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;

}