diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2011-08-07 18:22:19 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2011-08-08 15:28:31 +0200 |
commit | f81444bd57095cf8ff8e76b50f662aad0757f574 (patch) | |
tree | 70a1acb7b15be082cf66456b97b252fe6fb5f4dd /src/pki_crypto.c | |
parent | 38d00c0e7aa9d9104c7d3453bf57fde9678ff75b (diff) | |
download | libssh-f81444bd57095cf8ff8e76b50f662aad0757f574.tar.gz libssh-f81444bd57095cf8ff8e76b50f662aad0757f574.tar.xz libssh-f81444bd57095cf8ff8e76b50f662aad0757f574.zip |
pki: Add pki_do_sign().
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r-- | src/pki_crypto.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c index 532e1ea..2c99daf 100644 --- a/src/pki_crypto.c +++ b/src/pki_crypto.c @@ -35,6 +35,7 @@ #include "libssh/session.h" #include "libssh/callbacks.h" #include "libssh/pki.h" +#include "libssh/keys.h" static int pem_get_password(char *buf, int size, int rwflag, void *userdata) { ssh_session session = userdata; @@ -218,4 +219,49 @@ fail: return NULL; } +struct signature_struct *pki_do_sign(ssh_key privatekey, + const unsigned char *hash) { + struct signature_struct *sign; + + sign = malloc(sizeof(SIGNATURE)); + if (sign == NULL) { + return NULL; + } + sign->type = privatekey->type; + + switch(privatekey->type) { + case SSH_KEYTYPE_DSS: + sign->dsa_sign = DSA_do_sign(hash + 1, SHA_DIGEST_LEN, + privatekey->dsa); + if (sign->dsa_sign == NULL) { + signature_free(sign); + return NULL; + } + +#ifdef DEBUG_CRYPTO + ssh_print_bignum("r", sign->dsa_sign->r); + ssh_print_bignum("s", sign->dsa_sign->s); +#endif + + sign->rsa_sign = NULL; + break; + case SSH_KEYTYPE_RSA: + case SSH_KEYTYPE_RSA1: + sign->rsa_sign = RSA_do_sign(hash + 1, SHA_DIGEST_LEN, + privatekey->rsa); + if (sign->rsa_sign == NULL) { + signature_free(sign); + return NULL; + } + sign->dsa_sign = NULL; + break; + case SSH_KEYTYPE_ECDSA: + case SSH_KEYTYPE_UNKNOWN: + signature_free(sign); + return NULL; + } + + return sign; +} + #endif /* _PKI_CRYPTO_H */ |