|
Lines 285-305
sshkey_size(const struct sshkey *k)
Link Here
|
| 285 |
{ |
285 |
{ |
| 286 |
#ifdef WITH_OPENSSL |
286 |
#ifdef WITH_OPENSSL |
| 287 |
const BIGNUM *rsa_n, *dsa_p; |
287 |
const BIGNUM *rsa_n, *dsa_p; |
|
|
288 |
RSA *rsa = NULL; |
| 289 |
DSA *dsa = NULL; |
| 288 |
#endif /* WITH_OPENSSL */ |
290 |
#endif /* WITH_OPENSSL */ |
| 289 |
|
291 |
|
| 290 |
switch (k->type) { |
292 |
switch (k->type) { |
| 291 |
#ifdef WITH_OPENSSL |
293 |
#ifdef WITH_OPENSSL |
| 292 |
case KEY_RSA: |
294 |
case KEY_RSA: |
| 293 |
case KEY_RSA_CERT: |
295 |
case KEY_RSA_CERT: |
| 294 |
if (k->rsa == NULL) |
296 |
rsa = EVP_PKEY_get0_RSA(k->pkey); |
|
|
297 |
if (rsa == NULL) |
| 295 |
return 0; |
298 |
return 0; |
| 296 |
RSA_get0_key(k->rsa, &rsa_n, NULL, NULL); |
299 |
RSA_get0_key(rsa, &rsa_n, NULL, NULL); |
| 297 |
return BN_num_bits(rsa_n); |
300 |
return BN_num_bits(rsa_n); |
| 298 |
case KEY_DSA: |
301 |
case KEY_DSA: |
| 299 |
case KEY_DSA_CERT: |
302 |
case KEY_DSA_CERT: |
| 300 |
if (k->dsa == NULL) |
303 |
dsa = EVP_PKEY_get0_DSA(k->pkey); |
|
|
304 |
if (dsa == NULL) |
| 301 |
return 0; |
305 |
return 0; |
| 302 |
DSA_get0_pqg(k->dsa, &dsa_p, NULL, NULL); |
306 |
DSA_get0_pqg(dsa, &dsa_p, NULL, NULL); |
| 303 |
return BN_num_bits(dsa_p); |
307 |
return BN_num_bits(dsa_p); |
| 304 |
case KEY_ECDSA: |
308 |
case KEY_ECDSA: |
| 305 |
case KEY_ECDSA_CERT: |
309 |
case KEY_ECDSA_CERT: |
|
Lines 358-363
sshkey_type_plain(int type)
Link Here
|
| 358 |
} |
362 |
} |
| 359 |
|
363 |
|
| 360 |
#ifdef WITH_OPENSSL |
364 |
#ifdef WITH_OPENSSL |
|
|
365 |
int |
| 366 |
sshkey_calculate_signature(EVP_PKEY *pkey, int hash_alg, u_char **sigp, |
| 367 |
int *lenp, const u_char *data, size_t datalen) |
| 368 |
{ |
| 369 |
EVP_MD_CTX *ctx = NULL; |
| 370 |
u_char *sig = NULL; |
| 371 |
int ret, slen, len; |
| 372 |
|
| 373 |
if (sigp == NULL || lenp == NULL) { |
| 374 |
return SSH_ERR_INVALID_ARGUMENT; |
| 375 |
} |
| 376 |
|
| 377 |
slen = EVP_PKEY_size(pkey); |
| 378 |
if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM) |
| 379 |
return SSH_ERR_INVALID_ARGUMENT; |
| 380 |
|
| 381 |
len = slen; |
| 382 |
if ((sig = malloc(slen)) == NULL) { |
| 383 |
return SSH_ERR_ALLOC_FAIL; |
| 384 |
} |
| 385 |
|
| 386 |
if ((ctx = EVP_MD_CTX_new()) == NULL) { |
| 387 |
ret = SSH_ERR_ALLOC_FAIL; |
| 388 |
goto error; |
| 389 |
} |
| 390 |
if (EVP_SignInit_ex(ctx, ssh_digest_to_md(hash_alg), NULL) <= 0 || |
| 391 |
EVP_SignUpdate(ctx, data, datalen) <= 0 || |
| 392 |
EVP_SignFinal(ctx, sig, &len, pkey) <= 0) { |
| 393 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 394 |
goto error; |
| 395 |
} |
| 396 |
|
| 397 |
*sigp = sig; |
| 398 |
*lenp = len; |
| 399 |
/* Now owned by the caller */ |
| 400 |
sig = NULL; |
| 401 |
ret = 0; |
| 402 |
|
| 403 |
error: |
| 404 |
EVP_MD_CTX_free(ctx); |
| 405 |
free(sig); |
| 406 |
return ret; |
| 407 |
} |
| 408 |
|
| 409 |
int |
| 410 |
sshkey_verify_signature(EVP_PKEY *pkey, int hash_alg, const u_char *data, |
| 411 |
size_t datalen, u_char *sigbuf, int siglen) |
| 412 |
{ |
| 413 |
EVP_MD_CTX *ctx = NULL; |
| 414 |
int ret; |
| 415 |
|
| 416 |
if ((ctx = EVP_MD_CTX_new()) == NULL) { |
| 417 |
return SSH_ERR_ALLOC_FAIL; |
| 418 |
} |
| 419 |
if (EVP_VerifyInit_ex(ctx, ssh_digest_to_md(hash_alg), NULL) <= 0 || |
| 420 |
EVP_VerifyUpdate(ctx, data, datalen) <= 0) { |
| 421 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 422 |
goto done; |
| 423 |
} |
| 424 |
ret = EVP_VerifyFinal(ctx, sigbuf, siglen, pkey); |
| 425 |
switch (ret) { |
| 426 |
case 1: |
| 427 |
ret = 0; |
| 428 |
break; |
| 429 |
case 0: |
| 430 |
ret = SSH_ERR_SIGNATURE_INVALID; |
| 431 |
break; |
| 432 |
default: |
| 433 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 434 |
break; |
| 435 |
} |
| 436 |
|
| 437 |
done: |
| 438 |
EVP_MD_CTX_free(ctx); |
| 439 |
return ret; |
| 440 |
} |
| 441 |
|
| 361 |
/* XXX: these are really begging for a table-driven approach */ |
442 |
/* XXX: these are really begging for a table-driven approach */ |
| 362 |
int |
443 |
int |
| 363 |
sshkey_curve_name_to_nid(const char *name) |
444 |
sshkey_curve_name_to_nid(const char *name) |
|
Lines 494-503
sshkey_new(int type)
Link Here
|
| 494 |
if ((k = calloc(1, sizeof(*k))) == NULL) |
575 |
if ((k = calloc(1, sizeof(*k))) == NULL) |
| 495 |
return NULL; |
576 |
return NULL; |
| 496 |
k->type = type; |
577 |
k->type = type; |
| 497 |
k->ecdsa = NULL; |
|
|
| 498 |
k->ecdsa_nid = -1; |
578 |
k->ecdsa_nid = -1; |
| 499 |
k->dsa = NULL; |
579 |
k->pkey = NULL; |
| 500 |
k->rsa = NULL; |
|
|
| 501 |
k->cert = NULL; |
580 |
k->cert = NULL; |
| 502 |
k->ed25519_sk = NULL; |
581 |
k->ed25519_sk = NULL; |
| 503 |
k->ed25519_pk = NULL; |
582 |
k->ed25519_pk = NULL; |
|
Lines 507-528
sshkey_new(int type)
Link Here
|
| 507 |
#ifdef WITH_OPENSSL |
586 |
#ifdef WITH_OPENSSL |
| 508 |
case KEY_RSA: |
587 |
case KEY_RSA: |
| 509 |
case KEY_RSA_CERT: |
588 |
case KEY_RSA_CERT: |
|
|
589 |
if ((k->pkey = EVP_PKEY_new()) == NULL) { |
| 590 |
free(k); |
| 591 |
return NULL; |
| 592 |
} |
| 510 |
if ((rsa = RSA_new()) == NULL) { |
593 |
if ((rsa = RSA_new()) == NULL) { |
|
|
594 |
EVP_PKEY_free(k->pkey); |
| 511 |
free(k); |
595 |
free(k); |
| 512 |
return NULL; |
596 |
return NULL; |
| 513 |
} |
597 |
} |
| 514 |
k->rsa = rsa; |
598 |
if (EVP_PKEY_set1_RSA(k->pkey, rsa) != 1) { |
|
|
599 |
EVP_PKEY_free(k->pkey); |
| 600 |
free(k); |
| 601 |
RSA_free(rsa); |
| 602 |
return NULL; |
| 603 |
} |
| 515 |
break; |
604 |
break; |
| 516 |
case KEY_DSA: |
605 |
case KEY_DSA: |
| 517 |
case KEY_DSA_CERT: |
606 |
case KEY_DSA_CERT: |
|
|
607 |
if ((k->pkey = EVP_PKEY_new()) == NULL) { |
| 608 |
free(k); |
| 609 |
return NULL; |
| 610 |
} |
| 518 |
if ((dsa = DSA_new()) == NULL) { |
611 |
if ((dsa = DSA_new()) == NULL) { |
|
|
612 |
EVP_PKEY_free(k->pkey); |
| 613 |
free(k); |
| 614 |
return NULL; |
| 615 |
} |
| 616 |
if (EVP_PKEY_set1_DSA(k->pkey, dsa) != 1) { |
| 617 |
EVP_PKEY_free(k->pkey); |
| 618 |
DSA_free(dsa); |
| 519 |
free(k); |
619 |
free(k); |
| 520 |
return NULL; |
620 |
return NULL; |
| 521 |
} |
621 |
} |
| 522 |
k->dsa = dsa; |
|
|
| 523 |
break; |
622 |
break; |
| 524 |
case KEY_ECDSA: |
623 |
case KEY_ECDSA: |
| 525 |
case KEY_ECDSA_CERT: |
624 |
case KEY_ECDSA_CERT: |
|
|
625 |
if ((k->pkey = EVP_PKEY_new()) == NULL) { |
| 626 |
free(k); |
| 627 |
return NULL; |
| 628 |
} |
| 526 |
/* Cannot do anything until we know the group */ |
629 |
/* Cannot do anything until we know the group */ |
| 527 |
break; |
630 |
break; |
| 528 |
#endif /* WITH_OPENSSL */ |
631 |
#endif /* WITH_OPENSSL */ |
|
Lines 558-578
sshkey_free(struct sshkey *k)
Link Here
|
| 558 |
#ifdef WITH_OPENSSL |
661 |
#ifdef WITH_OPENSSL |
| 559 |
case KEY_RSA: |
662 |
case KEY_RSA: |
| 560 |
case KEY_RSA_CERT: |
663 |
case KEY_RSA_CERT: |
| 561 |
RSA_free(k->rsa); |
|
|
| 562 |
k->rsa = NULL; |
| 563 |
break; |
| 564 |
case KEY_DSA: |
664 |
case KEY_DSA: |
| 565 |
case KEY_DSA_CERT: |
665 |
case KEY_DSA_CERT: |
| 566 |
DSA_free(k->dsa); |
|
|
| 567 |
k->dsa = NULL; |
| 568 |
break; |
| 569 |
# ifdef OPENSSL_HAS_ECC |
666 |
# ifdef OPENSSL_HAS_ECC |
| 570 |
case KEY_ECDSA: |
667 |
case KEY_ECDSA: |
| 571 |
case KEY_ECDSA_CERT: |
668 |
case KEY_ECDSA_CERT: |
| 572 |
EC_KEY_free(k->ecdsa); |
|
|
| 573 |
k->ecdsa = NULL; |
| 574 |
break; |
| 575 |
# endif /* OPENSSL_HAS_ECC */ |
669 |
# endif /* OPENSSL_HAS_ECC */ |
|
|
670 |
EVP_PKEY_free(k->pkey); |
| 671 |
k->pkey = NULL; |
| 672 |
break; |
| 576 |
#endif /* WITH_OPENSSL */ |
673 |
#endif /* WITH_OPENSSL */ |
| 577 |
case KEY_ED25519: |
674 |
case KEY_ED25519: |
| 578 |
case KEY_ED25519_CERT: |
675 |
case KEY_ED25519_CERT: |
|
Lines 628-633
int
Link Here
|
| 628 |
sshkey_equal_public(const struct sshkey *a, const struct sshkey *b) |
725 |
sshkey_equal_public(const struct sshkey *a, const struct sshkey *b) |
| 629 |
{ |
726 |
{ |
| 630 |
#if defined(WITH_OPENSSL) |
727 |
#if defined(WITH_OPENSSL) |
|
|
728 |
const RSA *rsa_a, *rsa_b; |
| 729 |
const DSA *dsa_a, *dsa_b; |
| 730 |
const EC_KEY *ecdsa_a, *ecdsa_b; |
| 631 |
const BIGNUM *rsa_e_a, *rsa_n_a; |
731 |
const BIGNUM *rsa_e_a, *rsa_n_a; |
| 632 |
const BIGNUM *rsa_e_b, *rsa_n_b; |
732 |
const BIGNUM *rsa_e_b, *rsa_n_b; |
| 633 |
const BIGNUM *dsa_p_a, *dsa_q_a, *dsa_g_a, *dsa_pub_key_a; |
733 |
const BIGNUM *dsa_p_a, *dsa_q_a, *dsa_g_a, *dsa_pub_key_a; |
|
Lines 645-664
sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
Link Here
|
| 645 |
#ifdef WITH_OPENSSL |
745 |
#ifdef WITH_OPENSSL |
| 646 |
case KEY_RSA_CERT: |
746 |
case KEY_RSA_CERT: |
| 647 |
case KEY_RSA: |
747 |
case KEY_RSA: |
| 648 |
if (a->rsa == NULL || b->rsa == NULL) |
748 |
rsa_a = EVP_PKEY_get0_RSA(a->pkey); |
|
|
749 |
rsa_b = EVP_PKEY_get0_RSA(b->pkey); |
| 750 |
if (rsa_a == NULL || rsa_b == NULL) |
| 649 |
return 0; |
751 |
return 0; |
| 650 |
RSA_get0_key(a->rsa, &rsa_n_a, &rsa_e_a, NULL); |
752 |
RSA_get0_key(rsa_a, &rsa_n_a, &rsa_e_a, NULL); |
| 651 |
RSA_get0_key(b->rsa, &rsa_n_b, &rsa_e_b, NULL); |
753 |
RSA_get0_key(rsa_b, &rsa_n_b, &rsa_e_b, NULL); |
| 652 |
return BN_cmp(rsa_e_a, rsa_e_b) == 0 && |
754 |
return BN_cmp(rsa_e_a, rsa_e_b) == 0 && |
| 653 |
BN_cmp(rsa_n_a, rsa_n_b) == 0; |
755 |
BN_cmp(rsa_n_a, rsa_n_b) == 0; |
| 654 |
case KEY_DSA_CERT: |
756 |
case KEY_DSA_CERT: |
| 655 |
case KEY_DSA: |
757 |
case KEY_DSA: |
| 656 |
if (a->dsa == NULL || b->dsa == NULL) |
758 |
dsa_a = EVP_PKEY_get0_DSA(a->pkey); |
|
|
759 |
dsa_b = EVP_PKEY_get0_DSA(b->pkey); |
| 760 |
if (dsa_a == NULL || dsa_b == NULL) |
| 657 |
return 0; |
761 |
return 0; |
| 658 |
DSA_get0_pqg(a->dsa, &dsa_p_a, &dsa_q_a, &dsa_g_a); |
762 |
DSA_get0_pqg(dsa_a, &dsa_p_a, &dsa_q_a, &dsa_g_a); |
| 659 |
DSA_get0_pqg(b->dsa, &dsa_p_b, &dsa_q_b, &dsa_g_b); |
763 |
DSA_get0_pqg(dsa_b, &dsa_p_b, &dsa_q_b, &dsa_g_b); |
| 660 |
DSA_get0_key(a->dsa, &dsa_pub_key_a, NULL); |
764 |
DSA_get0_key(dsa_a, &dsa_pub_key_a, NULL); |
| 661 |
DSA_get0_key(b->dsa, &dsa_pub_key_b, NULL); |
765 |
DSA_get0_key(dsa_b, &dsa_pub_key_b, NULL); |
| 662 |
return BN_cmp(dsa_p_a, dsa_p_b) == 0 && |
766 |
return BN_cmp(dsa_p_a, dsa_p_b) == 0 && |
| 663 |
BN_cmp(dsa_q_a, dsa_q_b) == 0 && |
767 |
BN_cmp(dsa_q_a, dsa_q_b) == 0 && |
| 664 |
BN_cmp(dsa_g_a, dsa_g_b) == 0 && |
768 |
BN_cmp(dsa_g_a, dsa_g_b) == 0 && |
|
Lines 666-682
sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
Link Here
|
| 666 |
# ifdef OPENSSL_HAS_ECC |
770 |
# ifdef OPENSSL_HAS_ECC |
| 667 |
case KEY_ECDSA_CERT: |
771 |
case KEY_ECDSA_CERT: |
| 668 |
case KEY_ECDSA: |
772 |
case KEY_ECDSA: |
| 669 |
if (a->ecdsa == NULL || b->ecdsa == NULL || |
773 |
ecdsa_a = EVP_PKEY_get0_EC_KEY(a->pkey); |
| 670 |
EC_KEY_get0_public_key(a->ecdsa) == NULL || |
774 |
ecdsa_b = EVP_PKEY_get0_EC_KEY(b->pkey); |
| 671 |
EC_KEY_get0_public_key(b->ecdsa) == NULL) |
775 |
if (ecdsa_a == NULL || ecdsa_b == NULL || |
|
|
776 |
EC_KEY_get0_public_key(ecdsa_a) == NULL || |
| 777 |
EC_KEY_get0_public_key(ecdsa_b) == NULL) |
| 672 |
return 0; |
778 |
return 0; |
| 673 |
if ((bnctx = BN_CTX_new()) == NULL) |
779 |
if ((bnctx = BN_CTX_new()) == NULL) |
| 674 |
return 0; |
780 |
return 0; |
| 675 |
if (EC_GROUP_cmp(EC_KEY_get0_group(a->ecdsa), |
781 |
if (EC_GROUP_cmp(EC_KEY_get0_group(ecdsa_a), |
| 676 |
EC_KEY_get0_group(b->ecdsa), bnctx) != 0 || |
782 |
EC_KEY_get0_group(ecdsa_b), bnctx) != 0 || |
| 677 |
EC_POINT_cmp(EC_KEY_get0_group(a->ecdsa), |
783 |
EC_POINT_cmp(EC_KEY_get0_group(ecdsa_a), |
| 678 |
EC_KEY_get0_public_key(a->ecdsa), |
784 |
EC_KEY_get0_public_key(ecdsa_a), |
| 679 |
EC_KEY_get0_public_key(b->ecdsa), bnctx) != 0) { |
785 |
EC_KEY_get0_public_key(ecdsa_b), bnctx) != 0) { |
| 680 |
BN_CTX_free(bnctx); |
786 |
BN_CTX_free(bnctx); |
| 681 |
return 0; |
787 |
return 0; |
| 682 |
} |
788 |
} |
|
Lines 720-725
to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
Link Here
|
| 720 |
int type, ret = SSH_ERR_INTERNAL_ERROR; |
826 |
int type, ret = SSH_ERR_INTERNAL_ERROR; |
| 721 |
const char *typename; |
827 |
const char *typename; |
| 722 |
#ifdef WITH_OPENSSL |
828 |
#ifdef WITH_OPENSSL |
|
|
829 |
const RSA *rsa; |
| 830 |
const DSA *dsa; |
| 831 |
const EC_KEY *ecdsa; |
| 723 |
const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key; |
832 |
const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key; |
| 724 |
#endif /* WITH_OPENSSL */ |
833 |
#endif /* WITH_OPENSSL */ |
| 725 |
|
834 |
|
|
Lines 752-761
to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
Link Here
|
| 752 |
break; |
861 |
break; |
| 753 |
#ifdef WITH_OPENSSL |
862 |
#ifdef WITH_OPENSSL |
| 754 |
case KEY_DSA: |
863 |
case KEY_DSA: |
| 755 |
if (key->dsa == NULL) |
864 |
dsa = EVP_PKEY_get0_DSA(key->pkey); |
|
|
865 |
if (dsa == NULL) |
| 756 |
return SSH_ERR_INVALID_ARGUMENT; |
866 |
return SSH_ERR_INVALID_ARGUMENT; |
| 757 |
DSA_get0_pqg(key->dsa, &dsa_p, &dsa_q, &dsa_g); |
867 |
DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g); |
| 758 |
DSA_get0_key(key->dsa, &dsa_pub_key, NULL); |
868 |
DSA_get0_key(dsa, &dsa_pub_key, NULL); |
| 759 |
if ((ret = sshbuf_put_cstring(b, typename)) != 0 || |
869 |
if ((ret = sshbuf_put_cstring(b, typename)) != 0 || |
| 760 |
(ret = sshbuf_put_bignum2(b, dsa_p)) != 0 || |
870 |
(ret = sshbuf_put_bignum2(b, dsa_p)) != 0 || |
| 761 |
(ret = sshbuf_put_bignum2(b, dsa_q)) != 0 || |
871 |
(ret = sshbuf_put_bignum2(b, dsa_q)) != 0 || |
|
Lines 765-783
to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain,
Link Here
|
| 765 |
break; |
875 |
break; |
| 766 |
# ifdef OPENSSL_HAS_ECC |
876 |
# ifdef OPENSSL_HAS_ECC |
| 767 |
case KEY_ECDSA: |
877 |
case KEY_ECDSA: |
| 768 |
if (key->ecdsa == NULL) |
878 |
ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey); |
|
|
879 |
if (ecdsa == NULL) |
| 769 |
return SSH_ERR_INVALID_ARGUMENT; |
880 |
return SSH_ERR_INVALID_ARGUMENT; |
| 770 |
if ((ret = sshbuf_put_cstring(b, typename)) != 0 || |
881 |
if ((ret = sshbuf_put_cstring(b, typename)) != 0 || |
| 771 |
(ret = sshbuf_put_cstring(b, |
882 |
(ret = sshbuf_put_cstring(b, |
| 772 |
sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 || |
883 |
sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 || |
| 773 |
(ret = sshbuf_put_eckey(b, key->ecdsa)) != 0) |
884 |
(ret = sshbuf_put_eckey(b, ecdsa)) != 0) |
| 774 |
return ret; |
885 |
return ret; |
| 775 |
break; |
886 |
break; |
| 776 |
# endif |
887 |
# endif |
| 777 |
case KEY_RSA: |
888 |
case KEY_RSA: |
| 778 |
if (key->rsa == NULL) |
889 |
rsa = EVP_PKEY_get0_RSA(key->pkey); |
|
|
890 |
if (rsa == NULL) |
| 779 |
return SSH_ERR_INVALID_ARGUMENT; |
891 |
return SSH_ERR_INVALID_ARGUMENT; |
| 780 |
RSA_get0_key(key->rsa, &rsa_n, &rsa_e, NULL); |
892 |
RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL); |
| 781 |
if ((ret = sshbuf_put_cstring(b, typename)) != 0 || |
893 |
if ((ret = sshbuf_put_cstring(b, typename)) != 0 || |
| 782 |
(ret = sshbuf_put_bignum2(b, rsa_e)) != 0 || |
894 |
(ret = sshbuf_put_bignum2(b, rsa_e)) != 0 || |
| 783 |
(ret = sshbuf_put_bignum2(b, rsa_n)) != 0) |
895 |
(ret = sshbuf_put_bignum2(b, rsa_n)) != 0) |
|
Lines 1312-1341
sshkey_read(struct sshkey *ret, char **cpp)
Link Here
|
| 1312 |
switch (sshkey_type_plain(ret->type)) { |
1424 |
switch (sshkey_type_plain(ret->type)) { |
| 1313 |
#ifdef WITH_OPENSSL |
1425 |
#ifdef WITH_OPENSSL |
| 1314 |
case KEY_RSA: |
1426 |
case KEY_RSA: |
| 1315 |
RSA_free(ret->rsa); |
1427 |
EVP_PKEY_free(ret->pkey); |
| 1316 |
ret->rsa = k->rsa; |
1428 |
ret->pkey = k->pkey; |
| 1317 |
k->rsa = NULL; |
1429 |
k->pkey = NULL; |
| 1318 |
#ifdef DEBUG_PK |
1430 |
#ifdef DEBUG_PK |
| 1319 |
RSA_print_fp(stderr, ret->rsa, 8); |
1431 |
RSA_print_fp(stderr, EVP_PKEY_get0_RSA(ret->pkey), 8); |
| 1320 |
#endif |
1432 |
#endif |
| 1321 |
break; |
1433 |
break; |
| 1322 |
case KEY_DSA: |
1434 |
case KEY_DSA: |
| 1323 |
DSA_free(ret->dsa); |
1435 |
EVP_PKEY_free(ret->pkey); |
| 1324 |
ret->dsa = k->dsa; |
1436 |
ret->pkey = k->pkey; |
| 1325 |
k->dsa = NULL; |
1437 |
k->pkey = NULL; |
| 1326 |
#ifdef DEBUG_PK |
1438 |
#ifdef DEBUG_PK |
| 1327 |
DSA_print_fp(stderr, ret->dsa, 8); |
1439 |
DSA_print_fp(stderr, EVP_PKEY_get0_DSA(ret->pkey), 8); |
| 1328 |
#endif |
1440 |
#endif |
| 1329 |
break; |
1441 |
break; |
| 1330 |
# ifdef OPENSSL_HAS_ECC |
1442 |
# ifdef OPENSSL_HAS_ECC |
| 1331 |
case KEY_ECDSA: |
1443 |
case KEY_ECDSA: |
| 1332 |
EC_KEY_free(ret->ecdsa); |
1444 |
EVP_PKEY_free(ret->pkey); |
| 1333 |
ret->ecdsa = k->ecdsa; |
1445 |
ret->pkey = k->pkey; |
| 1334 |
ret->ecdsa_nid = k->ecdsa_nid; |
1446 |
ret->ecdsa_nid = k->ecdsa_nid; |
| 1335 |
k->ecdsa = NULL; |
1447 |
k->pkey = NULL; |
| 1336 |
k->ecdsa_nid = -1; |
1448 |
k->ecdsa_nid = -1; |
| 1337 |
#ifdef DEBUG_PK |
1449 |
#ifdef DEBUG_PK |
| 1338 |
sshkey_dump_ec_key(ret->ecdsa); |
1450 |
sshkey_dump_ec_key(EVP_PKEY_get0_EC_KEY(ret->pkey)); |
| 1339 |
#endif |
1451 |
#endif |
| 1340 |
break; |
1452 |
break; |
| 1341 |
# endif /* OPENSSL_HAS_ECC */ |
1453 |
# endif /* OPENSSL_HAS_ECC */ |
|
Lines 1463-1480
sshkey_cert_type(const struct sshkey *k)
Link Here
|
| 1463 |
|
1575 |
|
| 1464 |
#ifdef WITH_OPENSSL |
1576 |
#ifdef WITH_OPENSSL |
| 1465 |
static int |
1577 |
static int |
| 1466 |
rsa_generate_private_key(u_int bits, RSA **rsap) |
1578 |
rsa_generate_private_key(u_int bits, EVP_PKEY **pkeyp) |
| 1467 |
{ |
1579 |
{ |
| 1468 |
RSA *private = NULL; |
1580 |
RSA *private = NULL; |
| 1469 |
BIGNUM *f4 = NULL; |
1581 |
BIGNUM *f4 = NULL; |
| 1470 |
int ret = SSH_ERR_INTERNAL_ERROR; |
1582 |
int ret = SSH_ERR_INTERNAL_ERROR; |
| 1471 |
|
1583 |
|
| 1472 |
if (rsap == NULL) |
1584 |
if (pkeyp == NULL) |
| 1473 |
return SSH_ERR_INVALID_ARGUMENT; |
1585 |
return SSH_ERR_INVALID_ARGUMENT; |
| 1474 |
if (bits < SSH_RSA_MINIMUM_MODULUS_SIZE || |
1586 |
if (bits < SSH_RSA_MINIMUM_MODULUS_SIZE || |
| 1475 |
bits > SSHBUF_MAX_BIGNUM * 8) |
1587 |
bits > SSHBUF_MAX_BIGNUM * 8) |
| 1476 |
return SSH_ERR_KEY_LENGTH; |
1588 |
return SSH_ERR_KEY_LENGTH; |
| 1477 |
*rsap = NULL; |
1589 |
*pkeyp = NULL; |
| 1478 |
if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) { |
1590 |
if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) { |
| 1479 |
ret = SSH_ERR_ALLOC_FAIL; |
1591 |
ret = SSH_ERR_ALLOC_FAIL; |
| 1480 |
goto out; |
1592 |
goto out; |
|
Lines 1484-1490
rsa_generate_private_key(u_int bits, RSA **rsap)
Link Here
|
| 1484 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
1596 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 1485 |
goto out; |
1597 |
goto out; |
| 1486 |
} |
1598 |
} |
| 1487 |
*rsap = private; |
1599 |
*pkeyp = EVP_PKEY_new(); |
|
|
1600 |
if (*pkeyp == NULL) { |
| 1601 |
ret = SSH_ERR_ALLOC_FAIL; |
| 1602 |
goto out; |
| 1603 |
} |
| 1604 |
if (EVP_PKEY_set1_RSA(*pkeyp, private) != 1) { |
| 1605 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 1606 |
goto out; |
| 1607 |
} |
| 1488 |
private = NULL; |
1608 |
private = NULL; |
| 1489 |
ret = 0; |
1609 |
ret = 0; |
| 1490 |
out: |
1610 |
out: |
|
Lines 1494-1505
rsa_generate_private_key(u_int bits, RSA **rsap)
Link Here
|
| 1494 |
} |
1614 |
} |
| 1495 |
|
1615 |
|
| 1496 |
static int |
1616 |
static int |
| 1497 |
dsa_generate_private_key(u_int bits, DSA **dsap) |
1617 |
dsa_generate_private_key(u_int bits, EVP_PKEY **pkeyp) |
| 1498 |
{ |
1618 |
{ |
| 1499 |
DSA *private; |
1619 |
DSA *private; |
| 1500 |
int ret = SSH_ERR_INTERNAL_ERROR; |
1620 |
int ret = SSH_ERR_INTERNAL_ERROR; |
| 1501 |
|
1621 |
|
| 1502 |
if (dsap == NULL) |
1622 |
if (pkeyp == NULL) |
| 1503 |
return SSH_ERR_INVALID_ARGUMENT; |
1623 |
return SSH_ERR_INVALID_ARGUMENT; |
| 1504 |
if (bits != 1024) |
1624 |
if (bits != 1024) |
| 1505 |
return SSH_ERR_KEY_LENGTH; |
1625 |
return SSH_ERR_KEY_LENGTH; |
|
Lines 1507-1519
dsa_generate_private_key(u_int bits, DSA **dsap)
Link Here
|
| 1507 |
ret = SSH_ERR_ALLOC_FAIL; |
1627 |
ret = SSH_ERR_ALLOC_FAIL; |
| 1508 |
goto out; |
1628 |
goto out; |
| 1509 |
} |
1629 |
} |
| 1510 |
*dsap = NULL; |
1630 |
*pkeyp = NULL; |
| 1511 |
if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL, |
1631 |
if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL, |
| 1512 |
NULL, NULL) || !DSA_generate_key(private)) { |
1632 |
NULL, NULL) || !DSA_generate_key(private)) { |
| 1513 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
1633 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 1514 |
goto out; |
1634 |
goto out; |
| 1515 |
} |
1635 |
} |
| 1516 |
*dsap = private; |
1636 |
*pkeyp = EVP_PKEY_new(); |
|
|
1637 |
if (*pkeyp == NULL) { |
| 1638 |
ret = SSH_ERR_ALLOC_FAIL; |
| 1639 |
goto out; |
| 1640 |
} |
| 1641 |
if (EVP_PKEY_set1_DSA(*pkeyp, private) != 1) { |
| 1642 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 1643 |
goto out; |
| 1644 |
} |
| 1517 |
private = NULL; |
1645 |
private = NULL; |
| 1518 |
ret = 0; |
1646 |
ret = 0; |
| 1519 |
out: |
1647 |
out: |
|
Lines 1523-1530
dsa_generate_private_key(u_int bits, DSA **dsap)
Link Here
|
| 1523 |
|
1651 |
|
| 1524 |
# ifdef OPENSSL_HAS_ECC |
1652 |
# ifdef OPENSSL_HAS_ECC |
| 1525 |
int |
1653 |
int |
| 1526 |
sshkey_ecdsa_key_to_nid(EC_KEY *k) |
1654 |
sshkey_ecdsa_key_to_nid(struct sshkey *key) |
| 1527 |
{ |
1655 |
{ |
|
|
1656 |
EC_KEY *k; |
| 1528 |
EC_GROUP *eg; |
1657 |
EC_GROUP *eg; |
| 1529 |
int nids[] = { |
1658 |
int nids[] = { |
| 1530 |
NID_X9_62_prime256v1, |
1659 |
NID_X9_62_prime256v1, |
|
Lines 1537-1543
sshkey_ecdsa_key_to_nid(EC_KEY *k)
Link Here
|
| 1537 |
int nid; |
1666 |
int nid; |
| 1538 |
u_int i; |
1667 |
u_int i; |
| 1539 |
BN_CTX *bnctx; |
1668 |
BN_CTX *bnctx; |
| 1540 |
const EC_GROUP *g = EC_KEY_get0_group(k); |
1669 |
const EC_GROUP *g; |
|
|
1670 |
|
| 1671 |
if ((k = EVP_PKEY_get0_EC_KEY(key->pkey)) == NULL || |
| 1672 |
(g = EC_KEY_get0_group(k)) == NULL) { |
| 1673 |
return -1; |
| 1674 |
} |
| 1541 |
|
1675 |
|
| 1542 |
/* |
1676 |
/* |
| 1543 |
* The group may be stored in a ASN.1 encoded private key in one of two |
1677 |
* The group may be stored in a ASN.1 encoded private key in one of two |
|
Lines 1573-1588
sshkey_ecdsa_key_to_nid(EC_KEY *k)
Link Here
|
| 1573 |
} |
1707 |
} |
| 1574 |
|
1708 |
|
| 1575 |
static int |
1709 |
static int |
| 1576 |
ecdsa_generate_private_key(u_int bits, int *nid, EC_KEY **ecdsap) |
1710 |
ecdsa_generate_private_key(u_int bits, int *nid, EVP_PKEY **pkeyp) |
| 1577 |
{ |
1711 |
{ |
| 1578 |
EC_KEY *private; |
1712 |
EC_KEY *private; |
| 1579 |
int ret = SSH_ERR_INTERNAL_ERROR; |
1713 |
int ret = SSH_ERR_INTERNAL_ERROR; |
| 1580 |
|
1714 |
|
| 1581 |
if (nid == NULL || ecdsap == NULL) |
1715 |
if (nid == NULL || pkeyp == NULL) |
| 1582 |
return SSH_ERR_INVALID_ARGUMENT; |
1716 |
return SSH_ERR_INVALID_ARGUMENT; |
| 1583 |
if ((*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1) |
1717 |
if ((*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1) |
| 1584 |
return SSH_ERR_KEY_LENGTH; |
1718 |
return SSH_ERR_KEY_LENGTH; |
| 1585 |
*ecdsap = NULL; |
1719 |
*pkeyp = NULL; |
| 1586 |
if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL) { |
1720 |
if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL) { |
| 1587 |
ret = SSH_ERR_ALLOC_FAIL; |
1721 |
ret = SSH_ERR_ALLOC_FAIL; |
| 1588 |
goto out; |
1722 |
goto out; |
|
Lines 1592-1598
ecdsa_generate_private_key(u_int bits, int *nid, EC_KEY **ecdsap)
Link Here
|
| 1592 |
goto out; |
1726 |
goto out; |
| 1593 |
} |
1727 |
} |
| 1594 |
EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE); |
1728 |
EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE); |
| 1595 |
*ecdsap = private; |
1729 |
*pkeyp = EVP_PKEY_new(); |
|
|
1730 |
if (*pkeyp == NULL) { |
| 1731 |
ret = SSH_ERR_ALLOC_FAIL; |
| 1732 |
goto out; |
| 1733 |
} |
| 1734 |
if (EVP_PKEY_set1_EC_KEY(*pkeyp, private) != 1) { |
| 1735 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 1736 |
goto out; |
| 1737 |
} |
| 1596 |
private = NULL; |
1738 |
private = NULL; |
| 1597 |
ret = 0; |
1739 |
ret = 0; |
| 1598 |
out: |
1740 |
out: |
|
Lines 1630-1645
sshkey_generate(int type, u_int bits, struct sshkey **keyp)
Link Here
|
| 1630 |
#endif /* WITH_XMSS */ |
1772 |
#endif /* WITH_XMSS */ |
| 1631 |
#ifdef WITH_OPENSSL |
1773 |
#ifdef WITH_OPENSSL |
| 1632 |
case KEY_DSA: |
1774 |
case KEY_DSA: |
| 1633 |
ret = dsa_generate_private_key(bits, &k->dsa); |
1775 |
ret = dsa_generate_private_key(bits, &k->pkey); |
| 1634 |
break; |
1776 |
break; |
| 1635 |
# ifdef OPENSSL_HAS_ECC |
1777 |
# ifdef OPENSSL_HAS_ECC |
| 1636 |
case KEY_ECDSA: |
1778 |
case KEY_ECDSA: |
| 1637 |
ret = ecdsa_generate_private_key(bits, &k->ecdsa_nid, |
1779 |
ret = ecdsa_generate_private_key(bits, &k->ecdsa_nid, |
| 1638 |
&k->ecdsa); |
1780 |
&k->pkey); |
| 1639 |
break; |
1781 |
break; |
| 1640 |
# endif /* OPENSSL_HAS_ECC */ |
1782 |
# endif /* OPENSSL_HAS_ECC */ |
| 1641 |
case KEY_RSA: |
1783 |
case KEY_RSA: |
| 1642 |
ret = rsa_generate_private_key(bits, &k->rsa); |
1784 |
ret = rsa_generate_private_key(bits, &k->pkey); |
| 1643 |
break; |
1785 |
break; |
| 1644 |
#endif /* WITH_OPENSSL */ |
1786 |
#endif /* WITH_OPENSSL */ |
| 1645 |
default: |
1787 |
default: |
|
Lines 1729-1734
sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
Link Here
|
| 1729 |
struct sshkey *n = NULL; |
1871 |
struct sshkey *n = NULL; |
| 1730 |
int r = SSH_ERR_INTERNAL_ERROR; |
1872 |
int r = SSH_ERR_INTERNAL_ERROR; |
| 1731 |
#ifdef WITH_OPENSSL |
1873 |
#ifdef WITH_OPENSSL |
|
|
1874 |
RSA *rsa; |
| 1875 |
DSA *dsa; |
| 1876 |
EC_KEY *ecdsa; |
| 1877 |
const EC_POINT *ec_point; |
| 1732 |
const BIGNUM *rsa_n, *rsa_e; |
1878 |
const BIGNUM *rsa_n, *rsa_e; |
| 1733 |
BIGNUM *rsa_n_dup = NULL, *rsa_e_dup = NULL; |
1879 |
BIGNUM *rsa_n_dup = NULL, *rsa_e_dup = NULL; |
| 1734 |
const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key; |
1880 |
const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key; |
|
Lines 1746-1753
sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
Link Here
|
| 1746 |
goto out; |
1892 |
goto out; |
| 1747 |
} |
1893 |
} |
| 1748 |
|
1894 |
|
| 1749 |
DSA_get0_pqg(k->dsa, &dsa_p, &dsa_q, &dsa_g); |
1895 |
dsa = EVP_PKEY_get0_DSA(k->pkey); |
| 1750 |
DSA_get0_key(k->dsa, &dsa_pub_key, NULL); |
1896 |
if (dsa == NULL) { |
|
|
1897 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1898 |
goto out; |
| 1899 |
} |
| 1900 |
DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g); |
| 1901 |
DSA_get0_key(dsa, &dsa_pub_key, NULL); |
| 1751 |
if ((dsa_p_dup = BN_dup(dsa_p)) == NULL || |
1902 |
if ((dsa_p_dup = BN_dup(dsa_p)) == NULL || |
| 1752 |
(dsa_q_dup = BN_dup(dsa_q)) == NULL || |
1903 |
(dsa_q_dup = BN_dup(dsa_q)) == NULL || |
| 1753 |
(dsa_g_dup = BN_dup(dsa_g)) == NULL || |
1904 |
(dsa_g_dup = BN_dup(dsa_g)) == NULL || |
|
Lines 1755-1766
sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
Link Here
|
| 1755 |
r = SSH_ERR_ALLOC_FAIL; |
1906 |
r = SSH_ERR_ALLOC_FAIL; |
| 1756 |
goto out; |
1907 |
goto out; |
| 1757 |
} |
1908 |
} |
| 1758 |
if (!DSA_set0_pqg(n->dsa, dsa_p_dup, dsa_q_dup, dsa_g_dup)) { |
1909 |
dsa = EVP_PKEY_get0_DSA(n->pkey); |
|
|
1910 |
if (!dsa || !DSA_set0_pqg(dsa, dsa_p_dup, dsa_q_dup, dsa_g_dup)) { |
| 1759 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
1911 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1760 |
goto out; |
1912 |
goto out; |
| 1761 |
} |
1913 |
} |
| 1762 |
dsa_p_dup = dsa_q_dup = dsa_g_dup = NULL; /* transferred */ |
1914 |
dsa_p_dup = dsa_q_dup = dsa_g_dup = NULL; /* transferred */ |
| 1763 |
if (!DSA_set0_key(n->dsa, dsa_pub_key_dup, NULL)) { |
1915 |
if (!DSA_set0_key(dsa, dsa_pub_key_dup, NULL)) { |
| 1764 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
1916 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1765 |
goto out; |
1917 |
goto out; |
| 1766 |
} |
1918 |
} |
|
Lines 1775-1787
sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
Link Here
|
| 1775 |
goto out; |
1927 |
goto out; |
| 1776 |
} |
1928 |
} |
| 1777 |
n->ecdsa_nid = k->ecdsa_nid; |
1929 |
n->ecdsa_nid = k->ecdsa_nid; |
| 1778 |
n->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid); |
1930 |
ecdsa = EVP_PKEY_get0_EC_KEY(k->pkey); |
| 1779 |
if (n->ecdsa == NULL) { |
1931 |
if (ecdsa == NULL) { |
|
|
1932 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1933 |
goto out; |
| 1934 |
} |
| 1935 |
ec_point = EC_KEY_get0_public_key(ecdsa); |
| 1936 |
ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid); |
| 1937 |
if (ecdsa == NULL) { |
| 1780 |
r = SSH_ERR_ALLOC_FAIL; |
1938 |
r = SSH_ERR_ALLOC_FAIL; |
| 1781 |
goto out; |
1939 |
goto out; |
| 1782 |
} |
1940 |
} |
| 1783 |
if (EC_KEY_set_public_key(n->ecdsa, |
1941 |
if (EC_KEY_set_public_key(ecdsa, ec_point) != 1) { |
| 1784 |
EC_KEY_get0_public_key(k->ecdsa)) != 1) { |
1942 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
|
1943 |
goto out; |
| 1944 |
} |
| 1945 |
if (EVP_PKEY_set1_EC_KEY(n->pkey, ecdsa) != 1) { |
| 1785 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
1946 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1786 |
goto out; |
1947 |
goto out; |
| 1787 |
} |
1948 |
} |
|
Lines 1793-1805
sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
Link Here
|
| 1793 |
r = SSH_ERR_ALLOC_FAIL; |
1954 |
r = SSH_ERR_ALLOC_FAIL; |
| 1794 |
goto out; |
1955 |
goto out; |
| 1795 |
} |
1956 |
} |
| 1796 |
RSA_get0_key(k->rsa, &rsa_n, &rsa_e, NULL); |
1957 |
rsa = EVP_PKEY_get0_RSA(k->pkey); |
|
|
1958 |
if (rsa == NULL) { |
| 1959 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1960 |
goto out; |
| 1961 |
} |
| 1962 |
RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL); |
| 1797 |
if ((rsa_n_dup = BN_dup(rsa_n)) == NULL || |
1963 |
if ((rsa_n_dup = BN_dup(rsa_n)) == NULL || |
| 1798 |
(rsa_e_dup = BN_dup(rsa_e)) == NULL) { |
1964 |
(rsa_e_dup = BN_dup(rsa_e)) == NULL) { |
| 1799 |
r = SSH_ERR_ALLOC_FAIL; |
1965 |
r = SSH_ERR_ALLOC_FAIL; |
| 1800 |
goto out; |
1966 |
goto out; |
| 1801 |
} |
1967 |
} |
| 1802 |
if (!RSA_set0_key(n->rsa, rsa_n_dup, rsa_e_dup, NULL)) { |
1968 |
rsa = EVP_PKEY_get0_RSA(n->pkey); |
|
|
1969 |
if (!rsa || !RSA_set0_key(rsa, rsa_n_dup, rsa_e_dup, NULL)) { |
| 1803 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
1970 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 1804 |
goto out; |
1971 |
goto out; |
| 1805 |
} |
1972 |
} |
|
Lines 1994-2002
cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
Link Here
|
| 1994 |
|
2161 |
|
| 1995 |
#ifdef WITH_OPENSSL |
2162 |
#ifdef WITH_OPENSSL |
| 1996 |
static int |
2163 |
static int |
| 1997 |
check_rsa_length(const RSA *rsa) |
2164 |
check_rsa_length(const struct sshkey *key) |
| 1998 |
{ |
2165 |
{ |
| 1999 |
const BIGNUM *rsa_n; |
2166 |
const BIGNUM *rsa_n; |
|
|
2167 |
const RSA *rsa; |
| 2168 |
|
| 2169 |
rsa = EVP_PKEY_get0_RSA(key->pkey); |
| 2170 |
if (rsa == NULL) |
| 2171 |
return SSH_ERR_INTERNAL_ERROR; |
| 2000 |
|
2172 |
|
| 2001 |
RSA_get0_key(rsa, &rsa_n, NULL, NULL); |
2173 |
RSA_get0_key(rsa, &rsa_n, NULL, NULL); |
| 2002 |
if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE) |
2174 |
if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE) |
|
Lines 2016-2021
sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
Link Here
|
| 2016 |
u_char *pk = NULL; |
2188 |
u_char *pk = NULL; |
| 2017 |
struct sshbuf *copy; |
2189 |
struct sshbuf *copy; |
| 2018 |
#if defined(WITH_OPENSSL) |
2190 |
#if defined(WITH_OPENSSL) |
|
|
2191 |
RSA *rsa; |
| 2192 |
DSA *dsa; |
| 2193 |
EC_KEY *ecdsa; |
| 2019 |
BIGNUM *rsa_n = NULL, *rsa_e = NULL; |
2194 |
BIGNUM *rsa_n = NULL, *rsa_e = NULL; |
| 2020 |
BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL, *dsa_pub_key = NULL; |
2195 |
BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL, *dsa_pub_key = NULL; |
| 2021 |
# if defined(OPENSSL_HAS_ECC) |
2196 |
# if defined(OPENSSL_HAS_ECC) |
|
Lines 2061-2075
sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
Link Here
|
| 2061 |
ret = SSH_ERR_INVALID_FORMAT; |
2236 |
ret = SSH_ERR_INVALID_FORMAT; |
| 2062 |
goto out; |
2237 |
goto out; |
| 2063 |
} |
2238 |
} |
| 2064 |
if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, NULL)) { |
2239 |
rsa = EVP_PKEY_get0_RSA(key->pkey); |
|
|
2240 |
if (!rsa || !RSA_set0_key(rsa, rsa_n, rsa_e, NULL)) { |
| 2065 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
2241 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2066 |
goto out; |
2242 |
goto out; |
| 2067 |
} |
2243 |
} |
| 2068 |
rsa_n = rsa_e = NULL; /* transferred */ |
2244 |
rsa_n = rsa_e = NULL; /* transferred */ |
| 2069 |
if ((ret = check_rsa_length(key->rsa)) != 0) |
2245 |
if ((ret = check_rsa_length(key)) != 0) |
| 2070 |
goto out; |
2246 |
goto out; |
| 2071 |
#ifdef DEBUG_PK |
2247 |
#ifdef DEBUG_PK |
| 2072 |
RSA_print_fp(stderr, key->rsa, 8); |
2248 |
RSA_print_fp(stderr, rsa, 8); |
| 2073 |
#endif |
2249 |
#endif |
| 2074 |
break; |
2250 |
break; |
| 2075 |
case KEY_DSA_CERT: |
2251 |
case KEY_DSA_CERT: |
|
Lines 2091-2108
sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
Link Here
|
| 2091 |
ret = SSH_ERR_INVALID_FORMAT; |
2267 |
ret = SSH_ERR_INVALID_FORMAT; |
| 2092 |
goto out; |
2268 |
goto out; |
| 2093 |
} |
2269 |
} |
| 2094 |
if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g)) { |
2270 |
dsa = EVP_PKEY_get0_DSA(key->pkey); |
|
|
2271 |
if (!dsa || !DSA_set0_pqg(dsa, dsa_p, dsa_q, dsa_g)) { |
| 2095 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
2272 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2096 |
goto out; |
2273 |
goto out; |
| 2097 |
} |
2274 |
} |
| 2098 |
dsa_p = dsa_q = dsa_g = NULL; /* transferred */ |
2275 |
dsa_p = dsa_q = dsa_g = NULL; /* transferred */ |
| 2099 |
if (!DSA_set0_key(key->dsa, dsa_pub_key, NULL)) { |
2276 |
if (!DSA_set0_key(dsa, dsa_pub_key, NULL)) { |
| 2100 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
2277 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2101 |
goto out; |
2278 |
goto out; |
| 2102 |
} |
2279 |
} |
| 2103 |
dsa_pub_key = NULL; /* transferred */ |
2280 |
dsa_pub_key = NULL; /* transferred */ |
| 2104 |
#ifdef DEBUG_PK |
2281 |
#ifdef DEBUG_PK |
| 2105 |
DSA_print_fp(stderr, key->dsa, 8); |
2282 |
DSA_print_fp(stderr, dsa, 8); |
| 2106 |
#endif |
2283 |
#endif |
| 2107 |
break; |
2284 |
break; |
| 2108 |
case KEY_ECDSA_CERT: |
2285 |
case KEY_ECDSA_CERT: |
|
Lines 2127-2158
sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
Link Here
|
| 2127 |
ret = SSH_ERR_EC_CURVE_MISMATCH; |
2304 |
ret = SSH_ERR_EC_CURVE_MISMATCH; |
| 2128 |
goto out; |
2305 |
goto out; |
| 2129 |
} |
2306 |
} |
| 2130 |
EC_KEY_free(key->ecdsa); |
2307 |
if ((ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) |
| 2131 |
if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) |
|
|
| 2132 |
== NULL) { |
2308 |
== NULL) { |
| 2133 |
ret = SSH_ERR_EC_CURVE_INVALID; |
2309 |
ret = SSH_ERR_EC_CURVE_INVALID; |
| 2134 |
goto out; |
2310 |
goto out; |
| 2135 |
} |
2311 |
} |
| 2136 |
if ((q = EC_POINT_new(EC_KEY_get0_group(key->ecdsa))) == NULL) { |
2312 |
if ((q = EC_POINT_new(EC_KEY_get0_group(ecdsa))) == NULL) { |
| 2137 |
ret = SSH_ERR_ALLOC_FAIL; |
2313 |
ret = SSH_ERR_ALLOC_FAIL; |
| 2138 |
goto out; |
2314 |
goto out; |
| 2139 |
} |
2315 |
} |
| 2140 |
if (sshbuf_get_ec(b, q, EC_KEY_get0_group(key->ecdsa)) != 0) { |
2316 |
if (sshbuf_get_ec(b, q, EC_KEY_get0_group(ecdsa)) != 0) { |
| 2141 |
ret = SSH_ERR_INVALID_FORMAT; |
2317 |
ret = SSH_ERR_INVALID_FORMAT; |
| 2142 |
goto out; |
2318 |
goto out; |
| 2143 |
} |
2319 |
} |
| 2144 |
if (sshkey_ec_validate_public(EC_KEY_get0_group(key->ecdsa), |
2320 |
if (sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa), |
| 2145 |
q) != 0) { |
2321 |
q) != 0) { |
| 2146 |
ret = SSH_ERR_KEY_INVALID_EC_VALUE; |
2322 |
ret = SSH_ERR_KEY_INVALID_EC_VALUE; |
| 2147 |
goto out; |
2323 |
goto out; |
| 2148 |
} |
2324 |
} |
| 2149 |
if (EC_KEY_set_public_key(key->ecdsa, q) != 1) { |
2325 |
if (EC_KEY_set_public_key(ecdsa, q) != 1) { |
| 2150 |
/* XXX assume it is a allocation error */ |
2326 |
/* XXX assume it is a allocation error */ |
| 2151 |
ret = SSH_ERR_ALLOC_FAIL; |
2327 |
ret = SSH_ERR_ALLOC_FAIL; |
| 2152 |
goto out; |
2328 |
goto out; |
| 2153 |
} |
2329 |
} |
|
|
2330 |
if (EVP_PKEY_set1_EC_KEY(key->pkey, ecdsa) != 1) { |
| 2331 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2332 |
goto out; |
| 2333 |
} |
| 2334 |
ecdsa = NULL; |
| 2154 |
#ifdef DEBUG_PK |
2335 |
#ifdef DEBUG_PK |
| 2155 |
sshkey_dump_ec_point(EC_KEY_get0_group(key->ecdsa), q); |
2336 |
sshkey_dump_ec_point(EC_KEY_get0_group(ecdsa), q); |
| 2156 |
#endif |
2337 |
#endif |
| 2157 |
break; |
2338 |
break; |
| 2158 |
# endif /* OPENSSL_HAS_ECC */ |
2339 |
# endif /* OPENSSL_HAS_ECC */ |
|
Lines 2505-2510
sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
Link Here
|
| 2505 |
struct sshbuf *cert = NULL; |
2686 |
struct sshbuf *cert = NULL; |
| 2506 |
char *sigtype = NULL; |
2687 |
char *sigtype = NULL; |
| 2507 |
#ifdef WITH_OPENSSL |
2688 |
#ifdef WITH_OPENSSL |
|
|
2689 |
const RSA *rsa; |
| 2690 |
const DSA *dsa; |
| 2691 |
const EC_KEY *ecdsa; |
| 2508 |
const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key; |
2692 |
const BIGNUM *rsa_n, *rsa_e, *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key; |
| 2509 |
#endif /* WITH_OPENSSL */ |
2693 |
#endif /* WITH_OPENSSL */ |
| 2510 |
|
2694 |
|
|
Lines 2543-2550
sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
Link Here
|
| 2543 |
switch (k->type) { |
2727 |
switch (k->type) { |
| 2544 |
#ifdef WITH_OPENSSL |
2728 |
#ifdef WITH_OPENSSL |
| 2545 |
case KEY_DSA_CERT: |
2729 |
case KEY_DSA_CERT: |
| 2546 |
DSA_get0_pqg(k->dsa, &dsa_p, &dsa_q, &dsa_g); |
2730 |
dsa = EVP_PKEY_get0_DSA(k->pkey); |
| 2547 |
DSA_get0_key(k->dsa, &dsa_pub_key, NULL); |
2731 |
if (dsa == NULL) { |
|
|
2732 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2733 |
goto out; |
| 2734 |
} |
| 2735 |
DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g); |
| 2736 |
DSA_get0_key(dsa, &dsa_pub_key, NULL); |
| 2548 |
if ((ret = sshbuf_put_bignum2(cert, dsa_p)) != 0 || |
2737 |
if ((ret = sshbuf_put_bignum2(cert, dsa_p)) != 0 || |
| 2549 |
(ret = sshbuf_put_bignum2(cert, dsa_q)) != 0 || |
2738 |
(ret = sshbuf_put_bignum2(cert, dsa_q)) != 0 || |
| 2550 |
(ret = sshbuf_put_bignum2(cert, dsa_g)) != 0 || |
2739 |
(ret = sshbuf_put_bignum2(cert, dsa_g)) != 0 || |
|
Lines 2553-2568
sshkey_certify_custom(struct sshkey *k, struct sshkey *ca, const char *alg,
Link Here
|
| 2553 |
break; |
2742 |
break; |
| 2554 |
# ifdef OPENSSL_HAS_ECC |
2743 |
# ifdef OPENSSL_HAS_ECC |
| 2555 |
case KEY_ECDSA_CERT: |
2744 |
case KEY_ECDSA_CERT: |
|
|
2745 |
ecdsa = EVP_PKEY_get1_EC_KEY(k->pkey); |
| 2746 |
if (ecdsa == NULL) { |
| 2747 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2748 |
goto out; |
| 2749 |
} |
| 2556 |
if ((ret = sshbuf_put_cstring(cert, |
2750 |
if ((ret = sshbuf_put_cstring(cert, |
| 2557 |
sshkey_curve_nid_to_name(k->ecdsa_nid))) != 0 || |
2751 |
sshkey_curve_nid_to_name(k->ecdsa_nid))) != 0 || |
| 2558 |
(ret = sshbuf_put_ec(cert, |
2752 |
(ret = sshbuf_put_ec(cert, |
| 2559 |
EC_KEY_get0_public_key(k->ecdsa), |
2753 |
EC_KEY_get0_public_key(ecdsa), |
| 2560 |
EC_KEY_get0_group(k->ecdsa))) != 0) |
2754 |
EC_KEY_get0_group(ecdsa))) != 0) |
| 2561 |
goto out; |
2755 |
goto out; |
| 2562 |
break; |
2756 |
break; |
| 2563 |
# endif /* OPENSSL_HAS_ECC */ |
2757 |
# endif /* OPENSSL_HAS_ECC */ |
| 2564 |
case KEY_RSA_CERT: |
2758 |
case KEY_RSA_CERT: |
| 2565 |
RSA_get0_key(k->rsa, &rsa_n, &rsa_e, NULL); |
2759 |
rsa = EVP_PKEY_get0_RSA(k->pkey); |
|
|
2760 |
if (rsa == NULL) { |
| 2761 |
ret = SSH_ERR_LIBCRYPTO_ERROR; |
| 2762 |
goto out; |
| 2763 |
} |
| 2764 |
RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL); |
| 2566 |
if ((ret = sshbuf_put_bignum2(cert, rsa_e)) != 0 || |
2765 |
if ((ret = sshbuf_put_bignum2(cert, rsa_e)) != 0 || |
| 2567 |
(ret = sshbuf_put_bignum2(cert, rsa_n)) != 0) |
2766 |
(ret = sshbuf_put_bignum2(cert, rsa_n)) != 0) |
| 2568 |
goto out; |
2767 |
goto out; |
|
Lines 2758-2763
sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
Link Here
|
| 2758 |
{ |
2957 |
{ |
| 2759 |
int r = SSH_ERR_INTERNAL_ERROR; |
2958 |
int r = SSH_ERR_INTERNAL_ERROR; |
| 2760 |
#ifdef WITH_OPENSSL |
2959 |
#ifdef WITH_OPENSSL |
|
|
2960 |
const RSA *rsa; |
| 2961 |
const DSA *dsa; |
| 2962 |
const EC_KEY *ecdsa; |
| 2761 |
const BIGNUM *rsa_n, *rsa_e, *rsa_d, *rsa_iqmp, *rsa_p, *rsa_q; |
2963 |
const BIGNUM *rsa_n, *rsa_e, *rsa_d, *rsa_iqmp, *rsa_p, *rsa_q; |
| 2762 |
const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key, *dsa_priv_key; |
2964 |
const BIGNUM *dsa_p, *dsa_q, *dsa_g, *dsa_pub_key, *dsa_priv_key; |
| 2763 |
#endif /* WITH_OPENSSL */ |
2965 |
#endif /* WITH_OPENSSL */ |
|
Lines 2767-2775
sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
Link Here
|
| 2767 |
switch (key->type) { |
2969 |
switch (key->type) { |
| 2768 |
#ifdef WITH_OPENSSL |
2970 |
#ifdef WITH_OPENSSL |
| 2769 |
case KEY_RSA: |
2971 |
case KEY_RSA: |
| 2770 |
RSA_get0_key(key->rsa, &rsa_n, &rsa_e, &rsa_d); |
2972 |
rsa = EVP_PKEY_get0_RSA(key->pkey); |
| 2771 |
RSA_get0_factors(key->rsa, &rsa_p, &rsa_q); |
2973 |
if (rsa == NULL) { |
| 2772 |
RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp); |
2974 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
|
2975 |
goto out; |
| 2976 |
} |
| 2977 |
RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d); |
| 2978 |
RSA_get0_factors(rsa, &rsa_p, &rsa_q); |
| 2979 |
RSA_get0_crt_params(rsa, NULL, NULL, &rsa_iqmp); |
| 2773 |
if ((r = sshbuf_put_bignum2(b, rsa_n)) != 0 || |
2980 |
if ((r = sshbuf_put_bignum2(b, rsa_n)) != 0 || |
| 2774 |
(r = sshbuf_put_bignum2(b, rsa_e)) != 0 || |
2981 |
(r = sshbuf_put_bignum2(b, rsa_e)) != 0 || |
| 2775 |
(r = sshbuf_put_bignum2(b, rsa_d)) != 0 || |
2982 |
(r = sshbuf_put_bignum2(b, rsa_d)) != 0 || |
|
Lines 2783-2791
sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
Link Here
|
| 2783 |
r = SSH_ERR_INVALID_ARGUMENT; |
2990 |
r = SSH_ERR_INVALID_ARGUMENT; |
| 2784 |
goto out; |
2991 |
goto out; |
| 2785 |
} |
2992 |
} |
| 2786 |
RSA_get0_key(key->rsa, NULL, NULL, &rsa_d); |
2993 |
rsa = EVP_PKEY_get0_RSA(key->pkey); |
| 2787 |
RSA_get0_factors(key->rsa, &rsa_p, &rsa_q); |
2994 |
if (rsa == NULL) { |
| 2788 |
RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp); |
2995 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
|
2996 |
goto out; |
| 2997 |
} |
| 2998 |
RSA_get0_key(rsa, NULL, NULL, &rsa_d); |
| 2999 |
RSA_get0_factors(rsa, &rsa_p, &rsa_q); |
| 3000 |
RSA_get0_crt_params(rsa, NULL, NULL, &rsa_iqmp); |
| 2789 |
if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 || |
3001 |
if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 || |
| 2790 |
(r = sshbuf_put_bignum2(b, rsa_d)) != 0 || |
3002 |
(r = sshbuf_put_bignum2(b, rsa_d)) != 0 || |
| 2791 |
(r = sshbuf_put_bignum2(b, rsa_iqmp)) != 0 || |
3003 |
(r = sshbuf_put_bignum2(b, rsa_iqmp)) != 0 || |
|
Lines 2794-2801
sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
Link Here
|
| 2794 |
goto out; |
3006 |
goto out; |
| 2795 |
break; |
3007 |
break; |
| 2796 |
case KEY_DSA: |
3008 |
case KEY_DSA: |
| 2797 |
DSA_get0_pqg(key->dsa, &dsa_p, &dsa_q, &dsa_g); |
3009 |
dsa = EVP_PKEY_get0_DSA(key->pkey); |
| 2798 |
DSA_get0_key(key->dsa, &dsa_pub_key, &dsa_priv_key); |
3010 |
if (dsa == NULL) { |
|
|
3011 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3012 |
goto out; |
| 3013 |
} |
| 3014 |
DSA_get0_pqg(dsa, &dsa_p, &dsa_q, &dsa_g); |
| 3015 |
DSA_get0_key(dsa, &dsa_pub_key, &dsa_priv_key); |
| 2799 |
if ((r = sshbuf_put_bignum2(b, dsa_p)) != 0 || |
3016 |
if ((r = sshbuf_put_bignum2(b, dsa_p)) != 0 || |
| 2800 |
(r = sshbuf_put_bignum2(b, dsa_q)) != 0 || |
3017 |
(r = sshbuf_put_bignum2(b, dsa_q)) != 0 || |
| 2801 |
(r = sshbuf_put_bignum2(b, dsa_g)) != 0 || |
3018 |
(r = sshbuf_put_bignum2(b, dsa_g)) != 0 || |
|
Lines 2808-2835
sshkey_private_serialize_opt(const struct sshkey *key, struct sshbuf *b,
Link Here
|
| 2808 |
r = SSH_ERR_INVALID_ARGUMENT; |
3025 |
r = SSH_ERR_INVALID_ARGUMENT; |
| 2809 |
goto out; |
3026 |
goto out; |
| 2810 |
} |
3027 |
} |
| 2811 |
DSA_get0_key(key->dsa, NULL, &dsa_priv_key); |
3028 |
dsa = EVP_PKEY_get0_DSA(key->pkey); |
|
|
3029 |
if (dsa == NULL) { |
| 3030 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3031 |
goto out; |
| 3032 |
} |
| 3033 |
DSA_get0_key(dsa, NULL, &dsa_priv_key); |
| 2812 |
if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 || |
3034 |
if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 || |
| 2813 |
(r = sshbuf_put_bignum2(b, dsa_priv_key)) != 0) |
3035 |
(r = sshbuf_put_bignum2(b, dsa_priv_key)) != 0) |
| 2814 |
goto out; |
3036 |
goto out; |
| 2815 |
break; |
3037 |
break; |
| 2816 |
# ifdef OPENSSL_HAS_ECC |
3038 |
# ifdef OPENSSL_HAS_ECC |
| 2817 |
case KEY_ECDSA: |
3039 |
case KEY_ECDSA: |
| 2818 |
if ((r = sshbuf_put_cstring(b, |
3040 |
ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey); |
|
|
3041 |
if (!ecdsa || (r = sshbuf_put_cstring(b, |
| 2819 |
sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 || |
3042 |
sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 || |
| 2820 |
(r = sshbuf_put_eckey(b, key->ecdsa)) != 0 || |
3043 |
(r = sshbuf_put_eckey(b, ecdsa)) != 0 || |
| 2821 |
(r = sshbuf_put_bignum2(b, |
3044 |
(r = sshbuf_put_bignum2(b, |
| 2822 |
EC_KEY_get0_private_key(key->ecdsa))) != 0) |
3045 |
EC_KEY_get0_private_key(ecdsa))) != 0) |
| 2823 |
goto out; |
3046 |
goto out; |
| 2824 |
break; |
3047 |
break; |
| 2825 |
case KEY_ECDSA_CERT: |
3048 |
case KEY_ECDSA_CERT: |
| 2826 |
if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) { |
3049 |
ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey); |
|
|
3050 |
if (!ecdsa || key->cert == NULL || |
| 3051 |
sshbuf_len(key->cert->certblob) == 0) { |
| 2827 |
r = SSH_ERR_INVALID_ARGUMENT; |
3052 |
r = SSH_ERR_INVALID_ARGUMENT; |
| 2828 |
goto out; |
3053 |
goto out; |
| 2829 |
} |
3054 |
} |
| 2830 |
if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 || |
3055 |
if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 || |
| 2831 |
(r = sshbuf_put_bignum2(b, |
3056 |
(r = sshbuf_put_bignum2(b, |
| 2832 |
EC_KEY_get0_private_key(key->ecdsa))) != 0) |
3057 |
EC_KEY_get0_private_key(ecdsa))) != 0) |
| 2833 |
goto out; |
3058 |
goto out; |
| 2834 |
break; |
3059 |
break; |
| 2835 |
# endif /* OPENSSL_HAS_ECC */ |
3060 |
# endif /* OPENSSL_HAS_ECC */ |
|
Lines 2910-2915
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 2910 |
u_char *ed25519_pk = NULL, *ed25519_sk = NULL; |
3135 |
u_char *ed25519_pk = NULL, *ed25519_sk = NULL; |
| 2911 |
u_char *xmss_pk = NULL, *xmss_sk = NULL; |
3136 |
u_char *xmss_pk = NULL, *xmss_sk = NULL; |
| 2912 |
#ifdef WITH_OPENSSL |
3137 |
#ifdef WITH_OPENSSL |
|
|
3138 |
RSA *rsa; |
| 3139 |
DSA *dsa; |
| 3140 |
EC_KEY *ecdsa; |
| 2913 |
BIGNUM *exponent = NULL; |
3141 |
BIGNUM *exponent = NULL; |
| 2914 |
BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL; |
3142 |
BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL; |
| 2915 |
BIGNUM *rsa_iqmp = NULL, *rsa_p = NULL, *rsa_q = NULL; |
3143 |
BIGNUM *rsa_iqmp = NULL, *rsa_p = NULL, *rsa_q = NULL; |
|
Lines 2935-2946
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 2935 |
(r = sshbuf_get_bignum2(buf, &dsa_pub_key)) != 0 || |
3163 |
(r = sshbuf_get_bignum2(buf, &dsa_pub_key)) != 0 || |
| 2936 |
(r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0) |
3164 |
(r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0) |
| 2937 |
goto out; |
3165 |
goto out; |
| 2938 |
if (!DSA_set0_pqg(k->dsa, dsa_p, dsa_q, dsa_g)) { |
3166 |
dsa = EVP_PKEY_get0_DSA(k->pkey); |
|
|
3167 |
if (!dsa || !DSA_set0_pqg(dsa, dsa_p, dsa_q, dsa_g)) { |
| 2939 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3168 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2940 |
goto out; |
3169 |
goto out; |
| 2941 |
} |
3170 |
} |
| 2942 |
dsa_p = dsa_q = dsa_g = NULL; /* transferred */ |
3171 |
dsa_p = dsa_q = dsa_g = NULL; /* transferred */ |
| 2943 |
if (!DSA_set0_key(k->dsa, dsa_pub_key, dsa_priv_key)) { |
3172 |
if (!DSA_set0_key(dsa, dsa_pub_key, dsa_priv_key)) { |
| 2944 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3173 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2945 |
goto out; |
3174 |
goto out; |
| 2946 |
} |
3175 |
} |
|
Lines 2950-2956
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 2950 |
if ((r = sshkey_froms(buf, &k)) != 0 || |
3179 |
if ((r = sshkey_froms(buf, &k)) != 0 || |
| 2951 |
(r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0) |
3180 |
(r = sshbuf_get_bignum2(buf, &dsa_priv_key)) != 0) |
| 2952 |
goto out; |
3181 |
goto out; |
| 2953 |
if (!DSA_set0_key(k->dsa, NULL, dsa_priv_key)) { |
3182 |
dsa = EVP_PKEY_get0_DSA(k->pkey); |
|
|
3183 |
if (!dsa || !DSA_set0_key(dsa, NULL, dsa_priv_key)) { |
| 2954 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3184 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2955 |
goto out; |
3185 |
goto out; |
| 2956 |
} |
3186 |
} |
|
Lines 2972-3005
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 2972 |
r = SSH_ERR_EC_CURVE_MISMATCH; |
3202 |
r = SSH_ERR_EC_CURVE_MISMATCH; |
| 2973 |
goto out; |
3203 |
goto out; |
| 2974 |
} |
3204 |
} |
| 2975 |
k->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid); |
3205 |
ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid); |
| 2976 |
if (k->ecdsa == NULL) { |
3206 |
if (ecdsa == NULL) { |
| 2977 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3207 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2978 |
goto out; |
3208 |
goto out; |
| 2979 |
} |
3209 |
} |
| 2980 |
if ((r = sshbuf_get_eckey(buf, k->ecdsa)) != 0 || |
3210 |
if ((r = sshbuf_get_eckey(buf, ecdsa)) != 0 || |
| 2981 |
(r = sshbuf_get_bignum2(buf, &exponent))) |
3211 |
(r = sshbuf_get_bignum2(buf, &exponent))) |
| 2982 |
goto out; |
3212 |
goto out; |
| 2983 |
if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) { |
3213 |
if (EC_KEY_set_private_key(ecdsa, exponent) != 1) { |
| 2984 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3214 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2985 |
goto out; |
3215 |
goto out; |
| 2986 |
} |
3216 |
} |
| 2987 |
if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(k->ecdsa), |
3217 |
if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa), |
| 2988 |
EC_KEY_get0_public_key(k->ecdsa))) != 0 || |
3218 |
EC_KEY_get0_public_key(ecdsa))) != 0 || |
| 2989 |
(r = sshkey_ec_validate_private(k->ecdsa)) != 0) |
3219 |
(r = sshkey_ec_validate_private(ecdsa)) != 0) |
|
|
3220 |
goto out; |
| 3221 |
if (EVP_PKEY_set1_EC_KEY(k->pkey, ecdsa) != 1) { |
| 3222 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2990 |
goto out; |
3223 |
goto out; |
|
|
3224 |
} |
| 2991 |
break; |
3225 |
break; |
| 2992 |
case KEY_ECDSA_CERT: |
3226 |
case KEY_ECDSA_CERT: |
| 2993 |
if ((r = sshkey_froms(buf, &k)) != 0 || |
3227 |
if ((r = sshkey_froms(buf, &k)) != 0 || |
| 2994 |
(r = sshbuf_get_bignum2(buf, &exponent)) != 0) |
3228 |
(r = sshbuf_get_bignum2(buf, &exponent)) != 0) |
| 2995 |
goto out; |
3229 |
goto out; |
| 2996 |
if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) { |
3230 |
ecdsa = EVP_PKEY_get0_EC_KEY(k->pkey); |
|
|
3231 |
if (!ecdsa || EC_KEY_set_private_key(ecdsa, exponent) != 1) { |
| 2997 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3232 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 2998 |
goto out; |
3233 |
goto out; |
| 2999 |
} |
3234 |
} |
| 3000 |
if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(k->ecdsa), |
3235 |
if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa), |
| 3001 |
EC_KEY_get0_public_key(k->ecdsa))) != 0 || |
3236 |
EC_KEY_get0_public_key(ecdsa))) != 0 || |
| 3002 |
(r = sshkey_ec_validate_private(k->ecdsa)) != 0) |
3237 |
(r = sshkey_ec_validate_private(ecdsa)) != 0) |
| 3003 |
goto out; |
3238 |
goto out; |
| 3004 |
break; |
3239 |
break; |
| 3005 |
# endif /* OPENSSL_HAS_ECC */ |
3240 |
# endif /* OPENSSL_HAS_ECC */ |
|
Lines 3015-3031
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 3015 |
(r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 || |
3250 |
(r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 || |
| 3016 |
(r = sshbuf_get_bignum2(buf, &rsa_q)) != 0) |
3251 |
(r = sshbuf_get_bignum2(buf, &rsa_q)) != 0) |
| 3017 |
goto out; |
3252 |
goto out; |
| 3018 |
if (!RSA_set0_key(k->rsa, rsa_n, rsa_e, rsa_d)) { |
3253 |
rsa = EVP_PKEY_get0_RSA(k->pkey); |
|
|
3254 |
if (!rsa || !RSA_set0_key(rsa, rsa_n, rsa_e, rsa_d)) { |
| 3019 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3255 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3020 |
goto out; |
3256 |
goto out; |
| 3021 |
} |
3257 |
} |
| 3022 |
rsa_n = rsa_e = rsa_d = NULL; /* transferred */ |
3258 |
rsa_n = rsa_e = rsa_d = NULL; /* transferred */ |
| 3023 |
if (!RSA_set0_factors(k->rsa, rsa_p, rsa_q)) { |
3259 |
if (!RSA_set0_factors(rsa, rsa_p, rsa_q)) { |
| 3024 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3260 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3025 |
goto out; |
3261 |
goto out; |
| 3026 |
} |
3262 |
} |
| 3027 |
rsa_p = rsa_q = NULL; /* transferred */ |
3263 |
rsa_p = rsa_q = NULL; /* transferred */ |
| 3028 |
if ((r = check_rsa_length(k->rsa)) != 0) |
3264 |
if ((r = check_rsa_length(k)) != 0) |
| 3029 |
goto out; |
3265 |
goto out; |
| 3030 |
if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0) |
3266 |
if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0) |
| 3031 |
goto out; |
3267 |
goto out; |
|
Lines 3037-3053
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 3037 |
(r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 || |
3273 |
(r = sshbuf_get_bignum2(buf, &rsa_p)) != 0 || |
| 3038 |
(r = sshbuf_get_bignum2(buf, &rsa_q)) != 0) |
3274 |
(r = sshbuf_get_bignum2(buf, &rsa_q)) != 0) |
| 3039 |
goto out; |
3275 |
goto out; |
| 3040 |
if (!RSA_set0_key(k->rsa, NULL, NULL, rsa_d)) { |
3276 |
rsa = EVP_PKEY_get0_RSA(k->pkey); |
|
|
3277 |
if (!rsa || !RSA_set0_key(rsa, NULL, NULL, rsa_d)) { |
| 3041 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3278 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3042 |
goto out; |
3279 |
goto out; |
| 3043 |
} |
3280 |
} |
| 3044 |
rsa_d = NULL; /* transferred */ |
3281 |
rsa_d = NULL; /* transferred */ |
| 3045 |
if (!RSA_set0_factors(k->rsa, rsa_p, rsa_q)) { |
3282 |
if (!RSA_set0_factors(rsa, rsa_p, rsa_q)) { |
| 3046 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3283 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3047 |
goto out; |
3284 |
goto out; |
| 3048 |
} |
3285 |
} |
| 3049 |
rsa_p = rsa_q = NULL; /* transferred */ |
3286 |
rsa_p = rsa_q = NULL; /* transferred */ |
| 3050 |
if ((r = check_rsa_length(k->rsa)) != 0) |
3287 |
if ((r = check_rsa_length(k)) != 0) |
| 3051 |
goto out; |
3288 |
goto out; |
| 3052 |
if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0) |
3289 |
if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0) |
| 3053 |
goto out; |
3290 |
goto out; |
|
Lines 3137-3143
sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
Link Here
|
| 3137 |
switch (k->type) { |
3374 |
switch (k->type) { |
| 3138 |
case KEY_RSA: |
3375 |
case KEY_RSA: |
| 3139 |
case KEY_RSA_CERT: |
3376 |
case KEY_RSA_CERT: |
| 3140 |
if (RSA_blinding_on(k->rsa, NULL) != 1) { |
3377 |
rsa = EVP_PKEY_get0_RSA(k->pkey); |
|
|
3378 |
if (!rsa || RSA_blinding_on(rsa, NULL) != 1) { |
| 3141 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
3379 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3142 |
goto out; |
3380 |
goto out; |
| 3143 |
} |
3381 |
} |
|
Lines 3728-3733
sshkey_private_pem_to_blob(struct sshkey *key, struct sshbuf *blob,
Link Here
|
| 3728 |
const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL; |
3966 |
const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL; |
| 3729 |
char *bptr; |
3967 |
char *bptr; |
| 3730 |
BIO *bio = NULL; |
3968 |
BIO *bio = NULL; |
|
|
3969 |
RSA *rsa; |
| 3970 |
DSA *dsa; |
| 3971 |
EC_KEY *ecdsa; |
| 3731 |
|
3972 |
|
| 3732 |
if (len > 0 && len <= 4) |
3973 |
if (len > 0 && len <= 4) |
| 3733 |
return SSH_ERR_PASSPHRASE_TOO_SHORT; |
3974 |
return SSH_ERR_PASSPHRASE_TOO_SHORT; |
|
Lines 3736-3752
sshkey_private_pem_to_blob(struct sshkey *key, struct sshbuf *blob,
Link Here
|
| 3736 |
|
3977 |
|
| 3737 |
switch (key->type) { |
3978 |
switch (key->type) { |
| 3738 |
case KEY_DSA: |
3979 |
case KEY_DSA: |
| 3739 |
success = PEM_write_bio_DSAPrivateKey(bio, key->dsa, |
3980 |
dsa = EVP_PKEY_get0_DSA(key->pkey); |
|
|
3981 |
success = PEM_write_bio_DSAPrivateKey(bio, dsa, |
| 3740 |
cipher, passphrase, len, NULL, NULL); |
3982 |
cipher, passphrase, len, NULL, NULL); |
| 3741 |
break; |
3983 |
break; |
| 3742 |
#ifdef OPENSSL_HAS_ECC |
3984 |
#ifdef OPENSSL_HAS_ECC |
| 3743 |
case KEY_ECDSA: |
3985 |
case KEY_ECDSA: |
| 3744 |
success = PEM_write_bio_ECPrivateKey(bio, key->ecdsa, |
3986 |
ecdsa = EVP_PKEY_get0_EC_KEY(key->pkey); |
|
|
3987 |
success = PEM_write_bio_ECPrivateKey(bio, ecdsa, |
| 3745 |
cipher, passphrase, len, NULL, NULL); |
3988 |
cipher, passphrase, len, NULL, NULL); |
| 3746 |
break; |
3989 |
break; |
| 3747 |
#endif |
3990 |
#endif |
| 3748 |
case KEY_RSA: |
3991 |
case KEY_RSA: |
| 3749 |
success = PEM_write_bio_RSAPrivateKey(bio, key->rsa, |
3992 |
rsa = EVP_PKEY_get0_RSA(key->pkey); |
|
|
3993 |
success = PEM_write_bio_RSAPrivateKey(bio, rsa, |
| 3750 |
cipher, passphrase, len, NULL, NULL); |
3994 |
cipher, passphrase, len, NULL, NULL); |
| 3751 |
break; |
3995 |
break; |
| 3752 |
default: |
3996 |
default: |
|
Lines 3912-3931
sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
Link Here
|
| 3912 |
} |
4156 |
} |
| 3913 |
if (EVP_PKEY_base_id(pk) == EVP_PKEY_RSA && |
4157 |
if (EVP_PKEY_base_id(pk) == EVP_PKEY_RSA && |
| 3914 |
(type == KEY_UNSPEC || type == KEY_RSA)) { |
4158 |
(type == KEY_UNSPEC || type == KEY_RSA)) { |
|
|
4159 |
RSA *rsa; |
| 3915 |
if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) { |
4160 |
if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) { |
| 3916 |
r = SSH_ERR_ALLOC_FAIL; |
4161 |
r = SSH_ERR_ALLOC_FAIL; |
| 3917 |
goto out; |
4162 |
goto out; |
| 3918 |
} |
4163 |
} |
| 3919 |
prv->rsa = EVP_PKEY_get1_RSA(pk); |
4164 |
rsa = EVP_PKEY_get0_RSA(pk); |
|
|
4165 |
if (rsa == NULL) { |
| 4166 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 4167 |
goto out; |
| 4168 |
} |
| 4169 |
prv->pkey = pk; |
| 4170 |
pk = NULL; |
| 3920 |
prv->type = KEY_RSA; |
4171 |
prv->type = KEY_RSA; |
| 3921 |
#ifdef DEBUG_PK |
4172 |
#ifdef DEBUG_PK |
| 3922 |
RSA_print_fp(stderr, prv->rsa, 8); |
4173 |
RSA_print_fp(stderr, rsa, 8); |
| 3923 |
#endif |
4174 |
#endif |
| 3924 |
if (RSA_blinding_on(prv->rsa, NULL) != 1) { |
4175 |
if (RSA_blinding_on(rsa, NULL) != 1) { |
| 3925 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
4176 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 3926 |
goto out; |
4177 |
goto out; |
| 3927 |
} |
4178 |
} |
| 3928 |
if ((r = check_rsa_length(prv->rsa)) != 0) |
4179 |
if ((r = check_rsa_length(prv)) != 0) |
| 3929 |
goto out; |
4180 |
goto out; |
| 3930 |
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA && |
4181 |
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA && |
| 3931 |
(type == KEY_UNSPEC || type == KEY_DSA)) { |
4182 |
(type == KEY_UNSPEC || type == KEY_DSA)) { |
|
Lines 3933-3964
sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
Link Here
|
| 3933 |
r = SSH_ERR_ALLOC_FAIL; |
4184 |
r = SSH_ERR_ALLOC_FAIL; |
| 3934 |
goto out; |
4185 |
goto out; |
| 3935 |
} |
4186 |
} |
| 3936 |
prv->dsa = EVP_PKEY_get1_DSA(pk); |
4187 |
prv->pkey = pk; |
|
|
4188 |
pk = NULL; |
| 3937 |
prv->type = KEY_DSA; |
4189 |
prv->type = KEY_DSA; |
| 3938 |
#ifdef DEBUG_PK |
4190 |
#ifdef DEBUG_PK |
| 3939 |
DSA_print_fp(stderr, prv->dsa, 8); |
4191 |
DSA_print_fp(stderr, EVP_PKEY_get0_DSA(pk), 8); |
| 3940 |
#endif |
4192 |
#endif |
| 3941 |
#ifdef OPENSSL_HAS_ECC |
4193 |
#ifdef OPENSSL_HAS_ECC |
| 3942 |
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_EC && |
4194 |
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_EC && |
| 3943 |
(type == KEY_UNSPEC || type == KEY_ECDSA)) { |
4195 |
(type == KEY_UNSPEC || type == KEY_ECDSA)) { |
|
|
4196 |
EC_KEY *ecdsa; |
| 3944 |
if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) { |
4197 |
if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) { |
| 3945 |
r = SSH_ERR_ALLOC_FAIL; |
4198 |
r = SSH_ERR_ALLOC_FAIL; |
| 3946 |
goto out; |
4199 |
goto out; |
| 3947 |
} |
4200 |
} |
| 3948 |
prv->ecdsa = EVP_PKEY_get1_EC_KEY(pk); |
4201 |
ecdsa = EVP_PKEY_get0_EC_KEY(pk); |
|
|
4202 |
if (ecdsa == NULL) { |
| 4203 |
r = SSH_ERR_LIBCRYPTO_ERROR; |
| 4204 |
goto out; |
| 4205 |
} |
| 3949 |
prv->type = KEY_ECDSA; |
4206 |
prv->type = KEY_ECDSA; |
| 3950 |
prv->ecdsa_nid = sshkey_ecdsa_key_to_nid(prv->ecdsa); |
4207 |
EVP_PKEY_free(prv->pkey); |
|
|
4208 |
prv->pkey = pk; |
| 4209 |
pk = NULL; |
| 4210 |
prv->ecdsa_nid = sshkey_ecdsa_key_to_nid(prv); |
| 3951 |
if (prv->ecdsa_nid == -1 || |
4211 |
if (prv->ecdsa_nid == -1 || |
| 3952 |
sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL || |
4212 |
sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL || |
| 3953 |
sshkey_ec_validate_public(EC_KEY_get0_group(prv->ecdsa), |
4213 |
sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa), |
| 3954 |
EC_KEY_get0_public_key(prv->ecdsa)) != 0 || |
4214 |
EC_KEY_get0_public_key(ecdsa)) != 0 || |
| 3955 |
sshkey_ec_validate_private(prv->ecdsa) != 0) { |
4215 |
sshkey_ec_validate_private(ecdsa) != 0) { |
| 3956 |
r = SSH_ERR_INVALID_FORMAT; |
4216 |
r = SSH_ERR_INVALID_FORMAT; |
| 3957 |
goto out; |
4217 |
goto out; |
| 3958 |
} |
4218 |
} |
| 3959 |
# ifdef DEBUG_PK |
4219 |
# ifdef DEBUG_PK |
| 3960 |
if (prv != NULL && prv->ecdsa != NULL) |
4220 |
if (prv != NULL && ecdsa != NULL) |
| 3961 |
sshkey_dump_ec_key(prv->ecdsa); |
4221 |
sshkey_dump_ec_key(ecdsa); |
| 3962 |
# endif |
4222 |
# endif |
| 3963 |
#endif /* OPENSSL_HAS_ECC */ |
4223 |
#endif /* OPENSSL_HAS_ECC */ |
| 3964 |
} else { |
4224 |
} else { |