aboutsummaryrefslogtreecommitdiff
path: root/src/pki_crypto.c
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-12-30 11:06:10 +0100
committerAndreas Schneider <asn@cryptomilk.org>2012-02-04 18:37:04 +0100
commit9070b041843f0850f13947f7994264aab263557e (patch)
treef7bed3309831399c137d807e797e18d1b108e12b /src/pki_crypto.c
parentb309dd8fb72d1deaa16536f6d3391711594bbca5 (diff)
downloadlibssh-9070b041843f0850f13947f7994264aab263557e.tar.gz
libssh-9070b041843f0850f13947f7994264aab263557e.tar.xz
libssh-9070b041843f0850f13947f7994264aab263557e.zip
pki: Add ecdsa support for signature_to_blob.
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r--src/pki_crypto.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c
index e07008cc..981e4102 100644
--- a/src/pki_crypto.c
+++ b/src/pki_crypto.c
@@ -1003,6 +1003,35 @@ ssh_string pki_signature_to_blob(const ssh_signature sig)
sig_blob = ssh_string_copy(sig->rsa_sig);
break;
case SSH_KEYTYPE_ECDSA:
+#ifdef HAVE_OPENSSL_ECC
+ r = make_bignum_string(sig->ecdsa_sig->r);
+ if (r == NULL) {
+ return NULL;
+ }
+ s = make_bignum_string(sig->ecdsa_sig->s);
+ if (s == NULL) {
+ ssh_string_free(r);
+ return NULL;
+ }
+
+ memcpy(buffer,
+ ((char *)ssh_string_data(r)) + ssh_string_len(r) - 20,
+ 20);
+ memcpy(buffer + 20,
+ ((char *)ssh_string_data(s)) + ssh_string_len(s) - 20,
+ 20);
+
+ ssh_string_free(r);
+ ssh_string_free(s);
+
+ sig_blob = ssh_string_new(40);
+ if (sig_blob == NULL) {
+ return NULL;
+ }
+
+ ssh_string_fill(sig_blob, buffer, 40);
+ break;
+#endif
case SSH_KEYTYPE_UNKNOWN:
ssh_pki_log("Unknown signature key type: %d", sig->type);
return NULL;