diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2013-10-18 23:48:21 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2013-10-18 23:48:21 +0200 |
commit | bd8ab422d02e12ba0b2460023c17a7c10441bf45 (patch) | |
tree | 00ebe3e73bdf7b72a568dd229c1e1cd3618637c7 /src | |
parent | 33890daf4104238ecf4216102abd0411eed17c43 (diff) | |
download | libssh-bd8ab422d02e12ba0b2460023c17a7c10441bf45.tar.gz libssh-bd8ab422d02e12ba0b2460023c17a7c10441bf45.tar.xz libssh-bd8ab422d02e12ba0b2460023c17a7c10441bf45.zip |
pki_crpypto: Fix ecdsa signature to blob.
BUG: https://red.libssh.org/issues/118
Diffstat (limited to 'src')
-rw-r--r-- | src/pki_crypto.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 82fbe93..1912f24 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -1018,33 +1018,47 @@ ssh_string pki_signature_to_blob(const ssh_signature sig) break; case SSH_KEYTYPE_ECDSA: #ifdef HAVE_OPENSSL_ECC + { + ssh_buffer b; + int rc; + + b = ssh_buffer_new(); + if (b == NULL) { + return NULL; + } + r = make_bignum_string(sig->ecdsa_sig->r); if (r == NULL) { + ssh_buffer_free(b); return NULL; } + rc = buffer_add_ssh_string(b, r); + ssh_string_free(r); + if (rc < 0) { + ssh_buffer_free(b); + return NULL; + } + s = make_bignum_string(sig->ecdsa_sig->s); if (s == NULL) { - ssh_string_free(r); + ssh_buffer_free(b); 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); + rc = buffer_add_ssh_string(b, s); ssh_string_free(s); + if (rc < 0) { + ssh_buffer_free(b); + return NULL; + } - sig_blob = ssh_string_new(40); + sig_blob = ssh_string_new(buffer_get_rest_len(b)); if (sig_blob == NULL) { return NULL; } - ssh_string_fill(sig_blob, buffer, 40); + ssh_string_fill(sig_blob, buffer_get_rest(b), buffer_get_rest_len(b)); break; + } #endif case SSH_KEYTYPE_UNKNOWN: ssh_pki_log("Unknown signature key type: %s", sig->type_c); |