|
Lines 674-689
server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp)
Link Here
|
| 674 |
struct sshbuf *resp = NULL; |
674 |
struct sshbuf *resp = NULL; |
| 675 |
struct sshbuf *sigbuf = NULL; |
675 |
struct sshbuf *sigbuf = NULL; |
| 676 |
struct sshkey *key = NULL, *key_pub = NULL, *key_prv = NULL; |
676 |
struct sshkey *key = NULL, *key_pub = NULL, *key_prv = NULL; |
| 677 |
int r, ndx, kexsigtype, use_kexsigtype, success = 0; |
677 |
int r, ndx, success = 0; |
| 678 |
const u_char *blob; |
678 |
const u_char *blob; |
|
|
679 |
const char *sigalg, *kex_rsa_sigalg = NULL; |
| 679 |
u_char *sig = 0; |
680 |
u_char *sig = 0; |
| 680 |
size_t blen, slen; |
681 |
size_t blen, slen; |
| 681 |
|
682 |
|
| 682 |
if ((resp = sshbuf_new()) == NULL || (sigbuf = sshbuf_new()) == NULL) |
683 |
if ((resp = sshbuf_new()) == NULL || (sigbuf = sshbuf_new()) == NULL) |
| 683 |
fatal_f("sshbuf_new"); |
684 |
fatal_f("sshbuf_new"); |
| 684 |
|
685 |
if (sshkey_type_plain(sshkey_type_from_name( |
| 685 |
kexsigtype = sshkey_type_plain( |
686 |
ssh->kex->hostkey_alg)) == KEY_RSA) |
| 686 |
sshkey_type_from_name(ssh->kex->hostkey_alg)); |
687 |
kex_rsa_sigalg = ssh->kex->hostkey_alg; |
| 687 |
while (ssh_packet_remaining(ssh) > 0) { |
688 |
while (ssh_packet_remaining(ssh) > 0) { |
| 688 |
sshkey_free(key); |
689 |
sshkey_free(key); |
| 689 |
key = NULL; |
690 |
key = NULL; |
|
Lines 716-731
server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp)
Link Here
|
| 716 |
* For RSA keys, prefer to use the signature type negotiated |
717 |
* For RSA keys, prefer to use the signature type negotiated |
| 717 |
* during KEX to the default (SHA1). |
718 |
* during KEX to the default (SHA1). |
| 718 |
*/ |
719 |
*/ |
| 719 |
use_kexsigtype = kexsigtype == KEY_RSA && |
720 |
sigalg = NULL; |
| 720 |
sshkey_type_plain(key->type) == KEY_RSA; |
721 |
if (sshkey_type_plain(key->type) == KEY_RSA) { |
|
|
722 |
if (kex_rsa_sigalg != NULL) |
| 723 |
sigalg = kex_rsa_sigalg; |
| 724 |
else if (ssh->kex->flags & KEX_RSA_SHA2_512_SUPPORTED) |
| 725 |
sigalg = "rsa-sha2-512"; |
| 726 |
else if (ssh->kex->flags & KEX_RSA_SHA2_256_SUPPORTED) |
| 727 |
sigalg = "rsa-sha2-256"; |
| 728 |
} |
| 729 |
debug3_f("sign %s key (index %d) using sigalg %s", |
| 730 |
sshkey_type(key), ndx, sigalg == NULL ? "default" : sigalg); |
| 721 |
if ((r = sshbuf_put_cstring(sigbuf, |
731 |
if ((r = sshbuf_put_cstring(sigbuf, |
| 722 |
"hostkeys-prove-00@openssh.com")) != 0 || |
732 |
"hostkeys-prove-00@openssh.com")) != 0 || |
| 723 |
(r = sshbuf_put_stringb(sigbuf, |
733 |
(r = sshbuf_put_stringb(sigbuf, |
| 724 |
ssh->kex->session_id)) != 0 || |
734 |
ssh->kex->session_id)) != 0 || |
| 725 |
(r = sshkey_puts(key, sigbuf)) != 0 || |
735 |
(r = sshkey_puts(key, sigbuf)) != 0 || |
| 726 |
(r = ssh->kex->sign(ssh, key_prv, key_pub, &sig, &slen, |
736 |
(r = ssh->kex->sign(ssh, key_prv, key_pub, &sig, &slen, |
| 727 |
sshbuf_ptr(sigbuf), sshbuf_len(sigbuf), |
737 |
sshbuf_ptr(sigbuf), sshbuf_len(sigbuf), sigalg)) != 0 || |
| 728 |
use_kexsigtype ? ssh->kex->hostkey_alg : NULL)) != 0 || |
|
|
| 729 |
(r = sshbuf_put_string(resp, sig, slen)) != 0) { |
738 |
(r = sshbuf_put_string(resp, sig, slen)) != 0) { |
| 730 |
error_fr(r, "assemble signature"); |
739 |
error_fr(r, "assemble signature"); |
| 731 |
goto out; |
740 |
goto out; |