Hello,

We started working on a project several months ago that has a need for 
signature verification of an xml file.  We had completed our tests and 
everything was woking.  The provider of the file then sent us a new Public Key 
and said that it is what we will get for the live data.  The file will not read 
into our programs (one in C++ and one in Java).

The C code that was working is as follows:

pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose (fp);

if (pkey == NULL)
{
error stuff
}

sigDatEnc = g_base64_decode( (gchar *) sigDat, &sigDatLen);
EVP_VerifyInit(&md_ctx, EVP_sha512());
EVP_VerifyUpdate(&md_ctx, xmlDat, strlen((char *) xmlDat));
err = EVP_VerifyFinal (&md_ctx, sigDatEnc, sigDatLen, pkey);
free(sigDatEnc);
EVP_PKEY_free (pkey);

It fails on the PEM_read_PUBKEY by returning a NULL when it tries to read in 
the file.  The only help we can get from the provider is the following code 
(Perl) which woks for them:

#!/usr/bin/perl

     use Crypt::OpenSSL::Random;
     use Crypt::OpenSSL::RSA;
     use MIME::Base64;

     my $packet = <<EOD;
-----BEGIN GLOBAL ENERGY INNOVATIONS LICENSE DATA-----
<license_data><mac>00:0D:15:00:74:1A</mac><version>1.0.0</version><serial>EC
1000-0900018</serial><module 
code="impedance"><start>2000-01-01</start><end>2099-12-31</end></module><coo
kie>D2940155EEDB6C92E3FD703A63EC4527</cookie><time>1265407356</time></licens
e_data>
-----BEGIN GLOBAL ENERGY INNOVATIONS SIGNATURE-----
JkNJD5EG0o+ioFc67Ud+GWuoCjKHgdi9AzGC3B7yqf1QxBR8B4H5/owRrsgcB/KMjV2VP7drWWWD
ETcS60FfYVLsUsakj69tCC8aVZCdkSeXmcvRvva8YzTi5oPzflDC8/o/MrMvy1+o8GgfgPTuAeSy
iCGnI0R1KVIWiAeRB859y4WCJ/ME+CB1zWhf+8QawosQzGtrOL+l+8PRQSHxAU1Lr+8VcIQdF7iW
MYmeS7YDNZRoxfKHev527oNYlR4ymSzgrgjh7sweNwLVuAIfX89PIGXPRWJYyddeE6au8cgJ2LIK
aVU1Kf8MpQfbCm3IKCXgOnGUUGiNclAbOkfI4fR7wwsPM3XyNCtm0vLKZ58bdRC3tUxH3bzveOff
+uyYQB+yRRNvhqMFnVtWr9N2Zd67eAkHlMKlJjBz2qyDcyMLk2NcaOJtcerHYmviBZrUaGJ8WvH8
7zb0FGsHzlkyIbaWrwwXAFl/yWxTwh0sti3QObpIFvY6CgsoCktZg2mtWHCdblgydBYer1dHN37h
fz54lZAC6m5GpKch/K7ChcfmeSgX/3euybP6ZjcUeeyFp5AGhG9xND/e7XPk93iCzj044PyDoQLG
75ZP00LTIwAkG0Vf2WR6O9gTJovCklP2eKxn4BN7UlM/4S5EUkrW4mbV9f34/qGkhqG8f10Xzig=
-----END GLOBAL ENERGY INNOVATIONS SIGNATURE-----
EOD

     my $public_key = <<EOD;
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEAvW90MggAl07zMvyQdUk18/iOySyY8P/1vqC5XGNvC5aXIvC8UDpU
2v8EK40SUc0FEqP8g893HgW+yDJa7SF2VyW2IEcnum2yot2ifGHjCDUnea2W5wBO
aFlY9Co9VXDLhRJNQyXyfKCXL/xiM2O2Py1x0+SIXkc1ml2M0x4Fb4QsMO5E2Y6o
2mRVlPlooDPkj4BijvVX/EiPWpfbQAoidk8urHif5OTdIyqunce6b1Fqz7NH118n
DVQp/Txk6hGtGkHxYCC0biG20+u6XlD9qkYWn2KYqxBxJZvV12YO3pC1kzYAR9Xy
VlCfyHK8pGdcHO8LHZsWR5PeryNBWU14xlOVQsziFE4oMyEiSt00cUQhF+yCLQpr
T7+xvKTGA9YTXfI59LprKMXN5RPCBF5WuQZoxlREQMjhYV+b1rQx1jkkrflA0liF
oTgkrGw5mxk9jlQbFNeY4eVAudF3w2OdVD/N5UNoR+L7Jj1gAJjEV6what uYQrJ9f58h
7UzsktkHPgROncZGGZLDM/acRbzar3Iv4CK8hnsHrAan8qd7jh9kU8DEXQ1Is2qf
w1/BMX4DPfijY1zboqUbrFwAmq7twoiTJPK+++aYBU7fu5tvRIPIXdziGOkWmrc6
gjsIQA8GoM4am19VlD6P1inHMa1P4s8Md6AvbeAPkWXGmsYdsHvRDo8CAwEAAQ==
-----END RSA PUBLIC KEY-----
EOD

     my ($payload, $signature) =
         ($packet =~ m{--\n(.*?)--[^\n]+\n(.*?)--}ms);

     my $decoded_signature = decode_base64($signature);

     my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key($public_key);
     $rsa_pub->use_sha512_hash();

     if ($rsa_pub->verify($payload, $decoded_signature)) {
         print "Signature verifies.\n";
     }
     else {
         print "Signature DOES NOT verify.\n";
     }

My question is -- can anyone tell me what OpenSSL function calls (in both C and 
Java) are made using this code written in Perl?

I suppose a secondary question would be -- what function would read in this 
Public key from a file as my original code did?

Thank you for the help

Jim

Reply via email to