Listing 2 RSA Sign and RSA Verify
#include <assert.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include "common.h"
#include "rsa.h"
int rsa_openssl_sign(unsigned char *signature,
size_t *sig_size,
const unsigned char *msg,
size_t msg_len,
RSA *key)
{
int rsa_err;
unsigned char sha1_result[SHA1_OUTPUT_LEN];
assert(key && signature && msg);
assert(msg_len > 0);
/* hash and sign the hash result */
SHA1(msg, msg_len, sha1_result);
rsa_err = RSA_sign(NID_sha1,
sha1_result, sizeof(sha1_result),
signature, sig_size,
key);
return (rsa_err == 1)? 0 : -1;
}
int rsa_openssl_verify(const unsigned char *signature,
size_t sig_size,
const unsigned char *msg,
size_t msg_len,
RSA *key,
unsigned int *isValid)
{
unsigned char sha1_result[SHA1_OUTPUT_LEN];
unsigned char sig_copy[sig_size];
assert(key && signature && msg && isValid);
assert(sig_size > 0 && msg_len > 0);
#ifdef DEBUG
ERR_load_crypto_strings();
#endif
/* hash and verify the signature matches */
SHA1(msg, msg_len, sha1_result);
memcpy(sig_copy, signature, sig_size);
*isValid = RSA_verify(NID_sha1,
sha1_result, sizeof(sha1_result),
sig_copy, sig_size,
key);
#ifdef DEBUG
{
int e;
do {
e = ERR_get_error();
fprintf(stderr, "RSA_VERIFY error = %s\n",
ERR_error_string(e, NULL));
} while (e != 0);
}
#endif
return 0;
}