aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-12-30 11:09:40 +0100
committerAndreas Schneider <asn@cryptomilk.org>2012-02-04 18:37:04 +0100
commite9f5c7421e3e7e4a0eaefddf1694571f37e54007 (patch)
tree5a663ca2574c0dc4a6692a46092e0c5c0d6a99a6 /src
parent9070b041843f0850f13947f7994264aab263557e (diff)
downloadlibssh-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.c50
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;