aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelen <jjelen@redhat.com>2018-09-11 15:11:12 +0200
committerAndreas Schneider <asn@cryptomilk.org>2018-09-17 16:39:38 +0200
commit8cc0672c0cf116221418626ca8b7b1234c31af43 (patch)
tree086889d0c3879725bb4c9f5a132166f40eb02428
parent8f7214a584c7a884ae3714b84451cc51027f98e2 (diff)
downloadlibssh-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.c36
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)