diff --git a/src/curve25519.c b/src/curve25519.c index 153fbcd9..3cee2032 100644 --- a/src/curve25519.c +++ b/src/curve25519.c @@ -90,7 +90,7 @@ static int ssh_curve25519_build_k(ssh_session session) { crypto_scalarmult(k, session->next_crypto->curve25519_privkey, session->next_crypto->curve25519_server_pubkey); - BN_bin2bn(k, CURVE25519_PUBKEY_SIZE, session->next_crypto->k); + bignum_bin2bn(k, CURVE25519_PUBKEY_SIZE, session->next_crypto->k); #ifdef DEBUG_CRYPTO ssh_print_hexa("Session server cookie", diff --git a/src/ecdh.c b/src/ecdh.c index c9c5c329..679cc2e0 100644 --- a/src/ecdh.c +++ b/src/ecdh.c @@ -100,6 +100,7 @@ static int ecdh_build_k(ssh_session session) { EC_POINT *pubkey; void *buffer; int len = (EC_GROUP_get_degree(group) + 7) / 8; + int rc; bignum_CTX ctx = bignum_ctx_new(); if (ctx == NULL) { return -1; @@ -124,9 +125,23 @@ static int ecdh_build_k(ssh_session session) { EC_POINT_oct2point(group,pubkey,ssh_string_data(session->next_crypto->ecdh_server_pubkey), ssh_string_len(session->next_crypto->ecdh_server_pubkey),ctx); buffer = malloc(len); - ECDH_compute_key(buffer,len,pubkey,session->next_crypto->ecdh_privkey,NULL); - EC_POINT_free(pubkey); - BN_bin2bn(buffer,len,session->next_crypto->k); + if (buffer == NULL) { + EC_POINT_clear_free(pubkey); + return -1; + } + + rc = ECDH_compute_key(buffer, + len, + pubkey, + session->next_crypto->ecdh_privkey, + NULL); + EC_POINT_clear_free(pubkey); + if (rc <= 0) { + free(buffer); + return -1; + } + + bignum_bin2bn(buffer, len, session->next_crypto->k); free(buffer); EC_KEY_free(session->next_crypto->ecdh_privkey); session->next_crypto->ecdh_privkey=NULL;