dsa.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984
  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. mont = BN_MONT_CTX_new();
  209. if (mont == NULL) {
  210. goto err;
  211. }
  212. r0 = BN_CTX_get(ctx);
  213. g = BN_CTX_get(ctx);
  214. W = BN_CTX_get(ctx);
  215. q = BN_CTX_get(ctx);
  216. X = BN_CTX_get(ctx);
  217. c = BN_CTX_get(ctx);
  218. p = BN_CTX_get(ctx);
  219. test = BN_CTX_get(ctx);
  220. if (test == NULL || !BN_lshift(test, BN_value_one(), bits - 1)) {
  221. goto err;
  222. }
  223. for (;;) {
  224. // Find q.
  225. for (;;) {
  226. // step 1
  227. if (!BN_GENCB_call(cb, 0, m++)) {
  228. goto err;
  229. }
  230. int use_random_seed = (seed_in == NULL);
  231. if (use_random_seed) {
  232. if (!RAND_bytes(seed, qsize)) {
  233. goto err;
  234. }
  235. } else {
  236. // If we come back through, use random seed next time.
  237. seed_in = NULL;
  238. }
  239. OPENSSL_memcpy(buf, seed, qsize);
  240. OPENSSL_memcpy(buf2, seed, qsize);
  241. // precompute "SEED + 1" for step 7:
  242. for (i = qsize - 1; i < qsize; i--) {
  243. buf[i]++;
  244. if (buf[i] != 0) {
  245. break;
  246. }
  247. }
  248. // step 2
  249. if (!EVP_Digest(seed, qsize, md, NULL, evpmd, NULL) ||
  250. !EVP_Digest(buf, qsize, buf2, NULL, evpmd, NULL)) {
  251. goto err;
  252. }
  253. for (i = 0; i < qsize; i++) {
  254. md[i] ^= buf2[i];
  255. }
  256. // step 3
  257. md[0] |= 0x80;
  258. md[qsize - 1] |= 0x01;
  259. if (!BN_bin2bn(md, qsize, q)) {
  260. goto err;
  261. }
  262. // step 4
  263. r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx, use_random_seed, cb);
  264. if (r > 0) {
  265. break;
  266. }
  267. if (r != 0) {
  268. goto err;
  269. }
  270. // do a callback call
  271. // step 5
  272. }
  273. if (!BN_GENCB_call(cb, 2, 0) || !BN_GENCB_call(cb, 3, 0)) {
  274. goto err;
  275. }
  276. // step 6
  277. counter = 0;
  278. // "offset = 2"
  279. n = (bits - 1) / 160;
  280. for (;;) {
  281. if ((counter != 0) && !BN_GENCB_call(cb, 0, counter)) {
  282. goto err;
  283. }
  284. // step 7
  285. BN_zero(W);
  286. // now 'buf' contains "SEED + offset - 1"
  287. for (k = 0; k <= n; k++) {
  288. // obtain "SEED + offset + k" by incrementing:
  289. for (i = qsize - 1; i < qsize; i--) {
  290. buf[i]++;
  291. if (buf[i] != 0) {
  292. break;
  293. }
  294. }
  295. if (!EVP_Digest(buf, qsize, md, NULL, evpmd, NULL)) {
  296. goto err;
  297. }
  298. // step 8
  299. if (!BN_bin2bn(md, qsize, r0) ||
  300. !BN_lshift(r0, r0, (qsize << 3) * k) ||
  301. !BN_add(W, W, r0)) {
  302. goto err;
  303. }
  304. }
  305. // more of step 8
  306. if (!BN_mask_bits(W, bits - 1) ||
  307. !BN_copy(X, W) ||
  308. !BN_add(X, X, test)) {
  309. goto err;
  310. }
  311. // step 9
  312. if (!BN_lshift1(r0, q) ||
  313. !BN_mod(c, X, r0, ctx) ||
  314. !BN_sub(r0, c, BN_value_one()) ||
  315. !BN_sub(p, X, r0)) {
  316. goto err;
  317. }
  318. // step 10
  319. if (BN_cmp(p, test) >= 0) {
  320. // step 11
  321. r = BN_is_prime_fasttest_ex(p, DSS_prime_checks, ctx, 1, cb);
  322. if (r > 0) {
  323. goto end; // found it
  324. }
  325. if (r != 0) {
  326. goto err;
  327. }
  328. }
  329. // step 13
  330. counter++;
  331. // "offset = offset + n + 1"
  332. // step 14
  333. if (counter >= 4096) {
  334. break;
  335. }
  336. }
  337. }
  338. end:
  339. if (!BN_GENCB_call(cb, 2, 1)) {
  340. goto err;
  341. }
  342. // We now need to generate g
  343. // Set r0=(p-1)/q
  344. if (!BN_sub(test, p, BN_value_one()) ||
  345. !BN_div(r0, NULL, test, q, ctx)) {
  346. goto err;
  347. }
  348. if (!BN_set_word(test, h) ||
  349. !BN_MONT_CTX_set(mont, p, ctx)) {
  350. goto err;
  351. }
  352. for (;;) {
  353. // g=test^r0%p
  354. if (!BN_mod_exp_mont(g, test, r0, p, ctx, mont)) {
  355. goto err;
  356. }
  357. if (!BN_is_one(g)) {
  358. break;
  359. }
  360. if (!BN_add(test, test, BN_value_one())) {
  361. goto err;
  362. }
  363. h++;
  364. }
  365. if (!BN_GENCB_call(cb, 3, 1)) {
  366. goto err;
  367. }
  368. ok = 1;
  369. err:
  370. if (ok) {
  371. BN_free(dsa->p);
  372. BN_free(dsa->q);
  373. BN_free(dsa->g);
  374. dsa->p = BN_dup(p);
  375. dsa->q = BN_dup(q);
  376. dsa->g = BN_dup(g);
  377. if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) {
  378. ok = 0;
  379. goto err;
  380. }
  381. if (out_counter != NULL) {
  382. *out_counter = counter;
  383. }
  384. if (out_h != NULL) {
  385. *out_h = h;
  386. }
  387. }
  388. if (ctx) {
  389. BN_CTX_end(ctx);
  390. BN_CTX_free(ctx);
  391. }
  392. BN_MONT_CTX_free(mont);
  393. return ok;
  394. }
  395. DSA *DSAparams_dup(const DSA *dsa) {
  396. DSA *ret = DSA_new();
  397. if (ret == NULL) {
  398. return NULL;
  399. }
  400. ret->p = BN_dup(dsa->p);
  401. ret->q = BN_dup(dsa->q);
  402. ret->g = BN_dup(dsa->g);
  403. if (ret->p == NULL || ret->q == NULL || ret->g == NULL) {
  404. DSA_free(ret);
  405. return NULL;
  406. }
  407. return ret;
  408. }
  409. int DSA_generate_key(DSA *dsa) {
  410. int ok = 0;
  411. BN_CTX *ctx = NULL;
  412. BIGNUM *pub_key = NULL, *priv_key = NULL;
  413. ctx = BN_CTX_new();
  414. if (ctx == NULL) {
  415. goto err;
  416. }
  417. priv_key = dsa->priv_key;
  418. if (priv_key == NULL) {
  419. priv_key = BN_new();
  420. if (priv_key == NULL) {
  421. goto err;
  422. }
  423. }
  424. if (!BN_rand_range_ex(priv_key, 1, dsa->q)) {
  425. goto err;
  426. }
  427. pub_key = dsa->pub_key;
  428. if (pub_key == NULL) {
  429. pub_key = BN_new();
  430. if (pub_key == NULL) {
  431. goto err;
  432. }
  433. }
  434. if (!BN_MONT_CTX_set_locked(&dsa->method_mont_p, &dsa->method_mont_lock,
  435. dsa->p, ctx) ||
  436. !BN_mod_exp_mont_consttime(pub_key, dsa->g, priv_key, dsa->p, ctx,
  437. dsa->method_mont_p)) {
  438. goto err;
  439. }
  440. dsa->priv_key = priv_key;
  441. dsa->pub_key = pub_key;
  442. ok = 1;
  443. err:
  444. if (dsa->pub_key == NULL) {
  445. BN_free(pub_key);
  446. }
  447. if (dsa->priv_key == NULL) {
  448. BN_free(priv_key);
  449. }
  450. BN_CTX_free(ctx);
  451. return ok;
  452. }
  453. DSA_SIG *DSA_SIG_new(void) {
  454. DSA_SIG *sig;
  455. sig = OPENSSL_malloc(sizeof(DSA_SIG));
  456. if (!sig) {
  457. return NULL;
  458. }
  459. sig->r = NULL;
  460. sig->s = NULL;
  461. return sig;
  462. }
  463. void DSA_SIG_free(DSA_SIG *sig) {
  464. if (!sig) {
  465. return;
  466. }
  467. BN_free(sig->r);
  468. BN_free(sig->s);
  469. OPENSSL_free(sig);
  470. }
  471. DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len, const DSA *dsa) {
  472. BIGNUM *kinv = NULL, *r = NULL, *s = NULL;
  473. BIGNUM m;
  474. BIGNUM xr;
  475. BN_CTX *ctx = NULL;
  476. int reason = ERR_R_BN_LIB;
  477. DSA_SIG *ret = NULL;
  478. BN_init(&m);
  479. BN_init(&xr);
  480. if (!dsa->p || !dsa->q || !dsa->g) {
  481. reason = DSA_R_MISSING_PARAMETERS;
  482. goto err;
  483. }
  484. s = BN_new();
  485. if (s == NULL) {
  486. goto err;
  487. }
  488. ctx = BN_CTX_new();
  489. if (ctx == NULL) {
  490. goto err;
  491. }
  492. redo:
  493. if (!dsa_sign_setup(dsa, ctx, &kinv, &r)) {
  494. goto err;
  495. }
  496. if (digest_len > BN_num_bytes(dsa->q)) {
  497. // if the digest length is greater than the size of q use the
  498. // BN_num_bits(dsa->q) leftmost bits of the digest, see
  499. // fips 186-3, 4.2
  500. digest_len = BN_num_bytes(dsa->q);
  501. }
  502. if (BN_bin2bn(digest, digest_len, &m) == NULL) {
  503. goto err;
  504. }
  505. // Compute s = inv(k) (m + xr) mod q
  506. if (!BN_mod_mul(&xr, dsa->priv_key, r, dsa->q, ctx)) {
  507. goto err; // s = xr
  508. }
  509. if (!BN_add(s, &xr, &m)) {
  510. goto err; // s = m + xr
  511. }
  512. if (BN_cmp(s, dsa->q) > 0) {
  513. if (!BN_sub(s, s, dsa->q)) {
  514. goto err;
  515. }
  516. }
  517. if (!BN_mod_mul(s, s, kinv, dsa->q, ctx)) {
  518. goto err;
  519. }
  520. // Redo if r or s is zero as required by FIPS 186-3: this is
  521. // very unlikely.
  522. if (BN_is_zero(r) || BN_is_zero(s)) {
  523. goto redo;
  524. }
  525. ret = DSA_SIG_new();
  526. if (ret == NULL) {
  527. goto err;
  528. }
  529. ret->r = r;
  530. ret->s = s;
  531. err:
  532. if (ret == NULL) {
  533. OPENSSL_PUT_ERROR(DSA, reason);
  534. BN_free(r);
  535. BN_free(s);
  536. }
  537. BN_CTX_free(ctx);
  538. BN_clear_free(&m);
  539. BN_clear_free(&xr);
  540. BN_clear_free(kinv);
  541. return ret;
  542. }
  543. int DSA_do_verify(const uint8_t *digest, size_t digest_len, DSA_SIG *sig,
  544. const DSA *dsa) {
  545. int valid;
  546. if (!DSA_do_check_signature(&valid, digest, digest_len, sig, dsa)) {
  547. return -1;
  548. }
  549. return valid;
  550. }
  551. int DSA_do_check_signature(int *out_valid, const uint8_t *digest,
  552. size_t digest_len, DSA_SIG *sig, const DSA *dsa) {
  553. BN_CTX *ctx;
  554. BIGNUM u1, u2, t1;
  555. int ret = 0;
  556. unsigned i;
  557. *out_valid = 0;
  558. if (!dsa->p || !dsa->q || !dsa->g) {
  559. OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS);
  560. return 0;
  561. }
  562. i = BN_num_bits(dsa->q);
  563. // fips 186-3 allows only different sizes for q
  564. if (i != 160 && i != 224 && i != 256) {
  565. OPENSSL_PUT_ERROR(DSA, DSA_R_BAD_Q_VALUE);
  566. return 0;
  567. }
  568. if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS) {
  569. OPENSSL_PUT_ERROR(DSA, DSA_R_MODULUS_TOO_LARGE);
  570. return 0;
  571. }
  572. BN_init(&u1);
  573. BN_init(&u2);
  574. BN_init(&t1);
  575. ctx = BN_CTX_new();
  576. if (ctx == NULL) {
  577. goto err;
  578. }
  579. if (BN_is_zero(sig->r) || BN_is_negative(sig->r) ||
  580. BN_ucmp(sig->r, dsa->q) >= 0) {
  581. ret = 1;
  582. goto err;
  583. }
  584. if (BN_is_zero(sig->s) || BN_is_negative(sig->s) ||
  585. BN_ucmp(sig->s, dsa->q) >= 0) {
  586. ret = 1;
  587. goto err;
  588. }
  589. // Calculate W = inv(S) mod Q
  590. // save W in u2
  591. if (BN_mod_inverse(&u2, sig->s, dsa->q, ctx) == NULL) {
  592. goto err;
  593. }
  594. // save M in u1
  595. if (digest_len > (i >> 3)) {
  596. // if the digest length is greater than the size of q use the
  597. // BN_num_bits(dsa->q) leftmost bits of the digest, see
  598. // fips 186-3, 4.2
  599. digest_len = (i >> 3);
  600. }
  601. if (BN_bin2bn(digest, digest_len, &u1) == NULL) {
  602. goto err;
  603. }
  604. // u1 = M * w mod q
  605. if (!BN_mod_mul(&u1, &u1, &u2, dsa->q, ctx)) {
  606. goto err;
  607. }
  608. // u2 = r * w mod q
  609. if (!BN_mod_mul(&u2, sig->r, &u2, dsa->q, ctx)) {
  610. goto err;
  611. }
  612. if (!BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_p,
  613. (CRYPTO_MUTEX *)&dsa->method_mont_lock, dsa->p,
  614. ctx)) {
  615. goto err;
  616. }
  617. if (!BN_mod_exp2_mont(&t1, dsa->g, &u1, dsa->pub_key, &u2, dsa->p, ctx,
  618. dsa->method_mont_p)) {
  619. goto err;
  620. }
  621. // BN_copy(&u1,&t1);
  622. // let u1 = u1 mod q
  623. if (!BN_mod(&u1, &t1, dsa->q, ctx)) {
  624. goto err;
  625. }
  626. // V is now in u1. If the signature is correct, it will be
  627. // equal to R.
  628. *out_valid = BN_ucmp(&u1, sig->r) == 0;
  629. ret = 1;
  630. err:
  631. if (ret != 1) {
  632. OPENSSL_PUT_ERROR(DSA, ERR_R_BN_LIB);
  633. }
  634. BN_CTX_free(ctx);
  635. BN_free(&u1);
  636. BN_free(&u2);
  637. BN_free(&t1);
  638. return ret;
  639. }
  640. int DSA_sign(int type, const uint8_t *digest, size_t digest_len,
  641. uint8_t *out_sig, unsigned int *out_siglen, const DSA *dsa) {
  642. DSA_SIG *s;
  643. s = DSA_do_sign(digest, digest_len, dsa);
  644. if (s == NULL) {
  645. *out_siglen = 0;
  646. return 0;
  647. }
  648. *out_siglen = i2d_DSA_SIG(s, &out_sig);
  649. DSA_SIG_free(s);
  650. return 1;
  651. }
  652. int DSA_verify(int type, const uint8_t *digest, size_t digest_len,
  653. const uint8_t *sig, size_t sig_len, const DSA *dsa) {
  654. int valid;
  655. if (!DSA_check_signature(&valid, digest, digest_len, sig, sig_len, dsa)) {
  656. return -1;
  657. }
  658. return valid;
  659. }
  660. int DSA_check_signature(int *out_valid, const uint8_t *digest,
  661. size_t digest_len, const uint8_t *sig, size_t sig_len,
  662. const DSA *dsa) {
  663. DSA_SIG *s = NULL;
  664. int ret = 0;
  665. uint8_t *der = NULL;
  666. s = DSA_SIG_new();
  667. if (s == NULL) {
  668. goto err;
  669. }
  670. const uint8_t *sigp = sig;
  671. if (d2i_DSA_SIG(&s, &sigp, sig_len) == NULL || sigp != sig + sig_len) {
  672. goto err;
  673. }
  674. // Ensure that the signature uses DER and doesn't have trailing garbage.
  675. int der_len = i2d_DSA_SIG(s, &der);
  676. if (der_len < 0 || (size_t)der_len != sig_len ||
  677. OPENSSL_memcmp(sig, der, sig_len)) {
  678. goto err;
  679. }
  680. ret = DSA_do_check_signature(out_valid, digest, digest_len, s, dsa);
  681. err:
  682. OPENSSL_free(der);
  683. DSA_SIG_free(s);
  684. return ret;
  685. }
  686. // der_len_len returns the number of bytes needed to represent a length of |len|
  687. // in DER.
  688. static size_t der_len_len(size_t len) {
  689. if (len < 0x80) {
  690. return 1;
  691. }
  692. size_t ret = 1;
  693. while (len > 0) {
  694. ret++;
  695. len >>= 8;
  696. }
  697. return ret;
  698. }
  699. int DSA_size(const DSA *dsa) {
  700. size_t order_len = BN_num_bytes(dsa->q);
  701. // Compute the maximum length of an |order_len| byte integer. Defensively
  702. // assume that the leading 0x00 is included.
  703. size_t integer_len = 1 /* tag */ + der_len_len(order_len + 1) + 1 + order_len;
  704. if (integer_len < order_len) {
  705. return 0;
  706. }
  707. // A DSA signature is two INTEGERs.
  708. size_t value_len = 2 * integer_len;
  709. if (value_len < integer_len) {
  710. return 0;
  711. }
  712. // Add the header.
  713. size_t ret = 1 /* tag */ + der_len_len(value_len) + value_len;
  714. if (ret < value_len) {
  715. return 0;
  716. }
  717. return ret;
  718. }
  719. static int dsa_sign_setup(const DSA *dsa, BN_CTX *ctx_in, BIGNUM **out_kinv,
  720. BIGNUM **out_r) {
  721. BN_CTX *ctx;
  722. BIGNUM k, kq, *kinv = NULL, *r = NULL;
  723. int ret = 0;
  724. if (!dsa->p || !dsa->q || !dsa->g) {
  725. OPENSSL_PUT_ERROR(DSA, DSA_R_MISSING_PARAMETERS);
  726. return 0;
  727. }
  728. BN_init(&k);
  729. BN_init(&kq);
  730. ctx = ctx_in;
  731. if (ctx == NULL) {
  732. ctx = BN_CTX_new();
  733. if (ctx == NULL) {
  734. goto err;
  735. }
  736. }
  737. r = BN_new();
  738. if (r == NULL) {
  739. goto err;
  740. }
  741. // Get random k
  742. if (!BN_rand_range_ex(&k, 1, dsa->q)) {
  743. goto err;
  744. }
  745. if (!BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_p,
  746. (CRYPTO_MUTEX *)&dsa->method_mont_lock, dsa->p,
  747. ctx) ||
  748. !BN_MONT_CTX_set_locked((BN_MONT_CTX **)&dsa->method_mont_q,
  749. (CRYPTO_MUTEX *)&dsa->method_mont_lock, dsa->q,
  750. ctx)) {
  751. goto err;
  752. }
  753. // Compute r = (g^k mod p) mod q
  754. if (!BN_copy(&kq, &k)) {
  755. goto err;
  756. }
  757. // We do not want timing information to leak the length of k,
  758. // so we compute g^k using an equivalent exponent of fixed length.
  759. //
  760. // (This is a kludge that we need because the BN_mod_exp_mont()
  761. // does not let us specify the desired timing behaviour.)
  762. if (!BN_add(&kq, &kq, dsa->q)) {
  763. goto err;
  764. }
  765. if (BN_num_bits(&kq) <= BN_num_bits(dsa->q) && !BN_add(&kq, &kq, dsa->q)) {
  766. goto err;
  767. }
  768. if (!BN_mod_exp_mont_consttime(r, dsa->g, &kq, dsa->p, ctx,
  769. dsa->method_mont_p)) {
  770. goto err;
  771. }
  772. if (!BN_mod(r, r, dsa->q, ctx)) {
  773. goto err;
  774. }
  775. // Compute part of 's = inv(k) (m + xr) mod q' using Fermat's Little
  776. // Theorem.
  777. kinv = BN_new();
  778. if (kinv == NULL ||
  779. !bn_mod_inverse_prime(kinv, &k, dsa->q, ctx, dsa->method_mont_q)) {
  780. goto err;
  781. }
  782. BN_clear_free(*out_kinv);
  783. *out_kinv = kinv;
  784. kinv = NULL;
  785. BN_clear_free(*out_r);
  786. *out_r = r;
  787. ret = 1;
  788. err:
  789. if (!ret) {
  790. OPENSSL_PUT_ERROR(DSA, ERR_R_BN_LIB);
  791. if (r != NULL) {
  792. BN_clear_free(r);
  793. }
  794. }
  795. if (ctx_in == NULL) {
  796. BN_CTX_free(ctx);
  797. }
  798. BN_clear_free(&k);
  799. BN_clear_free(&kq);
  800. BN_clear_free(kinv);
  801. return ret;
  802. }
  803. int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_unused *unused,
  804. CRYPTO_EX_dup *dup_unused, CRYPTO_EX_free *free_func) {
  805. int index;
  806. if (!CRYPTO_get_ex_new_index(&g_ex_data_class, &index, argl, argp,
  807. free_func)) {
  808. return -1;
  809. }
  810. return index;
  811. }
  812. int DSA_set_ex_data(DSA *dsa, int idx, void *arg) {
  813. return CRYPTO_set_ex_data(&dsa->ex_data, idx, arg);
  814. }
  815. void *DSA_get_ex_data(const DSA *dsa, int idx) {
  816. return CRYPTO_get_ex_data(&dsa->ex_data, idx);
  817. }
  818. DH *DSA_dup_DH(const DSA *dsa) {
  819. if (dsa == NULL) {
  820. return NULL;
  821. }
  822. DH *ret = DH_new();
  823. if (ret == NULL) {
  824. goto err;
  825. }
  826. if (dsa->q != NULL) {
  827. ret->priv_length = BN_num_bits(dsa->q);
  828. if ((ret->q = BN_dup(dsa->q)) == NULL) {
  829. goto err;
  830. }
  831. }
  832. if ((dsa->p != NULL && (ret->p = BN_dup(dsa->p)) == NULL) ||
  833. (dsa->g != NULL && (ret->g = BN_dup(dsa->g)) == NULL) ||
  834. (dsa->pub_key != NULL && (ret->pub_key = BN_dup(dsa->pub_key)) == NULL) ||
  835. (dsa->priv_key != NULL &&
  836. (ret->priv_key = BN_dup(dsa->priv_key)) == NULL)) {
  837. goto err;
  838. }
  839. return ret;
  840. err:
  841. DH_free(ret);
  842. return NULL;
  843. }