@@ -187,17 +187,36 @@ static void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, b
187187 }
188188}
189189
190- static void TestChaCha20 (const std::string &hexkey, uint64_t nonce, uint64_t seek, const std::string& hexout)
190+ static void TestChaCha20 (const std::string &hex_message, const std::string & hexkey, uint64_t nonce, uint64_t seek, const std::string& hexout)
191191{
192192 std::vector<unsigned char > key = ParseHex (hexkey);
193+ std::vector<unsigned char > m = ParseHex (hex_message);
193194 ChaCha20 rng (key.data (), key.size ());
194195 rng.SetIV (nonce);
195196 rng.Seek (seek);
196197 std::vector<unsigned char > out = ParseHex (hexout);
197198 std::vector<unsigned char > outres;
198199 outres.resize (out.size ());
199- rng.Output (outres.data (), outres.size ());
200+ assert (hex_message.empty () || m.size () == out.size ());
201+
202+ // perform the ChaCha20 round(s), if message is provided it will output the encrypted ciphertext otherwise the keystream
203+ if (!hex_message.empty ()) {
204+ rng.Crypt (m.data (), outres.data (), outres.size ());
205+ } else {
206+ rng.Keystream (outres.data (), outres.size ());
207+ }
200208 BOOST_CHECK (out == outres);
209+ if (!hex_message.empty ()) {
210+ // Manually XOR with the keystream and compare the output
211+ rng.SetIV (nonce);
212+ rng.Seek (seek);
213+ std::vector<unsigned char > only_keystream (outres.size ());
214+ rng.Keystream (only_keystream.data (), only_keystream.size ());
215+ for (size_t i = 0 ; i != m.size (); i++) {
216+ outres[i] = m[i] ^ only_keystream[i];
217+ }
218+ BOOST_CHECK (out == outres);
219+ }
201220}
202221
203222static std::string LongTestString () {
@@ -497,25 +516,37 @@ BOOST_AUTO_TEST_CASE(aes_cbc_testvectors) {
497516BOOST_AUTO_TEST_CASE (chacha20_testvector)
498517{
499518 // Test vector from RFC 7539
500- TestChaCha20 (" 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x4a000000UL , 1 ,
519+
520+ // test encryption
521+ TestChaCha20 (" 4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756"
522+ " c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e"
523+ " 20776f756c642062652069742e" ,
524+ " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x4a000000UL , 1 ,
525+ " 6e2e359a2568f98041ba0728dd0d6981e97e7aec1d4360c20a27afccfd9fae0bf91b65c5524733ab8f593dabcd62b3571639d"
526+ " 624e65152ab8f530c359f0861d807ca0dbf500d6a6156a38e088a22b65e52bc514d16ccf806818ce91ab77937365af90bbf74"
527+ " a35be6b40b8eedf2785e42874d"
528+ );
529+
530+ // test keystream output
531+ TestChaCha20 (" " , " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x4a000000UL , 1 ,
501532 " 224f51f3401bd9e12fde276fb8631ded8c131f823d2c06e27e4fcaec9ef3cf788a3b0aa372600a92b57974cded2b9334794cb"
502533 " a40c63e34cdea212c4cf07d41b769a6749f3f630f4122cafe28ec4dc47e26d4346d70b98c73f3e9c53ac40c5945398b6eda1a"
503534 " 832c89c167eacd901d7e2bf363" );
504535
505536 // Test vectors from https://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04#section-7
506- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000000" , 0 , 0 ,
537+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000000" , 0 , 0 ,
507538 " 76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b"
508539 " 8f41518a11cc387b669b2ee6586" );
509- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000001" , 0 , 0 ,
540+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000001" , 0 , 0 ,
510541 " 4540f05a9f1fb296d7736e7b208e3c96eb4fe1834688d2604f450952ed432d41bbe2a0b6ea7566d2a5d1e7e20d42af2c53d79"
511542 " 2b1c43fea817e9ad275ae546963" );
512- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000000" , 0x0100000000000000ULL , 0 ,
543+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000000" , 0x0100000000000000ULL , 0 ,
513544 " de9cba7bf3d69ef5e786dc63973f653a0b49e015adbff7134fcb7df137821031e85a050278a7084527214f73efc7fa5b52770"
514545 " 62eb7a0433e445f41e3" );
515- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000000" , 1 , 0 ,
546+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000000" , 1 , 0 ,
516547 " ef3fdfd6c61578fbf5cf35bd3dd33b8009631634d21e42ac33960bd138e50d32111e4caf237ee53ca8ad6426194a88545ddc4"
517548 " 97a0b466e7d6bbdb0041b2f586b" );
518- TestChaCha20 (" 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x0706050403020100ULL , 0 ,
549+ TestChaCha20 (" " , " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x0706050403020100ULL , 0 ,
519550 " f798a189f195e66982105ffb640bb7757f579da31602fc93ec01ac56f85ac3c134a4547b733b46413042c9440049176905d3b"
520551 " e59ea1c53f15916155c2be8241a38008b9a26bc35941e2444177c8ade6689de95264986d95889fb60e84629c9bd9a5acb1cc1"
521552 " 18be563eb9b3a4a472f82e09a7e778492b562ef7130e88dfe031c79db9d4f7c7a899151b9a475032b63fc385245fe054e3dd5"
0 commit comments