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