diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2011-08-07 19:53:03 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2011-08-08 15:28:31 +0200 |
commit | bec483bc1874909be8fd9c8fbc909f53be5ba27a (patch) | |
tree | fd00ee7897dbe20e96e1772e30654a44c1eac728 /src/pki.c | |
parent | f81444bd57095cf8ff8e76b50f662aad0757f574 (diff) | |
download | libssh-bec483bc1874909be8fd9c8fbc909f53be5ba27a.tar.gz libssh-bec483bc1874909be8fd9c8fbc909f53be5ba27a.tar.xz libssh-bec483bc1874909be8fd9c8fbc909f53be5ba27a.zip |
pki: Add ssh_pki_import_pubkey_base64().
Diffstat (limited to 'src/pki.c')
-rw-r--r-- | src/pki.c | 127 |
1 files changed, 127 insertions, 0 deletions
@@ -345,6 +345,133 @@ int ssh_pki_import_privkey_base64(ssh_session session, return SSH_OK; } +int ssh_pki_import_pubkey_base64(ssh_session session, + const char *b64_key, + enum ssh_keytypes_e type, + ssh_key *pkey) { + ssh_buffer buffer; + ssh_key key; + int rc; + + key = ssh_key_new(); + if (key == NULL) { + return SSH_ERROR; + } + + key->type = type; + key->type_c = ssh_key_type_to_char(type); + key->flags = SSH_KEY_FLAG_PUBLIC; + + buffer = base64_to_bin(b64_key); + + switch (type) { + case SSH_KEYTYPE_DSS: + { + ssh_string p; + ssh_string q; + ssh_string g; + ssh_string pubkey; + + p = buffer_get_ssh_string(buffer); + if (p == NULL) { + goto fail; + } + q = buffer_get_ssh_string(buffer); + if (q == NULL) { + ssh_string_burn(p); + ssh_string_free(p); + + goto fail; + } + g = buffer_get_ssh_string(buffer); + if (g == NULL) { + ssh_string_burn(p); + ssh_string_free(p); + ssh_string_burn(q); + ssh_string_free(q); + + goto fail; + } + pubkey = buffer_get_ssh_string(buffer); + if (g == NULL) { + ssh_string_burn(p); + ssh_string_free(p); + ssh_string_burn(q); + ssh_string_free(q); + ssh_string_burn(g); + ssh_string_free(g); + + goto fail; + } + + rc = pki_pubkey_build_dss(key, p, q, g, pubkey); +#ifdef DEBUG_CRYPTO + ssh_print_hexa("p", ssh_string_data(p), ssh_string_len(p)); + ssh_print_hexa("q", ssh_string_data(q), ssh_string_len(q)); + ssh_print_hexa("g", ssh_string_data(g), ssh_string_len(g)); +#endif + ssh_string_burn(p); + ssh_string_free(p); + ssh_string_burn(q); + ssh_string_free(q); + ssh_string_burn(g); + ssh_string_free(g); + if (rc == SSH_ERROR) { + goto fail; + } + } + break; + case SSH_KEYTYPE_RSA: + case SSH_KEYTYPE_RSA1: + { + ssh_string e; + ssh_string n; + + e = buffer_get_ssh_string(buffer); + if (e == NULL) { + goto fail; + } + n = buffer_get_ssh_string(buffer); + if (n == NULL) { + ssh_string_burn(e); + ssh_string_free(e); + + goto fail; + } + + rc = pki_pubkey_build_rsa(key, e, n); +#ifdef DEBUG_CRYPTO + ssh_print_hexa("e", ssh_string_data(e), ssh_string_len(e)); + ssh_print_hexa("n", ssh_string_data(n), ssh_string_len(n)); +#endif + ssh_string_burn(e); + ssh_string_free(e); + ssh_string_burn(n); + ssh_string_free(n); + if (rc == SSH_ERROR) { + goto fail; + } + } + break; + case SSH_KEYTYPE_ECDSA: + case SSH_KEYTYPE_UNKNOWN: + ssh_set_error(session, SSH_FATAL, + "Unknown public key protocol %d", + type); + goto fail; + } + + ssh_buffer_free(buffer); + + *pkey = key; + return SSH_OK; +fail: + ssh_buffer_free(buffer); + ssh_key_free(key); + + return SSH_ERROR; +} + ssh_key ssh_pki_publickey_from_privatekey(ssh_key privkey) { return pki_publickey_from_privatekey(privkey); } |