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