testutil: always print errors on failure
[openssl.git] / test / poly1305_internal_test.c
1 /*
2  * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 /* Internal tests for the poly1305 module */
11
12 #include <stdio.h>
13 #include <string.h>
14
15 #include "testutil.h"
16 #include "internal/poly1305.h"
17 #include "../crypto/poly1305/poly1305_local.h"
18 #include "e_os.h"
19
20 typedef struct {
21     size_t size;
22     const unsigned char data[1024];
23 } SIZED_DATA;
24
25 typedef struct {
26     SIZED_DATA input;
27     SIZED_DATA key;
28     SIZED_DATA expected;
29 } TESTDATA;
30
31 typedef struct {
32     const char *test_case_name;
33     int test_num;
34     const TESTDATA *test_data;
35 } SIMPLE_FIXTURE;
36
37 /**********************************************************************
38  *
39  * Test of poly1305 internal functions
40  *
41  ***/
42
43 static SIMPLE_FIXTURE setup_poly1305(const char *const test_case_name)
44 {
45     SIMPLE_FIXTURE fixture;
46     fixture.test_case_name = test_case_name;
47     return fixture;
48 }
49
50 /* TODO : hex decoder / encoder should be implemented in testutil.c */
51 static void hexdump(const unsigned char *a, size_t len)
52 {
53     size_t i;
54
55     for (i = 0; i < len; i++)
56         fprintf(stderr, "%02x", a[i]);
57 }
58
59 static int execute_poly1305(SIMPLE_FIXTURE fixture)
60 {
61     POLY1305 poly1305;
62     unsigned int i = fixture.test_num;
63     const TESTDATA *test = fixture.test_data;
64     const unsigned char *in = test->input.data;
65     size_t inlen = test->input.size;
66     const unsigned char *key = test->key.data;
67     const unsigned char *expected = test->expected.data;
68     size_t expectedlen = test->expected.size;
69     unsigned char out[16];
70
71     if (expectedlen != sizeof(out))
72         return 0;
73
74     Poly1305_Init(&poly1305, key);
75     Poly1305_Update(&poly1305, in, inlen);
76     Poly1305_Final(&poly1305, out);
77
78     if (memcmp(out, expected, expectedlen) != 0) {
79         fprintf(stderr, "Poly1305 test #%d failed.\n", i);
80         fprintf(stderr, "got:      ");
81         hexdump(out, sizeof(out));
82         fprintf(stderr, "\nexpected: ");
83         hexdump(expected, expectedlen);
84         fprintf(stderr, "\n");
85         return 0;
86     }
87
88     if (inlen > 16) {
89         Poly1305_Init(&poly1305, key);
90         Poly1305_Update(&poly1305, in, 1);
91         Poly1305_Update(&poly1305, in+1, inlen-1);
92         Poly1305_Final(&poly1305, out);
93
94         if (memcmp(out, expected, expectedlen) != 0) {
95             fprintf(stderr, "Poly1305 test #%d/1+(N-1) failed.\n", i);
96             fprintf(stderr, "got:      ");
97             hexdump(out, sizeof(out));
98             fprintf(stderr, "\nexpected: ");
99             hexdump(expected, expectedlen);
100             fprintf(stderr, "\n");
101             return 0;
102         }
103     }
104
105     if (inlen > 32) {
106         size_t half = inlen / 2;
107
108         Poly1305_Init(&poly1305, key);
109         Poly1305_Update(&poly1305, in, half);
110         Poly1305_Update(&poly1305, in+half, inlen-half);
111         Poly1305_Final(&poly1305, out);
112
113         if (memcmp(out, expected, expectedlen) != 0) {
114             fprintf(stderr, "Poly1305 test #%d/2 failed.\n", i);
115             fprintf(stderr, "got:      ");
116             hexdump(out, sizeof(out));
117             fprintf(stderr, "\nexpected: ");
118             hexdump(expected, expectedlen);
119             fprintf(stderr, "\n");
120             return 0;
121         }
122
123         for (half = 16; half < inlen; half += 16) {
124             Poly1305_Init(&poly1305, key);
125             Poly1305_Update(&poly1305, in, half);
126             Poly1305_Update(&poly1305, in+half, inlen-half);
127             Poly1305_Final(&poly1305, out);
128
129             if (memcmp(out, expected, expectedlen) != 0) {
130                 fprintf(stderr, "Poly1305 test #%d/%" OSSLzu "+%" OSSLzu " failed.\n",
131                        i, half, inlen-half);
132                 fprintf(stderr, "got:      ");
133                 hexdump(out, sizeof(out));
134                 fprintf(stderr, "\nexpected: ");
135                 hexdump(expected, expectedlen);
136                 fprintf(stderr, "\n");
137                 return 0;
138             }
139         }
140     }
141
142     return 1;
143 }
144
145 static void teardown_poly1305(SIMPLE_FIXTURE fixture)
146 {
147 }
148
149 static void benchmark_poly1305()
150 {
151 # ifdef OPENSSL_CPUID_OBJ
152     POLY1305 poly1305;
153     unsigned char key[32];
154     unsigned char buf[8192];
155     unsigned long long stopwatch;
156     unsigned long long OPENSSL_rdtsc();
157     unsigned int i;
158
159     memset (buf,0x55,sizeof(buf));
160     memset (key,0xAA,sizeof(key));
161
162     Poly1305_Init(&poly1305, key);
163
164     for (i=0;i<100000;i++)
165         Poly1305_Update(&poly1305,buf,sizeof(buf));
166
167     stopwatch = OPENSSL_rdtsc();
168     for (i=0;i<10000;i++)
169         Poly1305_Update(&poly1305,buf,sizeof(buf));
170     stopwatch = OPENSSL_rdtsc() - stopwatch;
171
172     printf("%g\n",stopwatch/(double)(i*sizeof(buf)));
173
174     stopwatch = OPENSSL_rdtsc();
175     for (i=0;i<10000;i++) {
176         Poly1305_Init(&poly1305, key);
177         Poly1305_Update(&poly1305,buf,16);
178         Poly1305_Final(&poly1305,buf);
179     }
180     stopwatch = OPENSSL_rdtsc() - stopwatch;
181
182     printf("%g\n",stopwatch/(double)(i));
183 # else
184     fprintf(stderr,
185             "Benchmarking of poly1305 isn't available on this platform\n");
186 # endif
187 }
188
189 /**********************************************************************
190  *
191  * Test driver
192  *
193  ***/
194
195 static TESTDATA tests[] = {
196     /*
197      * RFC7539
198      */
199     {
200         {
201             34,
202             {
203                 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72,
204                 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f,
205                 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65,
206                 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f,
207
208                 0x75, 0x70
209             }
210         },
211         {
212             32,
213             {
214                 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33,
215                 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8,
216                 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd,
217                 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b
218             }
219         },
220         {
221             16,
222             {
223                 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6,
224                 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9
225             }
226         }
227     },
228     /*
229      * test vectors from "The Poly1305-AES message-authentication code"
230      */
231     {
232         {
233             2,
234             {
235                 0xf3, 0xf6
236             }
237         },
238         {
239             32,
240             {
241                 0x85, 0x1f, 0xc4, 0x0c, 0x34, 0x67, 0xac, 0x0b,
242                 0xe0, 0x5c, 0xc2, 0x04, 0x04, 0xf3, 0xf7, 0x00,
243                 0x58, 0x0b, 0x3b, 0x0f, 0x94, 0x47, 0xbb, 0x1e,
244                 0x69, 0xd0, 0x95, 0xb5, 0x92, 0x8b, 0x6d, 0xbc
245             }
246         },
247         {
248             16,
249             {
250                 0xf4, 0xc6, 0x33, 0xc3, 0x04, 0x4f, 0xc1, 0x45,
251                 0xf8, 0x4f, 0x33, 0x5c, 0xb8, 0x19, 0x53, 0xde
252             }
253         }
254     },
255     {
256         {
257             0,
258             {
259                 0
260             }
261         },
262         {
263             32,
264             {
265                 0xa0, 0xf3, 0x08, 0x00, 0x00, 0xf4, 0x64, 0x00,
266                 0xd0, 0xc7, 0xe9, 0x07, 0x6c, 0x83, 0x44, 0x03,
267                 0xdd, 0x3f, 0xab, 0x22, 0x51, 0xf1, 0x1a, 0xc7,
268                 0x59, 0xf0, 0x88, 0x71, 0x29, 0xcc, 0x2e, 0xe7
269             }
270         },
271         {
272             16,
273             {
274                 0xdd, 0x3f, 0xab, 0x22, 0x51, 0xf1, 0x1a, 0xc7,
275                 0x59, 0xf0, 0x88, 0x71, 0x29, 0xcc, 0x2e, 0xe7
276             }
277         }
278     },
279     {
280         {
281             32,
282             {
283                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
284                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
285                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
286                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36
287             }
288         },
289         {
290             32,
291             {
292                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
293                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
294                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
295                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef
296             }
297         },
298         {
299             16,
300             {
301                 0x0e, 0xe1, 0xc1, 0x6b, 0xb7, 0x3f, 0x0f, 0x4f,
302                 0xd1, 0x98, 0x81, 0x75, 0x3c, 0x01, 0xcd, 0xbe
303             }
304         }
305     },
306     {
307         {
308             63,
309             {
310                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
311                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
312                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
313                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
314
315                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
316                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
317                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
318                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9
319             }
320         },
321         {
322             32,
323             {
324                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
325                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
326                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
327                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
328             }
329         },
330         {
331             16,
332             {
333                 0x51, 0x54, 0xad, 0x0d, 0x2c, 0xb2, 0x6e, 0x01,
334                 0x27, 0x4f, 0xc5, 0x11, 0x48, 0x49, 0x1f, 0x1b
335             }
336         },
337     },
338     /*
339      * self-generated vectors exercise "significant" lengths, such that
340      * are handled by different code paths
341      */
342     {
343         {
344             64,
345             {
346                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
347                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
348                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
349                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
350
351                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
352                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
353                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
354                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf
355             }
356         },
357         {
358             32,
359             {
360                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
361                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
362                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
363                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
364             }
365         },
366         {
367             16,
368             {
369                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
370                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66
371             }
372         },
373     },
374     {
375         {
376             48,
377             {
378                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
379                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
380                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
381                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
382
383                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
384                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67
385             }
386         },
387         {
388             32,
389             {
390                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
391                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
392                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
393                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
394
395             }
396         },
397         {
398             16,
399             {
400                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
401                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61
402             }
403         },
404     },
405     {
406         {
407             96,
408             {
409                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
410                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
411                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
412                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
413
414                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
415                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
416                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
417                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
418
419                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
420                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
421                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
422                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36
423             }
424         },
425         {
426             32,
427             {
428                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
429                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
430                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
431                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
432             }
433         },
434         {
435             16,
436             {
437                 0xbb, 0xb6, 0x13, 0xb2, 0xb6, 0xd7, 0x53, 0xba,
438                 0x07, 0x39, 0x5b, 0x91, 0x6a, 0xae, 0xce, 0x15
439             }
440         },
441     },
442     {
443         {
444             112,
445             {
446                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
447                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
448                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
449                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
450
451                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
452                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
453                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
454                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
455
456                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
457                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
458                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
459                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
460
461                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
462                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24
463             }
464         },
465         {
466             32,
467             {
468                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
469                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
470                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
471                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
472             }
473         },
474         {
475             16,
476             {
477                 0xc7, 0x94, 0xd7, 0x05, 0x7d, 0x17, 0x78, 0xc4,
478                 0xbb, 0xee, 0x0a, 0x39, 0xb3, 0xd9, 0x73, 0x42
479             }
480         },
481     },
482     {
483         {
484             128,
485             {
486                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
487                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
488                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
489                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
490
491                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
492                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
493                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
494                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
495
496                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
497                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
498                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
499                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
500
501                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
502                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
503                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
504                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36
505             }
506         },
507         {
508             32,
509             {
510                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
511                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
512                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
513                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
514             }
515         },
516         {
517             16,
518             {
519                 0xff, 0xbc, 0xb9, 0xb3, 0x71, 0x42, 0x31, 0x52,
520                 0xd7, 0xfc, 0xa5, 0xad, 0x04, 0x2f, 0xba, 0xa9
521             }
522         },
523     },
524     {
525         {
526             144,
527             {
528                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
529                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
530                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
531                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
532
533                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
534                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
535                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
536                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
537
538                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
539                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
540                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
541                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
542
543                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
544                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
545                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
546                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
547
548                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
549                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66
550             }
551         },
552         {
553             32,
554             {
555                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
556                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
557                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
558                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
559             }
560         },
561         {
562             16,
563             {
564                 0x06, 0x9e, 0xd6, 0xb8, 0xef, 0x0f, 0x20, 0x7b,
565                 0x3e, 0x24, 0x3b, 0xb1, 0x01, 0x9f, 0xe6, 0x32
566             }
567         },
568     },
569     {
570         {
571             160,
572             {
573                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
574                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
575                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
576                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
577
578                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
579                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
580                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
581                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
582
583                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
584                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
585                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
586                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
587
588                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
589                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
590                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
591                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
592
593                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
594                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
595                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
596                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61
597             }
598         },
599         {
600             32,
601             {
602                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
603                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
604                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
605                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
606             }
607         },
608         {
609             16,
610             {
611                 0xcc, 0xa3, 0x39, 0xd9, 0xa4, 0x5f, 0xa2, 0x36,
612                 0x8c, 0x2c, 0x68, 0xb3, 0xa4, 0x17, 0x91, 0x33
613             }
614         },
615     },
616     {
617         {
618             288,
619             {
620                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
621                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
622                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
623                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
624
625                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
626                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
627                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
628                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
629
630                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
631                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
632                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
633                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
634
635                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
636                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
637                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
638                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
639
640                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
641                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
642                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
643                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61,
644
645                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
646                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
647                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
648                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
649
650                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
651                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
652                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
653                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
654
655                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
656                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
657                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
658                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
659
660                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
661                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
662                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
663                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36
664             }
665         },
666         {
667             32,
668             {
669                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
670                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
671                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
672                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
673             }
674         },
675         {
676             16,
677             {
678                 0x53, 0xf6, 0xe8, 0x28, 0xa2, 0xf0, 0xfe, 0x0e,
679                 0xe8, 0x15, 0xbf, 0x0b, 0xd5, 0x84, 0x1a, 0x34
680             }
681         },
682     },
683     {
684         {
685             320,
686             {
687                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
688                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
689                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
690                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
691
692                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
693                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
694                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
695                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
696
697                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
698                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
699                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
700                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
701
702                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
703                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
704                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
705                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
706
707                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
708                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
709                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
710                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61,
711
712                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
713                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
714                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
715                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
716
717                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
718                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
719                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
720                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
721
722                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
723                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
724                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
725                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
726
727                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
728                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
729                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
730                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
731
732                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
733                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
734                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
735                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61
736             }
737         },
738         {
739             32,
740             {
741                 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
742                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
743                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
744                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
745             }
746         },
747         {
748             16,
749             {
750                 0xb8, 0x46, 0xd4, 0x4e, 0x9b, 0xbd, 0x53, 0xce,
751                 0xdf, 0xfb, 0xfb, 0xb6, 0xb7, 0xfa, 0x49, 0x33
752             }
753         },
754     },
755     /*
756      * 4th power of the key spills to 131th bit in SIMD key setup
757      */
758     {
759         {
760             256,
761             {
762                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
763                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
764                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
765                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
766
767                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
768                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
769                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
770                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
771
772                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
773                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
774                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
775                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
776
777                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
778                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
779                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
780                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
781
782                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
783                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
784                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
785                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
786
787                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
788                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
789                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
790                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
791
792                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
793                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
794                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
795                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
796
797                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
798                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
799                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
800                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
801             }
802         },
803         {
804             32,
805             {
806                 0xad, 0x62, 0x81, 0x07, 0xe8, 0x35, 0x1d, 0x0f,
807                 0x2c, 0x23, 0x1a, 0x05, 0xdc, 0x4a, 0x41, 0x06,
808                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
810             }
811         },
812         {
813             16,
814             {
815                 0x07, 0x14, 0x5a, 0x4c, 0x02, 0xfe, 0x5f, 0xa3,
816                 0x20, 0x36, 0xde, 0x68, 0xfa, 0xbe, 0x90, 0x66
817             }
818         },
819     },
820     /*
821      * poly1305_ieee754.c failed this in final stage
822      */
823     {
824         {
825             252,
826             {
827                 0x84, 0x23, 0x64, 0xe1, 0x56, 0x33, 0x6c, 0x09,
828                 0x98, 0xb9, 0x33, 0xa6, 0x23, 0x77, 0x26, 0x18,
829                 0x0d, 0x9e, 0x3f, 0xdc, 0xbd, 0xe4, 0xcd, 0x5d,
830                 0x17, 0x08, 0x0f, 0xc3, 0xbe, 0xb4, 0x96, 0x14,
831
832                 0xd7, 0x12, 0x2c, 0x03, 0x74, 0x63, 0xff, 0x10,
833                 0x4d, 0x73, 0xf1, 0x9c, 0x12, 0x70, 0x46, 0x28,
834                 0xd4, 0x17, 0xc4, 0xc5, 0x4a, 0x3f, 0xe3, 0x0d,
835                 0x3c, 0x3d, 0x77, 0x14, 0x38, 0x2d, 0x43, 0xb0,
836
837                 0x38, 0x2a, 0x50, 0xa5, 0xde, 0xe5, 0x4b, 0xe8,
838                 0x44, 0xb0, 0x76, 0xe8, 0xdf, 0x88, 0x20, 0x1a,
839                 0x1c, 0xd4, 0x3b, 0x90, 0xeb, 0x21, 0x64, 0x3f,
840                 0xa9, 0x6f, 0x39, 0xb5, 0x18, 0xaa, 0x83, 0x40,
841
842                 0xc9, 0x42, 0xff, 0x3c, 0x31, 0xba, 0xf7, 0xc9,
843                 0xbd, 0xbf, 0x0f, 0x31, 0xae, 0x3f, 0xa0, 0x96,
844                 0xbf, 0x8c, 0x63, 0x03, 0x06, 0x09, 0x82, 0x9f,
845                 0xe7, 0x2e, 0x17, 0x98, 0x24, 0x89, 0x0b, 0xc8,
846
847                 0xe0, 0x8c, 0x31, 0x5c, 0x1c, 0xce, 0x2a, 0x83,
848                 0x14, 0x4d, 0xbb, 0xff, 0x09, 0xf7, 0x4e, 0x3e,
849                 0xfc, 0x77, 0x0b, 0x54, 0xd0, 0x98, 0x4a, 0x8f,
850                 0x19, 0xb1, 0x47, 0x19, 0xe6, 0x36, 0x35, 0x64,
851
852                 0x1d, 0x6b, 0x1e, 0xed, 0xf6, 0x3e, 0xfb, 0xf0,
853                 0x80, 0xe1, 0x78, 0x3d, 0x32, 0x44, 0x54, 0x12,
854                 0x11, 0x4c, 0x20, 0xde, 0x0b, 0x83, 0x7a, 0x0d,
855                 0xfa, 0x33, 0xd6, 0xb8, 0x28, 0x25, 0xff, 0xf4,
856
857                 0x4c, 0x9a, 0x70, 0xea, 0x54, 0xce, 0x47, 0xf0,
858                 0x7d, 0xf6, 0x98, 0xe6, 0xb0, 0x33, 0x23, 0xb5,
859                 0x30, 0x79, 0x36, 0x4a, 0x5f, 0xc3, 0xe9, 0xdd,
860                 0x03, 0x43, 0x92, 0xbd, 0xde, 0x86, 0xdc, 0xcd,
861
862                 0xda, 0x94, 0x32, 0x1c, 0x5e, 0x44, 0x06, 0x04,
863                 0x89, 0x33, 0x6c, 0xb6, 0x5b, 0xf3, 0x98, 0x9c,
864                 0x36, 0xf7, 0x28, 0x2c, 0x2f, 0x5d, 0x2b, 0x88,
865                 0x2c, 0x17, 0x1e, 0x74
866             }
867         },
868         {
869             32,
870             {
871                 0x95, 0xd5, 0xc0, 0x05, 0x50, 0x3e, 0x51, 0x0d,
872                 0x8c, 0xd0, 0xaa, 0x07, 0x2c, 0x4a, 0x4d, 0x06,
873                 0x6e, 0xab, 0xc5, 0x2d, 0x11, 0x65, 0x3d, 0xf4,
874                 0x7f, 0xbf, 0x63, 0xab, 0x19, 0x8b, 0xcc, 0x26
875             }
876         },
877         {
878             16,
879             {
880                 0xf2, 0x48, 0x31, 0x2e, 0x57, 0x8d, 0x9d, 0x58,
881                 0xf8, 0xb7, 0xbb, 0x4d, 0x19, 0x10, 0x54, 0x31
882             }
883         },
884     },
885     /*
886      * AVX2 in poly1305-x86.pl failed this with 176+32 split
887      */
888     {
889         {
890             208,
891             {
892                 0x24, 0x8a, 0xc3, 0x10, 0x85, 0xb6, 0xc2, 0xad,
893                 0xaa, 0xa3, 0x82, 0x59, 0xa0, 0xd7, 0x19, 0x2c,
894                 0x5c, 0x35, 0xd1, 0xbb, 0x4e, 0xf3, 0x9a, 0xd9,
895                 0x4c, 0x38, 0xd1, 0xc8, 0x24, 0x79, 0xe2, 0xdd,
896
897                 0x21, 0x59, 0xa0, 0x77, 0x02, 0x4b, 0x05, 0x89,
898                 0xbc, 0x8a, 0x20, 0x10, 0x1b, 0x50, 0x6f, 0x0a,
899                 0x1a, 0xd0, 0xbb, 0xab, 0x76, 0xe8, 0x3a, 0x83,
900                 0xf1, 0xb9, 0x4b, 0xe6, 0xbe, 0xae, 0x74, 0xe8,
901
902                 0x74, 0xca, 0xb6, 0x92, 0xc5, 0x96, 0x3a, 0x75,
903                 0x43, 0x6b, 0x77, 0x61, 0x21, 0xec, 0x9f, 0x62,
904                 0x39, 0x9a, 0x3e, 0x66, 0xb2, 0xd2, 0x27, 0x07,
905                 0xda, 0xe8, 0x19, 0x33, 0xb6, 0x27, 0x7f, 0x3c,
906
907                 0x85, 0x16, 0xbc, 0xbe, 0x26, 0xdb, 0xbd, 0x86,
908                 0xf3, 0x73, 0x10, 0x3d, 0x7c, 0xf4, 0xca, 0xd1,
909                 0x88, 0x8c, 0x95, 0x21, 0x18, 0xfb, 0xfb, 0xd0,
910                 0xd7, 0xb4, 0xbe, 0xdc, 0x4a, 0xe4, 0x93, 0x6a,
911
912                 0xff, 0x91, 0x15, 0x7e, 0x7a, 0xa4, 0x7c, 0x54,
913                 0x44, 0x2e, 0xa7, 0x8d, 0x6a, 0xc2, 0x51, 0xd3,
914                 0x24, 0xa0, 0xfb, 0xe4, 0x9d, 0x89, 0xcc, 0x35,
915                 0x21, 0xb6, 0x6d, 0x16, 0xe9, 0xc6, 0x6a, 0x37,
916
917                 0x09, 0x89, 0x4e, 0x4e, 0xb0, 0xa4, 0xee, 0xdc,
918                 0x4a, 0xe1, 0x94, 0x68, 0xe6, 0x6b, 0x81, 0xf2,
919
920                 0x71, 0x35, 0x1b, 0x1d, 0x92, 0x1e, 0xa5, 0x51,
921                 0x04, 0x7a, 0xbc, 0xc6, 0xb8, 0x7a, 0x90, 0x1f,
922                 0xde, 0x7d, 0xb7, 0x9f, 0xa1, 0x81, 0x8c, 0x11,
923                 0x33, 0x6d, 0xbc, 0x07, 0x24, 0x4a, 0x40, 0xeb
924             }
925         },
926         {
927             32,
928             {
929                 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
930                 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
931                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
933             }
934         },
935         {
936             16,
937             {
938                 0xbc, 0x93, 0x9b, 0xc5, 0x28, 0x14, 0x80, 0xfa,
939                 0x99, 0xc6, 0xd6, 0x8c, 0x25, 0x8e, 0xc4, 0x2f
940             }
941         },
942     },
943     /*
944      * test vectors from Google
945      */
946     {
947         {
948             0,
949             {
950                 0x00,
951             }
952         },
953         {
954             32,
955             {
956                 0xc8, 0xaf, 0xaa, 0xc3, 0x31, 0xee, 0x37, 0x2c,
957                 0xd6, 0x08, 0x2d, 0xe1, 0x34, 0x94, 0x3b, 0x17,
958                 0x47, 0x10, 0x13, 0x0e, 0x9f, 0x6f, 0xea, 0x8d,
959                 0x72, 0x29, 0x38, 0x50, 0xa6, 0x67, 0xd8, 0x6c
960             }
961         },
962         {
963             16,
964             {
965                 0x47, 0x10, 0x13, 0x0e, 0x9f, 0x6f, 0xea, 0x8d,
966                 0x72, 0x29, 0x38, 0x50, 0xa6, 0x67, 0xd8, 0x6c
967             }
968         },
969     },
970     {
971         {
972             12,
973             {
974                 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f,
975                 0x72, 0x6c, 0x64, 0x21
976             }
977         },
978         {
979             32,
980             {
981                 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
982                 0x33, 0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20,
983                 0x6b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20,
984                 0x50, 0x6f, 0x6c, 0x79, 0x31, 0x33, 0x30, 0x35
985             }
986         },
987         {
988             16,
989             {
990                 0xa6, 0xf7, 0x45, 0x00, 0x8f, 0x81, 0xc9, 0x16,
991                 0xa2, 0x0d, 0xcc, 0x74, 0xee, 0xf2, 0xb2, 0xf0
992             }
993         },
994     },
995     {
996         {
997             32,
998             {
999                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1000                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1001                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1002                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1003             }
1004         },
1005         {
1006             32,
1007             {
1008                 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
1009                 0x33, 0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20,
1010                 0x6b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20,
1011                 0x50, 0x6f, 0x6c, 0x79, 0x31, 0x33, 0x30, 0x35
1012             }
1013         },
1014         {
1015             16,
1016             {
1017                 0x49, 0xec, 0x78, 0x09, 0x0e, 0x48, 0x1e, 0xc6,
1018                 0xc2, 0x6b, 0x33, 0xb9, 0x1c, 0xcc, 0x03, 0x07
1019             }
1020         },
1021     },
1022     {
1023         {
1024             128,
1025             {
1026                 0x89, 0xda, 0xb8, 0x0b, 0x77, 0x17, 0xc1, 0xdb,
1027                 0x5d, 0xb4, 0x37, 0x86, 0x0a, 0x3f, 0x70, 0x21,
1028                 0x8e, 0x93, 0xe1, 0xb8, 0xf4, 0x61, 0xfb, 0x67,
1029                 0x7f, 0x16, 0xf3, 0x5f, 0x6f, 0x87, 0xe2, 0xa9,
1030
1031                 0x1c, 0x99, 0xbc, 0x3a, 0x47, 0xac, 0xe4, 0x76,
1032                 0x40, 0xcc, 0x95, 0xc3, 0x45, 0xbe, 0x5e, 0xcc,
1033                 0xa5, 0xa3, 0x52, 0x3c, 0x35, 0xcc, 0x01, 0x89,
1034                 0x3a, 0xf0, 0xb6, 0x4a, 0x62, 0x03, 0x34, 0x27,
1035
1036                 0x03, 0x72, 0xec, 0x12, 0x48, 0x2d, 0x1b, 0x1e,
1037                 0x36, 0x35, 0x61, 0x69, 0x8a, 0x57, 0x8b, 0x35,
1038                 0x98, 0x03, 0x49, 0x5b, 0xb4, 0xe2, 0xef, 0x19,
1039                 0x30, 0xb1, 0x7a, 0x51, 0x90, 0xb5, 0x80, 0xf1,
1040
1041                 0x41, 0x30, 0x0d, 0xf3, 0x0a, 0xdb, 0xec, 0xa2,
1042                 0x8f, 0x64, 0x27, 0xa8, 0xbc, 0x1a, 0x99, 0x9f,
1043                 0xd5, 0x1c, 0x55, 0x4a, 0x01, 0x7d, 0x09, 0x5d,
1044                 0x8c, 0x3e, 0x31, 0x27, 0xda, 0xf9, 0xf5, 0x95
1045             }
1046         },
1047         {
1048             32,
1049             {
1050                 0x2d, 0x77, 0x3b, 0xe3, 0x7a, 0xdb, 0x1e, 0x4d,
1051                 0x68, 0x3b, 0xf0, 0x07, 0x5e, 0x79, 0xc4, 0xee,
1052                 0x03, 0x79, 0x18, 0x53, 0x5a, 0x7f, 0x99, 0xcc,
1053                 0xb7, 0x04, 0x0f, 0xb5, 0xf5, 0xf4, 0x3a, 0xea
1054             }
1055         },
1056         {
1057             16,
1058             {
1059                 0xc8, 0x5d, 0x15, 0xed, 0x44, 0xc3, 0x78, 0xd6,
1060                 0xb0, 0x0e, 0x23, 0x06, 0x4c, 0x7b, 0xcd, 0x51
1061             }
1062         },
1063     },
1064     {
1065         {
1066             528,
1067             {
1068                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
1069                 0x17, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
1070
1071                 0x06, 0xdb, 0x1f, 0x1f, 0x36, 0x8d, 0x69, 0x6a,
1072                 0x81, 0x0a, 0x34, 0x9c, 0x0c, 0x71, 0x4c, 0x9a,
1073                 0x5e, 0x78, 0x50, 0xc2, 0x40, 0x7d, 0x72, 0x1a,
1074                 0xcd, 0xed, 0x95, 0xe0, 0x18, 0xd7, 0xa8, 0x52,
1075
1076                 0x66, 0xa6, 0xe1, 0x28, 0x9c, 0xdb, 0x4a, 0xeb,
1077                 0x18, 0xda, 0x5a, 0xc8, 0xa2, 0xb0, 0x02, 0x6d,
1078                 0x24, 0xa5, 0x9a, 0xd4, 0x85, 0x22, 0x7f, 0x3e,
1079                 0xae, 0xdb, 0xb2, 0xe7, 0xe3, 0x5e, 0x1c, 0x66,
1080
1081                 0xcd, 0x60, 0xf9, 0xab, 0xf7, 0x16, 0xdc, 0xc9,
1082                 0xac, 0x42, 0x68, 0x2d, 0xd7, 0xda, 0xb2, 0x87,
1083                 0xa7, 0x02, 0x4c, 0x4e, 0xef, 0xc3, 0x21, 0xcc,
1084                 0x05, 0x74, 0xe1, 0x67, 0x93, 0xe3, 0x7c, 0xec,
1085
1086                 0x03, 0xc5, 0xbd, 0xa4, 0x2b, 0x54, 0xc1, 0x14,
1087                 0xa8, 0x0b, 0x57, 0xaf, 0x26, 0x41, 0x6c, 0x7b,
1088                 0xe7, 0x42, 0x00, 0x5e, 0x20, 0x85, 0x5c, 0x73,
1089                 0xe2, 0x1d, 0xc8, 0xe2, 0xed, 0xc9, 0xd4, 0x35,
1090
1091                 0xcb, 0x6f, 0x60, 0x59, 0x28, 0x00, 0x11, 0xc2,
1092                 0x70, 0xb7, 0x15, 0x70, 0x05, 0x1c, 0x1c, 0x9b,
1093                 0x30, 0x52, 0x12, 0x66, 0x20, 0xbc, 0x1e, 0x27,
1094                 0x30, 0xfa, 0x06, 0x6c, 0x7a, 0x50, 0x9d, 0x53,
1095
1096                 0xc6, 0x0e, 0x5a, 0xe1, 0xb4, 0x0a, 0xa6, 0xe3,
1097                 0x9e, 0x49, 0x66, 0x92, 0x28, 0xc9, 0x0e, 0xec,
1098                 0xb4, 0xa5, 0x0d, 0xb3, 0x2a, 0x50, 0xbc, 0x49,
1099                 0xe9, 0x0b, 0x4f, 0x4b, 0x35, 0x9a, 0x1d, 0xfd,
1100
1101                 0x11, 0x74, 0x9c, 0xd3, 0x86, 0x7f, 0xcf, 0x2f,
1102                 0xb7, 0xbb, 0x6c, 0xd4, 0x73, 0x8f, 0x6a, 0x4a,
1103                 0xd6, 0xf7, 0xca, 0x50, 0x58, 0xf7, 0x61, 0x88,
1104                 0x45, 0xaf, 0x9f, 0x02, 0x0f, 0x6c, 0x3b, 0x96,
1105
1106                 0x7b, 0x8f, 0x4c, 0xd4, 0xa9, 0x1e, 0x28, 0x13,
1107                 0xb5, 0x07, 0xae, 0x66, 0xf2, 0xd3, 0x5c, 0x18,
1108                 0x28, 0x4f, 0x72, 0x92, 0x18, 0x60, 0x62, 0xe1,
1109                 0x0f, 0xd5, 0x51, 0x0d, 0x18, 0x77, 0x53, 0x51,
1110
1111                 0xef, 0x33, 0x4e, 0x76, 0x34, 0xab, 0x47, 0x43,
1112                 0xf5, 0xb6, 0x8f, 0x49, 0xad, 0xca, 0xb3, 0x84,
1113                 0xd3, 0xfd, 0x75, 0xf7, 0x39, 0x0f, 0x40, 0x06,
1114                 0xef, 0x2a, 0x29, 0x5c, 0x8c, 0x7a, 0x07, 0x6a,
1115
1116                 0xd5, 0x45, 0x46, 0xcd, 0x25, 0xd2, 0x10, 0x7f,
1117                 0xbe, 0x14, 0x36, 0xc8, 0x40, 0x92, 0x4a, 0xae,
1118                 0xbe, 0x5b, 0x37, 0x08, 0x93, 0xcd, 0x63, 0xd1,
1119                 0x32, 0x5b, 0x86, 0x16, 0xfc, 0x48, 0x10, 0x88,
1120
1121                 0x6b, 0xc1, 0x52, 0xc5, 0x32, 0x21, 0xb6, 0xdf,
1122                 0x37, 0x31, 0x19, 0x39, 0x32, 0x55, 0xee, 0x72,
1123                 0xbc, 0xaa, 0x88, 0x01, 0x74, 0xf1, 0x71, 0x7f,
1124                 0x91, 0x84, 0xfa, 0x91, 0x64, 0x6f, 0x17, 0xa2,
1125
1126                 0x4a, 0xc5, 0x5d, 0x16, 0xbf, 0xdd, 0xca, 0x95,
1127                 0x81, 0xa9, 0x2e, 0xda, 0x47, 0x92, 0x01, 0xf0,
1128                 0xed, 0xbf, 0x63, 0x36, 0x00, 0xd6, 0x06, 0x6d,
1129                 0x1a, 0xb3, 0x6d, 0x5d, 0x24, 0x15, 0xd7, 0x13,
1130
1131                 0x51, 0xbb, 0xcd, 0x60, 0x8a, 0x25, 0x10, 0x8d,
1132                 0x25, 0x64, 0x19, 0x92, 0xc1, 0xf2, 0x6c, 0x53,
1133                 0x1c, 0xf9, 0xf9, 0x02, 0x03, 0xbc, 0x4c, 0xc1,
1134                 0x9f, 0x59, 0x27, 0xd8, 0x34, 0xb0, 0xa4, 0x71,
1135
1136                 0x16, 0xd3, 0x88, 0x4b, 0xbb, 0x16, 0x4b, 0x8e,
1137                 0xc8, 0x83, 0xd1, 0xac, 0x83, 0x2e, 0x56, 0xb3,
1138                 0x91, 0x8a, 0x98, 0x60, 0x1a, 0x08, 0xd1, 0x71,
1139                 0x88, 0x15, 0x41, 0xd5, 0x94, 0xdb, 0x39, 0x9c,
1140
1141                 0x6a, 0xe6, 0x15, 0x12, 0x21, 0x74, 0x5a, 0xec,
1142                 0x81, 0x4c, 0x45, 0xb0, 0xb0, 0x5b, 0x56, 0x54,
1143                 0x36, 0xfd, 0x6f, 0x13, 0x7a, 0xa1, 0x0a, 0x0c,
1144                 0x0b, 0x64, 0x37, 0x61, 0xdb, 0xd6, 0xf9, 0xa9,
1145
1146                 0xdc, 0xb9, 0x9b, 0x1a, 0x6e, 0x69, 0x08, 0x54,
1147                 0xce, 0x07, 0x69, 0xcd, 0xe3, 0x97, 0x61, 0xd8,
1148                 0x2f, 0xcd, 0xec, 0x15, 0xf0, 0xd9, 0x2d, 0x7d,
1149                 0x8e, 0x94, 0xad, 0xe8, 0xeb, 0x83, 0xfb, 0xe0
1150             }
1151         },
1152         {
1153             32,
1154             {
1155                 0x99, 0xe5, 0x82, 0x2d, 0xd4, 0x17, 0x3c, 0x99,
1156                 0x5e, 0x3d, 0xae, 0x0d, 0xde, 0xfb, 0x97, 0x74,
1157                 0x3f, 0xde, 0x3b, 0x08, 0x01, 0x34, 0xb3, 0x9f,
1158                 0x76, 0xe9, 0xbf, 0x8d, 0x0e, 0x88, 0xd5, 0x46
1159             }
1160         },
1161         {
1162             16,
1163             {
1164                 0x26, 0x37, 0x40, 0x8f, 0xe1, 0x30, 0x86, 0xea,
1165                 0x73, 0xf9, 0x71, 0xe3, 0x42, 0x5e, 0x28, 0x20
1166             }
1167         },
1168     },
1169     /*
1170      * test vectors from Hanno Böck
1171      */
1172     {
1173         {
1174             257,
1175             {
1176                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1177                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1178                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1179                 0xcc, 0x80, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1180
1181                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1182                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1183                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1184                 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xcc, 0xcc, 0xcc,
1185
1186                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1187                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5,
1188                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1189                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1190
1191                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe3, 0xcc, 0xcc,
1192                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1193                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1194                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1195
1196                 0xcc, 0xcc, 0xcc, 0xcc, 0xac, 0xcc, 0xcc, 0xcc,
1197                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6,
1198                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00,
1199                 0xaf, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1200
1201                 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00,
1202                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1205
1206                 0x00, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00,
1207                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1208                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1210
1211                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1213                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1214                 0x00, 0x00, 0x71, 0x92, 0x05, 0xa8, 0x52, 0x1d,
1215
1216                 0xfc
1217             }
1218         },
1219         {
1220             32,
1221             {
1222                 0x7f, 0x1b, 0x02, 0x64, 0x00, 0x00, 0x00, 0x00,
1223                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1224                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1225                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc
1226             }
1227         },
1228         {
1229             16,
1230             {
1231                 0x85, 0x59, 0xb8, 0x76, 0xec, 0xee, 0xd6, 0x6e,
1232                 0xb3, 0x77, 0x98, 0xc0, 0x45, 0x7b, 0xaf, 0xf9
1233             }
1234         },
1235     },
1236     {
1237         {
1238             39,
1239             {
1240                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1241                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1242                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1243                 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00,
1244
1245                 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x64
1246             }
1247         },
1248         {
1249             32,
1250             {
1251                 0xe0, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
1252                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1253                 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1254                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa
1255             }
1256         },
1257         {
1258             16,
1259             {
1260                 0x00, 0xbd, 0x12, 0x58, 0x97, 0x8e, 0x20, 0x54,
1261                 0x44, 0xc9, 0xaa, 0xaa, 0x82, 0x00, 0x6f, 0xed
1262             }
1263         },
1264     },
1265     {
1266         {
1267             2,
1268             {
1269                 0x02, 0xfc
1270             }
1271         },
1272         {
1273             32,
1274             {
1275                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1276                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1277                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1278                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
1279             }
1280         },
1281         {
1282             16,
1283             {
1284                 0x06, 0x12, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
1285                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c
1286             }
1287         },
1288     },
1289     {
1290         {
1291             415,
1292             {
1293                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1294                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1295                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1296                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1297
1298                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, 0x7b,
1299                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1300                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1301                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1302
1303                 0x7b, 0x7b, 0x5c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1304                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1305                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1306                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1307
1308                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1309                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1310                 0x7b, 0x7b, 0x7b, 0x7b, 0x6e, 0x7b, 0x00, 0x7b,
1311                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1312
1313                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1314                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1315                 0x7b, 0x7b, 0x7b, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b,
1316                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1317
1318                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1319                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x5c,
1320                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1321                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1322
1323                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1324                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1325                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1326                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
1327
1328                 0x7b, 0x6e, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x00,
1329                 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1330                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1331                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332
1333                 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335                 0x00, 0x00, 0x00, 0x20, 0x00, 0xef, 0xff, 0x00,
1336                 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337
1338                 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
1339                 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x64, 0x00,
1340                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1341                 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
1342
1343                 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1344                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2,
1346                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1347
1348                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349                 0x00, 0x00, 0x20, 0x00, 0xef, 0xff, 0x00, 0x09,
1350                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1351                 0x00, 0x7a, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
1352
1353                 0x00, 0x09, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00,
1354                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc
1357             }
1358         },
1359         {
1360             32,
1361             {
1362                 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364                 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
1365                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x7b
1366             }
1367         },
1368         {
1369             16,
1370             {
1371                 0x33, 0x20, 0x5b, 0xbf, 0x9e, 0x9f, 0x8f, 0x72,
1372                 0x12, 0xab, 0x9e, 0x2a, 0xb9, 0xb7, 0xe4, 0xa5
1373             }
1374         },
1375     },
1376     {
1377         {
1378             118,
1379             {
1380                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1381                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1382                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1383                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1384
1385                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1386                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1387                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1388                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1389
1390                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
1391                 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xe9,
1392                 0xe9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
1393                 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0xac, 0xac,
1394
1395                 0xec, 0x01, 0x00, 0xac, 0xac, 0xac, 0x2c, 0xac,
1396                 0xa2, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
1397                 0xac, 0xac, 0xac, 0xac, 0x64, 0xf2
1398             }
1399         },
1400         {
1401             32,
1402             {
1403                 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7f,
1404                 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
1405                 0x00, 0x00, 0xcf, 0x77, 0x77, 0x77, 0x77, 0x77,
1406                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77
1407             }
1408         },
1409         {
1410             16,
1411             {
1412                 0x02, 0xee, 0x7c, 0x8c, 0x54, 0x6d, 0xde, 0xb1,
1413                 0xa4, 0x67, 0xe4, 0xc3, 0x98, 0x11, 0x58, 0xb9
1414             }
1415         },
1416     },
1417     /*
1418      * test vectors from Andrew Moon
1419      */
1420     { /* nacl */
1421         {
1422             131,
1423             {
1424                 0x8e, 0x99, 0x3b, 0x9f, 0x48, 0x68, 0x12, 0x73,
1425                 0xc2, 0x96, 0x50, 0xba, 0x32, 0xfc, 0x76, 0xce,
1426                 0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4,
1427                 0x47, 0x6f, 0xb8, 0xc5, 0x31, 0xa1, 0x18, 0x6a,
1428
1429                 0xc0, 0xdf, 0xc1, 0x7c, 0x98, 0xdc, 0xe8, 0x7b,
1430                 0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72,
1431                 0x71, 0xd2, 0xc2, 0x0f, 0x9b, 0x92, 0x8f, 0xe2,
1432                 0x27, 0x0d, 0x6f, 0xb8, 0x63, 0xd5, 0x17, 0x38,
1433
1434                 0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a,
1435                 0xb9, 0x32, 0x16, 0x45, 0x48, 0xe5, 0x26, 0xae,
1436                 0x90, 0x22, 0x43, 0x68, 0x51, 0x7a, 0xcf, 0xea,
1437                 0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda,
1438
1439                 0x99, 0x83, 0x2b, 0x61, 0xca, 0x01, 0xb6, 0xde,
1440                 0x56, 0x24, 0x4a, 0x9e, 0x88, 0xd5, 0xf9, 0xb3,
1441                 0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6,
1442                 0x59, 0x9b, 0x1f, 0x65, 0x4c, 0xb4, 0x5a, 0x74,
1443
1444                 0xe3, 0x55, 0xa5
1445             }
1446         },
1447         {
1448             32,
1449             {
1450                 0xee, 0xa6, 0xa7, 0x25, 0x1c, 0x1e, 0x72, 0x91,
1451                 0x6d, 0x11, 0xc2, 0xcb, 0x21, 0x4d, 0x3c, 0x25,
1452                 0x25, 0x39, 0x12, 0x1d, 0x8e, 0x23, 0x4e, 0x65,
1453                 0x2d, 0x65, 0x1f, 0xa4, 0xc8, 0xcf, 0xf8, 0x80
1454             }
1455         },
1456         {
1457             16,
1458             {
1459                 0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5,
1460                 0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9
1461             }
1462         },
1463     },
1464     { /* wrap 2^130-5 */
1465         {
1466             16,
1467             {
1468                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1469                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1470             }
1471         },
1472         {
1473             32,
1474             {
1475                 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1476                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1477                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1478                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1479             }
1480         },
1481         {
1482             16,
1483             {
1484                 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1485                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1486             }
1487         },
1488     },
1489     { /* wrap 2^128 */
1490         {
1491             16,
1492             {
1493                 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1494                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1495             }
1496         },
1497         {
1498             32,
1499             {
1500                 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1501                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1502                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1503                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1504             }
1505         },
1506         {
1507             16,
1508             {
1509                 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1510                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1511             }
1512         },
1513     },
1514     { /* limb carry */
1515         {
1516             48,
1517             {
1518                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1519                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1520                 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1521                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1522
1523                 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1525             }
1526         },
1527         {
1528             32,
1529             {
1530                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1531                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1532                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1533                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1534             }
1535         },
1536         {
1537             16,
1538             {
1539                 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1540                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1541             }
1542         },
1543     },
1544     { /* 2^130-5 */
1545         {
1546             48,
1547             {
1548                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1549                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1550                 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
1551                 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
1552
1553                 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1554                 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
1555             }
1556         },
1557         {
1558             32,
1559             {
1560                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1561                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1562                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1563                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1564             }
1565         },
1566         {
1567             16,
1568             {
1569                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1570                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1571
1572             }
1573         },
1574     },
1575     { /* 2^130-6 */
1576         {
1577             16,
1578             {
1579                 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1580                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1581             }
1582         },
1583         {
1584             32,
1585             {
1586                 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1587                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1588                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1589                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1590             }
1591         },
1592         {
1593             16,
1594             {
1595                 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1596                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1597             }
1598         },
1599     },
1600     { /* 5*H+L reduction intermediate */
1601         {
1602             64,
1603             {
1604                 0xe3, 0x35, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0xb9,
1605                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1606                 0x33, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0x79, 0xcd,
1607                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1608
1609                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1610                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1611                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1612                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1613             }
1614         },
1615         {
1616             32,
1617             {
1618                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1619                 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1620                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1621                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1622             }
1623         },
1624         {
1625             16,
1626             {
1627                 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1628                 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1629             }
1630         },
1631     },
1632     { /* 5*H+L reduction final */
1633         {
1634             48,
1635             {
1636                 0xe3, 0x35, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0xb9,
1637                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1638                 0x33, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0x79, 0xcd,
1639                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1640
1641                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1642                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1643
1644             }
1645         },
1646         {
1647             32,
1648             {
1649                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1650                 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1651                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1652                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1653             }
1654         },
1655         {
1656             16,
1657             {
1658                 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1659                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1660             }
1661         }
1662     }
1663 };
1664
1665 static int drive_tests(int idx)
1666 {
1667     SETUP_TEST_FIXTURE(SIMPLE_FIXTURE, setup_poly1305);
1668     fixture.test_num = idx;
1669     fixture.test_data = &tests[idx];
1670     EXECUTE_TEST(execute_poly1305, teardown_poly1305);
1671 }
1672
1673 int main(int argc, char **argv)
1674 {
1675     int result = 0;
1676     int iter_argv;
1677     int benchmark = 0;
1678
1679     for (iter_argv = 1; iter_argv < argc; iter_argv++) {
1680         if (strcmp(argv[iter_argv], "-b") == 0)
1681             benchmark = 1;
1682         else if (strcmp(argv[iter_argv], "-h") == 0)
1683             goto help;
1684     }
1685
1686     ADD_ALL_TESTS(drive_tests, OSSL_NELEM(tests));
1687
1688     result = run_tests(argv[0]);
1689
1690     if (benchmark)
1691         benchmark_poly1305();
1692
1693     return result;
1694
1695  help:
1696     printf("-h\tThis help\n");
1697     printf("-b\tBenchmark in addition to the tests\n");
1698
1699     return 0;
1700 }