diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2011-08-20 18:08:16 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2011-08-20 18:08:16 +0200 |
commit | 8acc3dd3afeff6b9f4c2327c9b2d0bc0f0eafb18 (patch) | |
tree | f059b96765eb9e13c8afa15e3ff340e89f684445 /src/pki_crypto.c | |
parent | 79029854f638839be3cfcf8f2194e69ea5e96559 (diff) | |
download | libssh-8acc3dd3afeff6b9f4c2327c9b2d0bc0f0eafb18.tar.gz libssh-8acc3dd3afeff6b9f4c2327c9b2d0bc0f0eafb18.tar.xz libssh-8acc3dd3afeff6b9f4c2327c9b2d0bc0f0eafb18.zip |
pki: Add _RSA_do_sign to pki_crypto.
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r-- | src/pki_crypto.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 700408c..0309427 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -485,6 +485,36 @@ fail: return NULL; } +static ssh_string _RSA_do_sign(const unsigned char *payload, + int len, + RSA *privkey) +{ + ssh_string sign = NULL; + unsigned char *buffer = NULL; + unsigned int size; + + buffer = malloc(RSA_size(privkey)); + if (buffer == NULL) { + return NULL; + } + + if (RSA_sign(NID_sha1, payload, len, buffer, &size, privkey) == 0) { + SAFE_FREE(buffer); + return NULL; + } + + sign = ssh_string_new(size); + if (sign == NULL) { + SAFE_FREE(buffer); + return NULL; + } + + ssh_string_fill(sign, buffer, size); + SAFE_FREE(buffer); + + return sign; +} + struct signature_struct *pki_do_sign(ssh_key privatekey, const unsigned char *hash) { struct signature_struct *sign; @@ -513,7 +543,7 @@ struct signature_struct *pki_do_sign(ssh_key privatekey, break; case SSH_KEYTYPE_RSA: case SSH_KEYTYPE_RSA1: - sign->rsa_sign = RSA_do_sign(hash + 1, SHA_DIGEST_LEN, + sign->rsa_sign = _RSA_do_sign(hash + 1, SHA_DIGEST_LEN, privatekey->rsa); if (sign->rsa_sign == NULL) { signature_free(sign); |