diff options
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r-- | src/pki_crypto.c | 76 |
1 files changed, 50 insertions, 26 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 69ac2999..07bc7f99 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -1094,41 +1094,65 @@ static ssh_string _RSA_do_sign(const unsigned char *digest, return sig_blob; } -ssh_string pki_signature_to_blob(const ssh_signature sig) +static ssh_string pki_dsa_signature_to_blob(const ssh_signature sig) { - char buffer[40] = {0}; + char buffer[40] = { 0 }; ssh_string sig_blob = NULL; + ssh_string r; + int r_len, r_offset_in, r_offset_out; + ssh_string s; + int s_len, s_offset_in, s_offset_out; - switch(sig->type) { - case SSH_KEYTYPE_DSS: - r = make_bignum_string(sig->dsa_sig->r); - if (r == NULL) { - return NULL; - } - s = make_bignum_string(sig->dsa_sig->s); - if (s == NULL) { - ssh_string_free(r); - return NULL; - } + r = make_bignum_string(sig->dsa_sig->r); + if (r == NULL) { + 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); + s = make_bignum_string(sig->dsa_sig->s); + if (s == NULL) { + ssh_string_free(r); + return NULL; + } - ssh_string_free(r); - ssh_string_free(s); + r_len = ssh_string_len(r); + r_offset_in = (r_len > 20) ? (r_len - 20) : 0; + r_offset_out = (r_len < 20) ? (20 - r_len) : 0; - sig_blob = ssh_string_new(40); - if (sig_blob == NULL) { - return NULL; - } + s_len = ssh_string_len(s); + s_offset_in = (s_len > 20) ? (s_len - 20) : 0; + s_offset_out = (s_len < 20) ? (20 - s_len) : 0; + + memcpy(buffer + r_offset_out, + ((char *)ssh_string_data(r)) + r_offset_in, + r_len - r_offset_in); + memcpy(buffer + 20 + s_offset_out, + ((char *)ssh_string_data(s)) + s_offset_in, + s_len - s_offset_in); + + 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); + + return sig_blob; +} + +ssh_string pki_signature_to_blob(const ssh_signature sig) +{ + ssh_string r; + ssh_string s; + ssh_string sig_blob = NULL; - ssh_string_fill(sig_blob, buffer, 40); + switch(sig->type) { + case SSH_KEYTYPE_DSS: + sig_blob = pki_dsa_signature_to_blob(sig); break; case SSH_KEYTYPE_RSA: case SSH_KEYTYPE_RSA1: |