Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

947 rindas
22 KiB

  1. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  2. * All rights reserved.
  3. *
  4. * This package is an SSL implementation written
  5. * by Eric Young (eay@cryptsoft.com).
  6. * The implementation was written so as to conform with Netscapes SSL.
  7. *
  8. * This library is free for commercial and non-commercial use as long as
  9. * the following conditions are aheared to. The following conditions
  10. * apply to all code found in this distribution, be it the RC4, RSA,
  11. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  12. * included with this distribution is covered by the same copyright terms
  13. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  14. *
  15. * Copyright remains Eric Young's, and as such any Copyright notices in
  16. * the code are not to be removed.
  17. * If this package is used in a product, Eric Young should be given attribution
  18. * as the author of the parts of the library used.
  19. * This can be in the form of a textual message at program startup or
  20. * in documentation (online or textual) provided with the package.
  21. *
  22. * Redistribution and use in source and binary forms, with or without
  23. * modification, are permitted provided that the following conditions
  24. * are met:
  25. * 1. Redistributions of source code must retain the copyright
  26. * notice, this list of conditions and the following disclaimer.
  27. * 2. Redistributions in binary form must reproduce the above copyright
  28. * notice, this list of conditions and the following disclaimer in the
  29. * documentation and/or other materials provided with the distribution.
  30. * 3. All advertising materials mentioning features or use of this software
  31. * must display the following acknowledgement:
  32. * "This product includes cryptographic software written by
  33. * Eric Young (eay@cryptsoft.com)"
  34. * The word 'cryptographic' can be left out if the rouines from the library
  35. * being used are not cryptographic related :-).
  36. * 4. If you include any Windows specific code (or a derivative thereof) from
  37. * the apps directory (application code) you must include an acknowledgement:
  38. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  39. *
  40. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  41. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  44. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50. * SUCH DAMAGE.
  51. *
  52. * The licence and distribution terms for any publically available version or
  53. * derivative of this code cannot be changed. i.e. this code cannot simply be
  54. * copied and put under another distribution licence
  55. * [including the GNU Public Licence.]
  56. *
  57. * The DSS routines are based on patches supplied by
  58. * Steven Schoch <schoch@sheba.arc.nasa.gov>. */
  59. #include <openssl/dsa.h>
  60. #include <string.h>
  61. #include <openssl/bn.h>
  62. #include <openssl/dh.h>
  63. #include <openssl/digest.h>
  64. #include <openssl/engine.h>
  65. #include <openssl/err.h>
  66. #include <openssl/ex_data.h>
  67. #include <openssl/mem.h>
  68. #include <openssl/rand.h>
  69. #include <openssl/sha.h>
  70. #include <openssl/thread.h>
  71. #include "../fipsmodule/bn/internal.h"
  72. #include "../internal.h"
  73. #define OPENSSL_DSA_MAX_MODULUS_BITS 10000
  74. // Primality test according to FIPS PUB 186[-1], Appendix 2.1: 50 rounds of
  75. // Rabin-Miller
  76. #define DSS_prime_checks 50
  77. static int dsa_sign_setup(const DSA *dsa, BN_CTX *ctx_in, BIGNUM **out_kinv,
  78. BIGNUM **out_r);
  79. static CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT;
  80. DSA *DSA_new(void) {
  81. DSA *dsa = OPENSSL_malloc(sizeof(DSA));
  82. if (dsa == NULL) {
  83. OPENSSL_PUT_ERROR(DSA, ERR_R_MALLOC_FAILURE);
  84. return NULL;
  85. }
  86. OPENSSL_memset(dsa, 0, sizeof(DSA));
  87. dsa->references = 1;
  88. CRYPTO_MUTEX_init(&dsa->method_mont_lock);
  89. CRYPTO_new_ex_data(&dsa->ex_data);
  90. return dsa;
  91. }
  92. void DSA_free(DSA *dsa) {
  93. if (dsa == NULL) {
  94. return;
  95. }
  96. if (!CRYPTO_refcount_dec_and_test_zero(&dsa->references)) {
  97. return;
  98. }
  99. CRYPTO_free_ex_data(&g_ex_data_class, dsa, &dsa->ex_data);
  100. BN_clear_free(dsa->p);
  101. BN_clear_free(dsa->q);
  102. BN_clear_free(dsa->g);
  103. BN_clear_free(dsa->pub_key);
  104. BN_clear_free(dsa->priv_key);
  105. BN_MONT_CTX_free(dsa->method_mont_p);
  106. BN_MONT_CTX_free(dsa->method_mont_q);
  107. CRYPTO_MUTEX_cleanup(&dsa->method_mont_lock);
  108. OPENSSL_free(dsa);
  109. }
  110. int DSA_up_ref(DSA *dsa) {
  111. CRYPTO_refcount_inc(&dsa->references);
  112. return 1;
  113. }
  114. void DSA_get0_key(const DSA *dsa, const BIGNUM **out_pub_key,
  115. const BIGNUM **out_priv_key) {
  116. if (out_pub_key != NULL) {
  117. *out_pub_key = dsa->pub_key;
  118. }
  119. if (out_priv_key != NULL) {
  120. *out_priv_key = dsa->priv_key;
  121. }
  122. }
  123. void DSA_get0_pqg(const DSA *dsa, const BIGNUM **out_p, const BIGNUM **out_q,
  124. const BIGNUM **out_g) {
  125. if (out_p != NULL) {
  126. *out_p = dsa->p;
  127. }
  128. if (out_q != NULL) {
  129. *out_q = dsa->q;
  130. }
  131. if (out_g != NULL) {
  132. *out_g = dsa->g;
  133. }
  134. }
  135. int DSA_set0_key(DSA *dsa, BIGNUM *pub_key, BIGNUM *priv_key) {
  136. if (dsa->pub_key == NULL && pub_key == NULL) {
  137. return 0;
  138. }
  139. if (pub_key != NULL) {
  140. BN_free(dsa->pub_key);
  141. dsa->pub_key = pub_key;
  142. }
  143. if (priv_key != NULL) {
  144. BN_free(dsa->priv_key);
  145. dsa->priv_key = priv_key;
  146. }
  147. return 1;
  148. }
  149. int DSA_set0_pqg(DSA *dsa, BIGNUM *p, BIGNUM *q, BIGNUM *g) {
  150. if ((dsa->p == NULL && p == NULL) ||
  151. (dsa->q == NULL && q == NULL) ||
  152. (dsa->g == NULL && g == NULL)) {
  153. return 0;
  154. }
  155. if (p != NULL) {
  156. BN_free(dsa->p);
  157. dsa->p = p;
  158. }
  159. if (q != NULL) {
  160. BN_free(dsa->q);
  161. dsa->q = q;
  162. }
  163. if (g != NULL) {
  164. BN_free(dsa->g);
  165. dsa->g = g;
  166. }
  167. return 1;
  168. }
  169. int DSA_generate_parameters_ex(DSA *dsa, unsigned bits, const uint8_t *seed_in,
  170. size_t seed_len, int *out_counter,
  171. unsigned long *out_h, BN_GENCB *cb) {
  172. int ok = 0;
  173. unsigned char seed[SHA256_DIGEST_LENGTH];
  174. unsigned char md[SHA256_DIGEST_LENGTH];
  175. unsigned char buf[SHA256_DIGEST_LENGTH], buf2[SHA256_DIGEST_LENGTH];
  176. BIGNUM *r0, *W, *X, *c, *test;
  177. BIGNUM *g = NULL, *q = NULL, *p = NULL;
  178. BN_MONT_CTX *mont = NULL;
  179. int k, n = 0, m = 0;
  180. unsigned i;
  181. int counter = 0;
  182. int r = 0;
  183. BN_CTX *ctx = NULL;
  184. unsigned int h = 2;
  185. unsigned qsize;
  186. const EVP_MD *evpmd;
  187. evpmd = (bits >= 2048) ? EVP_sha256() : EVP_sha1();
  188. qsize = EVP_MD_size(evpmd);
  189. if (bits < 512) {
  190. bits = 512;
  191. }
  192. bits = (bits + 63) / 64 * 64;
  193. if (seed_in != NULL) {
  194. if (seed_len < (size_t)qsize) {
  195. return 0;
  196. }
  197. if (seed_len > (size_t)qsize) {
  198. // Only consume as much seed as is expected.
  199. seed_len = qsize;
  200. }
  201. OPENSSL_memcpy(seed, seed_in, seed_len);
  202. }
  203. ctx = BN_CTX_new();
  204. if (ctx == NULL) {
  205. goto err;
  206. }
  207. BN_CTX_start(ctx);
  208. r0 = BN_CTX_get(ctx);
  209. g = BN_CTX_get(ctx);
  210. W = BN_CTX_get(ctx);
  211. q = BN_CTX_get(ctx);
  212. X = BN_CTX_get(ctx);
  213. c = BN_CTX_get(ctx);
  214. p = BN_CTX_get(ctx);
  215. test = BN_CTX_get(ctx);
  216. if (test == NULL || !BN_lshift(test, BN_value_one(), bits - 1)) {
  217. goto err;
  218. }
  219. for (;;) {
  220. // Find q.
  221. for (;;) {
  222. // step 1
  223. if (!BN_GENCB_call(cb, 0, m++)) {
  224. goto err;
  225. }
  226. int use_random_seed = (seed_in == NULL);
  227. if (use_random_seed) {
  228. if (!RAND_bytes(seed, qsize)) {
  229. goto err;
  230. }
  231. } else {
  232. // If we come back through, use random seed next time.
  233. seed_in = NULL;
  234. }
  235. OPENSSL_memcpy(buf, seed, qsize);
  236. OPENSSL_memcpy(buf2, seed, qsize);
  237. // precompute "SEED + 1" for step 7:
  238. for (i = qsize - 1; i < qsize; i--) {
  239. buf[i]++;
  240. if (buf[i] != 0) {
  241. break;
  242. }
  243. }
  244. // step 2
  245. if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL) ||
  246. !EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL)) {
  247. goto err;
  248. }
  249. for (i = 0; i < qsize; i++) {
  250. md[i] ^= buf2[i];
  251. }
  252. // step 3
  253. md[0] |= 0x80;
  254. md[qsize - 1] |= 0x01;
  255. if (!BN_bin2bn(md, qsize, q)) {
  256. goto err;
  257. }
  258. // step 4
  259. r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx, use_random_seed, cb);
  260. if (r > 0) {
  261. break;
  262. }
  263. if (r != 0) {
  264. goto err;
  265. }
  266. // do a callback call
  267. // step 5
  268. }
  269. if (!BN_GENCB_call(cb, 2, 0) || !BN_GENCB_call(cb, 3, 0)) {
  270. goto err;
  271. }
  272. // step 6
  273. counter = 0;
  274. // "offset = 2"
  275. n = (bits - 1) / 160;
  276. for (;;) {
  277. if ((counter != 0) && !BN_GENCB_call(cb, 0, counter)) {
  278. goto err;
  279. }
  280. // step 7
  281. BN_zero(W);
  282. // now 'buf' contains "SEED + offset - 1"
  283. for (k = 0; k <= n; k++) {
  284. // obtain "SEED + offset + k" by incrementing:
  285. for (i = qsize - 1; i < qsize; i--) {
  286. buf[i]++;
  287. if (buf[i] != 0) {
  288. break;
  289. }
  290. }
  291. if (!EVP_Digest(buf, qsize, md, NULL, evpmd, NULL)) {
  292. goto err;
  293. }
  294. // step 8
  295. if (!BN_bin2bn(md, qsize, r0) ||
  296. !BN_lshift(r0, r0, (qsize << 3) * k) ||
  297. !BN_add(W, W, r0)) {
  298. goto err;
  299. }
  300. }
  301. // more of step 8
  302. if (!BN_mask_bits(W, bits - 1) ||
  303. !BN_copy(X, W) ||
  304. !BN_add(X, X, test)) {
  305. goto err;
  306. }
  307. // step 9
  308. if (!BN_lshift1(r0, q) ||
  309. !BN_mod(c, X, r0, ctx) ||
  310. !BN_sub(r0, c, BN_value_one()) ||
  311. !BN_sub(p, X, r0)) {
  312. goto err;
  313. }
  314. // step 10
  315. if (BN_cmp(p, test) >= 0) {
  316. // step 11
  317. r = BN_is_prime_fasttest_ex(p, DSS_prime_checks, ctx, 1, cb);
  318. if (r > 0) {
  319. goto end; // found it
  320. }
  321. if (r != 0) {
  322. goto err;
  323. }
  324. }
  325. // step 13
  326. counter++;
  327. // "offset = offset + n + 1"
  328. // step 14
  329. if (counter >= 4096) {
  330. break;
  331. }
  332. }
  333. }
  334. end:
  335. if (!BN_GENCB_call(cb, 2, 1)) {
  336. goto err;
  337. }
  338. // We now need to generate g
  339. // Set r0=(p-1)/q
  340. if (!BN_sub(test, p, BN_value_one()) ||
  341. !BN_div(r0, NULL, test, q, ctx)) {
  342. goto err;
  343. }
  344. mont = BN_MONT_CTX_new_for_modulus(p, ctx);
  345. if (mont == NULL ||
  346. !BN_set_word(test, h)) {
  347. goto err;
  348. }
  349. for (;;) {
  350. // g=test^r0%p
  351. if (!BN_mod_exp_mont(g, test, r0, p, ctx, mont)) {
  352. goto err;
  353. }
  354. if (!BN_is_one(g)) {
  355. break;
  356. }
  357. if (!BN_add(test, test, BN_value_one())) {
  358. goto err;
  359. }
  360. h++;
  361. }
  362. if (!BN_GENCB_call(cb, 3, 1)) {
  363. goto err;
  364. }
  365. ok = 1;
  366. err:
  367. if (ok) {
  368. BN_free(dsa->p);
  369. BN_free(dsa->q);
  370. BN_free(dsa->g);
  371. dsa->p = BN_dup(p);
  372. dsa->q = BN_dup(q);
  373. dsa->g = BN_dup(g);
  374. if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) {
  375. ok = 0;
  376. goto err;
  377. }
  378. if (out_counter != NULL) {
  379. *out_counter = counter;
  380. }
  381. if (out_h != NULL) {
  382. *out_h = h;
  383. }
  384. }
  385. if (ctx) {
  386. BN_CTX_end(ctx);
  387. BN_CTX_free(ctx);
  388. }
  389. BN_MONT_CTX_free(mont);
  390. return ok;
  391. }
  392. DSA *DSAparams_dup(const DSA *dsa) {
  393. DSA *ret = DSA_new();
  394. if (ret == NULL) {
  395. return NULL;
  396. }
  397. ret->p = BN_dup(dsa->p);
  398. ret->q = BN_dup(dsa->q);
  399. ret->g = BN_dup(dsa->g);
  400. if (ret->p == NULL || ret->q == NULL || ret->g == NULL) {
  401. DSA_free(ret);
  402. return NULL;
  403. }
  404. return ret;
  405. }
  406. int DSA_generate_key(DSA *dsa) {
  407. int ok = 0;
  408. BN_CTX *ctx = NULL;
  409. BIGNUM *pub_key = NULL, *priv_key = NULL;
  410. ctx = BN_CTX_new();
  411. if (ctx == NULL) {
  412. goto err;
  413. }
  414. priv_key = dsa->priv_key;
  415. if (priv_key == NULL) {
  416. priv_key = BN_new();
  417. if (priv_key == NULL) {
  418. goto err;
  419. }
  420. }
  421. if (!BN_rand_range_ex(priv_key, 1, dsa->q)) {
  422. goto err;
  423. }
  424. pub_key = dsa->pub_key;
  425. if (pub_key == NULL) {
  426. pub_key = BN_new();
  427. if (pub_key == NULL) {
  428. goto err;
  429. }
  430. }
  431. if (!BN_MONT_CTX_set_locked(&dsa->method_mont_p, &dsa->method_mont_lock,
  432. dsa->p, ctx) ||
  433. !BN_mod_exp_mont_consttime(pub_key, dsa->g, priv_key, dsa->p, ctx,
  434. dsa->method_mont_p)) {
  435. goto err;
  436. }
  437. dsa->priv_key = priv_key;
  438. dsa->pub_key = pub_key;
  439. ok = 1;
  440. err:
  441. if (dsa->pub_key == NULL) {
  442. BN_free(pub_key);
  443. }
  444. if (dsa->priv_key == NULL) {
  445. BN_free(priv_key);
  446. }
  447. BN_CTX_free(ctx);
  448. return ok;
  449. }
  450. DSA_SIG *DSA_SIG_new(void) {
  451. DSA_SIG *sig;
  452. sig = OPENSSL_malloc(sizeof(DSA_SIG));
  453. if (!sig) {
  454. return NULL;
  455. }
  456. sig->r = NULL;
  457. sig->s = NULL;
  458. return sig;
  459. }
  460. void DSA_SIG_free(DSA_SIG *sig) {
  461. if (!sig) {
  462. return;
  463. }
  464. BN_free(sig->r);
  465. BN_free(sig->s);
  466. OPENSSL_free(sig);
  467. }
  468. DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) {
  469. BIGNUM *kinv = NULL, *r = NULL, *s = NULL;
  470. BIGNUM m;
  471. BIGNUM xr;
  472. BN_CTX *ctx = NULL;
  473. int reason = ERR_R_BN_LIB;
  474. DSA_SIG *ret = NULL;
  475. BN_init(&m);
  476. BN_init(&xr);
  477. if (!dsa->p || !dsa->q || !dsa->g) {
  478. reason = DSA_R_MISSING_PARAMETERS;
  479. goto err;
  480. }
  481. s = BN_new();
  482. if (s == NULL) {
  483. goto err;
  484. }
  485. ctx = BN_CTX_new();
  486. if (ctx == NULL) {
  487. goto err;
  488. }
  489. redo:
  490. if (!dsa_sign_setup(dsa, ctx, &kinv, &r)) {
  491. goto err;
  492. }
  493. if (digest_len > BN_num_bytes(dsa->q)) {
  494. // if the digest length is greater than the size of q use the
  495. // BN_num_bits(dsa->q) leftmost bits of the digest, see
  496. // fips 186-3, 4.2
  497. digest_len = BN_num_bytes(dsa->q);
  498. }
  499. if (BN_bin2bn(digest, digest_len, &m) == NULL) {
  500. goto err;
  501. }
  502. // Compute s = inv(k) (m + xr) mod q
  503. if (!BN_mod_mul(&xr, dsa->priv_key, r, dsa->q, ctx)) {
  504. goto err; // s = xr
  505. }
  506. if (!BN_add(s, &xr, &m)) {
  507. goto err; // s = m + xr
  508. }
  509. if (BN_cmp(s, dsa->q) > 0) {
  510. if (!BN_sub(s, s, dsa->q)) {
  511. goto err;
  512. }
  513. }
  514. if (!BN_mod_mul(s, s, kinv, dsa->q, ctx)) {
  515. goto err;
  516. }
  517. // Redo if r or s is zero as required by FIPS 186-3: this is
  518. // very unlikely.
  519. if (BN_is_zero(r) || BN_is_zero(s)) {
  520. goto redo;
  521. }
  522. ret = DSA_SIG_new();
  523. if (ret == NULL) {
  524. goto err;
  525. }
  526. ret->r = r;
  527. ret->s = s;
  528. err:
  529. if (ret == NULL) {
  530. OPENSSL_PUT_ERROR(DSA, reason);
  531. BN_free(r);
  532. BN_free(s);
  533. }
  534. BN_CTX_free(ctx);
  535. BN_clear_free(&m);
  536. BN_clear_free(&xr);
  537. BN_clear_free(kinv);
  538. return ret;
  539. }
  540. int DSA_do_verify(const uint8_t *digest, size_t digest_len, DSA_SIG *sig,
  541. const DSA *dsa) {
  542. int valid;
  543. if (!DSA_do_check_signature(&valid, digest, digest_len, sig, dsa)) {
  544. return -1;
  545. }
  546. return valid;
  547. }
  548. int DSA_do_check_signature(int *out_valid, const uint8_t *digest,
  549. size_t digest_len, DSA_SIG *sig, const DSA *dsa) {
  550. BN_CTX *ctx;
  551. BIGNUM u1, u2, t1;
  552. int ret = 0;
  553. unsigned i;
  554. *out_valid = 0;
  555. if (!dsa->p || !dsa->q || !dsa->g) {
  556. OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS);
  557. return 0;
  558. }
  559. i = BN_num_bits(dsa->q);
  560. // fips 186-3 allows only different sizes for q
  561. if (i != 160 && i != 224 && i != 256) {
  562. OPENSSL_PUT_ERROR(DSA, DSA_R_BAD_Q_VALUE);
  563. return 0;
  564. }
  565. if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS) {
  566. OPENSSL_PUT_ERROR(DSA, DSA_R_MODULUS_TOO_LARGE);
  567. return 0;
  568. }
  569. BN_init(&u1);
  570. BN_init(&u2);
  571. BN_init(&t1);
  572. ctx = BN_CTX_new();
  573. if (ctx == NULL) {
  574. goto err;
  575. }
  576. if (BN_is_zero(sig->r) || BN_is_negative(sig->r) ||
  577. BN_ucmp(sig->r, dsa->q) >= 0) {
  578. ret = 1;
  579. goto err;
  580. }
  581. if (BN_is_zero(sig->s) || BN_is_negative(sig->s) ||
  582. BN_ucmp(sig->s, dsa->q) >= 0) {
  583. ret = 1;
  584. goto err;
  585. }
  586. // Calculate W = inv(S) mod Q
  587. // save W in u2
  588. if (BN_mod_inverse(&u2, sig->s, dsa->q, ctx) == NULL) {
  589. goto err;
  590. }
  591. // save M in u1
  592. if (digest_len > (i >> 3)) {
  593. // if the digest length is greater than the size of q use the
  594. // BN_num_bits(dsa->q) leftmost bits of the digest, see
  595. // fips 186-3, 4.2
  596. digest_len = (i >> 3);
  597. }
  598. if (BN_bin2bn(digest, digest_len, &u1) == NULL) {
  599. goto err;
  600. }
  601. // u1 = M * w mod q
  602. if (!BN_mod_mul(&u1, &u1, &u2, dsa->q, ctx)) {
  603. goto err;
  604. }
  605. // u2 = r * w mod q
  606. if (!BN_mod_mul(&u2, sig->r, &u2, dsa->q, ctx)) {
  607. goto err;
  608. }
  609. if (!BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_p,
  610. (CRYPTO_MUTEX *)&dsa->method_mont_lock, dsa->p,
  611. ctx)) {
  612. goto err;
  613. }
  614. if (!BN_mod_exp2_mont(&t1, dsa->g, &u1, dsa->pub_key, &u2, dsa->p, ctx,
  615. dsa->method_mont_p)) {
  616. goto err;
  617. }
  618. // BN_copy(&u1,&t1);
  619. // let u1 = u1 mod q
  620. if (!BN_mod(&u1, &t1, dsa->q, ctx)) {
  621. goto err;
  622. }
  623. // V is now in u1. If the signature is correct, it will be
  624. // equal to R.
  625. *out_valid = BN_ucmp(&u1, sig->r) == 0;
  626. ret = 1;
  627. err:
  628. if (ret != 1) {
  629. OPENSSL_PUT_ERROR(DSA, ERR_R_BN_LIB);
  630. }
  631. BN_CTX_free(ctx);
  632. BN_free(&u1);
  633. BN_free(&u2);
  634. BN_free(&t1);
  635. return ret;
  636. }
  637. int DSA_sign(int type, const uint8_t *digest, size_t digest_len,
  638. uint8_t *out_sig, unsigned int *out_siglen, const DSA *dsa) {
  639. DSA_SIG *s;
  640. s = DSA_do_sign(digest, digest_len, dsa);
  641. if (s == NULL) {
  642. *out_siglen = 0;
  643. return 0;
  644. }
  645. *out_siglen = i2d_DSA_SIG(s, &out_sig);
  646. DSA_SIG_free(s);
  647. return 1;
  648. }
  649. int DSA_verify(int type, const uint8_t *digest, size_t digest_len,
  650. const uint8_t *sig, size_t sig_len, const DSA *dsa) {
  651. int valid;
  652. if (!DSA_check_signature(&valid, digest, digest_len, sig, sig_len, dsa)) {
  653. return -1;
  654. }
  655. return valid;
  656. }
  657. int DSA_check_signature(int *out_valid, const uint8_t *digest,
  658. size_t digest_len, const uint8_t *sig, size_t sig_len,
  659. const DSA *dsa) {
  660. DSA_SIG *s = NULL;
  661. int ret = 0;
  662. uint8_t *der = NULL;
  663. s = DSA_SIG_new();
  664. if (s == NULL) {
  665. goto err;
  666. }
  667. const uint8_t *sigp = sig;
  668. if (d2i_DSA_SIG(&s, &sigp, sig_len) == NULL || sigp != sig + sig_len) {
  669. goto err;
  670. }
  671. // Ensure that the signature uses DER and doesn't have trailing garbage.
  672. int der_len = i2d_DSA_SIG(s, &der);
  673. if (der_len < 0 || (size_t)der_len != sig_len ||
  674. OPENSSL_memcmp(sig, der, sig_len)) {
  675. goto err;
  676. }
  677. ret = DSA_do_check_signature(out_valid, digest, digest_len, s, dsa);
  678. err:
  679. OPENSSL_free(der);
  680. DSA_SIG_free(s);
  681. return ret;
  682. }
  683. // der_len_len returns the number of bytes needed to represent a length of |len|
  684. // in DER.
  685. static size_t der_len_len(size_t len) {
  686. if (len < 0x80) {
  687. return 1;
  688. }
  689. size_t ret = 1;
  690. while (len > 0) {
  691. ret++;
  692. len >>= 8;
  693. }
  694. return ret;
  695. }
  696. int DSA_size(const DSA *dsa) {
  697. size_t order_len = BN_num_bytes(dsa->q);
  698. // Compute the maximum length of an |order_len| byte integer. Defensively
  699. // assume that the leading 0x00 is included.
  700. size_t integer_len = 1 /* tag */ + der_len_len(order_len + 1) + 1 + order_len;
  701. if (integer_len < order_len) {
  702. return 0;
  703. }
  704. // A DSA signature is two INTEGERs.
  705. size_t value_len = 2 * integer_len;
  706. if (value_len < integer_len) {
  707. return 0;
  708. }
  709. // Add the header.
  710. size_t ret = 1 /* tag */ + der_len_len(value_len) + value_len;
  711. if (ret < value_len) {
  712. return 0;
  713. }
  714. return ret;
  715. }
  716. static int dsa_sign_setup(const DSA *dsa, BN_CTX *ctx_in, BIGNUM **out_kinv,
  717. BIGNUM **out_r) {
  718. BN_CTX *ctx;
  719. BIGNUM k, *kinv = NULL, *r = NULL;
  720. int ret = 0;
  721. if (!dsa->p || !dsa->q || !dsa->g) {
  722. OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS);
  723. return 0;
  724. }
  725. BN_init(&k);
  726. ctx = ctx_in;
  727. if (ctx == NULL) {
  728. ctx = BN_CTX_new();
  729. if (ctx == NULL) {
  730. goto err;
  731. }
  732. }
  733. r = BN_new();
  734. kinv = BN_new();
  735. if (r == NULL || kinv == NULL ||
  736. // Get random k
  737. !BN_rand_range_ex(&k, 1, dsa->q) ||
  738. !BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_p,
  739. (CRYPTO_MUTEX *)&dsa->method_mont_lock, dsa->p,
  740. ctx) ||
  741. !BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_q,
  742. (CRYPTO_MUTEX *)&dsa->method_mont_lock, dsa->q,
  743. ctx) ||
  744. // Compute r = (g^k mod p) mod q
  745. !BN_mod_exp_mont_consttime(r, dsa->g, &k, dsa->p, ctx,
  746. dsa->method_mont_p) ||
  747. !BN_mod(r, r, dsa->q, ctx) ||
  748. // Compute part of 's = inv(k) (m + xr) mod q' using Fermat's Little
  749. // Theorem.
  750. !bn_mod_inverse_prime(kinv, &k, dsa->q, ctx, dsa->method_mont_q)) {
  751. goto err;
  752. }
  753. BN_clear_free(*out_kinv);
  754. *out_kinv = kinv;
  755. kinv = NULL;
  756. BN_clear_free(*out_r);
  757. *out_r = r;
  758. ret = 1;
  759. err:
  760. if (!ret) {
  761. OPENSSL_PUT_ERROR(DSA, ERR_R_BN_LIB);
  762. if (r != NULL) {
  763. BN_clear_free(r);
  764. }
  765. }
  766. if (ctx_in == NULL) {
  767. BN_CTX_free(ctx);
  768. }
  769. BN_clear_free(&k);
  770. BN_clear_free(kinv);
  771. return ret;
  772. }
  773. int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_unused *unused,
  774. CRYPTO_EX_dup *dup_unused, CRYPTO_EX_free *free_func) {
  775. int index;
  776. if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
  777. free_func)) {
  778. return -1;
  779. }
  780. return index;
  781. }
  782. int DSA_set_ex_data(DSA *dsa, int idx, void *arg) {
  783. return CRYPTO_set_ex_data(&dsa->ex_data, idx, arg);
  784. }
  785. void *DSA_get_ex_data(const DSA *dsa, int idx) {
  786. return CRYPTO_get_ex_data(&dsa->ex_data, idx);
  787. }
  788. DH *DSA_dup_DH(const DSA *dsa) {
  789. if (dsa == NULL) {
  790. return NULL;
  791. }
  792. DH *ret = DH_new();
  793. if (ret == NULL) {
  794. goto err;
  795. }
  796. if (dsa->q != NULL) {
  797. ret->priv_length = BN_num_bits(dsa->q);
  798. if ((ret->q = BN_dup(dsa->q)) == NULL) {
  799. goto err;
  800. }
  801. }
  802. if ((dsa->p != NULL && (ret->p = BN_dup(dsa->p)) == NULL) ||
  803. (dsa->g != NULL && (ret->g = BN_dup(dsa->g)) == NULL) ||
  804. (dsa->pub_key != NULL && (ret->pub_key = BN_dup(dsa->pub_key)) == NULL) ||
  805. (dsa->priv_key != NULL &&
  806. (ret->priv_key = BN_dup(dsa->priv_key)) == NULL)) {
  807. goto err;
  808. }
  809. return ret;
  810. err:
  811. DH_free(ret);
  812. return NULL;
  813. }