MD5withRSA on the java side to generate the sig which verifies correctly with Java code. On the C side:
#include <stdio.h> #include <openssl/rsa.h> #include <openssl/evp.h> #include <openssl/objects.h> #include <openssl/bio.h> #include <openssl/x509.h> #include <openssl/err.h> #include <openssl/pem.h> #include <openssl/ssl.h> int main () { int i,err; char data[1024] = "abcdefg"; EVP_MD_CTX md_ctx; EVP_MD_CTX mdctx; EVP_PKEY * pkey; X509_PUBKEY * pX509; FILE * fp; X509 * x509; unsigned char *der; unsigned char my_public_key[162]={ // the key goes here, obtained via: openssl x509 -in xyz.cert -inform PEM -C }; int sigLen,dataLen; BIO *sigFile,*filter,*dataFile; unsigned char binSig[1024]; ERR_load_crypto_strings(); pX509 = X509_PUBKEY_new(); der = &my_public_key[0]; if (pX509 == NULL) { ERR_print_errors_fp (stderr); exit (1); } d2i_X509_PUBKEY(&pX509, &der, sizeof(my_public_key)); /* second step, make it into an envelope key */ pkey = X509_PUBKEY_get(pX509); X509_PUBKEY_free(pX509); if (pkey == NULL) { ERR_print_errors_fp (stderr); exit (1); } /* dataFile=BIO_new(BIO_s_file()); BIO_read_filename(dataFile,"data.txt"); dataLen = BIO_read(dataFile, data, sizeof(data)); BIO_free(dataFile); */ dataLen = strlen(data); /* read in the signature, decoding it from base64 */ sigFile=BIO_new(BIO_s_file()); BIO_read_filename(sigFile,"/local1/signer/sig.dat"); /* filter = BIO_new(BIO_f_base64()); sigFile = BIO_push(filter, sigFile); */ binSig[0] = '\0'; sigLen = BIO_read(sigFile, binSig, sizeof(binSig)); printf("sigLen: %d\n",sigLen); sigLen = BIO_read(sigFile, binSig, sizeof(binSig)); printf("sigLen: %d\n",sigLen); BIO_free_all(sigFile); printf("data: %s\n",data); printf("length: %d\n",strlen((char *)data)); for (i=0; i<strlen(binSig); i++) { printf("%x,", binSig[i]); } EVP_VerifyInit (&md_ctx, EVP_md5()); EVP_VerifyUpdate (&md_ctx, data, strlen((char*)data)); err = EVP_VerifyFinal (&md_ctx, binSig, sigLen, pkey); EVP_PKEY_free (pkey); if (err != 1) { ERR_print_errors_fp (stderr); exit (1); } printf ("Signature Verified Ok.\n"); return(0); } When ran: % ./sign sigLen: 128 data: abcdefg length: 7 1964:error:04077068:rsa routines:RSA_verify:bad signature:rsa_sign.c:216: 55,48,88,c3,e,45,f0,9c,e9,2b,7f,6f,46,b4,73,49,a,51,49,e6,44,54,d1,52,22,2,8,d6,ec,68,a2,66,43,ba,a4,f2,47,76,d5,27,36,d3,38,69,64,12,f,b1,3a,b4,a2,28,75,ba,dd,a4,16,93,6a,98,bc,1d,5f,12,90,5a,d0,4,61,89,ca,18,84,8b,e0,80,cc,1f,64,91,9f,74,e9,43,59,53,27,d8,7d,54,19,f8,44,9d,d2,30,6d,fa,18,ec,62,f7,3f,11,e4,4,24,94,18,94,a9,af,3f,77,d,21,55,bf,6d,54,68,c4,13,fa,17,b2,f4,2a,74, Your help is most appreciated. I have been working on this far longer than what it should take. In message <[EMAIL PROTECTED]>, Michel le Li writes: >Um...are you using the exact same algorithm on both side? What about >padding schemes? Can you give more details? >I think as long as the algorithm is totally the same, it shouldn't matter >if it is Java generated or openssl generated. > >Michelle > > > >On Tue, 1 Apr 2003, Sly Upah wrote: > >> Can anyone point me to source or give me instructions on how I >> can verify a Java generated signature? I can create a signature >> and verify it using pure openssl calls but anything coming from >> the Java side looks like the bytes are all screwed up. Do I have >> to do something special to massage the bits? >> Thanks, >> Sly >> >> >> ______________________________________________________________________ >> OpenSSL Project http://www.openssl.org >> User Support Mailing List [EMAIL PROTECTED] >> Automated List Manager [EMAIL PROTECTED] >> > >______________________________________________________________________ >OpenSSL Project http://www.openssl.org >User Support Mailing List [EMAIL PROTECTED] >Automated List Manager [EMAIL PROTECTED] > ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]