diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2011-08-15 17:42:11 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2011-08-15 18:48:08 +0200 |
commit | c77b23b32a550a3dd52b8d2c5b3d1b177126dc54 (patch) | |
tree | cb995b46d8e2bd29100ff856de92439165e0107f /src/pki_crypto.c | |
parent | 962bdb1eea88cfa385e94c59342ce69567a8c59c (diff) | |
download | libssh-c77b23b32a550a3dd52b8d2c5b3d1b177126dc54.tar.gz libssh-c77b23b32a550a3dd52b8d2c5b3d1b177126dc54.tar.xz libssh-c77b23b32a550a3dd52b8d2c5b3d1b177126dc54.zip |
pki: Cleanup pki header.
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r-- | src/pki_crypto.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 821d3ccb..763cb46a 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -347,6 +347,102 @@ int pki_pubkey_build_rsa(ssh_key key, return SSH_OK; } +int pki_publickey_to_string(const ssh_key key, ssh_string *pstr) +{ + ssh_string buffer; + ssh_string type_s; + ssh_string e = NULL; + ssh_string n = NULL; + ssh_string p = NULL; + ssh_string g = NULL; + ssh_string q = NULL; + int rc; + + buffer = ssh_buffer_new(); + if (buffer == NULL) { + return NULL; + } + + type_s = ssh_string_from_char(key->type_c); + if (type_s == NULL) { + ssh_buffer_free(buffer); + return NULL; + } + + rc = buffer_add_ssh_string(buffer, type_s); + string_free(type_s); + if (rc < 0) { + ssh_buffer_free(buffer); + return NULL; + } + + switch (key->type) { + case SSH_KEYTYPE_DSS: + p = make_bignum_string(key->p); + if (p == NULL) { + goto fail; + } + + q = make_bignum_string(key->q); + if (q == NULL) { + goto fail; + } + + g = make_bignum_string(key->g); + if (g == NULL) { + goto fail; + } + + n = make_bignum_string(key->pub_key); + if (n == NULL) { + goto fail; + } + + if (buffer_add_ssh_string(buffer, p) < 0) { + goto fail; + } + if (buffer_add_ssh_string(buffer, q) < 0) { + goto fail; + } + if (buffer_add_ssh_string(buffer, g) < 0) { + goto fail; + } + if (buffer_add_ssh_string(buffer, n) < 0) { + goto fail; + } + break; + case SSH_KEYTYPE_RSA: + case SSH_KEYTYPE_RSA1: + if (rsa_public_to_string(key->rsa_pub, buf) < 0) { + goto error; + } + break; + } + + str = ssh_string_new(buffer_get_rest_len(buffer)); + if (str == NULL) { + goto fail; + } + + rc = ssh_string_fill(str, buffer_get_rest(buffer), buffer_get_rest_len(buffer)); + if (rc < 0) { + goto fail; + } + ssh_buffer_free(buffer); + + *pstr = str; + return SSH_OK; +fail: + ssh_buffer_free(buffer); + ssh_string_free(e); + ssh_string_free(p); + ssh_string_free(g); + ssh_string_free(q); + ssh_string_free(n); + + return SSH_ERROR; +} + struct signature_struct *pki_do_sign(ssh_key privatekey, const unsigned char *hash) { struct signature_struct *sign; |