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