aboutsummaryrefslogtreecommitdiff
path: root/src/pki_gcrypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pki_gcrypt.c')
-rw-r--r--src/pki_gcrypt.c45
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};