diff options
author | Jakub Jelen <jjelen@redhat.com> | 2018-09-11 15:11:12 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2018-09-17 16:39:38 +0200 |
commit | 8cc0672c0cf116221418626ca8b7b1234c31af43 (patch) | |
tree | 086889d0c3879725bb4c9f5a132166f40eb02428 | |
parent | 8f7214a584c7a884ae3714b84451cc51027f98e2 (diff) | |
download | libssh-8cc0672c0cf116221418626ca8b7b1234c31af43.tar.gz libssh-8cc0672c0cf116221418626ca8b7b1234c31af43.tar.xz libssh-8cc0672c0cf116221418626ca8b7b1234c31af43.zip |
pki_mbedcrypto: pki_pubkey_build_rsa: properly clean up on error
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r-- | src/pki_mbedcrypto.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/src/pki_mbedcrypto.c b/src/pki_mbedcrypto.c index 534e375d..a5954980 100644 --- a/src/pki_mbedcrypto.c +++ b/src/pki_mbedcrypto.c @@ -229,25 +229,31 @@ int pki_pubkey_build_rsa(ssh_key key, ssh_string e, ssh_string n) pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA); mbedtls_pk_setup(key->rsa, pk_info); - if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA)) { - rsa = mbedtls_pk_rsa(*key->rsa); - rc = mbedtls_mpi_read_binary(&rsa->N, ssh_string_data(n), - ssh_string_len(n)); - if (rc != 0) { - return SSH_ERROR; - } - rc = mbedtls_mpi_read_binary(&rsa->E, ssh_string_data(e), - ssh_string_len(e)); - if (rc != 0) { - return SSH_ERROR; - } + rc = mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA); + if (rc == 0) { + goto fail; + } - rsa->len = (mbedtls_mpi_bitlen(&rsa->N) + 7) >> 3; - } else { - return SSH_ERROR; + rsa = mbedtls_pk_rsa(*key->rsa); + rc = mbedtls_mpi_read_binary(&rsa->N, ssh_string_data(n), + ssh_string_len(n)); + if (rc != 0) { + goto fail; + } + rc = mbedtls_mpi_read_binary(&rsa->E, ssh_string_data(e), + ssh_string_len(e)); + if (rc != 0) { + goto fail; } + rsa->len = (mbedtls_mpi_bitlen(&rsa->N) + 7) >> 3; + return SSH_OK; + +fail: + mbedtls_pk_free(key->rsa); + SAFE_FREE(key->rsa); + return SSH_ERROR; } ssh_key pki_key_dup(const ssh_key key, int demote) |