dsa.c 22 KB

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