Description
When upgrading from CryptoPP 8.6.0 to 8.8.0 (master branch via vcpkg), we started having our own unit tests fail with code using the CryptoPP::RabbitWithIV
algorithm. Upon inspection, it appears when inString == outString
(which is perfectly legal according to ProcessData
), Rabbit is returning a buffer with all 0x00
bytes, instead of the encrypted/decrypted buffer.
When I dug into the method, it looks like RabbitWithIVPolicy::OperateKeystream
ends up just XOR'ing the generated keystream with itself...
Here is a minimal example reproducing the issue with the Rabbit test vectors, Test 4
. This code passes on CryptoPP 8.6.0, and throws an assertion on CryptoPP 8.8.0. This also applies to CryptoPP::Rabbit
. Compiled using Visual Studio (x64) on Windows 10.
#include <cryptopp/rabbit.h>
int main()
{
auto key = std::vector<uint8_t>(CryptoPP::RabbitWithIV::KEYLENGTH, 0x00);
auto iv = std::vector<uint8_t>(CryptoPP::RabbitWithIV::IV_LENGTH, 0x00);
auto buffer = std::vector<uint8_t>(0x20, 0x00);
auto expected = std::vector<uint8_t>{ 0xED, 0xB7, 0x05, 0x67, 0x37, 0x5D, 0xCD, 0x7C, 0xD8, 0x95, 0x54, 0xF8, 0x5E, 0x27, 0xA7, 0xC6, 0x8D, 0x4A, 0xDC, 0x70, 0x32, 0x29, 0x8F, 0x7B, 0xD4, 0xEF, 0xF5, 0x04, 0xAC, 0xA6, 0x29, 0x5F };
CryptoPP::RabbitWithIV::Encryption enc;
enc.SetKeyWithIV(key.data(), key.size(), iv.data(), iv.size());
enc.ProcessData(buffer.data(), buffer.data(), buffer.size());
CRYPTOPP_ASSERT(memcmp(buffer.data(), expected.data(), expected.size()) == 0);
return 0;
}
Just to note, we use a lot of CryptoPP algorithms in our codebase, and no other algorithms had this issue so far.
Seems this may be related to #1010, perhaps a missed algorithm?
Activity