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.