summaryrefslogtreecommitdiffstats
path: root/src/pki_crypto.c
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-08-20 18:08:16 +0200
committerAndreas Schneider <asn@cryptomilk.org>2011-08-20 18:08:16 +0200
commit8acc3dd3afeff6b9f4c2327c9b2d0bc0f0eafb18 (patch)
treef059b96765eb9e13c8afa15e3ff340e89f684445 /src/pki_crypto.c
parent79029854f638839be3cfcf8f2194e69ea5e96559 (diff)
downloadlibssh-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.c32
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);