9edb9410ee514bf17035ea7c3756a73d02749395
[platform/upstream/nettle.git] / testsuite / chacha-test.c
1 /* chacha-test.c
2
3    Test program for the ChaCha stream cipher implementation.
4
5    Copyright (C) 2013 Joachim Strömbergson
6    Copyright (C) 2012, 2014 Niels Möller
7
8    This file is part of GNU Nettle.
9
10    GNU Nettle is free software: you can redistribute it and/or
11    modify it under the terms of either:
12
13      * the GNU Lesser General Public License as published by the Free
14        Software Foundation; either version 3 of the License, or (at your
15        option) any later version.
16
17    or
18
19      * the GNU General Public License as published by the Free
20        Software Foundation; either version 2 of the License, or (at your
21        option) any later version.
22
23    or both in parallel, as here.
24
25    GNU Nettle is distributed in the hope that it will be useful,
26    but WITHOUT ANY WARRANTY; without even the implied warranty of
27    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
28    General Public License for more details.
29
30    You should have received copies of the GNU General Public License and
31    the GNU Lesser General Public License along with this program.  If
32    not, see http://www.gnu.org/licenses/.
33 */
34
35 #include "testutils.h"
36
37 #include "chacha.h"
38
39 static void
40 test_chacha(const struct tstring *key, const struct tstring *nonce,
41             const struct tstring *expected, unsigned rounds)
42 {
43   struct chacha_ctx ctx;
44
45   ASSERT (key->length == CHACHA_KEY_SIZE);
46   chacha_set_key (&ctx, key->data);
47
48   if (rounds == 20)
49     {
50       uint8_t *data = xalloc (expected->length + 2);
51       size_t length;
52       data++;
53
54       for (length = 1; length <= expected->length; length++)
55         {
56           data[-1] = 17;
57           memset (data, 0, length);
58           data[length] = 17;
59           if (nonce->length == CHACHA_NONCE_SIZE)
60             chacha_set_nonce(&ctx, nonce->data);
61           else if (nonce->length == CHACHA_NONCE96_SIZE)
62             {
63               chacha_set_nonce96(&ctx, nonce->data);
64               /* Use initial counter 1, for
65                  draft-irtf-cfrg-chacha20-poly1305-08 test cases. */
66               ctx.state[12]++;
67             }
68           else
69             die ("Bad nonce size %u.\n", (unsigned) nonce->length);
70
71           chacha_crypt (&ctx, length, data, data);
72
73           ASSERT (data[-1] == 17);
74           ASSERT (data[length] == 17);
75           if (!MEMEQ(length, data, expected->data))
76             {
77               printf("Error, length %u, expected:\n", (unsigned) length);
78               print_hex (length, expected->data);
79               printf("Got:\n");
80               print_hex(length, data);
81               FAIL ();
82             }
83         }
84       if (verbose)
85         {
86           printf("Result after encryption:\n");
87           print_hex(expected->length, data);
88         }
89       free (data - 1);
90     }
91   else
92     {
93       /* Uses the _chacha_core function to be able to test different
94          numbers of rounds. */
95       uint32_t out[_CHACHA_STATE_LENGTH];
96       ASSERT (expected->length == CHACHA_BLOCK_SIZE);
97       ASSERT (nonce->length == CHACHA_NONCE_SIZE);
98
99       chacha_set_nonce(&ctx, nonce->data);
100       _chacha_core (out, ctx.state, rounds);
101
102       if (!MEMEQ(CHACHA_BLOCK_SIZE, out, expected->data))
103         {
104           printf("Error, expected:\n");
105           tstring_print_hex (expected);
106           printf("Got:\n");
107           print_hex(CHACHA_BLOCK_SIZE, (uint8_t *) out);
108           FAIL ();
109         }
110
111       if (verbose)
112         {
113           printf("Result after encryption:\n");
114           print_hex(CHACHA_BLOCK_SIZE, (uint8_t *) out);
115         }
116     }
117 }
118
119 void
120 test_main(void)
121 {
122   /* Test vectors from draft-strombergson-chacha-test-vectors */
123 #if 0
124   /* TC1: All zero key and IV. 128 bit key and 8 rounds. */
125   test_chacha (SHEX("0000000000000000 0000000000000000"),
126                SHEX("0000000000000000"),
127                SHEX("e28a5fa4a67f8c5d efed3e6fb7303486"
128                     "aa8427d31419a729 572d777953491120"
129                     "b64ab8e72b8deb85 cd6aea7cb6089a10"
130                     "1824beeb08814a42 8aab1fa2c816081b"),
131                8);
132
133   test_chacha (SHEX("0000000000000000 0000000000000000"),
134                SHEX("0000000000000000"),
135                SHEX("e1047ba9476bf8ff 312c01b4345a7d8c"
136                     "a5792b0ad467313f 1dc412b5fdce3241"
137                     "0dea8b68bd774c36 a920f092a04d3f95"
138                     "274fbeff97bc8491 fcef37f85970b450"),
139                12);
140
141   test_chacha (SHEX("0000000000000000 0000000000000000"),
142                SHEX("0000000000000000"),
143                SHEX("89670952608364fd 00b2f90936f031c8"
144                     "e756e15dba04b849 3d00429259b20f46"
145                     "cc04f111246b6c2c e066be3bfb32d9aa"
146                     "0fddfbc12123d4b9 e44f34dca05a103f"
147
148                     "6cd135c2878c832b 5896b134f6142a9d"
149                     "4d8d0d8f1026d20a 0a81512cbce6e975"
150                     "8a7143d021978022 a384141a80cea306"
151                     "2f41f67a752e66ad 3411984c787e30ad"),
152                20);
153 #endif
154   test_chacha (SHEX("0000000000000000 0000000000000000"
155                     "0000000000000000 0000000000000000"),
156                SHEX("0000000000000000"),
157                SHEX("3e00ef2f895f40d6 7f5bb8e81f09a5a1"
158                     "2c840ec3ce9a7f3b 181be188ef711a1e"
159                     "984ce172b9216f41 9f445367456d5619"
160                     "314a42a3da86b001 387bfdb80e0cfe42"
161
162                     /* "d2aefa0deaa5c151 bf0adb6c01f2a5ad"
163                     "c0fd581259f9a2aa dcf20f8fd566a26b"
164                     "5032ec38bbc5da98 ee0c6f568b872a65"
165                     "a08abf251deb21bb 4b56e5d8821e68aa" */),
166                8);
167
168   test_chacha (SHEX("0000000000000000 0000000000000000"
169                     "0000000000000000 0000000000000000"),
170                SHEX("0000000000000000"),
171                SHEX("9bf49a6a0755f953 811fce125f2683d5"
172                     "0429c3bb49e07414 7e0089a52eae155f"
173                     "0564f879d27ae3c0 2ce82834acfa8c79"
174                     "3a629f2ca0de6919 610be82f411326be"
175
176                     /* "0bd58841203e74fe 86fc71338ce0173d"
177                     "c628ebb719bdcbcc 151585214cc089b4"
178                     "42258dcda14cf111 c602b8971b8cc843"
179                     "e91e46ca905151c0 2744a6b017e69316" */),
180                12);
181
182   test_chacha (SHEX("0000000000000000 0000000000000000"
183                     "0000000000000000 0000000000000000"),
184                SHEX("0000000000000000"),
185                SHEX("76b8e0ada0f13d90 405d6ae55386bd28"
186                     "bdd219b8a08ded1a a836efcc8b770dc7"
187                     "da41597c5157488d 7724e03fb8d84a37"
188                     "6a43b8f41518a11c c387b669b2ee6586"
189
190                     "9f07e7be5551387a 98ba977c732d080d"
191                     "cb0f29a048e36569 12c6533e32ee7aed"
192                     "29b721769ce64e43 d57133b074d839d5"
193                     "31ed1f28510afb45 ace10a1f4b794d6f"),
194                20);
195
196   /* TC2: Single bit in key set. All zero IV */
197 #if 0
198   test_chacha (SHEX("0100000000000000 0000000000000000"),
199                SHEX("0000000000000000"),
200                SHEX("03a7669888605a07 65e8357475e58673"
201                     "f94fc8161da76c2a 3aa2f3caf9fe5449"
202                     "e0fcf38eb882656a f83d430d410927d5"
203                     "5c972ac4c92ab9da 3713e19f761eaa14"),
204                8);
205
206   test_chacha (SHEX("0100000000000000 0000000000000000"),
207                SHEX("0000000000000000"),
208                SHEX("2a865a3b8999fa83 ae8aacf33fc6be4f"
209                     "32c8aa9762738d26 963270052f4eef8b"
210                     "86af758f7867560a f6d0eeb973b5542b"
211                     "b24c8abceac8b1f3 6d026963d6c8a9b2"),
212                12);
213
214   test_chacha (SHEX("0100000000000000 0000000000000000"),
215                SHEX("0000000000000000"),
216                SHEX("ae56060d04f5b597 897ff2af1388dbce"
217                     "ff5a2a4920335dc1 7a3cb1b1b10fbe70"
218                     "ece8f4864d8c7cdf 0076453a8291c7db"
219                     "eb3aa9c9d10e8ca3 6be4449376ed7c42"
220
221                     "fc3d471c34a36fbb f616bc0a0e7c5230"
222                     "30d944f43ec3e78d d6a12466547cb4f7"
223                     "b3cebd0a5005e762 e562d1375b7ac445"
224                     "93a991b85d1a60fb a2035dfaa2a642d5"),
225                20);
226 #endif
227   test_chacha (SHEX("0100000000000000 0000000000000000"
228                     "0000000000000000 0000000000000000"),
229                SHEX("0000000000000000"),
230                SHEX("cf5ee9a0494aa961 3e05d5ed725b804b"
231                     "12f4a465ee635acc 3a311de8740489ea"
232                     "289d04f43c7518db 56eb4433e498a123"
233                     "8cd8464d3763ddbb 9222ee3bd8fae3c8"),
234                8);
235
236   test_chacha (SHEX("0100000000000000 0000000000000000"
237                     "0000000000000000 0000000000000000"),
238                SHEX("0000000000000000"),
239                SHEX("12056e595d56b0f6 eef090f0cd25a209"
240                     "49248c2790525d0f 930218ff0b4ddd10"
241                     "a6002239d9a454e2 9e107a7d06fefdfe"
242                     "f0210feba044f9f2 9b1772c960dc29c0"),
243                12);
244
245   test_chacha (SHEX("0100000000000000 0000000000000000"
246                     "0000000000000000 0000000000000000"),
247                SHEX("0000000000000000"),
248                SHEX("c5d30a7ce1ec1193 78c84f487d775a85"
249                     "42f13ece238a9455 e8229e888de85bbd"
250                     "29eb63d0a17a5b99 9b52da22be4023eb"
251                     "07620a54f6fa6ad8 737b71eb0464dac0"
252
253                     "10f656e6d1fd5505 3e50c4875c9930a3"
254                     "3f6d0263bd14dfd6 ab8c70521c19338b"
255                     "2308b95cf8d0bb7d 202d2102780ea352"
256                     "8f1cb48560f76b20 f382b942500fceac"),
257                20);
258
259   /* TC3: Single bit in IV set. All zero key */
260 #if 0
261   test_chacha (SHEX("0000000000000000 0000000000000000"),
262                SHEX("0100000000000000"),
263                SHEX("25f5bec6683916ff 44bccd12d102e692"
264                     "176663f4cac53e71 9509ca74b6b2eec8"
265                     "5da4236fb2990201 2adc8f0d86c8187d"
266                     "25cd1c486966930d 0204c4ee88a6ab35"),
267                8);
268
269   test_chacha (SHEX("0000000000000000 0000000000000000"),
270                SHEX("0100000000000000"),
271                SHEX("91cdb2f180bc89cf e86b8b6871cd6b3a"
272                     "f61abf6eba01635d b619c40a0b2e19ed"
273                     "fa8ce5a9bd7f53cc 2c9bcfea181e9754"
274                     "a9e245731f658cc2 82c2ae1cab1ae02c"),
275                12);
276
277   test_chacha (SHEX("0000000000000000 0000000000000000"),
278                SHEX("0100000000000000"),
279                SHEX("1663879eb3f2c994 9e2388caa343d361"
280                     "bb132771245ae6d0 27ca9cb010dc1fa7"
281                     "178dc41f8278bc1f 64b3f12769a24097"
282                     "f40d63a86366bdb3 6ac08abe60c07fe8"
283
284                     "b057375c89144408 cc744624f69f7f4c"
285                     "cbd93366c92fc4df cada65f1b959d8c6"
286                     "4dfc50de711fb464 16c2553cc60f21bb"
287                     "fd006491cb17888b 4fb3521c4fdd8745"),
288                20);
289 #endif
290   test_chacha (SHEX("0000000000000000 0000000000000000"
291                     "0000000000000000 0000000000000000"),
292                SHEX("0100000000000000"),
293                SHEX("2b8f4bb3798306ca 5130d47c4f8d4ed1"
294                     "3aa0edccc1be6942 090faeeca0d7599b"
295                     "7ff0fe616bb25aa0 153ad6fdc88b9549"
296                     "03c22426d478b97b 22b8f9b1db00cf06"),
297                8);
298
299   test_chacha (SHEX("0000000000000000 0000000000000000"
300                     "0000000000000000 0000000000000000"),
301                SHEX("0100000000000000"),
302                SHEX("64b8bdf87b828c4b 6dbaf7ef698de03d"
303                     "f8b33f635714418f 9836ade59be12969"
304                     "46c953a0f38ecffc 9ecb98e81d5d99a5"
305                     "edfc8f9a0a45b9e4 1ef3b31f028f1d0f"),
306                12);
307
308   test_chacha (SHEX("0000000000000000 0000000000000000"
309                     "0000000000000000 0000000000000000"),
310                SHEX("0100000000000000"),
311                SHEX("ef3fdfd6c61578fb f5cf35bd3dd33b80"
312                     "09631634d21e42ac 33960bd138e50d32"
313                     "111e4caf237ee53c a8ad6426194a8854"
314                     "5ddc497a0b466e7d 6bbdb0041b2f586b"
315
316                     "5305e5e44aff19b2 35936144675efbe4"
317                     "409eb7e8e5f1430f 5f5836aeb49bb532"
318                     "8b017c4b9dc11f8a 03863fa803dc71d5"
319                     "726b2b6b31aa3270 8afe5af1d6b69058"),
320                20);
321
322   /* TC4: All bits in key and IV are set. */
323 #if 0
324   test_chacha (SHEX("ffffffffffffffff ffffffffffffffff"),
325                SHEX("ffffffffffffffff"),
326                SHEX("2204d5b81ce66219 3e00966034f91302"
327                     "f14a3fb047f58b6e 6ef0d72113230416"
328                     "3e0fb640d76ff9c3 b9cd99996e6e38fa"
329                     "d13f0e31c82244d3 3abbc1b11e8bf12d"),
330                8);
331
332   test_chacha (SHEX("ffffffffffffffff ffffffffffffffff"),
333                SHEX("ffffffffffffffff"),
334                SHEX("60e349e60c38b328 c4baab90d44a7c72"
335                     "7662770d36350d65 a1433bd92b00ecf4"
336                     "83d5597d7a616258 ec3c5d5b30e1c5c8"
337                     "5c5dfe2f92423b8e 36870f3185b6add9"),
338                12);
339
340   test_chacha (SHEX("ffffffffffffffff ffffffffffffffff"),
341                SHEX("ffffffffffffffff"),
342                SHEX("992947c3966126a0 e660a3e95db048de"
343                     "091fb9e0185b1e41 e41015bb7ee50150"
344                     "399e4760b262f9d5 3f26d8dd19e56f5c"
345                     "506ae0c3619fa67f b0c408106d0203ee"
346
347                     "40ea3cfa61fa32a2 fda8d1238a2135d9"
348                     "d4178775240f9900 7064a6a7f0c731b6"
349                     "7c227c52ef796b6b ed9f9059ba0614bc"
350                     "f6dd6e38917f3b15 0e576375be50ed67"),
351                20);
352 #endif
353   test_chacha (SHEX("ffffffffffffffff ffffffffffffffff"
354                     "ffffffffffffffff ffffffffffffffff"),
355                SHEX("ffffffffffffffff"),
356                SHEX("e163bbf8c9a739d1 8925ee8362dad2cd"
357                     "c973df05225afb2a a26396f2a9849a4a"
358                     "445e0547d31c1623 c537df4ba85c70a9"
359                     "884a35bcbf3dfab0 77e98b0f68135f54"),
360                8);
361
362   test_chacha (SHEX("ffffffffffffffff ffffffffffffffff"
363                     "ffffffffffffffff ffffffffffffffff"),
364                SHEX("ffffffffffffffff"),
365                SHEX("04bf88dae8e47a22 8fa47b7e6379434b"
366                     "a664a7d28f4dab84 e5f8b464add20c3a"
367                     "caa69c5ab221a23a 57eb5f345c96f4d1"
368                     "322d0a2ff7a9cd43 401cd536639a615a"),
369                12);
370
371   test_chacha (SHEX("ffffffffffffffff ffffffffffffffff"
372                     "ffffffffffffffff ffffffffffffffff"),
373                SHEX("ffffffffffffffff"),
374                SHEX("d9bf3f6bce6ed0b5 4254557767fb5744"
375                     "3dd4778911b60605 5c39cc25e674b836"
376                     "3feabc57fde54f79 0c52c8ae43240b79"
377                     "d49042b777bfd6cb 80e931270b7f50eb"
378
379                     "5bac2acd86a836c5 dc98c116c1217ec3"
380                     "1d3a63a9451319f0 97f3b4d6dab07787"
381                     "19477d24d24b403a 12241d7cca064f79"
382                     "0f1d51ccaff6b166 7d4bbca1958c4306"),
383                20);
384
385   /* TC5: Every even bit set in key and IV. */
386 #if 0
387   test_chacha (SHEX("5555555555555555 5555555555555555"),
388                SHEX("5555555555555555"),
389                SHEX("f0a23bc36270e18e d0691dc384374b9b"
390                     "2c5cb60110a03f56 fa48a9fbbad961aa"
391                     "6bab4d892e96261b 6f1a0919514ae56f"
392                     "86e066e17c71a417 6ac684af1c931996"),
393                8);
394
395   test_chacha (SHEX("5555555555555555 5555555555555555"),
396                SHEX("5555555555555555"),
397                SHEX("90ec7a49ee0b20a8 08af3d463c1fac6c"
398                     "2a7c897ce8f6e60d 793b62ddbebcf980"
399                     "ac917f091e52952d b063b1d2b947de04"
400                     "aac087190ca99a35 b5ea501eb535d570"),
401                12);
402
403   test_chacha (SHEX("5555555555555555 5555555555555555"),
404                SHEX("5555555555555555"),
405                SHEX("357d7d94f966778f 5815a2051dcb0413"
406                     "3b26b0ead9f57dd0 9927837bc3067e4b"
407                     "6bf299ad81f7f50c 8da83c7810bfc17b"
408                     "b6f4813ab6c32695 7045fd3fd5e19915"
409
410                     "ec744a6b9bf8cbdc b36d8b6a5499c68a"
411                     "08ef7be6cc1e93f2 f5bcd2cad4e47c18"
412                     "a3e5d94b5666382c 6d130d822dd56aac"
413                     "b0f8195278e7b292 495f09868ddf12cc"),
414                20);
415 #endif
416   test_chacha (SHEX("5555555555555555 5555555555555555"
417                     "5555555555555555 5555555555555555"),
418                SHEX("5555555555555555"),
419                SHEX("7cb78214e4d3465b 6dc62cf7a1538c88"
420                     "996952b4fb72cb61 05f1243ce3442e29"
421                     "75a59ebcd2b2a598 290d7538491fe65b"
422                     "dbfefd060d887981 20a70d049dc2677d"),
423                8);
424
425   test_chacha (SHEX("5555555555555555 5555555555555555"
426                     "5555555555555555 5555555555555555"),
427                SHEX("5555555555555555"),
428                SHEX("a600f07727ff93f3 da00dd74cc3e8bfb"
429                     "5ca7302f6a0a2944 953de00450eecd40"
430                     "b860f66049f2eaed 63b2ef39cc310d2c"
431                     "488f5d9a241b615d c0ab70f921b91b95"),
432                12);
433
434   test_chacha (SHEX("5555555555555555 5555555555555555"
435                     "5555555555555555 5555555555555555"),
436                SHEX("5555555555555555"),
437                SHEX("bea9411aa453c543 4a5ae8c92862f564"
438                     "396855a9ea6e22d6 d3b50ae1b3663311"
439                     "a4a3606c671d605c e16c3aece8e61ea1"
440                     "45c59775017bee2f a6f88afc758069f7"
441
442                     "e0b8f676e644216f 4d2a3422d7fa36c6"
443                     "c4931aca950e9da4 2788e6d0b6d1cd83"
444                     "8ef652e97b145b14 871eae6c6804c700"
445                     "4db5ac2fce4c68c7 26d004b10fcaba86"),
446                20);
447
448   /* TC6: Every odd bit set in key and IV. */
449 #if 0
450   test_chacha (SHEX("aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"),
451                SHEX("aaaaaaaaaaaaaaaa"),
452                SHEX("312d95c0bc38eff4 942db2d50bdc500a"
453                     "30641ef7132db1a8 ae838b3bea3a7ab0"
454                     "3815d7a4cc09dbf5 882a3433d743aced"
455                     "48136ebab7329950 6855c0f5437a36c6"),
456                8);
457
458   test_chacha (SHEX("aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"),
459                SHEX("aaaaaaaaaaaaaaaa"),
460                SHEX("057fe84fead13c24 b76bb2a6fdde66f2"
461                     "688e8eb6268275c2 2c6bcb90b85616d7"
462                     "fe4d3193a1036b70 d7fb864f01453641"
463                     "851029ecdb60ac38 79f56496f16213f4"),
464                12);
465
466   test_chacha (SHEX("aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"),
467                SHEX("aaaaaaaaaaaaaaaa"),
468                SHEX("fc79acbd58526103 862776aab20f3b7d"
469                     "8d3149b2fab65766 299316b6e5b16684"
470                     "de5de548c1b7d083 efd9e3052319e0c6"
471                     "254141da04a6586d f800f64d46b01c87"
472
473                     "1f05bc67e07628eb e6f6865a2177e0b6"
474                     "6a558aa7cc1e8ff1 a98d27f7071f8335"
475                     "efce4537bb0ef7b5 73b32f32765f2900"
476                     "7da53bba62e7a44d 006f41eb28fe15d6"),
477                20);
478 #endif
479   test_chacha (SHEX("aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"
480                     "aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"),
481                SHEX("aaaaaaaaaaaaaaaa"),
482                SHEX("40f9ab86c8f9a1a0 cdc05a75e5531b61"
483                     "2d71ef7f0cf9e387 df6ed6972f0aae21"
484                     "311aa581f816c90e 8a99de990b6b95aa"
485                     "c92450f4e1127126 67b804c99e9c6eda"),
486                8);
487
488   test_chacha (SHEX("aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"
489                     "aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"),
490                SHEX("aaaaaaaaaaaaaaaa"),
491                SHEX("856505b01d3b47aa e03d6a97aa0f033a"
492                     "9adcc94377babd86 08864fb3f625b6e3"
493                     "14f086158f9f725d 811eeb953b7f7470"
494                     "76e4c3f639fa841f ad6c9a709e621397"),
495                12);
496
497   test_chacha (SHEX("aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"
498                     "aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa"),
499                SHEX("aaaaaaaaaaaaaaaa"),
500                SHEX("9aa2a9f656efde5a a7591c5fed4b35ae"
501                     "a2895dec7cb4543b 9e9f21f5e7bcbcf3"
502                     "c43c748a970888f8 248393a09d43e0b7"
503                     "e164bc4d0b0fb240 a2d72115c4808906"
504
505                     "72184489440545d0 21d97ef6b693dfe5"
506                     "b2c132d47e6f041c 9063651f96b623e6"
507                     "2a11999a23b6f7c4 61b2153026ad5e86"
508                     "6a2e597ed07b8401 dec63a0934c6b2a9"),
509                20);
510
511   /* TC7: Sequence patterns in key and IV. */
512 #if 0
513   test_chacha (SHEX("0011223344556677 8899aabbccddeeff"),
514                SHEX("0f1e2d3c4b5a6978"),
515                SHEX("29560d280b452840 0a8f4b795369fb3a"
516                     "01105599e9f1ed58 279cfc9ece2dc5f9"
517                     "9f1c2e52c98238f5 42a5c0a881d850b6"
518                     "15d3acd9fbdb026e 9368565da50e0d49"),
519                8);
520
521   test_chacha (SHEX("0011223344556677 8899aabbccddeeff"),
522                SHEX("0f1e2d3c4b5a6978"),
523                SHEX("5eddc2d9428fceee c50a52a964eae0ff"
524                     "b04b2de006a9b04c ff368ffa921116b2"
525                     "e8e264babd2efa0d e43ef2e3b6d065e8"
526                     "f7c0a17837b0a40e b0e2c7a3742c8753"),
527                12);
528
529   test_chacha (SHEX("0011223344556677 8899aabbccddeeff"),
530                SHEX("0f1e2d3c4b5a6978"),
531                SHEX("d1abf630467eb4f6 7f1cfb47cd626aae"
532                     "8afedbbe4ff8fc5f e9cfae307e74ed45"
533                     "1f1404425ad2b545 69d5f18148939971"
534                     "abb8fafc88ce4ac7 fe1c3d1f7a1eb7ca"
535
536                     "e76ca87b61a97135 41497760dd9ae059"
537                     "350cad0dcedfaa80 a883119a1a6f987f"
538                     "d1ce91fd8ee08280 34b411200a9745a2"
539                     "85554475d12afc04 887fef3516d12a2c"),
540                20);
541 #endif
542   test_chacha (SHEX("0011223344556677 8899aabbccddeeff"
543                     "ffeeddccbbaa9988 7766554433221100"),
544                SHEX("0f1e2d3c4b5a6978"),
545                SHEX("db43ad9d1e842d12 72e4530e276b3f56"
546                     "8f8859b3f7cf6d9d 2c74fa53808cb515"
547                     "7a8ebf46ad3dcc4b 6c7dadde131784b0"
548                     "120e0e22f6d5f9ff a7407d4a21b695d9"),
549                8);
550
551   test_chacha (SHEX("0011223344556677 8899aabbccddeeff"
552                     "ffeeddccbbaa9988 7766554433221100"),
553                SHEX("0f1e2d3c4b5a6978"),
554                SHEX("7ed12a3a63912ae9 41ba6d4c0d5e862e"
555                     "568b0e5589346935 505f064b8c2698db"
556                     "f7d850667d8e67be 639f3b4f6a16f92e"
557                     "65ea80f6c7429445 da1fc2c1b9365040"),
558                12);
559
560   test_chacha (SHEX("0011223344556677 8899aabbccddeeff"
561                     "ffeeddccbbaa9988 7766554433221100"),
562                SHEX("0f1e2d3c4b5a6978"),
563                SHEX("9fadf409c00811d0 0431d67efbd88fba"
564                     "59218d5d6708b1d6 85863fabbb0e961e"
565                     "ea480fd6fb532bfd 494b215101505742"
566                     "3ab60a63fe4f55f7 a212e2167ccab931"
567
568                     "fbfd29cf7bc1d279 eddf25dd316bb884"
569                     "3d6edee0bd1ef121 d12fa17cbc2c574c"
570                     "ccab5e275167b08b d686f8a09df87ec3"
571                     "ffb35361b94ebfa1 3fec0e4889d18da5"),
572                20);
573
574   /* TC8: hashed string patterns */
575 #if 0
576   test_chacha(SHEX("c46ec1b18ce8a878 725a37e780dfb735"),
577               SHEX("1ada31d5cf688221"),
578               SHEX("6a870108859f6791 18f3e205e2a56a68"
579                    "26ef5a60a4102ac8 d4770059fcb7c7ba"
580                    "e02f5ce004a6bfbb ea53014dd82107c0"
581                    "aa1c7ce11b7d78f2 d50bd3602bbd2594"),
582               8);
583
584   test_chacha(SHEX("c46ec1b18ce8a878 725a37e780dfb735"),
585               SHEX("1ada31d5cf688221"),
586               SHEX("b02bd81eb55c8f68 b5e9ca4e307079bc"
587                    "225bd22007eddc67 02801820709ce098"
588                    "07046a0d2aa552bf dbb49466176d56e3"
589                    "2d519e10f5ad5f27 46e241e09bdf9959"),
590               12);
591
592   test_chacha(SHEX("c46ec1b18ce8a878 725a37e780dfb735"),
593               SHEX("1ada31d5cf688221"),
594               SHEX("826abdd84460e2e9 349f0ef4af5b179b"
595                    "426e4b2d109a9c5b b44000ae51bea90a"
596                    "496beeef62a76850 ff3f0402c4ddc99f"
597                    "6db07f151c1c0dfa c2e56565d6289625"
598
599                    "5b23132e7b469c7b fb88fa95d44ca5ae"
600                    "3e45e848a4108e98 bad7a9eb15512784"
601                    "a6a9e6e591dce674 120acaf9040ff50f"
602                    "f3ac30ccfb5e1420 4f5e4268b90a8804"),
603               20);
604 #endif
605   test_chacha(SHEX("c46ec1b18ce8a878 725a37e780dfb735"
606                    "1f68ed2e194c79fb c6aebee1a667975d"),
607               SHEX("1ada31d5cf688221"),
608               SHEX("838751b42d8ddd8a 3d77f48825a2ba75"
609                    "2cf4047cb308a597 8ef274973be374c9"
610                    "6ad848065871417b 08f034e681fe46a9"
611                    "3f7d5c61d1306614 d4aaf257a7cff08b"),
612               8);
613
614   test_chacha(SHEX("c46ec1b18ce8a878 725a37e780dfb735"
615                    "1f68ed2e194c79fb c6aebee1a667975d"),
616               SHEX("1ada31d5cf688221"),
617               SHEX("1482072784bc6d06 b4e73bdc118bc010"
618                    "3c7976786ca918e0 6986aa251f7e9cc1"
619                    "b2749a0a16ee83b4 242d2e99b08d7c20"
620                    "092b80bc466c8728 3b61b1b39d0ffbab"),
621               12);
622
623   test_chacha(SHEX("c46ec1b18ce8a878 725a37e780dfb735"
624                    "1f68ed2e194c79fb c6aebee1a667975d"),
625               SHEX("1ada31d5cf688221"),
626               SHEX("f63a89b75c2271f9 368816542ba52f06"
627                    "ed49241792302b00 b5e8f80ae9a473af"
628                    "c25b218f519af0fd d406362e8d69de7f"
629                    "54c604a6e00f353f 110f771bdca8ab92"
630
631                    "e5fbc34e60a1d9a9 db17345b0a402736"
632                    "853bf910b060bdf1 f897b6290f01d138"
633                    "ae2c4c90225ba9ea 14d518f55929dea0"
634                    "98ca7a6ccfe61227 053c84e49a4a3332"),
635               20);
636
637   /* From draft-irtf-cfrg-chacha20-poly1305-08, with 96-bit nonce */
638   test_chacha(SHEX("0001020304050607 08090a0b0c0d0e0f"
639                    "1011121314151617 18191a1b1c1d1e1f"),
640               SHEX("000000090000004a 00000000"),
641               SHEX("10f1e7e4d13b5915 500fdd1fa32071c4"
642                    "c7d1f4c733c06803 0422aa9ac3d46c4e"
643                    "d2826446079faa09 14c2d705d98b02a2"
644                    "b5129cd1de164eb9 cbd083e8a2503c4e"),
645               20);
646 }