diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2011-09-17 13:20:04 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2011-09-18 20:34:16 +0200 |
commit | 09b33b1b6ece6c259a68f5542b64f71190c308c6 (patch) | |
tree | 1714ba85e16f69ccd21e6f24a7d26bf547e79a63 /src | |
parent | af09313eac20e91e7e70336c3b8a45688a73d146 (diff) | |
download | libssh-09b33b1b6ece6c259a68f5542b64f71190c308c6.tar.gz libssh-09b33b1b6ece6c259a68f5542b64f71190c308c6.tar.xz libssh-09b33b1b6ece6c259a68f5542b64f71190c308c6.zip |
server: split dh_handsake_server
Diffstat (limited to 'src')
-rw-r--r-- | src/server.c | 77 |
1 files changed, 44 insertions, 33 deletions
diff --git a/src/server.c b/src/server.c index e5be117..90bc8eb 100644 --- a/src/server.c +++ b/src/server.c @@ -169,13 +169,48 @@ SSH_PACKET_CALLBACK(ssh_packet_kexdh_init){ return SSH_PACKET_USED; } +int ssh_get_key_params(ssh_session session, ssh_key *privkey){ + ssh_key pubkey; + ssh_string pubkey_blob; + int rc; + + switch(session->srv.hostkey) { + case SSH_KEYTYPE_DSS: + *privkey = session->srv.dsa_key; + break; + case SSH_KEYTYPE_RSA: + case SSH_KEYTYPE_RSA1: + *privkey = session->srv.rsa_key; + break; + case SSH_KEYTYPE_ECDSA: + case SSH_KEYTYPE_UNKNOWN: + *privkey = NULL; + } + + rc = ssh_pki_export_privkey_to_pubkey(*privkey, &pubkey); + if (rc < 0) { + ssh_set_error(session, SSH_FATAL, + "Could not get the public key from the private key"); + + return -1; + } + + rc = ssh_pki_export_pubkey_blob(pubkey, &pubkey_blob); + ssh_key_free(pubkey); + if (rc < 0) { + ssh_set_error_oom(session); + return -1; + } + + dh_import_pubkey(session, pubkey_blob); + return SSH_OK; +} + static int dh_handshake_server(ssh_session session) { - ssh_key pubkey; - ssh_key privkey = NULL; - ssh_string pubkey_blob = NULL; + ssh_key privkey; + //ssh_string pubkey_blob = NULL; ssh_string sig_blob; ssh_string f; - int rc; if (dh_generate_y(session) < 0) { ssh_set_error(session, SSH_FATAL, "Could not create y number"); @@ -192,36 +227,11 @@ static int dh_handshake_server(ssh_session session) { return -1; } - switch(session->srv.hostkey) { - case SSH_KEYTYPE_DSS: - privkey = session->srv.dsa_key; - break; - case SSH_KEYTYPE_RSA: - case SSH_KEYTYPE_RSA1: - privkey = session->srv.rsa_key; - break; - case SSH_KEYTYPE_ECDSA: - case SSH_KEYTYPE_UNKNOWN: - privkey = NULL; - } - - rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey); - if (rc < 0) { - ssh_set_error(session, SSH_FATAL, - "Could not get the public key from the private key"); - ssh_string_free(f); - return -1; - } - - rc = ssh_pki_export_pubkey_blob(pubkey, &pubkey_blob); - ssh_key_free(pubkey); - if (rc < 0) { - ssh_set_error_oom(session); - ssh_string_free(f); - return -1; + if (ssh_get_key_params(session,&privkey) != SSH_OK){ + ssh_string_free(f); + return -1; } - dh_import_pubkey(session, pubkey_blob); if (dh_build_k(session) < 0) { ssh_set_error(session, SSH_FATAL, "Could not import the public key"); ssh_string_free(f); @@ -252,7 +262,8 @@ static int dh_handshake_server(ssh_session session) { } if (buffer_add_u8(session->out_buffer, SSH2_MSG_KEXDH_REPLY) < 0 || - buffer_add_ssh_string(session->out_buffer, pubkey_blob) < 0 || + buffer_add_ssh_string(session->out_buffer, + session->next_crypto->server_pubkey) < 0 || buffer_add_ssh_string(session->out_buffer, f) < 0 || buffer_add_ssh_string(session->out_buffer, sig_blob) < 0) { ssh_set_error(session, SSH_FATAL, "Not enough space"); |