* src/pki_gcrypt.c (pki_export_pubkey_rsa1): Rework to be more idiomatic. Fix leaking MPIs.
Signed-off-by: Justus Winter <[email protected]> --- src/pki_gcrypt.c | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/src/pki_gcrypt.c b/src/pki_gcrypt.c index 8785007..e88c0a8 100644 --- a/src/pki_gcrypt.c +++ b/src/pki_gcrypt.c @@ -1140,34 +1140,16 @@ int pki_export_pubkey_rsa1(const ssh_key key, char *rsa1, size_t rsa1_len) { - gcry_sexp_t sexp; + gpg_error_t err; int rsa_size; - bignum b; + bignum E, N; char *e, *n; - sexp = gcry_sexp_find_token(key->rsa, "e", 0); - if (sexp == NULL) { + err = gcry_sexp_extract_param(key->rsa, NULL, "en", &E, &N, NULL); + if (err) return SSH_ERROR; - } - b = gcry_sexp_nth_mpi(sexp, 1, GCRYMPI_FMT_USG); - gcry_sexp_release(sexp); - if (b == NULL) { - return SSH_ERROR; - } - e = bignum_bn2dec(b); - - sexp = gcry_sexp_find_token(key->rsa, "n", 0); - if (sexp == NULL) { - SAFE_FREE(e); - return SSH_ERROR; - } - b = gcry_sexp_nth_mpi(sexp, 1, GCRYMPI_FMT_USG); - gcry_sexp_release(sexp); - if (b == NULL) { - SAFE_FREE(e); - return SSH_ERROR; - } - n = bignum_bn2dec(b); + e = bignum_bn2dec(E); + n = bignum_bn2dec(N); rsa_size = (gcry_pk_get_nbits(key->rsa) + 7) / 8; @@ -1176,6 +1158,8 @@ int pki_export_pubkey_rsa1(const ssh_key key, host, rsa_size << 3, e, n); SAFE_FREE(e); SAFE_FREE(n); + bignum_free(E); + bignum_free(N); return SSH_OK; } -- 2.1.4
