mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-11-30 13:01:23 +03:00
pki_crpypto: Fix ecdsa signature to blob.
BUG: https://red.libssh.org/issues/118
This commit is contained in:
@@ -1018,33 +1018,47 @@ ssh_string pki_signature_to_blob(const ssh_signature sig)
|
|||||||
break;
|
break;
|
||||||
case SSH_KEYTYPE_ECDSA:
|
case SSH_KEYTYPE_ECDSA:
|
||||||
#ifdef HAVE_OPENSSL_ECC
|
#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);
|
r = make_bignum_string(sig->ecdsa_sig->r);
|
||||||
if (r == NULL) {
|
if (r == NULL) {
|
||||||
|
ssh_buffer_free(b);
|
||||||
return NULL;
|
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);
|
s = make_bignum_string(sig->ecdsa_sig->s);
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
ssh_string_free(r);
|
ssh_buffer_free(b);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
rc = buffer_add_ssh_string(b, s);
|
||||||
|
ssh_string_free(s);
|
||||||
|
if (rc < 0) {
|
||||||
|
ssh_buffer_free(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(buffer,
|
sig_blob = ssh_string_new(buffer_get_rest_len(b));
|
||||||
((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) {
|
if (sig_blob == NULL) {
|
||||||
return 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;
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
case SSH_KEYTYPE_UNKNOWN:
|
case SSH_KEYTYPE_UNKNOWN:
|
||||||
ssh_pki_log("Unknown signature key type: %s", sig->type_c);
|
ssh_pki_log("Unknown signature key type: %s", sig->type_c);
|
||||||
|
|||||||
Reference in New Issue
Block a user