You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2161 lines
69 KiB

  1. From b67882dece4df10893307467f3782237fad72d25 Mon Sep 17 00:00:00 2001
  2. From: "djm@openbsd.org" <djm@openbsd.org>
  3. Date: Thu, 13 Sep 2018 02:08:33 +0000
  4. Subject: [PATCH 1/5] upstream: hold our collective noses and use the
  5. openssl-1.1.x API in
  6. OpenSSH; feedback and ok tb@ jsing@ markus@
  7. OpenBSD-Commit-ID: cacbcac87ce5da0d3ca7ef1b38a6f7fb349e4417
  8. ---
  9. auth2.c | 4 +-
  10. cipher.c | 16 +-
  11. cipher.h | 4 +-
  12. dh.c | 60 +++--
  13. dh.h | 2 +-
  14. digest-openssl.c | 26 ++-
  15. kexdhc.c | 15 +-
  16. kexdhs.c | 11 +-
  17. kexgexc.c | 18 +-
  18. kexgexs.c | 21 +-
  19. monitor.c | 6 +-
  20. ssh-dss.c | 26 ++-
  21. ssh-ecdsa.c | 23 +-
  22. ssh-keygen.c | 61 +++--
  23. ssh-pkcs11-client.c | 12 +-
  24. ssh-pkcs11.c | 55 +++--
  25. ssh-rsa.c | 47 ++--
  26. sshd.c | 6 +-
  27. sshkey.c | 637 ++++++++++++++++++++++++++++------------------------
  28. sshkey.h | 7 +-
  29. 20 files changed, 619 insertions(+), 438 deletions(-)
  30. diff --git a/auth2.c b/auth2.c
  31. index ab879589..4d19957a 100644
  32. --- a/auth2.c
  33. +++ b/auth2.c
  34. @@ -706,7 +706,7 @@ auth2_record_key(Authctxt *authctxt, int authenticated,
  35. struct sshkey **tmp, *dup;
  36. int r;
  37. - if ((r = sshkey_demote(key, &dup)) != 0)
  38. + if ((r = sshkey_from_private(key, &dup)) != 0)
  39. fatal("%s: copy key: %s", __func__, ssh_err(r));
  40. sshkey_free(authctxt->auth_method_key);
  41. authctxt->auth_method_key = dup;
  42. @@ -715,7 +715,7 @@ auth2_record_key(Authctxt *authctxt, int authenticated,
  43. return;
  44. /* If authenticated, make sure we don't accept this key again */
  45. - if ((r = sshkey_demote(key, &dup)) != 0)
  46. + if ((r = sshkey_from_private(key, &dup)) != 0)
  47. fatal("%s: copy key: %s", __func__, ssh_err(r));
  48. if (authctxt->nprev_keys >= INT_MAX ||
  49. (tmp = recallocarray(authctxt->prev_keys, authctxt->nprev_keys,
  50. diff --git a/cipher.c b/cipher.c
  51. index a72682a8..df43826e 100644
  52. --- a/cipher.c
  53. +++ b/cipher.c
  54. @@ -446,7 +446,7 @@ cipher_get_keyiv_len(const struct sshcipher_ctx *cc)
  55. }
  56. int
  57. -cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, u_int len)
  58. +cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, size_t len)
  59. {
  60. #ifdef WITH_OPENSSL
  61. const struct sshcipher *c = cc->cipher;
  62. @@ -473,7 +473,7 @@ cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, u_int len)
  63. return 0;
  64. else if (evplen < 0)
  65. return SSH_ERR_LIBCRYPTO_ERROR;
  66. - if ((u_int)evplen != len)
  67. + if ((size_t)evplen != len)
  68. return SSH_ERR_INVALID_ARGUMENT;
  69. #ifndef OPENSSL_HAVE_EVPCTR
  70. if (c->evptype == evp_aes_128_ctr)
  71. @@ -484,14 +484,14 @@ cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, u_int len)
  72. if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN,
  73. len, iv))
  74. return SSH_ERR_LIBCRYPTO_ERROR;
  75. - } else
  76. - memcpy(iv, cc->evp->iv, len);
  77. + } else if (!EVP_CIPHER_CTX_get_iv(cc->evp, iv, len))
  78. + return SSH_ERR_LIBCRYPTO_ERROR;
  79. #endif
  80. return 0;
  81. }
  82. int
  83. -cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv)
  84. +cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv, size_t len)
  85. {
  86. #ifdef WITH_OPENSSL
  87. const struct sshcipher *c = cc->cipher;
  88. @@ -507,6 +507,8 @@ cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv)
  89. evplen = EVP_CIPHER_CTX_iv_length(cc->evp);
  90. if (evplen <= 0)
  91. return SSH_ERR_LIBCRYPTO_ERROR;
  92. + if ((size_t)evplen != len)
  93. + return SSH_ERR_INVALID_ARGUMENT;
  94. #ifndef OPENSSL_HAVE_EVPCTR
  95. /* XXX iv arg is const, but ssh_aes_ctr_iv isn't */
  96. if (c->evptype == evp_aes_128_ctr)
  97. @@ -518,8 +520,8 @@ cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv)
  98. if (!EVP_CIPHER_CTX_ctrl(cc->evp,
  99. EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv))
  100. return SSH_ERR_LIBCRYPTO_ERROR;
  101. - } else
  102. - memcpy(cc->evp->iv, iv, evplen);
  103. + } else if (!EVP_CIPHER_CTX_set_iv(cc->evp, iv, evplen))
  104. + return SSH_ERR_LIBCRYPTO_ERROR;
  105. #endif
  106. return 0;
  107. }
  108. diff --git a/cipher.h b/cipher.h
  109. index dc7ecf11..dc1571d2 100644
  110. --- a/cipher.h
  111. +++ b/cipher.h
  112. @@ -68,8 +68,8 @@ u_int cipher_is_cbc(const struct sshcipher *);
  113. u_int cipher_ctx_is_plaintext(struct sshcipher_ctx *);
  114. -int cipher_get_keyiv(struct sshcipher_ctx *, u_char *, u_int);
  115. -int cipher_set_keyiv(struct sshcipher_ctx *, const u_char *);
  116. +int cipher_get_keyiv(struct sshcipher_ctx *, u_char *, size_t);
  117. +int cipher_set_keyiv(struct sshcipher_ctx *, const u_char *, size_t);
  118. int cipher_get_keyiv_len(const struct sshcipher_ctx *);
  119. #endif /* CIPHER_H */
  120. diff --git a/dh.c b/dh.c
  121. index ac8d5a0a..d0d4527b 100644
  122. --- a/dh.c
  123. +++ b/dh.c
  124. @@ -216,14 +216,17 @@ choose_dh(int min, int wantbits, int max)
  125. /* diffie-hellman-groupN-sha1 */
  126. int
  127. -dh_pub_is_valid(DH *dh, BIGNUM *dh_pub)
  128. +dh_pub_is_valid(const DH *dh, const BIGNUM *dh_pub)
  129. {
  130. int i;
  131. int n = BN_num_bits(dh_pub);
  132. int bits_set = 0;
  133. BIGNUM *tmp;
  134. + const BIGNUM *dh_p;
  135. - if (dh_pub->neg) {
  136. + DH_get0_pqg(dh, &dh_p, NULL, NULL);
  137. +
  138. + if (BN_is_negative(dh_pub)) {
  139. logit("invalid public DH value: negative");
  140. return 0;
  141. }
  142. @@ -236,7 +239,7 @@ dh_pub_is_valid(DH *dh, BIGNUM *dh_pub)
  143. error("%s: BN_new failed", __func__);
  144. return 0;
  145. }
  146. - if (!BN_sub(tmp, dh->p, BN_value_one()) ||
  147. + if (!BN_sub(tmp, dh_p, BN_value_one()) ||
  148. BN_cmp(dh_pub, tmp) != -1) { /* pub_exp > p-2 */
  149. BN_clear_free(tmp);
  150. logit("invalid public DH value: >= p-1");
  151. @@ -247,14 +250,14 @@ dh_pub_is_valid(DH *dh, BIGNUM *dh_pub)
  152. for (i = 0; i <= n; i++)
  153. if (BN_is_bit_set(dh_pub, i))
  154. bits_set++;
  155. - debug2("bits set: %d/%d", bits_set, BN_num_bits(dh->p));
  156. + debug2("bits set: %d/%d", bits_set, BN_num_bits(dh_p));
  157. /*
  158. * if g==2 and bits_set==1 then computing log_g(dh_pub) is trivial
  159. */
  160. if (bits_set < 4) {
  161. logit("invalid public DH value (%d/%d)",
  162. - bits_set, BN_num_bits(dh->p));
  163. + bits_set, BN_num_bits(dh_p));
  164. return 0;
  165. }
  166. return 1;
  167. @@ -264,9 +267,12 @@ int
  168. dh_gen_key(DH *dh, int need)
  169. {
  170. int pbits;
  171. + const BIGNUM *dh_p, *pub_key;
  172. +
  173. + DH_get0_pqg(dh, &dh_p, NULL, NULL);
  174. - if (need < 0 || dh->p == NULL ||
  175. - (pbits = BN_num_bits(dh->p)) <= 0 ||
  176. + if (need < 0 || dh_p == NULL ||
  177. + (pbits = BN_num_bits(dh_p)) <= 0 ||
  178. need > INT_MAX / 2 || 2 * need > pbits)
  179. return SSH_ERR_INVALID_ARGUMENT;
  180. if (need < 256)
  181. @@ -275,13 +281,14 @@ dh_gen_key(DH *dh, int need)
  182. * Pollard Rho, Big step/Little Step attacks are O(sqrt(n)),
  183. * so double requested need here.
  184. */
  185. - dh->length = MINIMUM(need * 2, pbits - 1);
  186. - if (DH_generate_key(dh) == 0 ||
  187. - !dh_pub_is_valid(dh, dh->pub_key)) {
  188. - BN_clear_free(dh->priv_key);
  189. - dh->priv_key = NULL;
  190. + if (!DH_set_length(dh, MINIMUM(need * 2, pbits - 1)))
  191. return SSH_ERR_LIBCRYPTO_ERROR;
  192. - }
  193. +
  194. + if (DH_generate_key(dh) == 0)
  195. + return SSH_ERR_LIBCRYPTO_ERROR;
  196. + DH_get0_key(dh, &pub_key, NULL);
  197. + if (!dh_pub_is_valid(dh, pub_key))
  198. + return SSH_ERR_INVALID_FORMAT;
  199. return 0;
  200. }
  201. @@ -289,22 +296,27 @@ DH *
  202. dh_new_group_asc(const char *gen, const char *modulus)
  203. {
  204. DH *dh;
  205. + BIGNUM *dh_p = NULL, *dh_g = NULL;
  206. if ((dh = DH_new()) == NULL)
  207. return NULL;
  208. - if (BN_hex2bn(&dh->p, modulus) == 0 ||
  209. - BN_hex2bn(&dh->g, gen) == 0) {
  210. - DH_free(dh);
  211. - return NULL;
  212. - }
  213. - return (dh);
  214. + if (BN_hex2bn(&dh_p, modulus) == 0 ||
  215. + BN_hex2bn(&dh_g, gen) == 0)
  216. + goto fail;
  217. + if (!DH_set0_pqg(dh, dh_p, NULL, dh_g))
  218. + goto fail;
  219. + return dh;
  220. + fail:
  221. + DH_free(dh);
  222. + BN_clear_free(dh_p);
  223. + BN_clear_free(dh_g);
  224. + return NULL;
  225. }
  226. /*
  227. * This just returns the group, we still need to generate the exchange
  228. * value.
  229. */
  230. -
  231. DH *
  232. dh_new_group(BIGNUM *gen, BIGNUM *modulus)
  233. {
  234. @@ -312,10 +324,12 @@ dh_new_group(BIGNUM *gen, BIGNUM *modulus)
  235. if ((dh = DH_new()) == NULL)
  236. return NULL;
  237. - dh->p = modulus;
  238. - dh->g = gen;
  239. + if (!DH_set0_pqg(dh, modulus, NULL, gen)) {
  240. + DH_free(dh);
  241. + return NULL;
  242. + }
  243. - return (dh);
  244. + return dh;
  245. }
  246. /* rfc2409 "Second Oakley Group" (1024 bits) */
  247. diff --git a/dh.h b/dh.h
  248. index bcd485cf..344b29e3 100644
  249. --- a/dh.h
  250. +++ b/dh.h
  251. @@ -42,7 +42,7 @@ DH *dh_new_group18(void);
  252. DH *dh_new_group_fallback(int);
  253. int dh_gen_key(DH *, int);
  254. -int dh_pub_is_valid(DH *, BIGNUM *);
  255. +int dh_pub_is_valid(const DH *, const BIGNUM *);
  256. u_int dh_estimate(int);
  257. diff --git a/digest-openssl.c b/digest-openssl.c
  258. index 27709992..da7ed72b 100644
  259. --- a/digest-openssl.c
  260. +++ b/digest-openssl.c
  261. @@ -43,7 +43,7 @@
  262. struct ssh_digest_ctx {
  263. int alg;
  264. - EVP_MD_CTX mdctx;
  265. + EVP_MD_CTX *mdctx;
  266. };
  267. struct ssh_digest {
  268. @@ -106,7 +106,7 @@ ssh_digest_bytes(int alg)
  269. size_t
  270. ssh_digest_blocksize(struct ssh_digest_ctx *ctx)
  271. {
  272. - return EVP_MD_CTX_block_size(&ctx->mdctx);
  273. + return EVP_MD_CTX_block_size(ctx->mdctx);
  274. }
  275. struct ssh_digest_ctx *
  276. @@ -118,11 +118,14 @@ ssh_digest_start(int alg)
  277. if (digest == NULL || ((ret = calloc(1, sizeof(*ret))) == NULL))
  278. return NULL;
  279. ret->alg = alg;
  280. - EVP_MD_CTX_init(&ret->mdctx);
  281. - if (EVP_DigestInit_ex(&ret->mdctx, digest->mdfunc(), NULL) != 1) {
  282. + if ((ret->mdctx = EVP_MD_CTX_new()) == NULL) {
  283. free(ret);
  284. return NULL;
  285. }
  286. + if (EVP_DigestInit_ex(ret->mdctx, digest->mdfunc(), NULL) != 1) {
  287. + ssh_digest_free(ret);
  288. + return NULL;
  289. + }
  290. return ret;
  291. }
  292. @@ -132,7 +135,7 @@ ssh_digest_copy_state(struct ssh_digest_ctx *from, struct ssh_digest_ctx *to)
  293. if (from->alg != to->alg)
  294. return SSH_ERR_INVALID_ARGUMENT;
  295. /* we have bcopy-style order while openssl has memcpy-style */
  296. - if (!EVP_MD_CTX_copy_ex(&to->mdctx, &from->mdctx))
  297. + if (!EVP_MD_CTX_copy_ex(to->mdctx, from->mdctx))
  298. return SSH_ERR_LIBCRYPTO_ERROR;
  299. return 0;
  300. }
  301. @@ -140,7 +143,7 @@ ssh_digest_copy_state(struct ssh_digest_ctx *from, struct ssh_digest_ctx *to)
  302. int
  303. ssh_digest_update(struct ssh_digest_ctx *ctx, const void *m, size_t mlen)
  304. {
  305. - if (EVP_DigestUpdate(&ctx->mdctx, m, mlen) != 1)
  306. + if (EVP_DigestUpdate(ctx->mdctx, m, mlen) != 1)
  307. return SSH_ERR_LIBCRYPTO_ERROR;
  308. return 0;
  309. }
  310. @@ -161,7 +164,7 @@ ssh_digest_final(struct ssh_digest_ctx *ctx, u_char *d, size_t dlen)
  311. return SSH_ERR_INVALID_ARGUMENT;
  312. if (dlen < digest->digest_len) /* No truncation allowed */
  313. return SSH_ERR_INVALID_ARGUMENT;
  314. - if (EVP_DigestFinal_ex(&ctx->mdctx, d, &l) != 1)
  315. + if (EVP_DigestFinal_ex(ctx->mdctx, d, &l) != 1)
  316. return SSH_ERR_LIBCRYPTO_ERROR;
  317. if (l != digest->digest_len) /* sanity */
  318. return SSH_ERR_INTERNAL_ERROR;
  319. @@ -171,11 +174,10 @@ ssh_digest_final(struct ssh_digest_ctx *ctx, u_char *d, size_t dlen)
  320. void
  321. ssh_digest_free(struct ssh_digest_ctx *ctx)
  322. {
  323. - if (ctx != NULL) {
  324. - EVP_MD_CTX_cleanup(&ctx->mdctx);
  325. - explicit_bzero(ctx, sizeof(*ctx));
  326. - free(ctx);
  327. - }
  328. + if (ctx == NULL)
  329. + return;
  330. + EVP_MD_CTX_free(ctx->mdctx);
  331. + freezero(ctx, sizeof(*ctx));
  332. }
  333. int
  334. diff --git a/kexdhc.c b/kexdhc.c
  335. index 9a9f1ea7..a8b74247 100644
  336. --- a/kexdhc.c
  337. +++ b/kexdhc.c
  338. @@ -56,6 +56,7 @@ kexdh_client(struct ssh *ssh)
  339. {
  340. struct kex *kex = ssh->kex;
  341. int r;
  342. + const BIGNUM *pub_key;
  343. /* generate and send 'e', client DH public key */
  344. switch (kex->kex_type) {
  345. @@ -81,15 +82,17 @@ kexdh_client(struct ssh *ssh)
  346. goto out;
  347. }
  348. debug("sending SSH2_MSG_KEXDH_INIT");
  349. - if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0 ||
  350. - (r = sshpkt_start(ssh, SSH2_MSG_KEXDH_INIT)) != 0 ||
  351. - (r = sshpkt_put_bignum2(ssh, kex->dh->pub_key)) != 0 ||
  352. + if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
  353. + goto out;
  354. + DH_get0_key(kex->dh, &pub_key, NULL);
  355. + if ((r = sshpkt_start(ssh, SSH2_MSG_KEXDH_INIT)) != 0 ||
  356. + (r = sshpkt_put_bignum2(ssh, pub_key)) != 0 ||
  357. (r = sshpkt_send(ssh)) != 0)
  358. goto out;
  359. #ifdef DEBUG_KEXDH
  360. DHparams_print_fp(stderr, kex->dh);
  361. fprintf(stderr, "pub= ");
  362. - BN_print_fp(stderr, kex->dh->pub_key);
  363. + BN_print_fp(stderr, pub_key);
  364. fprintf(stderr, "\n");
  365. #endif
  366. debug("expecting SSH2_MSG_KEXDH_REPLY");
  367. @@ -104,6 +107,7 @@ input_kex_dh(int type, u_int32_t seq, struct ssh *ssh)
  368. {
  369. struct kex *kex = ssh->kex;
  370. BIGNUM *dh_server_pub = NULL, *shared_secret = NULL;
  371. + const BIGNUM *pub_key;
  372. struct sshkey *server_host_key = NULL;
  373. u_char *kbuf = NULL, *server_host_key_blob = NULL, *signature = NULL;
  374. u_char hash[SSH_DIGEST_MAX_LENGTH];
  375. @@ -168,6 +172,7 @@ input_kex_dh(int type, u_int32_t seq, struct ssh *ssh)
  376. #endif
  377. /* calc and verify H */
  378. + DH_get0_key(kex->dh, &pub_key, NULL);
  379. hashlen = sizeof(hash);
  380. if ((r = kex_dh_hash(
  381. kex->hash_alg,
  382. @@ -176,7 +181,7 @@ input_kex_dh(int type, u_int32_t seq, struct ssh *ssh)
  383. sshbuf_ptr(kex->my), sshbuf_len(kex->my),
  384. sshbuf_ptr(kex->peer), sshbuf_len(kex->peer),
  385. server_host_key_blob, sbloblen,
  386. - kex->dh->pub_key,
  387. + pub_key,
  388. dh_server_pub,
  389. shared_secret,
  390. hash, &hashlen)) != 0)
  391. diff --git a/kexdhs.c b/kexdhs.c
  392. index 5dfca0a2..8367c6c3 100644
  393. --- a/kexdhs.c
  394. +++ b/kexdhs.c
  395. @@ -95,6 +95,7 @@ input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh)
  396. {
  397. struct kex *kex = ssh->kex;
  398. BIGNUM *shared_secret = NULL, *dh_client_pub = NULL;
  399. + const BIGNUM *pub_key;
  400. struct sshkey *server_host_public, *server_host_private;
  401. u_char *kbuf = NULL, *signature = NULL, *server_host_key_blob = NULL;
  402. u_char hash[SSH_DIGEST_MAX_LENGTH];
  403. @@ -121,6 +122,7 @@ input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh)
  404. r = SSH_ERR_ALLOC_FAIL;
  405. goto out;
  406. }
  407. + DH_get0_key(kex->dh, &pub_key, NULL);
  408. if ((r = sshpkt_get_bignum2(ssh, dh_client_pub)) != 0 ||
  409. (r = sshpkt_get_end(ssh)) != 0)
  410. goto out;
  411. @@ -130,12 +132,9 @@ input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh)
  412. BN_print_fp(stderr, dh_client_pub);
  413. fprintf(stderr, "\n");
  414. debug("bits %d", BN_num_bits(dh_client_pub));
  415. -#endif
  416. -
  417. -#ifdef DEBUG_KEXDH
  418. DHparams_print_fp(stderr, kex->dh);
  419. fprintf(stderr, "pub= ");
  420. - BN_print_fp(stderr, kex->dh->pub_key);
  421. + BN_print_fp(stderr, pub_key);
  422. fprintf(stderr, "\n");
  423. #endif
  424. if (!dh_pub_is_valid(kex->dh, dh_client_pub)) {
  425. @@ -171,7 +170,7 @@ input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh)
  426. sshbuf_ptr(kex->my), sshbuf_len(kex->my),
  427. server_host_key_blob, sbloblen,
  428. dh_client_pub,
  429. - kex->dh->pub_key,
  430. + pub_key,
  431. shared_secret,
  432. hash, &hashlen)) != 0)
  433. goto out;
  434. @@ -197,7 +196,7 @@ input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh)
  435. /* send server hostkey, DH pubkey 'f' and signed H */
  436. if ((r = sshpkt_start(ssh, SSH2_MSG_KEXDH_REPLY)) != 0 ||
  437. (r = sshpkt_put_string(ssh, server_host_key_blob, sbloblen)) != 0 ||
  438. - (r = sshpkt_put_bignum2(ssh, kex->dh->pub_key)) != 0 || /* f */
  439. + (r = sshpkt_put_bignum2(ssh, pub_key)) != 0 || /* f */
  440. (r = sshpkt_put_string(ssh, signature, slen)) != 0 ||
  441. (r = sshpkt_send(ssh)) != 0)
  442. goto out;
  443. diff --git a/kexgexc.c b/kexgexc.c
  444. index 762a9a32..955bc837 100644
  445. --- a/kexgexc.c
  446. +++ b/kexgexc.c
  447. @@ -93,6 +93,7 @@ input_kex_dh_gex_group(int type, u_int32_t seq, struct ssh *ssh)
  448. {
  449. struct kex *kex = ssh->kex;
  450. BIGNUM *p = NULL, *g = NULL;
  451. + const BIGNUM *pub_key;
  452. int r, bits;
  453. debug("got SSH2_MSG_KEX_DH_GEX_GROUP");
  454. @@ -118,16 +119,18 @@ input_kex_dh_gex_group(int type, u_int32_t seq, struct ssh *ssh)
  455. p = g = NULL; /* belong to kex->dh now */
  456. /* generate and send 'e', client DH public key */
  457. - if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0 ||
  458. - (r = sshpkt_start(ssh, SSH2_MSG_KEX_DH_GEX_INIT)) != 0 ||
  459. - (r = sshpkt_put_bignum2(ssh, kex->dh->pub_key)) != 0 ||
  460. + if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
  461. + goto out;
  462. + DH_get0_key(kex->dh, &pub_key, NULL);
  463. + if ((r = sshpkt_start(ssh, SSH2_MSG_KEX_DH_GEX_INIT)) != 0 ||
  464. + (r = sshpkt_put_bignum2(ssh, pub_key)) != 0 ||
  465. (r = sshpkt_send(ssh)) != 0)
  466. goto out;
  467. debug("SSH2_MSG_KEX_DH_GEX_INIT sent");
  468. #ifdef DEBUG_KEXDH
  469. DHparams_print_fp(stderr, kex->dh);
  470. fprintf(stderr, "pub= ");
  471. - BN_print_fp(stderr, kex->dh->pub_key);
  472. + BN_print_fp(stderr, pub_key);
  473. fprintf(stderr, "\n");
  474. #endif
  475. ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_GROUP, NULL);
  476. @@ -144,6 +147,7 @@ input_kex_dh_gex_reply(int type, u_int32_t seq, struct ssh *ssh)
  477. {
  478. struct kex *kex = ssh->kex;
  479. BIGNUM *dh_server_pub = NULL, *shared_secret = NULL;
  480. + const BIGNUM *pub_key, *dh_p, *dh_g;
  481. struct sshkey *server_host_key = NULL;
  482. u_char *kbuf = NULL, *signature = NULL, *server_host_key_blob = NULL;
  483. u_char hash[SSH_DIGEST_MAX_LENGTH];
  484. @@ -211,6 +215,8 @@ input_kex_dh_gex_reply(int type, u_int32_t seq, struct ssh *ssh)
  485. kex->min = kex->max = -1;
  486. /* calc and verify H */
  487. + DH_get0_key(kex->dh, &pub_key, NULL);
  488. + DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
  489. hashlen = sizeof(hash);
  490. if ((r = kexgex_hash(
  491. kex->hash_alg,
  492. @@ -220,8 +226,8 @@ input_kex_dh_gex_reply(int type, u_int32_t seq, struct ssh *ssh)
  493. sshbuf_ptr(kex->peer), sshbuf_len(kex->peer),
  494. server_host_key_blob, sbloblen,
  495. kex->min, kex->nbits, kex->max,
  496. - kex->dh->p, kex->dh->g,
  497. - kex->dh->pub_key,
  498. + dh_p, dh_g,
  499. + pub_key,
  500. dh_server_pub,
  501. shared_secret,
  502. hash, &hashlen)) != 0)
  503. diff --git a/kexgexs.c b/kexgexs.c
  504. index f6983fd6..2a4aa7e8 100644
  505. --- a/kexgexs.c
  506. +++ b/kexgexs.c
  507. @@ -72,6 +72,7 @@ input_kex_dh_gex_request(int type, u_int32_t seq, struct ssh *ssh)
  508. struct kex *kex = ssh->kex;
  509. int r;
  510. u_int min = 0, max = 0, nbits = 0;
  511. + const BIGNUM *dh_p, *dh_g;
  512. debug("SSH2_MSG_KEX_DH_GEX_REQUEST received");
  513. if ((r = sshpkt_get_u32(ssh, &min)) != 0 ||
  514. @@ -101,9 +102,10 @@ input_kex_dh_gex_request(int type, u_int32_t seq, struct ssh *ssh)
  515. goto out;
  516. }
  517. debug("SSH2_MSG_KEX_DH_GEX_GROUP sent");
  518. + DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
  519. if ((r = sshpkt_start(ssh, SSH2_MSG_KEX_DH_GEX_GROUP)) != 0 ||
  520. - (r = sshpkt_put_bignum2(ssh, kex->dh->p)) != 0 ||
  521. - (r = sshpkt_put_bignum2(ssh, kex->dh->g)) != 0 ||
  522. + (r = sshpkt_put_bignum2(ssh, dh_p)) != 0 ||
  523. + (r = sshpkt_put_bignum2(ssh, dh_g)) != 0 ||
  524. (r = sshpkt_send(ssh)) != 0)
  525. goto out;
  526. @@ -123,6 +125,7 @@ input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh)
  527. {
  528. struct kex *kex = ssh->kex;
  529. BIGNUM *shared_secret = NULL, *dh_client_pub = NULL;
  530. + const BIGNUM *pub_key, *dh_p, *dh_g;
  531. struct sshkey *server_host_public, *server_host_private;
  532. u_char *kbuf = NULL, *signature = NULL, *server_host_key_blob = NULL;
  533. u_char hash[SSH_DIGEST_MAX_LENGTH];
  534. @@ -153,17 +156,17 @@ input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh)
  535. (r = sshpkt_get_end(ssh)) != 0)
  536. goto out;
  537. + DH_get0_key(kex->dh, &pub_key, NULL);
  538. + DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
  539. +
  540. #ifdef DEBUG_KEXDH
  541. fprintf(stderr, "dh_client_pub= ");
  542. BN_print_fp(stderr, dh_client_pub);
  543. fprintf(stderr, "\n");
  544. debug("bits %d", BN_num_bits(dh_client_pub));
  545. -#endif
  546. -
  547. -#ifdef DEBUG_KEXDH
  548. DHparams_print_fp(stderr, kex->dh);
  549. fprintf(stderr, "pub= ");
  550. - BN_print_fp(stderr, kex->dh->pub_key);
  551. + BN_print_fp(stderr, pub_key);
  552. fprintf(stderr, "\n");
  553. #endif
  554. if (!dh_pub_is_valid(kex->dh, dh_client_pub)) {
  555. @@ -199,9 +202,9 @@ input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh)
  556. sshbuf_ptr(kex->my), sshbuf_len(kex->my),
  557. server_host_key_blob, sbloblen,
  558. kex->min, kex->nbits, kex->max,
  559. - kex->dh->p, kex->dh->g,
  560. + dh_p, dh_g,
  561. dh_client_pub,
  562. - kex->dh->pub_key,
  563. + pub_key,
  564. shared_secret,
  565. hash, &hashlen)) != 0)
  566. goto out;
  567. @@ -227,7 +230,7 @@ input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh)
  568. /* send server hostkey, DH pubkey 'f' and signed H */
  569. if ((r = sshpkt_start(ssh, SSH2_MSG_KEX_DH_GEX_REPLY)) != 0 ||
  570. (r = sshpkt_put_string(ssh, server_host_key_blob, sbloblen)) != 0 ||
  571. - (r = sshpkt_put_bignum2(ssh, kex->dh->pub_key)) != 0 || /* f */
  572. + (r = sshpkt_put_bignum2(ssh, pub_key)) != 0 || /* f */
  573. (r = sshpkt_put_string(ssh, signature, slen)) != 0 ||
  574. (r = sshpkt_send(ssh)) != 0)
  575. goto out;
  576. diff --git a/monitor.c b/monitor.c
  577. index d4b4b047..b30813b4 100644
  578. --- a/monitor.c
  579. +++ b/monitor.c
  580. @@ -566,6 +566,7 @@ int
  581. mm_answer_moduli(int sock, struct sshbuf *m)
  582. {
  583. DH *dh;
  584. + const BIGNUM *dh_p, *dh_g;
  585. int r;
  586. u_int min, want, max;
  587. @@ -590,9 +591,10 @@ mm_answer_moduli(int sock, struct sshbuf *m)
  588. return (0);
  589. } else {
  590. /* Send first bignum */
  591. + DH_get0_pqg(dh, &dh_p, NULL, &dh_g);
  592. if ((r = sshbuf_put_u8(m, 1)) != 0 ||
  593. - (r = sshbuf_put_bignum2(m, dh->p)) != 0 ||
  594. - (r = sshbuf_put_bignum2(m, dh->g)) != 0)
  595. + (r = sshbuf_put_bignum2(m, dh_p)) != 0 ||
  596. + (r = sshbuf_put_bignum2(m, dh_g)) != 0)
  597. fatal("%s: buffer error: %s", __func__, ssh_err(r));
  598. DH_free(dh);
  599. diff --git a/ssh-dss.c b/ssh-dss.c
  600. index 9f832ee2..631b1571 100644
  601. --- a/ssh-dss.c
  602. +++ b/ssh-dss.c
  603. @@ -51,6 +51,7 @@ ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
  604. const u_char *data, size_t datalen, u_int compat)
  605. {
  606. DSA_SIG *sig = NULL;
  607. + const BIGNUM *sig_r, *sig_s;
  608. u_char digest[SSH_DIGEST_MAX_LENGTH], sigblob[SIGBLOB_LEN];
  609. size_t rlen, slen, len, dlen = ssh_digest_bytes(SSH_DIGEST_SHA1);
  610. struct sshbuf *b = NULL;
  611. @@ -76,15 +77,16 @@ ssh_dss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
  612. goto out;
  613. }
  614. - rlen = BN_num_bytes(sig->r);
  615. - slen = BN_num_bytes(sig->s);
  616. + DSA_SIG_get0(sig, &sig_r, &sig_s);
  617. + rlen = BN_num_bytes(sig_r);
  618. + slen = BN_num_bytes(sig_s);
  619. if (rlen > INTBLOB_LEN || slen > INTBLOB_LEN) {
  620. ret = SSH_ERR_INTERNAL_ERROR;
  621. goto out;
  622. }
  623. explicit_bzero(sigblob, SIGBLOB_LEN);
  624. - BN_bn2bin(sig->r, sigblob + SIGBLOB_LEN - INTBLOB_LEN - rlen);
  625. - BN_bn2bin(sig->s, sigblob + SIGBLOB_LEN - slen);
  626. + BN_bn2bin(sig_r, sigblob + SIGBLOB_LEN - INTBLOB_LEN - rlen);
  627. + BN_bn2bin(sig_s, sigblob + SIGBLOB_LEN - slen);
  628. if ((b = sshbuf_new()) == NULL) {
  629. ret = SSH_ERR_ALLOC_FAIL;
  630. @@ -118,6 +120,7 @@ ssh_dss_verify(const struct sshkey *key,
  631. const u_char *data, size_t datalen, u_int compat)
  632. {
  633. DSA_SIG *sig = NULL;
  634. + BIGNUM *sig_r = NULL, *sig_s = NULL;
  635. u_char digest[SSH_DIGEST_MAX_LENGTH], *sigblob = NULL;
  636. size_t len, dlen = ssh_digest_bytes(SSH_DIGEST_SHA1);
  637. int ret = SSH_ERR_INTERNAL_ERROR;
  638. @@ -155,16 +158,21 @@ ssh_dss_verify(const struct sshkey *key,
  639. /* parse signature */
  640. if ((sig = DSA_SIG_new()) == NULL ||
  641. - (sig->r = BN_new()) == NULL ||
  642. - (sig->s = BN_new()) == NULL) {
  643. + (sig_r = BN_new()) == NULL ||
  644. + (sig_s = BN_new()) == NULL) {
  645. ret = SSH_ERR_ALLOC_FAIL;
  646. goto out;
  647. }
  648. - if ((BN_bin2bn(sigblob, INTBLOB_LEN, sig->r) == NULL) ||
  649. - (BN_bin2bn(sigblob+ INTBLOB_LEN, INTBLOB_LEN, sig->s) == NULL)) {
  650. + if ((BN_bin2bn(sigblob, INTBLOB_LEN, sig_r) == NULL) ||
  651. + (BN_bin2bn(sigblob + INTBLOB_LEN, INTBLOB_LEN, sig_s) == NULL)) {
  652. ret = SSH_ERR_LIBCRYPTO_ERROR;
  653. goto out;
  654. }
  655. + if (!DSA_SIG_set0(sig, sig_r, sig_s)) {
  656. + ret = SSH_ERR_LIBCRYPTO_ERROR;
  657. + goto out;
  658. + }
  659. + sig_r = sig_s = NULL; /* transferred */
  660. /* sha1 the data */
  661. if ((ret = ssh_digest_memory(SSH_DIGEST_SHA1, data, datalen,
  662. @@ -186,6 +194,8 @@ ssh_dss_verify(const struct sshkey *key,
  663. out:
  664. explicit_bzero(digest, sizeof(digest));
  665. DSA_SIG_free(sig);
  666. + BN_clear_free(sig_r);
  667. + BN_clear_free(sig_s);
  668. sshbuf_free(b);
  669. free(ktype);
  670. if (sigblob != NULL) {
  671. diff --git a/ssh-ecdsa.c b/ssh-ecdsa.c
  672. index 3d3b78d7..9e92af04 100644
  673. --- a/ssh-ecdsa.c
  674. +++ b/ssh-ecdsa.c
  675. @@ -49,6 +49,7 @@ ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
  676. const u_char *data, size_t datalen, u_int compat)
  677. {
  678. ECDSA_SIG *sig = NULL;
  679. + const BIGNUM *sig_r, *sig_s;
  680. int hash_alg;
  681. u_char digest[SSH_DIGEST_MAX_LENGTH];
  682. size_t len, dlen;
  683. @@ -80,8 +81,9 @@ ssh_ecdsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
  684. ret = SSH_ERR_ALLOC_FAIL;
  685. goto out;
  686. }
  687. - if ((ret = sshbuf_put_bignum2(bb, sig->r)) != 0 ||
  688. - (ret = sshbuf_put_bignum2(bb, sig->s)) != 0)
  689. + ECDSA_SIG_get0(sig, &sig_r, &sig_s);
  690. + if ((ret = sshbuf_put_bignum2(bb, sig_r)) != 0 ||
  691. + (ret = sshbuf_put_bignum2(bb, sig_s)) != 0)
  692. goto out;
  693. if ((ret = sshbuf_put_cstring(b, sshkey_ssh_name_plain(key))) != 0 ||
  694. (ret = sshbuf_put_stringb(b, bb)) != 0)
  695. @@ -112,6 +114,7 @@ ssh_ecdsa_verify(const struct sshkey *key,
  696. const u_char *data, size_t datalen, u_int compat)
  697. {
  698. ECDSA_SIG *sig = NULL;
  699. + BIGNUM *sig_r = NULL, *sig_s = NULL;
  700. int hash_alg;
  701. u_char digest[SSH_DIGEST_MAX_LENGTH];
  702. size_t dlen;
  703. @@ -146,15 +149,23 @@ ssh_ecdsa_verify(const struct sshkey *key,
  704. }
  705. /* parse signature */
  706. - if ((sig = ECDSA_SIG_new()) == NULL) {
  707. + if ((sig = ECDSA_SIG_new()) == NULL ||
  708. + (sig_r = BN_new()) == NULL ||
  709. + (sig_s = BN_new()) == NULL) {
  710. ret = SSH_ERR_ALLOC_FAIL;
  711. goto out;
  712. }
  713. - if (sshbuf_get_bignum2(sigbuf, sig->r) != 0 ||
  714. - sshbuf_get_bignum2(sigbuf, sig->s) != 0) {
  715. + if (sshbuf_get_bignum2(sigbuf, sig_r) != 0 ||
  716. + sshbuf_get_bignum2(sigbuf, sig_s) != 0) {
  717. ret = SSH_ERR_INVALID_FORMAT;
  718. goto out;
  719. }
  720. + if (!ECDSA_SIG_set0(sig, sig_r, sig_s)) {
  721. + ret = SSH_ERR_LIBCRYPTO_ERROR;
  722. + goto out;
  723. + }
  724. + sig_r = sig_s = NULL; /* transferred */
  725. +
  726. if (sshbuf_len(sigbuf) != 0) {
  727. ret = SSH_ERR_UNEXPECTED_TRAILING_DATA;
  728. goto out;
  729. @@ -180,6 +191,8 @@ ssh_ecdsa_verify(const struct sshkey *key,
  730. sshbuf_free(sigbuf);
  731. sshbuf_free(b);
  732. ECDSA_SIG_free(sig);
  733. + BN_clear_free(sig_r);
  734. + BN_clear_free(sig_s);
  735. free(ktype);
  736. return ret;
  737. }
  738. diff --git a/ssh-keygen.c b/ssh-keygen.c
  739. index 22860ad9..f240af66 100644
  740. --- a/ssh-keygen.c
  741. +++ b/ssh-keygen.c
  742. @@ -450,7 +450,10 @@ do_convert_private_ssh2_from_blob(u_char *blob, u_int blen)
  743. u_int magic, i1, i2, i3, i4;
  744. size_t slen;
  745. u_long e;
  746. -
  747. + BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL;
  748. + BIGNUM *dsa_pub_key = NULL, *dsa_priv_key = NULL;
  749. + BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
  750. + BIGNUM *rsa_p = NULL, *rsa_q = NULL, *rsa_iqmp = NULL;
  751. if ((b = sshbuf_from(blob, blen)) == NULL)
  752. fatal("%s: sshbuf_from failed", __func__);
  753. if ((r = sshbuf_get_u32(b, &magic)) != 0)
  754. @@ -494,11 +497,23 @@ do_convert_private_ssh2_from_blob(u_char *blob, u_int blen)
  755. switch (key->type) {
  756. case KEY_DSA:
  757. - buffer_get_bignum_bits(b, key->dsa->p);
  758. - buffer_get_bignum_bits(b, key->dsa->g);
  759. - buffer_get_bignum_bits(b, key->dsa->q);
  760. - buffer_get_bignum_bits(b, key->dsa->pub_key);
  761. - buffer_get_bignum_bits(b, key->dsa->priv_key);
  762. + if ((dsa_p = BN_new()) == NULL ||
  763. + (dsa_q = BN_new()) == NULL ||
  764. + (dsa_g = BN_new()) == NULL ||
  765. + (dsa_pub_key = BN_new()) == NULL ||
  766. + (dsa_priv_key = BN_new()) == NULL)
  767. + fatal("%s: BN_new", __func__);
  768. + buffer_get_bignum_bits(b, dsa_p);
  769. + buffer_get_bignum_bits(b, dsa_g);
  770. + buffer_get_bignum_bits(b, dsa_q);
  771. + buffer_get_bignum_bits(b, dsa_pub_key);
  772. + buffer_get_bignum_bits(b, dsa_priv_key);
  773. + if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g))
  774. + fatal("%s: DSA_set0_pqg failed", __func__);
  775. + dsa_p = dsa_q = dsa_g = NULL; /* transferred */
  776. + if (!DSA_set0_key(key->dsa, dsa_pub_key, dsa_priv_key))
  777. + fatal("%s: DSA_set0_key failed", __func__);
  778. + dsa_pub_key = dsa_priv_key = NULL; /* transferred */
  779. break;
  780. case KEY_RSA:
  781. if ((r = sshbuf_get_u8(b, &e1)) != 0 ||
  782. @@ -515,18 +530,34 @@ do_convert_private_ssh2_from_blob(u_char *blob, u_int blen)
  783. e += e3;
  784. debug("e %lx", e);
  785. }
  786. - if (!BN_set_word(key->rsa->e, e)) {
  787. + if ((rsa_e = BN_new()) == NULL)
  788. + fatal("%s: BN_new", __func__);
  789. + if (!BN_set_word(rsa_e, e)) {
  790. + BN_clear_free(rsa_e);
  791. sshbuf_free(b);
  792. sshkey_free(key);
  793. return NULL;
  794. }
  795. - buffer_get_bignum_bits(b, key->rsa->d);
  796. - buffer_get_bignum_bits(b, key->rsa->n);
  797. - buffer_get_bignum_bits(b, key->rsa->iqmp);
  798. - buffer_get_bignum_bits(b, key->rsa->q);
  799. - buffer_get_bignum_bits(b, key->rsa->p);
  800. - if ((r = ssh_rsa_generate_additional_parameters(key)) != 0)
  801. + if ((rsa_n = BN_new()) == NULL ||
  802. + (rsa_d = BN_new()) == NULL ||
  803. + (rsa_p = BN_new()) == NULL ||
  804. + (rsa_q = BN_new()) == NULL ||
  805. + (rsa_iqmp = BN_new()) == NULL)
  806. + fatal("%s: BN_new", __func__);
  807. + buffer_get_bignum_bits(b, rsa_d);
  808. + buffer_get_bignum_bits(b, rsa_n);
  809. + buffer_get_bignum_bits(b, rsa_iqmp);
  810. + buffer_get_bignum_bits(b, rsa_q);
  811. + buffer_get_bignum_bits(b, rsa_p);
  812. + if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, rsa_d))
  813. + fatal("%s: RSA_set0_key failed", __func__);
  814. + rsa_n = rsa_e = rsa_d = NULL; /* transferred */
  815. + if (!RSA_set0_factors(key->rsa, rsa_p, rsa_q))
  816. + fatal("%s: RSA_set0_factors failed", __func__);
  817. + rsa_p = rsa_q = NULL; /* transferred */
  818. + if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0)
  819. fatal("generate RSA parameters failed: %s", ssh_err(r));
  820. + BN_clear_free(rsa_iqmp);
  821. break;
  822. }
  823. rlen = sshbuf_len(b);
  824. @@ -634,7 +665,7 @@ do_convert_from_pkcs8(struct sshkey **k, int *private)
  825. identity_file);
  826. }
  827. fclose(fp);
  828. - switch (EVP_PKEY_type(pubkey->type)) {
  829. + switch (EVP_PKEY_base_id(pubkey)) {
  830. case EVP_PKEY_RSA:
  831. if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
  832. fatal("sshkey_new failed");
  833. @@ -658,7 +689,7 @@ do_convert_from_pkcs8(struct sshkey **k, int *private)
  834. #endif
  835. default:
  836. fatal("%s: unsupported pubkey type %d", __func__,
  837. - EVP_PKEY_type(pubkey->type));
  838. + EVP_PKEY_base_id(pubkey));
  839. }
  840. EVP_PKEY_free(pubkey);
  841. return;
  842. diff --git a/ssh-pkcs11-client.c b/ssh-pkcs11-client.c
  843. index 028b272c..bcc18c6b 100644
  844. --- a/ssh-pkcs11-client.c
  845. +++ b/ssh-pkcs11-client.c
  846. @@ -156,12 +156,14 @@ pkcs11_rsa_private_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa,
  847. static int
  848. wrap_key(RSA *rsa)
  849. {
  850. - static RSA_METHOD helper_rsa;
  851. + static RSA_METHOD *helper_rsa;
  852. - memcpy(&helper_rsa, RSA_get_default_method(), sizeof(helper_rsa));
  853. - helper_rsa.name = "ssh-pkcs11-helper";
  854. - helper_rsa.rsa_priv_enc = pkcs11_rsa_private_encrypt;
  855. - RSA_set_method(rsa, &helper_rsa);
  856. + if ((helper_rsa = RSA_meth_dup(RSA_get_default_method())) == NULL)
  857. + fatal("%s: RSA_meth_dup failed", __func__);
  858. + if (!RSA_meth_set1_name(helper_rsa, "ssh-pkcs11-helper") ||
  859. + !RSA_meth_set_priv_enc(helper_rsa, pkcs11_rsa_private_encrypt))
  860. + fatal("%s: failed to prepare method", __func__);
  861. + RSA_set_method(rsa, helper_rsa);
  862. return (0);
  863. }
  864. diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c
  865. index 65a7b589..c35f9415 100644
  866. --- a/ssh-pkcs11.c
  867. +++ b/ssh-pkcs11.c
  868. @@ -67,7 +67,7 @@ struct pkcs11_key {
  869. struct pkcs11_provider *provider;
  870. CK_ULONG slotidx;
  871. int (*orig_finish)(RSA *rsa);
  872. - RSA_METHOD rsa_method;
  873. + RSA_METHOD *rsa_method;
  874. char *keyid;
  875. int keyid_len;
  876. };
  877. @@ -182,6 +182,7 @@ pkcs11_rsa_finish(RSA *rsa)
  878. rv = k11->orig_finish(rsa);
  879. if (k11->provider)
  880. pkcs11_provider_unref(k11->provider);
  881. + RSA_meth_free(k11->rsa_method);
  882. free(k11->keyid);
  883. free(k11);
  884. }
  885. @@ -326,13 +327,18 @@ pkcs11_rsa_wrap(struct pkcs11_provider *provider, CK_ULONG slotidx,
  886. k11->keyid = xmalloc(k11->keyid_len);
  887. memcpy(k11->keyid, keyid_attrib->pValue, k11->keyid_len);
  888. }
  889. - k11->orig_finish = def->finish;
  890. - memcpy(&k11->rsa_method, def, sizeof(k11->rsa_method));
  891. - k11->rsa_method.name = "pkcs11";
  892. - k11->rsa_method.rsa_priv_enc = pkcs11_rsa_private_encrypt;
  893. - k11->rsa_method.rsa_priv_dec = pkcs11_rsa_private_decrypt;
  894. - k11->rsa_method.finish = pkcs11_rsa_finish;
  895. - RSA_set_method(rsa, &k11->rsa_method);
  896. + k11->rsa_method = RSA_meth_dup(def);
  897. + if (k11->rsa_method == NULL)
  898. + fatal("%s: RSA_meth_dup failed", __func__);
  899. + k11->orig_finish = RSA_meth_get_finish(def);
  900. + if (!RSA_meth_set1_name(k11->rsa_method, "pkcs11") ||
  901. + !RSA_meth_set_priv_enc(k11->rsa_method,
  902. + pkcs11_rsa_private_encrypt) ||
  903. + !RSA_meth_set_priv_dec(k11->rsa_method,
  904. + pkcs11_rsa_private_decrypt) ||
  905. + !RSA_meth_set_finish(k11->rsa_method, pkcs11_rsa_finish))
  906. + fatal("%s: setup pkcs11 method failed", __func__);
  907. + RSA_set_method(rsa, k11->rsa_method);
  908. RSA_set_app_data(rsa, k11);
  909. return (0);
  910. }
  911. @@ -444,6 +450,15 @@ pkcs11_key_included(struct sshkey ***keysp, int *nkeys, struct sshkey *key)
  912. return (0);
  913. }
  914. +static int
  915. +have_rsa_key(const RSA *rsa)
  916. +{
  917. + const BIGNUM *rsa_n, *rsa_e;
  918. +
  919. + RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL);
  920. + return rsa_n != NULL && rsa_e != NULL;
  921. +}
  922. +
  923. static int
  924. pkcs11_fetch_keys_filter(struct pkcs11_provider *p, CK_ULONG slotidx,
  925. CK_ATTRIBUTE filter[], CK_ATTRIBUTE attribs[3],
  926. @@ -512,10 +527,20 @@ pkcs11_fetch_keys_filter(struct pkcs11_provider *p, CK_ULONG slotidx,
  927. if ((rsa = RSA_new()) == NULL) {
  928. error("RSA_new failed");
  929. } else {
  930. - rsa->n = BN_bin2bn(attribs[1].pValue,
  931. + BIGNUM *rsa_n, *rsa_e;
  932. +
  933. + rsa_n = BN_bin2bn(attribs[1].pValue,
  934. attribs[1].ulValueLen, NULL);
  935. - rsa->e = BN_bin2bn(attribs[2].pValue,
  936. + rsa_e = BN_bin2bn(attribs[2].pValue,
  937. attribs[2].ulValueLen, NULL);
  938. + if (rsa_n != NULL && rsa_e != NULL) {
  939. + if (!RSA_set0_key(rsa,
  940. + rsa_n, rsa_e, NULL))
  941. + fatal("%s: set key", __func__);
  942. + rsa_n = rsa_e = NULL; /* transferred */
  943. + }
  944. + BN_free(rsa_n);
  945. + BN_free(rsa_e);
  946. }
  947. } else {
  948. cp = attribs[2].pValue;
  949. @@ -525,16 +550,16 @@ pkcs11_fetch_keys_filter(struct pkcs11_provider *p, CK_ULONG slotidx,
  950. == NULL) {
  951. error("d2i_X509 failed");
  952. } else if ((evp = X509_get_pubkey(x509)) == NULL ||
  953. - evp->type != EVP_PKEY_RSA ||
  954. - evp->pkey.rsa == NULL) {
  955. + EVP_PKEY_base_id(evp) != EVP_PKEY_RSA ||
  956. + EVP_PKEY_get0_RSA(evp) == NULL) {
  957. debug("X509_get_pubkey failed or no rsa");
  958. - } else if ((rsa = RSAPublicKey_dup(evp->pkey.rsa))
  959. - == NULL) {
  960. + } else if ((rsa = RSAPublicKey_dup(
  961. + EVP_PKEY_get0_RSA(evp))) == NULL) {
  962. error("RSAPublicKey_dup");
  963. }
  964. X509_free(x509);
  965. }
  966. - if (rsa && rsa->n && rsa->e &&
  967. + if (rsa && have_rsa_key(rsa) &&
  968. pkcs11_rsa_wrap(p, slotidx, &attribs[0], rsa) == 0) {
  969. if ((key = sshkey_new(KEY_UNSPEC)) == NULL)
  970. fatal("sshkey_new failed");
  971. diff --git a/ssh-rsa.c b/ssh-rsa.c
  972. index 1756315b..2788f334 100644
  973. --- a/ssh-rsa.c
  974. +++ b/ssh-rsa.c
  975. @@ -104,38 +104,55 @@ rsa_hash_alg_nid(int type)
  976. }
  977. int
  978. -ssh_rsa_generate_additional_parameters(struct sshkey *key)
  979. +ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp)
  980. {
  981. - BIGNUM *aux = NULL;
  982. + const BIGNUM *rsa_p, *rsa_q, *rsa_d;
  983. + BIGNUM *aux = NULL, *d_consttime = NULL;
  984. + BIGNUM *rsa_dmq1 = NULL, *rsa_dmp1 = NULL, *rsa_iqmp = NULL;
  985. BN_CTX *ctx = NULL;
  986. - BIGNUM d;
  987. int r;
  988. if (key == NULL || key->rsa == NULL ||
  989. sshkey_type_plain(key->type) != KEY_RSA)
  990. return SSH_ERR_INVALID_ARGUMENT;
  991. + RSA_get0_key(key->rsa, NULL, NULL, &rsa_d);
  992. + RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
  993. +
  994. if ((ctx = BN_CTX_new()) == NULL)
  995. return SSH_ERR_ALLOC_FAIL;
  996. - if ((aux = BN_new()) == NULL) {
  997. + if ((aux = BN_new()) == NULL ||
  998. + (rsa_dmq1 = BN_new()) == NULL ||
  999. + (rsa_dmp1 = BN_new()) == NULL)
  1000. + return SSH_ERR_ALLOC_FAIL;
  1001. + if ((d_consttime = BN_dup(rsa_d)) == NULL ||
  1002. + (rsa_iqmp = BN_dup(iqmp)) == NULL) {
  1003. r = SSH_ERR_ALLOC_FAIL;
  1004. goto out;
  1005. }
  1006. BN_set_flags(aux, BN_FLG_CONSTTIME);
  1007. + BN_set_flags(d_consttime, BN_FLG_CONSTTIME);
  1008. - BN_init(&d);
  1009. - BN_with_flags(&d, key->rsa->d, BN_FLG_CONSTTIME);
  1010. -
  1011. - if ((BN_sub(aux, key->rsa->q, BN_value_one()) == 0) ||
  1012. - (BN_mod(key->rsa->dmq1, &d, aux, ctx) == 0) ||
  1013. - (BN_sub(aux, key->rsa->p, BN_value_one()) == 0) ||
  1014. - (BN_mod(key->rsa->dmp1, &d, aux, ctx) == 0)) {
  1015. + if ((BN_sub(aux, rsa_q, BN_value_one()) == 0) ||
  1016. + (BN_mod(rsa_dmq1, d_consttime, aux, ctx) == 0) ||
  1017. + (BN_sub(aux, rsa_p, BN_value_one()) == 0) ||
  1018. + (BN_mod(rsa_dmp1, d_consttime, aux, ctx) == 0)) {
  1019. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1020. + goto out;
  1021. + }
  1022. + if (!RSA_set0_crt_params(key->rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp)) {
  1023. r = SSH_ERR_LIBCRYPTO_ERROR;
  1024. goto out;
  1025. }
  1026. + rsa_dmp1 = rsa_dmq1 = rsa_iqmp = NULL; /* transferred */
  1027. + /* success */
  1028. r = 0;
  1029. out:
  1030. BN_clear_free(aux);
  1031. + BN_clear_free(d_consttime);
  1032. + BN_clear_free(rsa_dmp1);
  1033. + BN_clear_free(rsa_dmq1);
  1034. + BN_clear_free(rsa_iqmp);
  1035. BN_CTX_free(ctx);
  1036. return r;
  1037. }
  1038. @@ -145,6 +162,7 @@ int
  1039. ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
  1040. const u_char *data, size_t datalen, const char *alg_ident)
  1041. {
  1042. + const BIGNUM *rsa_n;
  1043. u_char digest[SSH_DIGEST_MAX_LENGTH], *sig = NULL;
  1044. size_t slen = 0;
  1045. u_int dlen, len;
  1046. @@ -163,7 +181,8 @@ ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
  1047. if (key == NULL || key->rsa == NULL || hash_alg == -1 ||
  1048. sshkey_type_plain(key->type) != KEY_RSA)
  1049. return SSH_ERR_INVALID_ARGUMENT;
  1050. - if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
  1051. + RSA_get0_key(key->rsa, &rsa_n, NULL, NULL);
  1052. + if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
  1053. return SSH_ERR_KEY_LENGTH;
  1054. slen = RSA_size(key->rsa);
  1055. if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM)
  1056. @@ -225,6 +244,7 @@ ssh_rsa_verify(const struct sshkey *key,
  1057. const u_char *sig, size_t siglen, const u_char *data, size_t datalen,
  1058. const char *alg)
  1059. {
  1060. + const BIGNUM *rsa_n;
  1061. char *sigtype = NULL;
  1062. int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR;
  1063. size_t len = 0, diff, modlen, dlen;
  1064. @@ -235,7 +255,8 @@ ssh_rsa_verify(const struct sshkey *key,
  1065. sshkey_type_plain(key->type) != KEY_RSA ||
  1066. sig == NULL || siglen == 0)
  1067. return SSH_ERR_INVALID_ARGUMENT;
  1068. - if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
  1069. + RSA_get0_key(key->rsa, &rsa_n, NULL, NULL);
  1070. + if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
  1071. return SSH_ERR_KEY_LENGTH;
  1072. if ((b = sshbuf_from(sig, siglen)) == NULL)
  1073. diff --git a/sshd.c b/sshd.c
  1074. index a738c3ab..98beb1ed 100644
  1075. --- a/sshd.c
  1076. +++ b/sshd.c
  1077. @@ -493,8 +493,8 @@ demote_sensitive_data(void)
  1078. for (i = 0; i < options.num_host_key_files; i++) {
  1079. if (sensitive_data.host_keys[i]) {
  1080. - if ((r = sshkey_demote(sensitive_data.host_keys[i],
  1081. - &tmp)) != 0)
  1082. + if ((r = sshkey_from_private(
  1083. + sensitive_data.host_keys[i], &tmp)) != 0)
  1084. fatal("could not demote host %s key: %s",
  1085. sshkey_type(sensitive_data.host_keys[i]),
  1086. ssh_err(r));
  1087. @@ -1772,7 +1772,7 @@ main(int ac, char **av)
  1088. error("Error loading host key \"%s\": %s",
  1089. options.host_key_files[i], ssh_err(r));
  1090. if (pubkey == NULL && key != NULL)
  1091. - if ((r = sshkey_demote(key, &pubkey)) != 0)
  1092. + if ((r = sshkey_from_private(key, &pubkey)) != 0)
  1093. fatal("Could not demote key: \"%s\": %s",
  1094. options.host_key_files[i], ssh_err(r));
  1095. sensitive_data.host_keys[i] = key;
  1096. diff --git a/sshkey.c b/sshkey.c
  1097. index 72c08c7e..a5e6e60e 100644
  1098. --- a/sshkey.c
  1099. +++ b/sshkey.c
  1100. @@ -288,14 +288,24 @@ sshkey_names_valid2(const char *names, int allow_wildcard)
  1101. u_int
  1102. sshkey_size(const struct sshkey *k)
  1103. {
  1104. +#ifdef WITH_OPENSSL
  1105. + const BIGNUM *rsa_n, *dsa_p;
  1106. +#endif /* WITH_OPENSSL */
  1107. +
  1108. switch (k->type) {
  1109. #ifdef WITH_OPENSSL
  1110. case KEY_RSA:
  1111. case KEY_RSA_CERT:
  1112. - return BN_num_bits(k->rsa->n);
  1113. + if (k->rsa == NULL)
  1114. + return 0;
  1115. + RSA_get0_key(k->rsa, &rsa_n, NULL, NULL);
  1116. + return BN_num_bits(rsa_n);
  1117. case KEY_DSA:
  1118. case KEY_DSA_CERT:
  1119. - return BN_num_bits(k->dsa->p);
  1120. + if (k->dsa == NULL)
  1121. + return 0;
  1122. + DSA_get0_pqg(k->dsa, &dsa_p, NULL, NULL);
  1123. + return BN_num_bits(dsa_p);
  1124. case KEY_ECDSA:
  1125. case KEY_ECDSA_CERT:
  1126. return sshkey_curve_nid_to_bits(k->ecdsa_nid);
  1127. @@ -500,10 +510,7 @@ sshkey_new(int type)
  1128. #ifdef WITH_OPENSSL
  1129. case KEY_RSA:
  1130. case KEY_RSA_CERT:
  1131. - if ((rsa = RSA_new()) == NULL ||
  1132. - (rsa->n = BN_new()) == NULL ||
  1133. - (rsa->e = BN_new()) == NULL) {
  1134. - RSA_free(rsa);
  1135. + if ((rsa = RSA_new()) == NULL) {
  1136. free(k);
  1137. return NULL;
  1138. }
  1139. @@ -511,12 +518,7 @@ sshkey_new(int type)
  1140. break;
  1141. case KEY_DSA:
  1142. case KEY_DSA_CERT:
  1143. - if ((dsa = DSA_new()) == NULL ||
  1144. - (dsa->p = BN_new()) == NULL ||
  1145. - (dsa->q = BN_new()) == NULL ||
  1146. - (dsa->g = BN_new()) == NULL ||
  1147. - (dsa->pub_key = BN_new()) == NULL) {
  1148. - DSA_free(dsa);
  1149. + if ((dsa = DSA_new()) == NULL) {
  1150. free(k);
  1151. return NULL;
  1152. }
  1153. @@ -550,47 +552,7 @@ sshkey_new(int type)
  1154. return k;
  1155. }
  1156. -int
  1157. -sshkey_add_private(struct sshkey *k)
  1158. -{
  1159. - switch (k->type) {
  1160. -#ifdef WITH_OPENSSL
  1161. - case KEY_RSA:
  1162. - case KEY_RSA_CERT:
  1163. -#define bn_maybe_alloc_failed(p) (p == NULL && (p = BN_new()) == NULL)
  1164. - if (bn_maybe_alloc_failed(k->rsa->d) ||
  1165. - bn_maybe_alloc_failed(k->rsa->iqmp) ||
  1166. - bn_maybe_alloc_failed(k->rsa->q) ||
  1167. - bn_maybe_alloc_failed(k->rsa->p) ||
  1168. - bn_maybe_alloc_failed(k->rsa->dmq1) ||
  1169. - bn_maybe_alloc_failed(k->rsa->dmp1))
  1170. - return SSH_ERR_ALLOC_FAIL;
  1171. - break;
  1172. - case KEY_DSA:
  1173. - case KEY_DSA_CERT:
  1174. - if (bn_maybe_alloc_failed(k->dsa->priv_key))
  1175. - return SSH_ERR_ALLOC_FAIL;
  1176. - break;
  1177. -#undef bn_maybe_alloc_failed
  1178. - case KEY_ECDSA:
  1179. - case KEY_ECDSA_CERT:
  1180. - /* Cannot do anything until we know the group */
  1181. - break;
  1182. -#endif /* WITH_OPENSSL */
  1183. - case KEY_ED25519:
  1184. - case KEY_ED25519_CERT:
  1185. - case KEY_XMSS:
  1186. - case KEY_XMSS_CERT:
  1187. - /* no need to prealloc */
  1188. - break;
  1189. - case KEY_UNSPEC:
  1190. - break;
  1191. - default:
  1192. - return SSH_ERR_INVALID_ARGUMENT;
  1193. - }
  1194. - return 0;
  1195. -}
  1196. -
  1197. +/* XXX garbage-collect this API */
  1198. struct sshkey *
  1199. sshkey_new_private(int type)
  1200. {
  1201. @@ -598,10 +560,6 @@ sshkey_new_private(int type)
  1202. if (k == NULL)
  1203. return NULL;
  1204. - if (sshkey_add_private(k) != 0) {
  1205. - sshkey_free(k);
  1206. - return NULL;
  1207. - }
  1208. return k;
  1209. }
  1210. @@ -683,9 +641,15 @@ cert_compare(struct sshkey_cert *a, struct sshkey_cert *b)
  1211. int
  1212. sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
  1213. {
  1214. -#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
  1215. +#if defined(WITH_OPENSSL)
  1216. + const BIGNUM *rsa_e_a, *rsa_n_a;
  1217. + const BIGNUM *rsa_e_b, *rsa_n_b;
  1218. + const BIGNUM *dsa_p_a, *dsa_q_a, *dsa_g_a, *dsa_pub_key_a;
  1219. + const BIGNUM *dsa_p_b, *dsa_q_b, *dsa_g_b, *dsa_pub_key_b;
  1220. +# if defined(OPENSSL_HAS_ECC)
  1221. BN_CTX *bnctx;
  1222. -#endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
  1223. +# endif /* OPENSSL_HAS_ECC */
  1224. +#endif /* WITH_OPENSSL */
  1225. if (a == NULL || b == NULL ||
  1226. sshkey_type_plain(a->type) != sshkey_type_plain(b->type))
  1227. @@ -695,16 +659,24 @@ sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
  1228. #ifdef WITH_OPENSSL
  1229. case KEY_RSA_CERT:
  1230. case KEY_RSA:
  1231. - return a->rsa != NULL && b->rsa != NULL &&
  1232. - BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
  1233. - BN_cmp(a->rsa->n, b->rsa->n) == 0;
  1234. + if (a->rsa == NULL || b->rsa == NULL)
  1235. + return 0;
  1236. + RSA_get0_key(a->rsa, &rsa_n_a, &rsa_e_a, NULL);
  1237. + RSA_get0_key(b->rsa, &rsa_n_b, &rsa_e_b, NULL);
  1238. + return BN_cmp(rsa_e_a, rsa_e_b) == 0 &&
  1239. + BN_cmp(rsa_n_a, rsa_n_b) == 0;
  1240. case KEY_DSA_CERT:
  1241. case KEY_DSA:
  1242. - return a->dsa != NULL && b->dsa != NULL &&
  1243. - BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
  1244. - BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
  1245. - BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
  1246. - BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
  1247. + if (a->dsa == NULL || b->dsa == NULL)
  1248. + return 0;
  1249. + DSA_get0_pqg(a->dsa, &dsa_p_a, &dsa_q_a, &dsa_g_a);
  1250. + DSA_get0_pqg(b->dsa, &dsa_p_b, &dsa_q_b, &dsa_g_b);
  1251. + DSA_get0_key(a->dsa, &dsa_pub_key_a, NULL);
  1252. + DSA_get0_key(b->dsa, &dsa_pub_key_b, NULL);
  1253. + return BN_cmp(dsa_p_a, dsa_p_b) == 0 &&
  1254. + BN_cmp(dsa_q_a, dsa_q_b) == 0 &&
  1255. + BN_cmp(dsa_g_a, dsa_g_b) == 0 &&
  1256. + BN_cmp(dsa_pub_key_a, dsa_pub_key_b) == 0;
  1257. # ifdef OPENSSL_HAS_ECC
  1258. case KEY_ECDSA_CERT:
  1259. case KEY_ECDSA:
  1260. @@ -761,6 +733,9 @@ to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
  1261. {
  1262. int type, ret = SSH_ERR_INTERNAL_ERROR;
  1263. const char *typename;
  1264. +#ifdef WITH_OPENSSL
  1265. + const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
  1266. +#endif /* WITH_OPENSSL */
  1267. if (key == NULL)
  1268. return SSH_ERR_INVALID_ARGUMENT;
  1269. @@ -793,11 +768,13 @@ to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
  1270. case KEY_DSA:
  1271. if (key->dsa == NULL)
  1272. return SSH_ERR_INVALID_ARGUMENT;
  1273. + DSA_get0_pqg(key->dsa, &dsa_p, &dsa_q, &dsa_g);
  1274. + DSA_get0_key(key->dsa, &dsa_pub_key, NULL);
  1275. if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
  1276. - (ret = sshbuf_put_bignum2(b, key->dsa->p)) != 0 ||
  1277. - (ret = sshbuf_put_bignum2(b, key->dsa->q)) != 0 ||
  1278. - (ret = sshbuf_put_bignum2(b, key->dsa->g)) != 0 ||
  1279. - (ret = sshbuf_put_bignum2(b, key->dsa->pub_key)) != 0)
  1280. + (ret = sshbuf_put_bignum2(b, dsa_p)) != 0 ||
  1281. + (ret = sshbuf_put_bignum2(b, dsa_q)) != 0 ||
  1282. + (ret = sshbuf_put_bignum2(b, dsa_g)) != 0 ||
  1283. + (ret = sshbuf_put_bignum2(b, dsa_pub_key)) != 0)
  1284. return ret;
  1285. break;
  1286. # ifdef OPENSSL_HAS_ECC
  1287. @@ -814,9 +791,10 @@ to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
  1288. case KEY_RSA:
  1289. if (key->rsa == NULL)
  1290. return SSH_ERR_INVALID_ARGUMENT;
  1291. + RSA_get0_key(key->rsa, &rsa_n, &rsa_e, NULL);
  1292. if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
  1293. - (ret = sshbuf_put_bignum2(b, key->rsa->e)) != 0 ||
  1294. - (ret = sshbuf_put_bignum2(b, key->rsa->n)) != 0)
  1295. + (ret = sshbuf_put_bignum2(b, rsa_e)) != 0 ||
  1296. + (ret = sshbuf_put_bignum2(b, rsa_n)) != 0)
  1297. return ret;
  1298. break;
  1299. #endif /* WITH_OPENSSL */
  1300. @@ -1750,59 +1728,95 @@ sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
  1301. {
  1302. struct sshkey *n = NULL;
  1303. int ret = SSH_ERR_INTERNAL_ERROR;
  1304. + int r = SSH_ERR_INTERNAL_ERROR;
  1305. +#ifdef WITH_OPENSSL
  1306. + const BIGNUM *rsa_n, *rsa_e;
  1307. + BIGNUM *rsa_n_dup = NULL, *rsa_e_dup = NULL;
  1308. + const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
  1309. + BIGNUM *dsa_p_dup = NULL, *dsa_q_dup = NULL, *dsa_g_dup = NULL;
  1310. + BIGNUM *dsa_pub_key_dup = NULL;
  1311. +#endif /* WITH_OPENSSL */
  1312. *pkp = NULL;
  1313. switch (k->type) {
  1314. #ifdef WITH_OPENSSL
  1315. case KEY_DSA:
  1316. case KEY_DSA_CERT:
  1317. - if ((n = sshkey_new(k->type)) == NULL)
  1318. - return SSH_ERR_ALLOC_FAIL;
  1319. - if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
  1320. - (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
  1321. - (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
  1322. - (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL)) {
  1323. - sshkey_free(n);
  1324. - return SSH_ERR_ALLOC_FAIL;
  1325. + if ((n = sshkey_new(k->type)) == NULL) {
  1326. + r = SSH_ERR_ALLOC_FAIL;
  1327. + goto out;
  1328. + }
  1329. +
  1330. + DSA_get0_pqg(k->dsa, &dsa_p, &dsa_q, &dsa_g);
  1331. + DSA_get0_key(k->dsa, &dsa_pub_key, NULL);
  1332. + if ((dsa_p_dup = BN_dup(dsa_p)) == NULL ||
  1333. + (dsa_q_dup = BN_dup(dsa_q)) == NULL ||
  1334. + (dsa_g_dup = BN_dup(dsa_g)) == NULL ||
  1335. + (dsa_pub_key_dup = BN_dup(dsa_pub_key)) == NULL) {
  1336. + r = SSH_ERR_ALLOC_FAIL;
  1337. + goto out;
  1338. + }
  1339. + if (!DSA_set0_pqg(n->dsa, dsa_p_dup, dsa_q_dup, dsa_g_dup)) {
  1340. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1341. + goto out;
  1342. + }
  1343. + dsa_p_dup = dsa_q_dup = dsa_g_dup = NULL; /* transferred */
  1344. + if (!DSA_set0_key(n->dsa, dsa_pub_key_dup, NULL)) {
  1345. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1346. + goto out;
  1347. }
  1348. + dsa_pub_key_dup = NULL; /* transferred */
  1349. +
  1350. break;
  1351. # ifdef OPENSSL_HAS_ECC
  1352. case KEY_ECDSA:
  1353. case KEY_ECDSA_CERT:
  1354. - if ((n = sshkey_new(k->type)) == NULL)
  1355. - return SSH_ERR_ALLOC_FAIL;
  1356. + if ((n = sshkey_new(k->type)) == NULL) {
  1357. + r = SSH_ERR_ALLOC_FAIL;
  1358. + goto out;
  1359. + }
  1360. n->ecdsa_nid = k->ecdsa_nid;
  1361. n->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
  1362. if (n->ecdsa == NULL) {
  1363. - sshkey_free(n);
  1364. - return SSH_ERR_ALLOC_FAIL;
  1365. + r = SSH_ERR_ALLOC_FAIL;
  1366. + goto out;
  1367. }
  1368. if (EC_KEY_set_public_key(n->ecdsa,
  1369. EC_KEY_get0_public_key(k->ecdsa)) != 1) {
  1370. - sshkey_free(n);
  1371. - return SSH_ERR_LIBCRYPTO_ERROR;
  1372. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1373. + goto out;
  1374. }
  1375. break;
  1376. # endif /* OPENSSL_HAS_ECC */
  1377. case KEY_RSA:
  1378. case KEY_RSA_CERT:
  1379. - if ((n = sshkey_new(k->type)) == NULL)
  1380. - return SSH_ERR_ALLOC_FAIL;
  1381. - if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
  1382. - (BN_copy(n->rsa->e, k->rsa->e) == NULL)) {
  1383. - sshkey_free(n);
  1384. - return SSH_ERR_ALLOC_FAIL;
  1385. + if ((n = sshkey_new(k->type)) == NULL) {
  1386. + r = SSH_ERR_ALLOC_FAIL;
  1387. + goto out;
  1388. }
  1389. + RSA_get0_key(k->rsa, &rsa_n, &rsa_e, NULL);
  1390. + if ((rsa_n_dup = BN_dup(rsa_n)) == NULL ||
  1391. + (rsa_e_dup = BN_dup(rsa_e)) == NULL) {
  1392. + r = SSH_ERR_ALLOC_FAIL;
  1393. + goto out;
  1394. + }
  1395. + if (!RSA_set0_key(n->rsa, rsa_n_dup, rsa_e_dup, NULL)) {
  1396. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1397. + goto out;
  1398. + }
  1399. + rsa_n_dup = rsa_e_dup = NULL; /* transferred */
  1400. break;
  1401. #endif /* WITH_OPENSSL */
  1402. case KEY_ED25519:
  1403. case KEY_ED25519_CERT:
  1404. - if ((n = sshkey_new(k->type)) == NULL)
  1405. - return SSH_ERR_ALLOC_FAIL;
  1406. + if ((n = sshkey_new(k->type)) == NULL) {
  1407. + r = SSH_ERR_ALLOC_FAIL;
  1408. + goto out;
  1409. + }
  1410. if (k->ed25519_pk != NULL) {
  1411. if ((n->ed25519_pk = malloc(ED25519_PK_SZ)) == NULL) {
  1412. - sshkey_free(n);
  1413. - return SSH_ERR_ALLOC_FAIL;
  1414. + r = SSH_ERR_ALLOC_FAIL;
  1415. + goto out;
  1416. }
  1417. memcpy(n->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
  1418. }
  1419. @@ -1810,37 +1824,46 @@ sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
  1420. #ifdef WITH_XMSS
  1421. case KEY_XMSS:
  1422. case KEY_XMSS_CERT:
  1423. - if ((n = sshkey_new(k->type)) == NULL)
  1424. - return SSH_ERR_ALLOC_FAIL;
  1425. - if ((ret = sshkey_xmss_init(n, k->xmss_name)) != 0) {
  1426. - sshkey_free(n);
  1427. - return ret;
  1428. + if ((n = sshkey_new(k->type)) == NULL) {
  1429. + r = SSH_ERR_ALLOC_FAIL;
  1430. + goto out;
  1431. }
  1432. + if ((r = sshkey_xmss_init(n, k->xmss_name)) != 0)
  1433. + goto out;
  1434. if (k->xmss_pk != NULL) {
  1435. size_t pklen = sshkey_xmss_pklen(k);
  1436. if (pklen == 0 || sshkey_xmss_pklen(n) != pklen) {
  1437. - sshkey_free(n);
  1438. - return SSH_ERR_INTERNAL_ERROR;
  1439. + r = SSH_ERR_INTERNAL_ERROR;
  1440. + goto out;
  1441. }
  1442. if ((n->xmss_pk = malloc(pklen)) == NULL) {
  1443. - sshkey_free(n);
  1444. - return SSH_ERR_ALLOC_FAIL;
  1445. + r = SSH_ERR_ALLOC_FAIL;
  1446. + goto out;
  1447. }
  1448. memcpy(n->xmss_pk, k->xmss_pk, pklen);
  1449. }
  1450. break;
  1451. #endif /* WITH_XMSS */
  1452. default:
  1453. - return SSH_ERR_KEY_TYPE_UNKNOWN;
  1454. - }
  1455. - if (sshkey_is_cert(k)) {
  1456. - if ((ret = sshkey_cert_copy(k, n)) != 0) {
  1457. - sshkey_free(n);
  1458. - return ret;
  1459. - }
  1460. + r = SSH_ERR_KEY_TYPE_UNKNOWN;
  1461. + goto out;
  1462. }
  1463. + if (sshkey_is_cert(k) && (r = sshkey_cert_copy(k, n)) != 0)
  1464. + goto out;
  1465. + /* success */
  1466. *pkp = n;
  1467. - return 0;
  1468. + n = NULL;
  1469. + r = 0;
  1470. + out:
  1471. + sshkey_free(n);
  1472. + BN_clear_free(rsa_n_dup);
  1473. + BN_clear_free(rsa_e_dup);
  1474. + BN_clear_free(dsa_p_dup);
  1475. + BN_clear_free(dsa_q_dup);
  1476. + BN_clear_free(dsa_g_dup);
  1477. + BN_clear_free(dsa_pub_key_dup);
  1478. +
  1479. + return r;
  1480. }
  1481. static int
  1482. @@ -1966,6 +1989,17 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
  1483. return ret;
  1484. }
  1485. +static int
  1486. +check_rsa_length(const RSA *rsa)
  1487. +{
  1488. + const BIGNUM *rsa_n;
  1489. +
  1490. + RSA_get0_key(rsa, &rsa_n, NULL, NULL);
  1491. + if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
  1492. + return SSH_ERR_KEY_LENGTH;
  1493. + return 0;
  1494. +}
  1495. +
  1496. static int
  1497. sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
  1498. int allow_cert)
  1499. @@ -1976,9 +2010,13 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
  1500. size_t len;
  1501. u_char *pk = NULL;
  1502. struct sshbuf *copy;
  1503. -#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
  1504. +#if defined(WITH_OPENSSL)
  1505. + BIGNUM *rsa_n = NULL, *rsa_e = NULL;
  1506. + BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL, *dsa_pub_key = NULL;
  1507. +# if defined(OPENSSL_HAS_ECC)
  1508. EC_POINT *q = NULL;
  1509. -#endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
  1510. +# endif /* OPENSSL_HAS_ECC */
  1511. +#endif /* WITH_OPENSSL */
  1512. #ifdef DEBUG_PK /* XXX */
  1513. sshbuf_dump(b, stderr);
  1514. @@ -2013,15 +2051,23 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
  1515. ret = SSH_ERR_ALLOC_FAIL;
  1516. goto out;
  1517. }
  1518. - if (sshbuf_get_bignum2(b, key->rsa->e) != 0 ||
  1519. - sshbuf_get_bignum2(b, key->rsa->n) != 0) {
  1520. + if ((rsa_e = BN_new()) == NULL ||
  1521. + (rsa_n = BN_new()) == NULL) {
  1522. + ret = SSH_ERR_ALLOC_FAIL;
  1523. + goto out;
  1524. + }
  1525. + if (sshbuf_get_bignum2(b, rsa_e) != 0 ||
  1526. + sshbuf_get_bignum2(b, rsa_n) != 0) {
  1527. ret = SSH_ERR_INVALID_FORMAT;
  1528. goto out;
  1529. }
  1530. - if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
  1531. - ret = SSH_ERR_KEY_LENGTH;
  1532. + if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, NULL)) {
  1533. + ret = SSH_ERR_LIBCRYPTO_ERROR;
  1534. goto out;
  1535. }
  1536. + rsa_n = rsa_e = NULL; /* transferred */
  1537. + if ((ret = check_rsa_length(key->rsa)) != 0)
  1538. + goto out;
  1539. #ifdef DEBUG_PK
  1540. RSA_print_fp(stderr, key->rsa, 8);
  1541. #endif
  1542. @@ -2038,13 +2084,30 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
  1543. ret = SSH_ERR_ALLOC_FAIL;
  1544. goto out;
  1545. }
  1546. - if (sshbuf_get_bignum2(b, key->dsa->p) != 0 ||
  1547. - sshbuf_get_bignum2(b, key->dsa->q) != 0 ||
  1548. - sshbuf_get_bignum2(b, key->dsa->g) != 0 ||
  1549. - sshbuf_get_bignum2(b, key->dsa->pub_key) != 0) {
  1550. + if ((dsa_p = BN_new()) == NULL ||
  1551. + (dsa_q = BN_new()) == NULL ||
  1552. + (dsa_g = BN_new()) == NULL ||
  1553. + (dsa_pub_key = BN_new()) == NULL) {
  1554. + ret = SSH_ERR_ALLOC_FAIL;
  1555. + goto out;
  1556. + }
  1557. + if (sshbuf_get_bignum2(b, dsa_p) != 0 ||
  1558. + sshbuf_get_bignum2(b, dsa_q) != 0 ||
  1559. + sshbuf_get_bignum2(b, dsa_g) != 0 ||
  1560. + sshbuf_get_bignum2(b, dsa_pub_key) != 0) {
  1561. ret = SSH_ERR_INVALID_FORMAT;
  1562. goto out;
  1563. }
  1564. + if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g)) {
  1565. + ret = SSH_ERR_LIBCRYPTO_ERROR;
  1566. + goto out;
  1567. + }
  1568. + dsa_p = dsa_q = dsa_g = NULL; /* transferred */
  1569. + if (!DSA_set0_key(key->dsa, dsa_pub_key, NULL)) {
  1570. + ret = SSH_ERR_LIBCRYPTO_ERROR;
  1571. + goto out;
  1572. + }
  1573. + dsa_pub_key = NULL; /* transferred */
  1574. #ifdef DEBUG_PK
  1575. DSA_print_fp(stderr, key->dsa, 8);
  1576. #endif
  1577. @@ -2178,9 +2241,17 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
  1578. free(ktype);
  1579. free(curve);
  1580. free(pk);
  1581. -#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
  1582. +#if defined(WITH_OPENSSL)
  1583. + BN_clear_free(rsa_n);
  1584. + BN_clear_free(rsa_e);
  1585. + BN_clear_free(dsa_p);
  1586. + BN_clear_free(dsa_q);
  1587. + BN_clear_free(dsa_g);
  1588. + BN_clear_free(dsa_pub_key);
  1589. +# if defined(OPENSSL_HAS_ECC)
  1590. EC_POINT_free(q);
  1591. -#endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
  1592. +# endif /* OPENSSL_HAS_ECC */
  1593. +#endif /* WITH_OPENSSL */
  1594. return ret;
  1595. }
  1596. @@ -2361,120 +2432,6 @@ sshkey_verify(const struct sshkey *key,
  1597. }
  1598. }
  1599. -/* Converts a private to a public key */
  1600. -int
  1601. -sshkey_demote(const struct sshkey *k, struct sshkey **dkp)
  1602. -{
  1603. - struct sshkey *pk;
  1604. - int ret = SSH_ERR_INTERNAL_ERROR;
  1605. -
  1606. - *dkp = NULL;
  1607. - if ((pk = calloc(1, sizeof(*pk))) == NULL)
  1608. - return SSH_ERR_ALLOC_FAIL;
  1609. - pk->type = k->type;
  1610. - pk->flags = k->flags;
  1611. - pk->ecdsa_nid = k->ecdsa_nid;
  1612. - pk->dsa = NULL;
  1613. - pk->ecdsa = NULL;
  1614. - pk->rsa = NULL;
  1615. - pk->ed25519_pk = NULL;
  1616. - pk->ed25519_sk = NULL;
  1617. - pk->xmss_pk = NULL;
  1618. - pk->xmss_sk = NULL;
  1619. -
  1620. - switch (k->type) {
  1621. -#ifdef WITH_OPENSSL
  1622. - case KEY_RSA_CERT:
  1623. - if ((ret = sshkey_cert_copy(k, pk)) != 0)
  1624. - goto fail;
  1625. - /* FALLTHROUGH */
  1626. - case KEY_RSA:
  1627. - if ((pk->rsa = RSA_new()) == NULL ||
  1628. - (pk->rsa->e = BN_dup(k->rsa->e)) == NULL ||
  1629. - (pk->rsa->n = BN_dup(k->rsa->n)) == NULL) {
  1630. - ret = SSH_ERR_ALLOC_FAIL;
  1631. - goto fail;
  1632. - }
  1633. - break;
  1634. - case KEY_DSA_CERT:
  1635. - if ((ret = sshkey_cert_copy(k, pk)) != 0)
  1636. - goto fail;
  1637. - /* FALLTHROUGH */
  1638. - case KEY_DSA:
  1639. - if ((pk->dsa = DSA_new()) == NULL ||
  1640. - (pk->dsa->p = BN_dup(k->dsa->p)) == NULL ||
  1641. - (pk->dsa->q = BN_dup(k->dsa->q)) == NULL ||
  1642. - (pk->dsa->g = BN_dup(k->dsa->g)) == NULL ||
  1643. - (pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL) {
  1644. - ret = SSH_ERR_ALLOC_FAIL;
  1645. - goto fail;
  1646. - }
  1647. - break;
  1648. - case KEY_ECDSA_CERT:
  1649. - if ((ret = sshkey_cert_copy(k, pk)) != 0)
  1650. - goto fail;
  1651. - /* FALLTHROUGH */
  1652. -# ifdef OPENSSL_HAS_ECC
  1653. - case KEY_ECDSA:
  1654. - pk->ecdsa = EC_KEY_new_by_curve_name(pk->ecdsa_nid);
  1655. - if (pk->ecdsa == NULL) {
  1656. - ret = SSH_ERR_ALLOC_FAIL;
  1657. - goto fail;
  1658. - }
  1659. - if (EC_KEY_set_public_key(pk->ecdsa,
  1660. - EC_KEY_get0_public_key(k->ecdsa)) != 1) {
  1661. - ret = SSH_ERR_LIBCRYPTO_ERROR;
  1662. - goto fail;
  1663. - }
  1664. - break;
  1665. -# endif /* OPENSSL_HAS_ECC */
  1666. -#endif /* WITH_OPENSSL */
  1667. - case KEY_ED25519_CERT:
  1668. - if ((ret = sshkey_cert_copy(k, pk)) != 0)
  1669. - goto fail;
  1670. - /* FALLTHROUGH */
  1671. - case KEY_ED25519:
  1672. - if (k->ed25519_pk != NULL) {
  1673. - if ((pk->ed25519_pk = malloc(ED25519_PK_SZ)) == NULL) {
  1674. - ret = SSH_ERR_ALLOC_FAIL;
  1675. - goto fail;
  1676. - }
  1677. - memcpy(pk->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
  1678. - }
  1679. - break;
  1680. -#ifdef WITH_XMSS
  1681. - case KEY_XMSS_CERT:
  1682. - if ((ret = sshkey_cert_copy(k, pk)) != 0)
  1683. - goto fail;
  1684. - /* FALLTHROUGH */
  1685. - case KEY_XMSS:
  1686. - if ((ret = sshkey_xmss_init(pk, k->xmss_name)) != 0)
  1687. - goto fail;
  1688. - if (k->xmss_pk != NULL) {
  1689. - size_t pklen = sshkey_xmss_pklen(k);
  1690. -
  1691. - if (pklen == 0 || sshkey_xmss_pklen(pk) != pklen) {
  1692. - ret = SSH_ERR_INTERNAL_ERROR;
  1693. - goto fail;
  1694. - }
  1695. - if ((pk->xmss_pk = malloc(pklen)) == NULL) {
  1696. - ret = SSH_ERR_ALLOC_FAIL;
  1697. - goto fail;
  1698. - }
  1699. - memcpy(pk->xmss_pk, k->xmss_pk, pklen);
  1700. - }
  1701. - break;
  1702. -#endif /* WITH_XMSS */
  1703. - default:
  1704. - ret = SSH_ERR_KEY_TYPE_UNKNOWN;
  1705. - fail:
  1706. - sshkey_free(pk);
  1707. - return ret;
  1708. - }
  1709. - *dkp = pk;
  1710. - return 0;
  1711. -}
  1712. -
  1713. /* Convert a plain key to their _CERT equivalent */
  1714. int
  1715. sshkey_to_certified(struct sshkey *k)
  1716. @@ -2532,6 +2489,9 @@ sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
  1717. size_t i, ca_len, sig_len;
  1718. int ret = SSH_ERR_INTERNAL_ERROR;
  1719. struct sshbuf *cert;
  1720. +#ifdef WITH_OPENSSL
  1721. + const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key;
  1722. +#endif /* WITH_OPENSSL */
  1723. if (k == NULL || k->cert == NULL ||
  1724. k->cert->certblob == NULL || ca == NULL)
  1725. @@ -2558,10 +2518,12 @@ sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
  1726. switch (k->type) {
  1727. #ifdef WITH_OPENSSL
  1728. case KEY_DSA_CERT:
  1729. - if ((ret = sshbuf_put_bignum2(cert, k->dsa->p)) != 0 ||
  1730. - (ret = sshbuf_put_bignum2(cert, k->dsa->q)) != 0 ||
  1731. - (ret = sshbuf_put_bignum2(cert, k->dsa->g)) != 0 ||
  1732. - (ret = sshbuf_put_bignum2(cert, k->dsa->pub_key)) != 0)
  1733. + DSA_get0_pqg(k->dsa, &dsa_p, &dsa_q, &dsa_g);
  1734. + DSA_get0_key(k->dsa, &dsa_pub_key, NULL);
  1735. + if ((ret = sshbuf_put_bignum2(cert, dsa_p)) != 0 ||
  1736. + (ret = sshbuf_put_bignum2(cert, dsa_q)) != 0 ||
  1737. + (ret = sshbuf_put_bignum2(cert, dsa_g)) != 0 ||
  1738. + (ret = sshbuf_put_bignum2(cert, dsa_pub_key)) != 0)
  1739. goto out;
  1740. break;
  1741. # ifdef OPENSSL_HAS_ECC
  1742. @@ -2575,8 +2537,9 @@ sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
  1743. break;
  1744. # endif /* OPENSSL_HAS_ECC */
  1745. case KEY_RSA_CERT:
  1746. - if ((ret = sshbuf_put_bignum2(cert, k->rsa->e)) != 0 ||
  1747. - (ret = sshbuf_put_bignum2(cert, k->rsa->n)) != 0)
  1748. + RSA_get0_key(k->rsa, &rsa_n, &rsa_e, NULL);
  1749. + if ((ret = sshbuf_put_bignum2(cert, rsa_e)) != 0 ||
  1750. + (ret = sshbuf_put_bignum2(cert, rsa_n)) != 0)
  1751. goto out;
  1752. break;
  1753. #endif /* WITH_OPENSSL */
  1754. @@ -2758,18 +2721,25 @@ sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
  1755. enum sshkey_serialize_rep opts)
  1756. {
  1757. int r = SSH_ERR_INTERNAL_ERROR;
  1758. +#ifdef WITH_OPENSSL
  1759. + const BIGNUM *rsa_n, *rsa_e, *rsa_d, *rsa_iqmp, *rsa_p, *rsa_q;
  1760. + const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key, *dsa_priv_key;
  1761. +#endif /* WITH_OPENSSL */
  1762. if ((r = sshbuf_put_cstring(b, sshkey_ssh_name(key))) != 0)
  1763. goto out;
  1764. switch (key->type) {
  1765. #ifdef WITH_OPENSSL
  1766. case KEY_RSA:
  1767. - if ((r = sshbuf_put_bignum2(b, key->rsa->n)) != 0 ||
  1768. - (r = sshbuf_put_bignum2(b, key->rsa->e)) != 0 ||
  1769. - (r = sshbuf_put_bignum2(b, key->rsa->d)) != 0 ||
  1770. - (r = sshbuf_put_bignum2(b, key->rsa->iqmp)) != 0 ||
  1771. - (r = sshbuf_put_bignum2(b, key->rsa->p)) != 0 ||
  1772. - (r = sshbuf_put_bignum2(b, key->rsa->q)) != 0)
  1773. + RSA_get0_key(key->rsa, &rsa_n, &rsa_e, &rsa_d);
  1774. + RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
  1775. + RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp);
  1776. + if ((r = sshbuf_put_bignum2(b, rsa_n)) != 0 ||
  1777. + (r = sshbuf_put_bignum2(b, rsa_e)) != 0 ||
  1778. + (r = sshbuf_put_bignum2(b, rsa_d)) != 0 ||
  1779. + (r = sshbuf_put_bignum2(b, rsa_iqmp)) != 0 ||
  1780. + (r = sshbuf_put_bignum2(b, rsa_p)) != 0 ||
  1781. + (r = sshbuf_put_bignum2(b, rsa_q)) != 0)
  1782. goto out;
  1783. break;
  1784. case KEY_RSA_CERT:
  1785. @@ -2777,19 +2747,24 @@ sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
  1786. r = SSH_ERR_INVALID_ARGUMENT;
  1787. goto out;
  1788. }
  1789. + RSA_get0_key(key->rsa, NULL, NULL, &rsa_d);
  1790. + RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
  1791. + RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp);
  1792. if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
  1793. - (r = sshbuf_put_bignum2(b, key->rsa->d)) != 0 ||
  1794. - (r = sshbuf_put_bignum2(b, key->rsa->iqmp)) != 0 ||
  1795. - (r = sshbuf_put_bignum2(b, key->rsa->p)) != 0 ||
  1796. - (r = sshbuf_put_bignum2(b, key->rsa->q)) != 0)
  1797. + (r = sshbuf_put_bignum2(b, rsa_d)) != 0 ||
  1798. + (r = sshbuf_put_bignum2(b, rsa_iqmp)) != 0 ||
  1799. + (r = sshbuf_put_bignum2(b, rsa_p)) != 0 ||
  1800. + (r = sshbuf_put_bignum2(b, rsa_q)) != 0)
  1801. goto out;
  1802. break;
  1803. case KEY_DSA:
  1804. - if ((r = sshbuf_put_bignum2(b, key->dsa->p)) != 0 ||
  1805. - (r = sshbuf_put_bignum2(b, key->dsa->q)) != 0 ||
  1806. - (r = sshbuf_put_bignum2(b, key->dsa->g)) != 0 ||
  1807. - (r = sshbuf_put_bignum2(b, key->dsa->pub_key)) != 0 ||
  1808. - (r = sshbuf_put_bignum2(b, key->dsa->priv_key)) != 0)
  1809. + DSA_get0_pqg(key->dsa, &dsa_p, &dsa_q, &dsa_g);
  1810. + DSA_get0_key(key->dsa, &dsa_pub_key, &dsa_priv_key);
  1811. + if ((r = sshbuf_put_bignum2(b, dsa_p)) != 0 ||
  1812. + (r = sshbuf_put_bignum2(b, dsa_q)) != 0 ||
  1813. + (r = sshbuf_put_bignum2(b, dsa_g)) != 0 ||
  1814. + (r = sshbuf_put_bignum2(b, dsa_pub_key)) != 0 ||
  1815. + (r = sshbuf_put_bignum2(b, dsa_priv_key)) != 0)
  1816. goto out;
  1817. break;
  1818. case KEY_DSA_CERT:
  1819. @@ -2797,8 +2772,9 @@ sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
  1820. r = SSH_ERR_INVALID_ARGUMENT;
  1821. goto out;
  1822. }
  1823. + DSA_get0_key(key->dsa, NULL, &dsa_priv_key);
  1824. if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
  1825. - (r = sshbuf_put_bignum2(b, key->dsa->priv_key)) != 0)
  1826. + (r = sshbuf_put_bignum2(b, dsa_priv_key)) != 0)
  1827. goto out;
  1828. break;
  1829. # ifdef OPENSSL_HAS_ECC
  1830. @@ -2899,6 +2875,10 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  1831. u_char *xmss_pk = NULL, *xmss_sk = NULL;
  1832. #ifdef WITH_OPENSSL
  1833. BIGNUM *exponent = NULL;
  1834. + BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
  1835. + BIGNUM *rsa_iqmp = NULL, *rsa_p = NULL, *rsa_q = NULL;
  1836. + BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL;
  1837. + BIGNUM *dsa_pub_key = NULL, *dsa_priv_key = NULL;
  1838. #endif /* WITH_OPENSSL */
  1839. if (kp != NULL)
  1840. @@ -2913,18 +2893,44 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  1841. r = SSH_ERR_ALLOC_FAIL;
  1842. goto out;
  1843. }
  1844. - if ((r = sshbuf_get_bignum2(buf, k->dsa->p)) != 0 ||
  1845. - (r = sshbuf_get_bignum2(buf, k->dsa->q)) != 0 ||
  1846. - (r = sshbuf_get_bignum2(buf, k->dsa->g)) != 0 ||
  1847. - (r = sshbuf_get_bignum2(buf, k->dsa->pub_key)) != 0 ||
  1848. - (r = sshbuf_get_bignum2(buf, k->dsa->priv_key)) != 0)
  1849. + if ((dsa_p = BN_new()) == NULL ||
  1850. + (dsa_q = BN_new()) == NULL ||
  1851. + (dsa_g = BN_new()) == NULL ||
  1852. + (dsa_pub_key = BN_new()) == NULL ||
  1853. + (dsa_priv_key = BN_new()) == NULL) {
  1854. + r = SSH_ERR_ALLOC_FAIL;
  1855. + goto out;
  1856. + }
  1857. + if ((r = sshbuf_get_bignum2(buf, dsa_p)) != 0 ||
  1858. + (r = sshbuf_get_bignum2(buf, dsa_q)) != 0 ||
  1859. + (r = sshbuf_get_bignum2(buf, dsa_g)) != 0 ||
  1860. + (r = sshbuf_get_bignum2(buf, dsa_pub_key)) != 0 ||
  1861. + (r = sshbuf_get_bignum2(buf, dsa_priv_key)) != 0)
  1862. goto out;
  1863. + if (!DSA_set0_pqg(k->dsa, dsa_p, dsa_q, dsa_g)) {
  1864. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1865. + goto out;
  1866. + }
  1867. + dsa_p = dsa_q = dsa_g = NULL; /* transferred */
  1868. + if (!DSA_set0_key(k->dsa, dsa_pub_key, dsa_priv_key)) {
  1869. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1870. + goto out;
  1871. + }
  1872. + dsa_pub_key = dsa_priv_key = NULL; /* transferred */
  1873. break;
  1874. case KEY_DSA_CERT:
  1875. + if ((dsa_priv_key = BN_new()) == NULL) {
  1876. + r = SSH_ERR_ALLOC_FAIL;
  1877. + goto out;
  1878. + }
  1879. if ((r = sshkey_froms(buf, &k)) != 0 ||
  1880. - (r = sshkey_add_private(k)) != 0 ||
  1881. - (r = sshbuf_get_bignum2(buf, k->dsa->priv_key)) != 0)
  1882. + (r = sshbuf_get_bignum2(buf, dsa_priv_key)) != 0)
  1883. + goto out;
  1884. + if (!DSA_set0_key(k->dsa, NULL, dsa_priv_key)) {
  1885. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1886. goto out;
  1887. + }
  1888. + dsa_priv_key = NULL; /* transferred */
  1889. break;
  1890. # ifdef OPENSSL_HAS_ECC
  1891. case KEY_ECDSA:
  1892. @@ -2965,7 +2971,6 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  1893. goto out;
  1894. }
  1895. if ((r = sshkey_froms(buf, &k)) != 0 ||
  1896. - (r = sshkey_add_private(k)) != 0 ||
  1897. (r = sshbuf_get_bignum2(buf, exponent)) != 0)
  1898. goto out;
  1899. if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) {
  1900. @@ -2983,32 +2988,65 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  1901. r = SSH_ERR_ALLOC_FAIL;
  1902. goto out;
  1903. }
  1904. - if ((r = sshbuf_get_bignum2(buf, k->rsa->n)) != 0 ||
  1905. - (r = sshbuf_get_bignum2(buf, k->rsa->e)) != 0 ||
  1906. - (r = sshbuf_get_bignum2(buf, k->rsa->d)) != 0 ||
  1907. - (r = sshbuf_get_bignum2(buf, k->rsa->iqmp)) != 0 ||
  1908. - (r = sshbuf_get_bignum2(buf, k->rsa->p)) != 0 ||
  1909. - (r = sshbuf_get_bignum2(buf, k->rsa->q)) != 0 ||
  1910. - (r = ssh_rsa_generate_additional_parameters(k)) != 0)
  1911. + if ((rsa_n = BN_new()) == NULL ||
  1912. + (rsa_e = BN_new()) == NULL ||
  1913. + (rsa_d = BN_new()) == NULL ||
  1914. + (rsa_iqmp = BN_new()) == NULL ||
  1915. + (rsa_p = BN_new()) == NULL ||
  1916. + (rsa_q = BN_new()) == NULL) {
  1917. + r = SSH_ERR_ALLOC_FAIL;
  1918. goto out;
  1919. - if (BN_num_bits(k->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
  1920. - r = SSH_ERR_KEY_LENGTH;
  1921. + }
  1922. + if ((r = sshbuf_get_bignum2(buf, rsa_n)) != 0 ||
  1923. + (r = sshbuf_get_bignum2(buf, rsa_e)) != 0 ||
  1924. + (r = sshbuf_get_bignum2(buf, rsa_d)) != 0 ||
  1925. + (r = sshbuf_get_bignum2(buf, rsa_iqmp)) != 0 ||
  1926. + (r = sshbuf_get_bignum2(buf, rsa_p)) != 0 ||
  1927. + (r = sshbuf_get_bignum2(buf, rsa_q)) != 0)
  1928. + goto out;
  1929. + if (!RSA_set0_key(k->rsa, rsa_n, rsa_e, rsa_d)) {
  1930. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1931. goto out;
  1932. }
  1933. + rsa_n = rsa_e = rsa_d = NULL; /* transferred */
  1934. + if (!RSA_set0_factors(k->rsa, rsa_p, rsa_q)) {
  1935. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1936. + goto out;
  1937. + }
  1938. + rsa_p = rsa_q = NULL; /* transferred */
  1939. + if ((r = check_rsa_length(k->rsa)) != 0)
  1940. + goto out;
  1941. + if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
  1942. + goto out;
  1943. break;
  1944. case KEY_RSA_CERT:
  1945. + if ((rsa_d = BN_new()) == NULL ||
  1946. + (rsa_iqmp = BN_new()) == NULL ||
  1947. + (rsa_p = BN_new()) == NULL ||
  1948. + (rsa_q = BN_new()) == NULL) {
  1949. + r = SSH_ERR_ALLOC_FAIL;
  1950. + goto out;
  1951. + }
  1952. if ((r = sshkey_froms(buf, &k)) != 0 ||
  1953. - (r = sshkey_add_private(k)) != 0 ||
  1954. - (r = sshbuf_get_bignum2(buf, k->rsa->d)) != 0 ||
  1955. - (r = sshbuf_get_bignum2(buf, k->rsa->iqmp)) != 0 ||
  1956. - (r = sshbuf_get_bignum2(buf, k->rsa->p)) != 0 ||
  1957. - (r = sshbuf_get_bignum2(buf, k->rsa->q)) != 0 ||
  1958. - (r = ssh_rsa_generate_additional_parameters(k)) != 0)
  1959. + (r = sshbuf_get_bignum2(buf, rsa_d)) != 0 ||
  1960. + (r = sshbuf_get_bignum2(buf, rsa_iqmp)) != 0 ||
  1961. + (r = sshbuf_get_bignum2(buf, rsa_p)) != 0 ||
  1962. + (r = sshbuf_get_bignum2(buf, rsa_q)) != 0)
  1963. + goto out;
  1964. + if (!RSA_set0_key(k->rsa, NULL, NULL, rsa_d)) {
  1965. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1966. goto out;
  1967. - if (BN_num_bits(k->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
  1968. - r = SSH_ERR_KEY_LENGTH;
  1969. + }
  1970. + rsa_d = NULL; /* transferred */
  1971. + if (!RSA_set0_factors(k->rsa, rsa_p, rsa_q)) {
  1972. + r = SSH_ERR_LIBCRYPTO_ERROR;
  1973. goto out;
  1974. }
  1975. + rsa_p = rsa_q = NULL; /* transferred */
  1976. + if ((r = check_rsa_length(k->rsa)) != 0)
  1977. + goto out;
  1978. + if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
  1979. + goto out;
  1980. break;
  1981. #endif /* WITH_OPENSSL */
  1982. case KEY_ED25519:
  1983. @@ -3029,7 +3067,6 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  1984. break;
  1985. case KEY_ED25519_CERT:
  1986. if ((r = sshkey_froms(buf, &k)) != 0 ||
  1987. - (r = sshkey_add_private(k)) != 0 ||
  1988. (r = sshbuf_get_string(buf, &ed25519_pk, &pklen)) != 0 ||
  1989. (r = sshbuf_get_string(buf, &ed25519_sk, &sklen)) != 0)
  1990. goto out;
  1991. @@ -3066,7 +3103,6 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  1992. break;
  1993. case KEY_XMSS_CERT:
  1994. if ((r = sshkey_froms(buf, &k)) != 0 ||
  1995. - (r = sshkey_add_private(k)) != 0 ||
  1996. (r = sshbuf_get_cstring(buf, &xmss_name, NULL)) != 0 ||
  1997. (r = sshbuf_get_string(buf, &xmss_pk, &pklen)) != 0 ||
  1998. (r = sshbuf_get_string(buf, &xmss_sk, &sklen)) != 0)
  1999. @@ -3115,6 +3151,17 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
  2000. free(curve);
  2001. #ifdef WITH_OPENSSL
  2002. BN_clear_free(exponent);
  2003. + BN_clear_free(dsa_p);
  2004. + BN_clear_free(dsa_q);
  2005. + BN_clear_free(dsa_g);
  2006. + BN_clear_free(dsa_pub_key);
  2007. + BN_clear_free(dsa_priv_key);
  2008. + BN_clear_free(rsa_n);
  2009. + BN_clear_free(rsa_e);
  2010. + BN_clear_free(rsa_d);
  2011. + BN_clear_free(rsa_p);
  2012. + BN_clear_free(rsa_q);
  2013. + BN_clear_free(rsa_iqmp);
  2014. #endif /* WITH_OPENSSL */
  2015. sshkey_free(k);
  2016. freezero(ed25519_pk, pklen);
  2017. @@ -3769,7 +3816,9 @@ translate_libcrypto_error(unsigned long pem_err)
  2018. switch (pem_reason) {
  2019. case EVP_R_BAD_DECRYPT:
  2020. return SSH_ERR_KEY_WRONG_PASSPHRASE;
  2021. +#ifdef EVP_R_BN_DECODE_ERROR
  2022. case EVP_R_BN_DECODE_ERROR:
  2023. +#endif
  2024. case EVP_R_DECODE_ERROR:
  2025. #ifdef EVP_R_PRIVATE_KEY_DECODE_ERROR
  2026. case EVP_R_PRIVATE_KEY_DECODE_ERROR:
  2027. @@ -3834,7 +3883,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
  2028. r = convert_libcrypto_error();
  2029. goto out;
  2030. }
  2031. - if (pk->type == EVP_PKEY_RSA &&
  2032. + if (EVP_PKEY_base_id(pk) == EVP_PKEY_RSA &&
  2033. (type == KEY_UNSPEC || type == KEY_RSA)) {
  2034. if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
  2035. r = SSH_ERR_ALLOC_FAIL;
  2036. @@ -3849,11 +3898,9 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
  2037. r = SSH_ERR_LIBCRYPTO_ERROR;
  2038. goto out;
  2039. }
  2040. - if (BN_num_bits(prv->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
  2041. - r = SSH_ERR_KEY_LENGTH;
  2042. + if ((r = check_rsa_length(prv->rsa)) != 0)
  2043. goto out;
  2044. - }
  2045. - } else if (pk->type == EVP_PKEY_DSA &&
  2046. + } else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA &&
  2047. (type == KEY_UNSPEC || type == KEY_DSA)) {
  2048. if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
  2049. r = SSH_ERR_ALLOC_FAIL;
  2050. @@ -3865,7 +3912,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
  2051. DSA_print_fp(stderr, prv->dsa, 8);
  2052. #endif
  2053. #ifdef OPENSSL_HAS_ECC
  2054. - } else if (pk->type == EVP_PKEY_EC &&
  2055. + } else if (EVP_PKEY_base_id(pk) == EVP_PKEY_EC &&
  2056. (type == KEY_UNSPEC || type == KEY_ECDSA)) {
  2057. if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
  2058. r = SSH_ERR_ALLOC_FAIL;
  2059. diff --git a/sshkey.h b/sshkey.h
  2060. index 9060b2ec..922db5bb 100644
  2061. --- a/sshkey.h
  2062. +++ b/sshkey.h
  2063. @@ -39,6 +39,7 @@
  2064. # define EC_POINT void
  2065. # endif /* OPENSSL_HAS_ECC */
  2066. #else /* WITH_OPENSSL */
  2067. +# define BIGNUM void
  2068. # define RSA void
  2069. # define DSA void
  2070. # define EC_KEY void
  2071. @@ -126,10 +127,8 @@ struct sshkey {
  2072. #define ED25519_PK_SZ crypto_sign_ed25519_PUBLICKEYBYTES
  2073. struct sshkey *sshkey_new(int);
  2074. -int sshkey_add_private(struct sshkey *);
  2075. -struct sshkey *sshkey_new_private(int);
  2076. +struct sshkey *sshkey_new_private(int); /* XXX garbage collect */
  2077. void sshkey_free(struct sshkey *);
  2078. -int sshkey_demote(const struct sshkey *, struct sshkey **);
  2079. int sshkey_equal_public(const struct sshkey *,
  2080. const struct sshkey *);
  2081. int sshkey_equal(const struct sshkey *, const struct sshkey *);
  2082. @@ -218,7 +217,7 @@ int sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type,
  2083. const char *passphrase, struct sshkey **keyp, char **commentp);
  2084. /* XXX should be internal, but used by ssh-keygen */
  2085. -int ssh_rsa_generate_additional_parameters(struct sshkey *);
  2086. +int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *);
  2087. /* stateful keys (e.g. XMSS) */
  2088. #ifdef NO_ATTRIBUTE_ON_PROTOTYPE_ARGS
  2089. --
  2090. 2.16.4