diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2013-06-18 17:02:40 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2013-06-18 17:02:40 +0200 |
commit | b31efd9ff1e861b4dd715b8b240fb8bebccf64e1 (patch) | |
tree | ed211c060e1dff7e2eccab85c182129f1bebdcef | |
parent | 5d05aec2efd2f5026b8eb4f2c0279521d564e4b8 (diff) | |
download | libssh-b31efd9ff1e861b4dd715b8b240fb8bebccf64e1.tar.gz libssh-b31efd9ff1e861b4dd715b8b240fb8bebccf64e1.tar.xz libssh-b31efd9ff1e861b4dd715b8b240fb8bebccf64e1.zip |
ecdh: Make sure we don't leak memory in ssh_client_ecdh_init().
This also adds more checks for return values.
-rw-r--r-- | src/ecdh.c | 39 |
1 files changed, 27 insertions, 12 deletions
@@ -38,41 +38,56 @@ * @brief Starts ecdh-sha2-nistp256 key exchange */ int ssh_client_ecdh_init(ssh_session session){ - EC_KEY *key=NULL; + EC_KEY *key; const EC_GROUP *group; const EC_POINT *pubkey; ssh_string client_pubkey; int len; int rc; - bignum_CTX ctx=BN_CTX_new(); - enter_function(); - if (buffer_add_u8(session->out_buffer, SSH2_MSG_KEX_ECDH_INIT) < 0) { - goto error; + bignum_CTX ctx = BN_CTX_new(); + + rc = buffer_add_u8(session->out_buffer, SSH2_MSG_KEX_ECDH_INIT); + if (rc < 0) { + BN_CTX_free(ctx); + return SSH_ERROR; } + key = EC_KEY_new_by_curve_name(NISTP256); + if (key == NULL) { + BN_CTX_free(ctx); + return SSH_ERROR; + } group = EC_KEY_get0_group(key); + EC_KEY_generate_key(key); + pubkey=EC_KEY_get0_public_key(key); len = EC_POINT_point2oct(group,pubkey,POINT_CONVERSION_UNCOMPRESSED, NULL,0,ctx); - client_pubkey=ssh_string_new(len); + + client_pubkey = ssh_string_new(len); + if (client_pubkey == NULL) { + BN_CTX_free(ctx); + EC_KEY_free(key); + } EC_POINT_point2oct(group,pubkey,POINT_CONVERSION_UNCOMPRESSED, ssh_string_data(client_pubkey),len,ctx); + BN_CTX_free(ctx); + rc = buffer_add_ssh_string(session->out_buffer,client_pubkey); if (rc < 0) { - goto error; + EC_KEY_free(key); + ssh_string_free(client_pubkey); + return SSH_ERROR; } - BN_CTX_free(ctx); session->next_crypto->ecdh_privkey = key; session->next_crypto->ecdh_client_pubkey = client_pubkey; + rc = packet_send(session); - leave_function(); + return rc; -error: - leave_function(); - return SSH_ERROR; } static void ecdh_import_pubkey(ssh_session session, ssh_string pubkey_string) { |