diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2011-12-30 11:09:40 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2012-02-04 18:37:04 +0100 |
commit | e9f5c7421e3e7e4a0eaefddf1694571f37e54007 (patch) | |
tree | 5a663ca2574c0dc4a6692a46092e0c5c0d6a99a6 /src | |
parent | 9070b041843f0850f13947f7994264aab263557e (diff) | |
download | libssh-e9f5c7421e3e7e4a0eaefddf1694571f37e54007.tar.gz libssh-e9f5c7421e3e7e4a0eaefddf1694571f37e54007.tar.xz libssh-e9f5c7421e3e7e4a0eaefddf1694571f37e54007.zip |
pki: Add ecdsa support for signature_from_blob.
Diffstat (limited to 'src')
-rw-r--r-- | src/pki_crypto.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 981e410..3480a9e 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -1136,6 +1136,56 @@ ssh_signature pki_signature_from_blob(const ssh_key pubkey, } break; case SSH_KEYTYPE_ECDSA: +#ifdef HAVE_OPENSSL_ECC + /* 40 is the dual signature blob len. */ + if (len != 40) { + ssh_pki_log("Signature has wrong size: %lu", + (unsigned long)len); + ssh_signature_free(sig); + return NULL; + } + +#ifdef DEBUG_CRYPTO + ssh_print_hexa("r", ssh_string_data(sig_blob), 20); + ssh_print_hexa("s", (unsigned char *)ssh_string_data(sig_blob) + 20, 20); +#endif + + sig->ecdsa_sig = ECDSA_SIG_new(); + if (sig->ecdsa_sig == NULL) { + ssh_signature_free(sig); + return NULL; + } + + r = ssh_string_new(20); + if (r == NULL) { + ssh_signature_free(sig); + return NULL; + } + ssh_string_fill(r, ssh_string_data(sig_blob), 20); + + sig->ecdsa_sig->r = make_string_bn(r); + ssh_string_free(r); + if (sig->ecdsa_sig->r == NULL) { + ssh_signature_free(sig); + return NULL; + } + + s = ssh_string_new(20); + if (s == NULL) { + ssh_signature_free(sig); + return NULL; + } + ssh_string_fill(s, (char *)ssh_string_data(sig_blob) + 20, 20); + + sig->ecdsa_sig->s = make_string_bn(s); + ssh_string_free(s); + if (sig->ecdsa_sig->s == NULL) { + ssh_signature_free(sig); + return NULL; + } + + break; +#endif case SSH_KEYTYPE_UNKNOWN: ssh_pki_log("Unknown signature type"); return NULL; |