On Friday, July 8, 2016 at 2:41:59 PM UTC+12, Jeffrey Walton wrote:
>
> I'm guessing the third pipeline is not quite correct:
>
>     StringSource source3(uncompressed_data, true, snf);
>
> I'm guessing you need to either pump (1) uncompressed_data+hash; or (2) 
> hash+uncompressed_data. This is typically how one uses a 
> SignatureVerificationFilter: 
> http://www.cryptopp.com/wiki/SignatureVerificationFilter .
>

That's the case that works, though.  To clarify, the uncompressed_data 
already includes the hash as a prefix.

Eliminating the AES part, since it's irrelevant to the issue, what I'm 
saying is that this code:

RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey);
auto snf = new SignatureVerificationFilter(verifier, new StringSink(
plaintext),
    SignatureVerificationFilter::PUT_MESSAGE | SignatureVerificationFilter::
SIGNATURE_AT_BEGIN);
StringSource source2(compressed_data, true, new Gunzip(new StringSink(
uncompressed_data)));
StringSource source3(uncompressed_data, true, snf);
assert(snf->GetLastResult());

Given a compressed_data that is the result of signing a plaintext with the 
corresponding private key, prepending the hash to the plaintext, then Gzip 
compressing it, this results in the correct original plaintext and the 
assertion passes on both Windows and Linux.

While this code:

RSASS<PKCS1v15, SHA256>::Verifier verifier(publicKey);
auto snf = new SignatureVerificationFilter(verifier, new StringSink(
plaintext),
    SignatureVerificationFilter::PUT_MESSAGE | SignatureVerificationFilter::
SIGNATURE_AT_BEGIN);
StringSource source2(compressed_data, true, new Gunzip(snf));
assert(snf->GetLastResult());

Given exactly the same input, again produces the correct plaintext on both 
Windows and Linux (at least in the first hundred bytes; I didn't check the 
whole message), *but* the assertion passes on Windows and fails on Linux 
(equivalently, if the THROW_EXCEPTION flag is also used, then it throws on 
Linux but not on Windows).  As you can see, the only difference is that the 
verification filter is chained directly from Gunzip rather than going via 
an intermediate string buffer.

Also, be careful of the way those primitives are combined in a public key 
> system. There's a lot to it, but see this question on the Crypto.SE: 
> https://crypto.stackexchange.com/questions/5458/should-we-sign-then-encrypt-or-encrypt-then-sign.
>  
> Also see this paper: 
> http://world.std.com/~dtd/sign_encrypt/sign_encrypt7.html.
>

Thank you; but I saw that note in the Wiki and read those carefully before 
going down this path.  Surreptitious forwarding isn't a concern in my usage 
scenario.

-- 
-- 
You received this message because you are subscribed to the "Crypto++ Users" 
Google Group.
To unsubscribe, send an email to cryptopp-users-unsubscr...@googlegroups.com.
More information about Crypto++ and this group is available at 
http://www.cryptopp.com.
--- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cryptopp-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to