@@ -187,17 +187,36 @@ static void TestAES256CBC(const std::string &hexkey, const std::string &hexiv, b
187
187
}
188
188
}
189
189
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)
191
191
{
192
192
std::vector<unsigned char > key = ParseHex (hexkey);
193
+ std::vector<unsigned char > m = ParseHex (hex_message);
193
194
ChaCha20 rng (key.data (), key.size ());
194
195
rng.SetIV (nonce);
195
196
rng.Seek (seek);
196
197
std::vector<unsigned char > out = ParseHex (hexout);
197
198
std::vector<unsigned char > outres;
198
199
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
+ }
200
208
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
+ }
201
220
}
202
221
203
222
static std::string LongTestString () {
@@ -497,25 +516,37 @@ BOOST_AUTO_TEST_CASE(aes_cbc_testvectors) {
497
516
BOOST_AUTO_TEST_CASE (chacha20_testvector)
498
517
{
499
518
// 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 ,
501
532
" 224f51f3401bd9e12fde276fb8631ded8c131f823d2c06e27e4fcaec9ef3cf788a3b0aa372600a92b57974cded2b9334794cb"
502
533
" a40c63e34cdea212c4cf07d41b769a6749f3f630f4122cafe28ec4dc47e26d4346d70b98c73f3e9c53ac40c5945398b6eda1a"
503
534
" 832c89c167eacd901d7e2bf363" );
504
535
505
536
// 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 ,
507
538
" 76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b"
508
539
" 8f41518a11cc387b669b2ee6586" );
509
- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000001" , 0 , 0 ,
540
+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000001" , 0 , 0 ,
510
541
" 4540f05a9f1fb296d7736e7b208e3c96eb4fe1834688d2604f450952ed432d41bbe2a0b6ea7566d2a5d1e7e20d42af2c53d79"
511
542
" 2b1c43fea817e9ad275ae546963" );
512
- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000000" , 0x0100000000000000ULL , 0 ,
543
+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000000" , 0x0100000000000000ULL , 0 ,
513
544
" de9cba7bf3d69ef5e786dc63973f653a0b49e015adbff7134fcb7df137821031e85a050278a7084527214f73efc7fa5b52770"
514
545
" 62eb7a0433e445f41e3" );
515
- TestChaCha20 (" 0000000000000000000000000000000000000000000000000000000000000000" , 1 , 0 ,
546
+ TestChaCha20 (" " , " 0000000000000000000000000000000000000000000000000000000000000000" , 1 , 0 ,
516
547
" ef3fdfd6c61578fbf5cf35bd3dd33b8009631634d21e42ac33960bd138e50d32111e4caf237ee53ca8ad6426194a88545ddc4"
517
548
" 97a0b466e7d6bbdb0041b2f586b" );
518
- TestChaCha20 (" 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x0706050403020100ULL , 0 ,
549
+ TestChaCha20 (" " , " 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" , 0x0706050403020100ULL , 0 ,
519
550
" f798a189f195e66982105ffb640bb7757f579da31602fc93ec01ac56f85ac3c134a4547b733b46413042c9440049176905d3b"
520
551
" e59ea1c53f15916155c2be8241a38008b9a26bc35941e2444177c8ade6689de95264986d95889fb60e84629c9bd9a5acb1cc1"
521
552
" 18be563eb9b3a4a472f82e09a7e778492b562ef7130e88dfe031c79db9d4f7c7a899151b9a475032b63fc385245fe054e3dd5"
0 commit comments