Hello,
> This is what I up to,
>
> $ openssl genrsa -out private.pem 2048
> $ openssl rsa -in private.pem -out public.pem -pubout
>
> to gen the private & public keys
>
> pvk_fd = fopen("private.pem","r");
> rsa_pv = PEM_read_RSAPrivateKey(pvk_fd,&rsa_pv,NULL,NULL);
> ret = RSA_sign(NID_md5,testString,15,authMsg,siglen,rsa_pv);
>
> .........
>
> pbk_fd = fopen("public.pem","r");
> rsa_pb = PEM_read_RSA_PUBKEY(pbk_fd,&rsa_pb,NULL,NULL);
> ret = RSA_verify(NID_md5,testString,15,authMsg,*siglen,rsa_pb);
>
> By dummping public modulus & exponent from both private and public keys,
> they are the same. RSA_sign/verify does not work. What did I miss?
This looks good, maybe there are some other problems.
I've attached quick test based on this code - maybe this will help.
Best regards,
--
Marek Marcola <[EMAIL PROTECTED]>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/err.h>
#include <openssl/rand.h>
int log_ssl(void)
{
char buf[256];
u_long err;
while ((err = ERR_get_error()) != 0) {
ERR_error_string_n(err, buf, sizeof(buf));
printf("*** %s\n", buf);
}
return (0);
}
int main()
{
FILE *pvk_fd;
FILE *pbk_fd;
RSA *rsa_pv = NULL;
RSA *rsa_pb = NULL;
char *bn_hex = NULL;
char m[] = "test test test";
unsigned char sig[1024];
unsigned int siglen;
SSL_load_error_strings();
SSLeay_add_ssl_algorithms();
RAND_load_file("/dev/urandom", 1024);
if ((pvk_fd = fopen("rsa.pem", "r")) == NULL) {
printf("fopen: %s\n", strerror(errno));
goto err;
}
if ((rsa_pv = PEM_read_RSAPrivateKey(pvk_fd, &rsa_pv, NULL, NULL)) == NULL) {
log_ssl();
goto err;
}
if ((pbk_fd = fopen("rsapub.pem", "r")) == NULL) {
printf("fopen: %s\n", strerror(errno));
goto err;
}
if ((rsa_pb = PEM_read_RSA_PUBKEY(pbk_fd, &rsa_pb, NULL, NULL)) == NULL) {
log_ssl();
goto err;
}
if ((bn_hex = BN_bn2hex(rsa_pv->n)) == NULL) {
log_ssl();
goto err;
}
printf("pv n: %s\n", bn_hex);
free(bn_hex);
if ((bn_hex = BN_bn2hex(rsa_pv->e)) == NULL) {
log_ssl();
goto err;
}
printf("pv e: %s\n", bn_hex);
free(bn_hex);
if ((bn_hex = BN_bn2hex(rsa_pb->n)) == NULL) {
log_ssl();
goto err;
}
printf("pb n: %s\n", bn_hex);
free(bn_hex);
if ((bn_hex = BN_bn2hex(rsa_pb->e)) == NULL) {
log_ssl();
goto err;
}
printf("pb e: %s\n", bn_hex);
free(bn_hex);
if (RSA_sign(NID_md5, (unsigned char *) m, strlen(m), sig, &siglen, rsa_pv) != 1) {
log_ssl();
goto err;
}
printf("siglen=%d\n", siglen);
if (RSA_verify(NID_md5, (unsigned char *) m, strlen(m), sig, siglen, rsa_pb) != 1) {
log_ssl();
goto err;
}
printf("OK\n");
return (0);
err:
return (1);
}