> From: [email protected] On Behalf Of redpath
> Sent: Tuesday, 30 October, 2012 16:56
> I am using openssl to create a signature for a file contents and use
> openssl to verify the contents using the signature file. The
> public key is from an x509 cert.
> All works great.
>
Specifically, a SHA1-with-RSA PKCS#1 signature; there are many other
public-key signature schemes, many of which OpenSSL and/or Java
(by default) support.
> I need to verify a file contents using Java. So I have
> written a sample Java application
> and it returns false and should return true. I use the same
> artifacts as I did for the openssl.
>
> I think the saved binary file of the signature may need some
> conversion for Java but thats my guess?
>
Nope. A C binary file, as you correctly did (with fopen "wb"),
and a Java File{Input,Output}Stream are compatible, at least
on all platforms supported by "standard" Sun^WOracle Java.
You're double-hashing. The lower-level RSA_{sign,verify}
in OpenSSL takes a hash and directly signs/verifies it using
the standard {AlgId,OCTETSTRING} format and PKCS#1 padding.
If you instead used the high-level EVP_{Sign,Verify}* those
take the _data_, _do_ the hash, and sign/verify the hash.
Java with the Suncle standard providers does only the latter.
The signature algorithm name you used, SHA1WithRSA, says this;
it does SHA1 *and* RSA sign/verify. Feed sig.update the actual
data (in chunks if necessary), not a hash.
There may be other options using non-standard providers, and
for that matter using your own code. If you really want, you
can take the public key (e,n), do the raw-RSA "public decrypt"
(Java has BigInteger with modPow standard), unpad (checking valid),
extract the hash (with checking AlgId), and compare.
<snip rest>
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [email protected]