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