diff options
Diffstat (limited to 'src/pki_gcrypt.c')
-rw-r--r-- | src/pki_gcrypt.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/pki_gcrypt.c b/src/pki_gcrypt.c index cf770611..6f3cd957 100644 --- a/src/pki_gcrypt.c +++ b/src/pki_gcrypt.c @@ -1145,6 +1145,51 @@ fail: return NULL; } +int pki_export_pubkey_rsa1(const ssh_key key, + const char *host, + char *rsa1, + size_t rsa1_len) +{ + gcry_sexp_t sexp; + int rsa_size; + bignum b; + char *e, *n; + + sexp = gcry_sexp_find_token(key->rsa, "e", 0); + if (sexp == NULL) { + 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); + + rsa_size = (gcry_pk_get_nbits(key->rsa) + 7) / 8; + + snprintf(rsa1, rsa1_len, + "%s %d %s %s\n", + host, rsa_size << 3, e, n); + SAFE_FREE(e); + SAFE_FREE(n); + + return SSH_OK; +} + ssh_string pki_signature_to_blob(const ssh_signature sig) { char buffer[40] = {0}; |