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