xref: /src/crypto/openssl/test/poly1305_internal_test.c (revision f25b8c9fb4f58cf61adb47d7570abe7caa6d385d)
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         { 34,
42             { 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72,
43                 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f,
44                 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65,
45                 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f,
46 
47                 0x75, 0x70 } },
48         { 32,
49             { 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33,
50                 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8,
51                 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd,
52                 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b } },
53         { 16,
54             { 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6,
55                 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9 } } },
56     /*
57      * test vectors from "The Poly1305-AES message-authentication code"
58      */
59     {
60         { 2,
61             { 0xf3, 0xf6 } },
62         { 32,
63             { 0x85, 0x1f, 0xc4, 0x0c, 0x34, 0x67, 0xac, 0x0b,
64                 0xe0, 0x5c, 0xc2, 0x04, 0x04, 0xf3, 0xf7, 0x00,
65                 0x58, 0x0b, 0x3b, 0x0f, 0x94, 0x47, 0xbb, 0x1e,
66                 0x69, 0xd0, 0x95, 0xb5, 0x92, 0x8b, 0x6d, 0xbc } },
67         { 16,
68             { 0xf4, 0xc6, 0x33, 0xc3, 0x04, 0x4f, 0xc1, 0x45,
69                 0xf8, 0x4f, 0x33, 0x5c, 0xb8, 0x19, 0x53, 0xde } } },
70     { { 0,
71           { 0 } },
72         { 32,
73             { 0xa0, 0xf3, 0x08, 0x00, 0x00, 0xf4, 0x64, 0x00,
74                 0xd0, 0xc7, 0xe9, 0x07, 0x6c, 0x83, 0x44, 0x03,
75                 0xdd, 0x3f, 0xab, 0x22, 0x51, 0xf1, 0x1a, 0xc7,
76                 0x59, 0xf0, 0x88, 0x71, 0x29, 0xcc, 0x2e, 0xe7 } },
77         { 16,
78             { 0xdd, 0x3f, 0xab, 0x22, 0x51, 0xf1, 0x1a, 0xc7,
79                 0x59, 0xf0, 0x88, 0x71, 0x29, 0xcc, 0x2e, 0xe7 } } },
80     { { 32,
81           { 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
82               0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
83               0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
84               0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36 } },
85         { 32,
86             { 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
87                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
88                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
89                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef } },
90         { 16,
91             { 0x0e, 0xe1, 0xc1, 0x6b, 0xb7, 0x3f, 0x0f, 0x4f,
92                 0xd1, 0x98, 0x81, 0x75, 0x3c, 0x01, 0xcd, 0xbe } } },
93     {
94         { 63,
95             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
96                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
97                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
98                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
99 
100                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
101                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
102                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
103                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9 } },
104         { 32,
105             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
106                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
107                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
108                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
109         { 16,
110             { 0x51, 0x54, 0xad, 0x0d, 0x2c, 0xb2, 0x6e, 0x01,
111                 0x27, 0x4f, 0xc5, 0x11, 0x48, 0x49, 0x1f, 0x1b } },
112     },
113     /*
114      * self-generated vectors exercise "significant" lengths, such that
115      * are handled by different code paths
116      */
117     {
118         { 64,
119             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
120                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
121                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
122                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
123 
124                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
125                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
126                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
127                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf } },
128         { 32,
129             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
130                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
131                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
132                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
133         { 16,
134             { 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
135                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66 } },
136     },
137     {
138         { 48,
139             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
140                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
141                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
142                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
143 
144                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
145                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67 } },
146         { 32,
147             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
148                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
149                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
150                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57
151 
152             } },
153         { 16,
154             { 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
155                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61 } },
156     },
157     {
158         { 96,
159             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
160                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
161                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
162                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
163 
164                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
165                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
166                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
167                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
168 
169                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
170                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
171                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
172                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36 } },
173         { 32,
174             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
175                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
176                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
177                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
178         { 16,
179             { 0xbb, 0xb6, 0x13, 0xb2, 0xb6, 0xd7, 0x53, 0xba,
180                 0x07, 0x39, 0x5b, 0x91, 0x6a, 0xae, 0xce, 0x15 } },
181     },
182     {
183         { 112,
184             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
185                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
186                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
187                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
188 
189                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
190                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
191                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
192                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
193 
194                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
195                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
196                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
197                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
198 
199                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
200                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24 } },
201         { 32,
202             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
203                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
204                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
205                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
206         { 16,
207             { 0xc7, 0x94, 0xd7, 0x05, 0x7d, 0x17, 0x78, 0xc4,
208                 0xbb, 0xee, 0x0a, 0x39, 0xb3, 0xd9, 0x73, 0x42 } },
209     },
210     {
211         { 128,
212             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
213                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
214                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
215                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
216 
217                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
218                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
219                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
220                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
221 
222                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
223                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
224                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
225                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
226 
227                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
228                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
229                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
230                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36 } },
231         { 32,
232             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
233                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
234                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
235                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
236         { 16,
237             { 0xff, 0xbc, 0xb9, 0xb3, 0x71, 0x42, 0x31, 0x52,
238                 0xd7, 0xfc, 0xa5, 0xad, 0x04, 0x2f, 0xba, 0xa9 } },
239     },
240     {
241         { 144,
242             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
243                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
244                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
245                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
246 
247                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
248                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
249                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
250                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
251 
252                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
253                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
254                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
255                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
256 
257                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
258                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
259                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
260                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
261 
262                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
263                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66 } },
264         { 32,
265             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
266                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
267                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
268                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
269         { 16,
270             { 0x06, 0x9e, 0xd6, 0xb8, 0xef, 0x0f, 0x20, 0x7b,
271                 0x3e, 0x24, 0x3b, 0xb1, 0x01, 0x9f, 0xe6, 0x32 } },
272     },
273     {
274         { 160,
275             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
276                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
277                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
278                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
279 
280                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
281                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
282                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
283                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
284 
285                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
286                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
287                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
288                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
289 
290                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
291                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
292                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
293                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
294 
295                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
296                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
297                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
298                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61 } },
299         { 32,
300             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
301                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
302                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
303                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
304         { 16,
305             { 0xcc, 0xa3, 0x39, 0xd9, 0xa4, 0x5f, 0xa2, 0x36,
306                 0x8c, 0x2c, 0x68, 0xb3, 0xa4, 0x17, 0x91, 0x33 } },
307     },
308     {
309         { 288,
310             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
311                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
312                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
313                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
314 
315                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
316                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
317                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
318                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
319 
320                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
321                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
322                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
323                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
324 
325                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
326                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
327                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
328                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
329 
330                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
331                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
332                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
333                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61,
334 
335                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
336                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
337                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
338                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
339 
340                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
341                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
342                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
343                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
344 
345                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
346                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
347                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
348                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
349 
350                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
351                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
352                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
353                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36 } },
354         { 32,
355             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
356                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
357                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
358                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
359         { 16,
360             { 0x53, 0xf6, 0xe8, 0x28, 0xa2, 0xf0, 0xfe, 0x0e,
361                 0xe8, 0x15, 0xbf, 0x0b, 0xd5, 0x84, 0x1a, 0x34 } },
362     },
363     {
364         { 320,
365             { 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
366                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
367                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
368                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
369 
370                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
371                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
372                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
373                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
374 
375                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
376                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
377                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
378                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
379 
380                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
381                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
382                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
383                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
384 
385                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
386                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
387                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
388                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61,
389 
390                 0xab, 0x08, 0x12, 0x72, 0x4a, 0x7f, 0x1e, 0x34,
391                 0x27, 0x42, 0xcb, 0xed, 0x37, 0x4d, 0x94, 0xd1,
392                 0x36, 0xc6, 0xb8, 0x79, 0x5d, 0x45, 0xb3, 0x81,
393                 0x98, 0x30, 0xf2, 0xc0, 0x44, 0x91, 0xfa, 0xf0,
394 
395                 0x99, 0x0c, 0x62, 0xe4, 0x8b, 0x80, 0x18, 0xb2,
396                 0xc3, 0xe4, 0xa0, 0xfa, 0x31, 0x34, 0xcb, 0x67,
397                 0xfa, 0x83, 0xe1, 0x58, 0xc9, 0x94, 0xd9, 0x61,
398                 0xc4, 0xcb, 0x21, 0x09, 0x5c, 0x1b, 0xf9, 0xaf,
399 
400                 0x48, 0x44, 0x3d, 0x0b, 0xb0, 0xd2, 0x11, 0x09,
401                 0xc8, 0x9a, 0x10, 0x0b, 0x5c, 0xe2, 0xc2, 0x08,
402                 0x83, 0x14, 0x9c, 0x69, 0xb5, 0x61, 0xdd, 0x88,
403                 0x29, 0x8a, 0x17, 0x98, 0xb1, 0x07, 0x16, 0xef,
404 
405                 0x66, 0x3c, 0xea, 0x19, 0x0f, 0xfb, 0x83, 0xd8,
406                 0x95, 0x93, 0xf3, 0xf4, 0x76, 0xb6, 0xbc, 0x24,
407                 0xd7, 0xe6, 0x79, 0x10, 0x7e, 0xa2, 0x6a, 0xdb,
408                 0x8c, 0xaf, 0x66, 0x52, 0xd0, 0x65, 0x61, 0x36,
409 
410                 0x81, 0x20, 0x59, 0xa5, 0xda, 0x19, 0x86, 0x37,
411                 0xca, 0xc7, 0xc4, 0xa6, 0x31, 0xbe, 0xe4, 0x66,
412                 0x5b, 0x88, 0xd7, 0xf6, 0x22, 0x8b, 0x11, 0xe2,
413                 0xe2, 0x85, 0x79, 0xa5, 0xc0, 0xc1, 0xf7, 0x61 } },
414         { 32,
415             { 0x12, 0x97, 0x6a, 0x08, 0xc4, 0x42, 0x6d, 0x0c,
416                 0xe8, 0xa8, 0x24, 0x07, 0xc4, 0xf4, 0x82, 0x07,
417                 0x80, 0xf8, 0xc2, 0x0a, 0xa7, 0x12, 0x02, 0xd1,
418                 0xe2, 0x91, 0x79, 0xcb, 0xcb, 0x55, 0x5a, 0x57 } },
419         { 16,
420             { 0xb8, 0x46, 0xd4, 0x4e, 0x9b, 0xbd, 0x53, 0xce,
421                 0xdf, 0xfb, 0xfb, 0xb6, 0xb7, 0xfa, 0x49, 0x33 } },
422     },
423     /*
424      * 4th power of the key spills to 131th bit in SIMD key setup
425      */
426     {
427         { 256,
428             { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
429                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
430                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
431                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
432 
433                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
434                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
435                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
436                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
437 
438                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
439                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
440                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
441                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
442 
443                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
444                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
445                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
446                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
447 
448                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
449                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
450                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
451                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
452 
453                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
454                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
455                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
456                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
457 
458                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
459                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
460                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
461                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
462 
463                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
464                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
465                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
466                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
467         { 32,
468             { 0xad, 0x62, 0x81, 0x07, 0xe8, 0x35, 0x1d, 0x0f,
469                 0x2c, 0x23, 0x1a, 0x05, 0xdc, 0x4a, 0x41, 0x06,
470                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
472         { 16,
473             { 0x07, 0x14, 0x5a, 0x4c, 0x02, 0xfe, 0x5f, 0xa3,
474                 0x20, 0x36, 0xde, 0x68, 0xfa, 0xbe, 0x90, 0x66 } },
475     },
476     /*
477      * poly1305_ieee754.c failed this in final stage
478      */
479     {
480         { 252,
481             { 0x84, 0x23, 0x64, 0xe1, 0x56, 0x33, 0x6c, 0x09,
482                 0x98, 0xb9, 0x33, 0xa6, 0x23, 0x77, 0x26, 0x18,
483                 0x0d, 0x9e, 0x3f, 0xdc, 0xbd, 0xe4, 0xcd, 0x5d,
484                 0x17, 0x08, 0x0f, 0xc3, 0xbe, 0xb4, 0x96, 0x14,
485 
486                 0xd7, 0x12, 0x2c, 0x03, 0x74, 0x63, 0xff, 0x10,
487                 0x4d, 0x73, 0xf1, 0x9c, 0x12, 0x70, 0x46, 0x28,
488                 0xd4, 0x17, 0xc4, 0xc5, 0x4a, 0x3f, 0xe3, 0x0d,
489                 0x3c, 0x3d, 0x77, 0x14, 0x38, 0x2d, 0x43, 0xb0,
490 
491                 0x38, 0x2a, 0x50, 0xa5, 0xde, 0xe5, 0x4b, 0xe8,
492                 0x44, 0xb0, 0x76, 0xe8, 0xdf, 0x88, 0x20, 0x1a,
493                 0x1c, 0xd4, 0x3b, 0x90, 0xeb, 0x21, 0x64, 0x3f,
494                 0xa9, 0x6f, 0x39, 0xb5, 0x18, 0xaa, 0x83, 0x40,
495 
496                 0xc9, 0x42, 0xff, 0x3c, 0x31, 0xba, 0xf7, 0xc9,
497                 0xbd, 0xbf, 0x0f, 0x31, 0xae, 0x3f, 0xa0, 0x96,
498                 0xbf, 0x8c, 0x63, 0x03, 0x06, 0x09, 0x82, 0x9f,
499                 0xe7, 0x2e, 0x17, 0x98, 0x24, 0x89, 0x0b, 0xc8,
500 
501                 0xe0, 0x8c, 0x31, 0x5c, 0x1c, 0xce, 0x2a, 0x83,
502                 0x14, 0x4d, 0xbb, 0xff, 0x09, 0xf7, 0x4e, 0x3e,
503                 0xfc, 0x77, 0x0b, 0x54, 0xd0, 0x98, 0x4a, 0x8f,
504                 0x19, 0xb1, 0x47, 0x19, 0xe6, 0x36, 0x35, 0x64,
505 
506                 0x1d, 0x6b, 0x1e, 0xed, 0xf6, 0x3e, 0xfb, 0xf0,
507                 0x80, 0xe1, 0x78, 0x3d, 0x32, 0x44, 0x54, 0x12,
508                 0x11, 0x4c, 0x20, 0xde, 0x0b, 0x83, 0x7a, 0x0d,
509                 0xfa, 0x33, 0xd6, 0xb8, 0x28, 0x25, 0xff, 0xf4,
510 
511                 0x4c, 0x9a, 0x70, 0xea, 0x54, 0xce, 0x47, 0xf0,
512                 0x7d, 0xf6, 0x98, 0xe6, 0xb0, 0x33, 0x23, 0xb5,
513                 0x30, 0x79, 0x36, 0x4a, 0x5f, 0xc3, 0xe9, 0xdd,
514                 0x03, 0x43, 0x92, 0xbd, 0xde, 0x86, 0xdc, 0xcd,
515 
516                 0xda, 0x94, 0x32, 0x1c, 0x5e, 0x44, 0x06, 0x04,
517                 0x89, 0x33, 0x6c, 0xb6, 0x5b, 0xf3, 0x98, 0x9c,
518                 0x36, 0xf7, 0x28, 0x2c, 0x2f, 0x5d, 0x2b, 0x88,
519                 0x2c, 0x17, 0x1e, 0x74 } },
520         { 32,
521             { 0x95, 0xd5, 0xc0, 0x05, 0x50, 0x3e, 0x51, 0x0d,
522                 0x8c, 0xd0, 0xaa, 0x07, 0x2c, 0x4a, 0x4d, 0x06,
523                 0x6e, 0xab, 0xc5, 0x2d, 0x11, 0x65, 0x3d, 0xf4,
524                 0x7f, 0xbf, 0x63, 0xab, 0x19, 0x8b, 0xcc, 0x26 } },
525         { 16,
526             { 0xf2, 0x48, 0x31, 0x2e, 0x57, 0x8d, 0x9d, 0x58,
527                 0xf8, 0xb7, 0xbb, 0x4d, 0x19, 0x10, 0x54, 0x31 } },
528     },
529     /*
530      * AVX2 in poly1305-x86.pl failed this with 176+32 split
531      */
532     {
533         { 208,
534             { 0x24, 0x8a, 0xc3, 0x10, 0x85, 0xb6, 0xc2, 0xad,
535                 0xaa, 0xa3, 0x82, 0x59, 0xa0, 0xd7, 0x19, 0x2c,
536                 0x5c, 0x35, 0xd1, 0xbb, 0x4e, 0xf3, 0x9a, 0xd9,
537                 0x4c, 0x38, 0xd1, 0xc8, 0x24, 0x79, 0xe2, 0xdd,
538 
539                 0x21, 0x59, 0xa0, 0x77, 0x02, 0x4b, 0x05, 0x89,
540                 0xbc, 0x8a, 0x20, 0x10, 0x1b, 0x50, 0x6f, 0x0a,
541                 0x1a, 0xd0, 0xbb, 0xab, 0x76, 0xe8, 0x3a, 0x83,
542                 0xf1, 0xb9, 0x4b, 0xe6, 0xbe, 0xae, 0x74, 0xe8,
543 
544                 0x74, 0xca, 0xb6, 0x92, 0xc5, 0x96, 0x3a, 0x75,
545                 0x43, 0x6b, 0x77, 0x61, 0x21, 0xec, 0x9f, 0x62,
546                 0x39, 0x9a, 0x3e, 0x66, 0xb2, 0xd2, 0x27, 0x07,
547                 0xda, 0xe8, 0x19, 0x33, 0xb6, 0x27, 0x7f, 0x3c,
548 
549                 0x85, 0x16, 0xbc, 0xbe, 0x26, 0xdb, 0xbd, 0x86,
550                 0xf3, 0x73, 0x10, 0x3d, 0x7c, 0xf4, 0xca, 0xd1,
551                 0x88, 0x8c, 0x95, 0x21, 0x18, 0xfb, 0xfb, 0xd0,
552                 0xd7, 0xb4, 0xbe, 0xdc, 0x4a, 0xe4, 0x93, 0x6a,
553 
554                 0xff, 0x91, 0x15, 0x7e, 0x7a, 0xa4, 0x7c, 0x54,
555                 0x44, 0x2e, 0xa7, 0x8d, 0x6a, 0xc2, 0x51, 0xd3,
556                 0x24, 0xa0, 0xfb, 0xe4, 0x9d, 0x89, 0xcc, 0x35,
557                 0x21, 0xb6, 0x6d, 0x16, 0xe9, 0xc6, 0x6a, 0x37,
558 
559                 0x09, 0x89, 0x4e, 0x4e, 0xb0, 0xa4, 0xee, 0xdc,
560                 0x4a, 0xe1, 0x94, 0x68, 0xe6, 0x6b, 0x81, 0xf2,
561 
562                 0x71, 0x35, 0x1b, 0x1d, 0x92, 0x1e, 0xa5, 0x51,
563                 0x04, 0x7a, 0xbc, 0xc6, 0xb8, 0x7a, 0x90, 0x1f,
564                 0xde, 0x7d, 0xb7, 0x9f, 0xa1, 0x81, 0x8c, 0x11,
565                 0x33, 0x6d, 0xbc, 0x07, 0x24, 0x4a, 0x40, 0xeb } },
566         { 32,
567             { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
568                 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
569                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
570                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
571         { 16,
572             { 0xbc, 0x93, 0x9b, 0xc5, 0x28, 0x14, 0x80, 0xfa,
573                 0x99, 0xc6, 0xd6, 0x8c, 0x25, 0x8e, 0xc4, 0x2f } },
574     },
575     /*
576      * test vectors from Google
577      */
578     {
579         { 0,
580             {
581                 0x00,
582             } },
583         { 32,
584             { 0xc8, 0xaf, 0xaa, 0xc3, 0x31, 0xee, 0x37, 0x2c,
585                 0xd6, 0x08, 0x2d, 0xe1, 0x34, 0x94, 0x3b, 0x17,
586                 0x47, 0x10, 0x13, 0x0e, 0x9f, 0x6f, 0xea, 0x8d,
587                 0x72, 0x29, 0x38, 0x50, 0xa6, 0x67, 0xd8, 0x6c } },
588         { 16,
589             { 0x47, 0x10, 0x13, 0x0e, 0x9f, 0x6f, 0xea, 0x8d,
590                 0x72, 0x29, 0x38, 0x50, 0xa6, 0x67, 0xd8, 0x6c } },
591     },
592     {
593         { 12,
594             { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f,
595                 0x72, 0x6c, 0x64, 0x21 } },
596         { 32,
597             { 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
598                 0x33, 0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20,
599                 0x6b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20,
600                 0x50, 0x6f, 0x6c, 0x79, 0x31, 0x33, 0x30, 0x35 } },
601         { 16,
602             { 0xa6, 0xf7, 0x45, 0x00, 0x8f, 0x81, 0xc9, 0x16,
603                 0xa2, 0x0d, 0xcc, 0x74, 0xee, 0xf2, 0xb2, 0xf0 } },
604     },
605     {
606         { 32,
607             { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
611         { 32,
612             { 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
613                 0x33, 0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20,
614                 0x6b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20,
615                 0x50, 0x6f, 0x6c, 0x79, 0x31, 0x33, 0x30, 0x35 } },
616         { 16,
617             { 0x49, 0xec, 0x78, 0x09, 0x0e, 0x48, 0x1e, 0xc6,
618                 0xc2, 0x6b, 0x33, 0xb9, 0x1c, 0xcc, 0x03, 0x07 } },
619     },
620     {
621         { 128,
622             { 0x89, 0xda, 0xb8, 0x0b, 0x77, 0x17, 0xc1, 0xdb,
623                 0x5d, 0xb4, 0x37, 0x86, 0x0a, 0x3f, 0x70, 0x21,
624                 0x8e, 0x93, 0xe1, 0xb8, 0xf4, 0x61, 0xfb, 0x67,
625                 0x7f, 0x16, 0xf3, 0x5f, 0x6f, 0x87, 0xe2, 0xa9,
626 
627                 0x1c, 0x99, 0xbc, 0x3a, 0x47, 0xac, 0xe4, 0x76,
628                 0x40, 0xcc, 0x95, 0xc3, 0x45, 0xbe, 0x5e, 0xcc,
629                 0xa5, 0xa3, 0x52, 0x3c, 0x35, 0xcc, 0x01, 0x89,
630                 0x3a, 0xf0, 0xb6, 0x4a, 0x62, 0x03, 0x34, 0x27,
631 
632                 0x03, 0x72, 0xec, 0x12, 0x48, 0x2d, 0x1b, 0x1e,
633                 0x36, 0x35, 0x61, 0x69, 0x8a, 0x57, 0x8b, 0x35,
634                 0x98, 0x03, 0x49, 0x5b, 0xb4, 0xe2, 0xef, 0x19,
635                 0x30, 0xb1, 0x7a, 0x51, 0x90, 0xb5, 0x80, 0xf1,
636 
637                 0x41, 0x30, 0x0d, 0xf3, 0x0a, 0xdb, 0xec, 0xa2,
638                 0x8f, 0x64, 0x27, 0xa8, 0xbc, 0x1a, 0x99, 0x9f,
639                 0xd5, 0x1c, 0x55, 0x4a, 0x01, 0x7d, 0x09, 0x5d,
640                 0x8c, 0x3e, 0x31, 0x27, 0xda, 0xf9, 0xf5, 0x95 } },
641         { 32,
642             { 0x2d, 0x77, 0x3b, 0xe3, 0x7a, 0xdb, 0x1e, 0x4d,
643                 0x68, 0x3b, 0xf0, 0x07, 0x5e, 0x79, 0xc4, 0xee,
644                 0x03, 0x79, 0x18, 0x53, 0x5a, 0x7f, 0x99, 0xcc,
645                 0xb7, 0x04, 0x0f, 0xb5, 0xf5, 0xf4, 0x3a, 0xea } },
646         { 16,
647             { 0xc8, 0x5d, 0x15, 0xed, 0x44, 0xc3, 0x78, 0xd6,
648                 0xb0, 0x0e, 0x23, 0x06, 0x4c, 0x7b, 0xcd, 0x51 } },
649     },
650     {
651         { 528,
652             { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
653                 0x17, 0x03, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00,
654 
655                 0x06, 0xdb, 0x1f, 0x1f, 0x36, 0x8d, 0x69, 0x6a,
656                 0x81, 0x0a, 0x34, 0x9c, 0x0c, 0x71, 0x4c, 0x9a,
657                 0x5e, 0x78, 0x50, 0xc2, 0x40, 0x7d, 0x72, 0x1a,
658                 0xcd, 0xed, 0x95, 0xe0, 0x18, 0xd7, 0xa8, 0x52,
659 
660                 0x66, 0xa6, 0xe1, 0x28, 0x9c, 0xdb, 0x4a, 0xeb,
661                 0x18, 0xda, 0x5a, 0xc8, 0xa2, 0xb0, 0x02, 0x6d,
662                 0x24, 0xa5, 0x9a, 0xd4, 0x85, 0x22, 0x7f, 0x3e,
663                 0xae, 0xdb, 0xb2, 0xe7, 0xe3, 0x5e, 0x1c, 0x66,
664 
665                 0xcd, 0x60, 0xf9, 0xab, 0xf7, 0x16, 0xdc, 0xc9,
666                 0xac, 0x42, 0x68, 0x2d, 0xd7, 0xda, 0xb2, 0x87,
667                 0xa7, 0x02, 0x4c, 0x4e, 0xef, 0xc3, 0x21, 0xcc,
668                 0x05, 0x74, 0xe1, 0x67, 0x93, 0xe3, 0x7c, 0xec,
669 
670                 0x03, 0xc5, 0xbd, 0xa4, 0x2b, 0x54, 0xc1, 0x14,
671                 0xa8, 0x0b, 0x57, 0xaf, 0x26, 0x41, 0x6c, 0x7b,
672                 0xe7, 0x42, 0x00, 0x5e, 0x20, 0x85, 0x5c, 0x73,
673                 0xe2, 0x1d, 0xc8, 0xe2, 0xed, 0xc9, 0xd4, 0x35,
674 
675                 0xcb, 0x6f, 0x60, 0x59, 0x28, 0x00, 0x11, 0xc2,
676                 0x70, 0xb7, 0x15, 0x70, 0x05, 0x1c, 0x1c, 0x9b,
677                 0x30, 0x52, 0x12, 0x66, 0x20, 0xbc, 0x1e, 0x27,
678                 0x30, 0xfa, 0x06, 0x6c, 0x7a, 0x50, 0x9d, 0x53,
679 
680                 0xc6, 0x0e, 0x5a, 0xe1, 0xb4, 0x0a, 0xa6, 0xe3,
681                 0x9e, 0x49, 0x66, 0x92, 0x28, 0xc9, 0x0e, 0xec,
682                 0xb4, 0xa5, 0x0d, 0xb3, 0x2a, 0x50, 0xbc, 0x49,
683                 0xe9, 0x0b, 0x4f, 0x4b, 0x35, 0x9a, 0x1d, 0xfd,
684 
685                 0x11, 0x74, 0x9c, 0xd3, 0x86, 0x7f, 0xcf, 0x2f,
686                 0xb7, 0xbb, 0x6c, 0xd4, 0x73, 0x8f, 0x6a, 0x4a,
687                 0xd6, 0xf7, 0xca, 0x50, 0x58, 0xf7, 0x61, 0x88,
688                 0x45, 0xaf, 0x9f, 0x02, 0x0f, 0x6c, 0x3b, 0x96,
689 
690                 0x7b, 0x8f, 0x4c, 0xd4, 0xa9, 0x1e, 0x28, 0x13,
691                 0xb5, 0x07, 0xae, 0x66, 0xf2, 0xd3, 0x5c, 0x18,
692                 0x28, 0x4f, 0x72, 0x92, 0x18, 0x60, 0x62, 0xe1,
693                 0x0f, 0xd5, 0x51, 0x0d, 0x18, 0x77, 0x53, 0x51,
694 
695                 0xef, 0x33, 0x4e, 0x76, 0x34, 0xab, 0x47, 0x43,
696                 0xf5, 0xb6, 0x8f, 0x49, 0xad, 0xca, 0xb3, 0x84,
697                 0xd3, 0xfd, 0x75, 0xf7, 0x39, 0x0f, 0x40, 0x06,
698                 0xef, 0x2a, 0x29, 0x5c, 0x8c, 0x7a, 0x07, 0x6a,
699 
700                 0xd5, 0x45, 0x46, 0xcd, 0x25, 0xd2, 0x10, 0x7f,
701                 0xbe, 0x14, 0x36, 0xc8, 0x40, 0x92, 0x4a, 0xae,
702                 0xbe, 0x5b, 0x37, 0x08, 0x93, 0xcd, 0x63, 0xd1,
703                 0x32, 0x5b, 0x86, 0x16, 0xfc, 0x48, 0x10, 0x88,
704 
705                 0x6b, 0xc1, 0x52, 0xc5, 0x32, 0x21, 0xb6, 0xdf,
706                 0x37, 0x31, 0x19, 0x39, 0x32, 0x55, 0xee, 0x72,
707                 0xbc, 0xaa, 0x88, 0x01, 0x74, 0xf1, 0x71, 0x7f,
708                 0x91, 0x84, 0xfa, 0x91, 0x64, 0x6f, 0x17, 0xa2,
709 
710                 0x4a, 0xc5, 0x5d, 0x16, 0xbf, 0xdd, 0xca, 0x95,
711                 0x81, 0xa9, 0x2e, 0xda, 0x47, 0x92, 0x01, 0xf0,
712                 0xed, 0xbf, 0x63, 0x36, 0x00, 0xd6, 0x06, 0x6d,
713                 0x1a, 0xb3, 0x6d, 0x5d, 0x24, 0x15, 0xd7, 0x13,
714 
715                 0x51, 0xbb, 0xcd, 0x60, 0x8a, 0x25, 0x10, 0x8d,
716                 0x25, 0x64, 0x19, 0x92, 0xc1, 0xf2, 0x6c, 0x53,
717                 0x1c, 0xf9, 0xf9, 0x02, 0x03, 0xbc, 0x4c, 0xc1,
718                 0x9f, 0x59, 0x27, 0xd8, 0x34, 0xb0, 0xa4, 0x71,
719 
720                 0x16, 0xd3, 0x88, 0x4b, 0xbb, 0x16, 0x4b, 0x8e,
721                 0xc8, 0x83, 0xd1, 0xac, 0x83, 0x2e, 0x56, 0xb3,
722                 0x91, 0x8a, 0x98, 0x60, 0x1a, 0x08, 0xd1, 0x71,
723                 0x88, 0x15, 0x41, 0xd5, 0x94, 0xdb, 0x39, 0x9c,
724 
725                 0x6a, 0xe6, 0x15, 0x12, 0x21, 0x74, 0x5a, 0xec,
726                 0x81, 0x4c, 0x45, 0xb0, 0xb0, 0x5b, 0x56, 0x54,
727                 0x36, 0xfd, 0x6f, 0x13, 0x7a, 0xa1, 0x0a, 0x0c,
728                 0x0b, 0x64, 0x37, 0x61, 0xdb, 0xd6, 0xf9, 0xa9,
729 
730                 0xdc, 0xb9, 0x9b, 0x1a, 0x6e, 0x69, 0x08, 0x54,
731                 0xce, 0x07, 0x69, 0xcd, 0xe3, 0x97, 0x61, 0xd8,
732                 0x2f, 0xcd, 0xec, 0x15, 0xf0, 0xd9, 0x2d, 0x7d,
733                 0x8e, 0x94, 0xad, 0xe8, 0xeb, 0x83, 0xfb, 0xe0 } },
734         { 32,
735             { 0x99, 0xe5, 0x82, 0x2d, 0xd4, 0x17, 0x3c, 0x99,
736                 0x5e, 0x3d, 0xae, 0x0d, 0xde, 0xfb, 0x97, 0x74,
737                 0x3f, 0xde, 0x3b, 0x08, 0x01, 0x34, 0xb3, 0x9f,
738                 0x76, 0xe9, 0xbf, 0x8d, 0x0e, 0x88, 0xd5, 0x46 } },
739         { 16,
740             { 0x26, 0x37, 0x40, 0x8f, 0xe1, 0x30, 0x86, 0xea,
741                 0x73, 0xf9, 0x71, 0xe3, 0x42, 0x5e, 0x28, 0x20 } },
742     },
743     /*
744      * test vectors from Hanno Böck
745      */
746     {
747         { 257,
748             { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
749                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
750                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
751                 0xcc, 0x80, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
752 
753                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
754                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
755                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
756                 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xcc, 0xcc, 0xcc,
757 
758                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
759                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5,
760                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
761                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
762 
763                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe3, 0xcc, 0xcc,
764                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
765                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
766                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
767 
768                 0xcc, 0xcc, 0xcc, 0xcc, 0xac, 0xcc, 0xcc, 0xcc,
769                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6,
770                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00,
771                 0xaf, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
772 
773                 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00,
774                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777 
778                 0x00, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00,
779                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 
783                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786                 0x00, 0x00, 0x71, 0x92, 0x05, 0xa8, 0x52, 0x1d,
787 
788                 0xfc } },
789         { 32,
790             { 0x7f, 0x1b, 0x02, 0x64, 0x00, 0x00, 0x00, 0x00,
791                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
792                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
793                 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc } },
794         { 16,
795             { 0x85, 0x59, 0xb8, 0x76, 0xec, 0xee, 0xd6, 0x6e,
796                 0xb3, 0x77, 0x98, 0xc0, 0x45, 0x7b, 0xaf, 0xf9 } },
797     },
798     {
799         { 39,
800             { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
801                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
802                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
803                 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00,
804 
805                 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x64 } },
806         { 32,
807             { 0xe0, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
808                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809                 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
810                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa } },
811         { 16,
812             { 0x00, 0xbd, 0x12, 0x58, 0x97, 0x8e, 0x20, 0x54,
813                 0x44, 0xc9, 0xaa, 0xaa, 0x82, 0x00, 0x6f, 0xed } },
814     },
815     {
816         { 2,
817             { 0x02, 0xfc } },
818         { 32,
819             { 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
820                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
821                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
822                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c } },
823         { 16,
824             { 0x06, 0x12, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
825                 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c } },
826     },
827     {
828         { 415,
829             { 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
830                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
831                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
832                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
833 
834                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7a, 0x7b,
835                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
836                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
837                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
838 
839                 0x7b, 0x7b, 0x5c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
840                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
841                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
842                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
843 
844                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
845                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
846                 0x7b, 0x7b, 0x7b, 0x7b, 0x6e, 0x7b, 0x00, 0x7b,
847                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
848 
849                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
850                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
851                 0x7b, 0x7b, 0x7b, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b,
852                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
853 
854                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
855                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x5c,
856                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
857                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
858 
859                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
860                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
861                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
862                 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
863 
864                 0x7b, 0x6e, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x00,
865                 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
866                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
867                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 
869                 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871                 0x00, 0x00, 0x00, 0x20, 0x00, 0xef, 0xff, 0x00,
872                 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 
874                 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
875                 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x64, 0x00,
876                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877                 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
878 
879                 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2,
882                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883 
884                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885                 0x00, 0x00, 0x20, 0x00, 0xef, 0xff, 0x00, 0x09,
886                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
887                 0x00, 0x7a, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
888 
889                 0x00, 0x09, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00,
890                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
891                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
892                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc } },
893         { 32,
894             { 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
895                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
896                 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
897                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x7b } },
898         { 16,
899             { 0x33, 0x20, 0x5b, 0xbf, 0x9e, 0x9f, 0x8f, 0x72,
900                 0x12, 0xab, 0x9e, 0x2a, 0xb9, 0xb7, 0xe4, 0xa5 } },
901     },
902     {
903         { 118,
904             { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
905                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
906                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
907                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
908 
909                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
910                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
911                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
912                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
913 
914                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
915                 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xe9,
916                 0xe9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
917                 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0xac, 0xac,
918 
919                 0xec, 0x01, 0x00, 0xac, 0xac, 0xac, 0x2c, 0xac,
920                 0xa2, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,
921                 0xac, 0xac, 0xac, 0xac, 0x64, 0xf2 } },
922         { 32,
923             { 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7f,
924                 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
925                 0x00, 0x00, 0xcf, 0x77, 0x77, 0x77, 0x77, 0x77,
926                 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 } },
927         { 16,
928             { 0x02, 0xee, 0x7c, 0x8c, 0x54, 0x6d, 0xde, 0xb1,
929                 0xa4, 0x67, 0xe4, 0xc3, 0x98, 0x11, 0x58, 0xb9 } },
930     },
931     /*
932      * test vectors from Andrew Moon
933      */
934     {
935         /* nacl */
936         {
937             131,
938             { 0x8e, 0x99, 0x3b, 0x9f, 0x48, 0x68, 0x12, 0x73,
939                 0xc2, 0x96, 0x50, 0xba, 0x32, 0xfc, 0x76, 0xce,
940                 0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4,
941                 0x47, 0x6f, 0xb8, 0xc5, 0x31, 0xa1, 0x18, 0x6a,
942 
943                 0xc0, 0xdf, 0xc1, 0x7c, 0x98, 0xdc, 0xe8, 0x7b,
944                 0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72,
945                 0x71, 0xd2, 0xc2, 0x0f, 0x9b, 0x92, 0x8f, 0xe2,
946                 0x27, 0x0d, 0x6f, 0xb8, 0x63, 0xd5, 0x17, 0x38,
947 
948                 0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a,
949                 0xb9, 0x32, 0x16, 0x45, 0x48, 0xe5, 0x26, 0xae,
950                 0x90, 0x22, 0x43, 0x68, 0x51, 0x7a, 0xcf, 0xea,
951                 0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda,
952 
953                 0x99, 0x83, 0x2b, 0x61, 0xca, 0x01, 0xb6, 0xde,
954                 0x56, 0x24, 0x4a, 0x9e, 0x88, 0xd5, 0xf9, 0xb3,
955                 0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6,
956                 0x59, 0x9b, 0x1f, 0x65, 0x4c, 0xb4, 0x5a, 0x74,
957 
958                 0xe3, 0x55, 0xa5 } },
959         { 32,
960             { 0xee, 0xa6, 0xa7, 0x25, 0x1c, 0x1e, 0x72, 0x91,
961                 0x6d, 0x11, 0xc2, 0xcb, 0x21, 0x4d, 0x3c, 0x25,
962                 0x25, 0x39, 0x12, 0x1d, 0x8e, 0x23, 0x4e, 0x65,
963                 0x2d, 0x65, 0x1f, 0xa4, 0xc8, 0xcf, 0xf8, 0x80 } },
964         { 16,
965             { 0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5,
966                 0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9 } },
967     },
968     {
969         /* wrap 2^130-5 */
970         {
971             16,
972             { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
973                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
974         { 32,
975             { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
977                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
979         { 16,
980             { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
982     },
983     {
984         /* wrap 2^128 */
985         {
986             16,
987             { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
989         { 32,
990             { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
991                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
992                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
993                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
994         { 16,
995             { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
997     },
998     {
999         /* limb carry */
1000         {
1001             48,
1002             { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1003                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1004                 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1005                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1006 
1007                 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1009         { 32,
1010             { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1011                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1013                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1014         { 16,
1015             { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1016                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1017     },
1018     {
1019         /* 2^130-5 */
1020         {
1021             48,
1022             { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1023                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1024                 0xfb, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
1025                 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
1026 
1027                 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1028                 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 } },
1029         { 32,
1030             { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1032                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1034         { 16,
1035             { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1036                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1037 
1038             } },
1039     },
1040     {
1041         /* 2^130-6 */
1042         {
1043             16,
1044             { 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1045                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
1046         { 32,
1047             { 0x02, 0x00, 0x00, 0x00, 0x00, 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         { 16,
1052             { 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1053                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
1054     },
1055     {
1056         /* 5*H+L reduction intermediate */
1057         {
1058             64,
1059             { 0xe3, 0x35, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0xb9,
1060                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1061                 0x33, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0x79, 0xcd,
1062                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 
1064                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1066                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1067                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1068         { 32,
1069             { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070                 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1072                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1073         { 16,
1074             { 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075                 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1076     },
1077     { /* 5*H+L reduction final */
1078         {
1079             48,
1080             { 0xe3, 0x35, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0xb9,
1081                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082                 0x33, 0x94, 0xd7, 0x50, 0x5e, 0x43, 0x79, 0xcd,
1083                 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084 
1085                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1087 
1088             } },
1089         { 32,
1090             { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091                 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
1094         { 16,
1095             { 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }
1097 };
1098 
test_poly1305(int idx)1099 static int test_poly1305(int idx)
1100 {
1101     POLY1305 poly1305;
1102     const TESTDATA test = tests[idx];
1103     const unsigned char *in = test.input.data;
1104     size_t inlen = test.input.size;
1105     const unsigned char *key = test.key.data;
1106     const unsigned char *expected = test.expected.data;
1107     size_t expectedlen = test.expected.size;
1108     unsigned char out[16];
1109 
1110     if (!TEST_size_t_eq(expectedlen, sizeof(out)))
1111         return 0;
1112 
1113     Poly1305_Init(&poly1305, key);
1114     Poly1305_Update(&poly1305, in, inlen);
1115     Poly1305_Final(&poly1305, out);
1116 
1117     if (!TEST_mem_eq(out, expectedlen, expected, expectedlen)) {
1118         TEST_info("Poly1305 test #%d failed.", idx);
1119         return 0;
1120     }
1121 
1122     if (inlen > 16) {
1123         Poly1305_Init(&poly1305, key);
1124         Poly1305_Update(&poly1305, in, 1);
1125         Poly1305_Update(&poly1305, in + 1, inlen - 1);
1126         Poly1305_Final(&poly1305, out);
1127 
1128         if (!TEST_mem_eq(out, expectedlen, expected, expectedlen)) {
1129             TEST_info("Poly1305 test #%d/1+(N-1) failed.", idx);
1130             return 0;
1131         }
1132     }
1133 
1134     if (inlen > 32) {
1135         size_t half = inlen / 2;
1136 
1137         Poly1305_Init(&poly1305, key);
1138         Poly1305_Update(&poly1305, in, half);
1139         Poly1305_Update(&poly1305, in + half, inlen - half);
1140         Poly1305_Final(&poly1305, out);
1141 
1142         if (!TEST_mem_eq(out, expectedlen, expected, expectedlen)) {
1143             TEST_info("Poly1305 test #%d/2 failed.", idx);
1144             return 0;
1145         }
1146 
1147         for (half = 16; half < inlen; half += 16) {
1148             Poly1305_Init(&poly1305, key);
1149             Poly1305_Update(&poly1305, in, half);
1150             Poly1305_Update(&poly1305, in + half, inlen - half);
1151             Poly1305_Final(&poly1305, out);
1152 
1153             if (!TEST_mem_eq(out, expectedlen, expected, expectedlen)) {
1154                 TEST_info("Poly1305 test #%d/%zu+%zu failed.",
1155                     idx, half, inlen - half);
1156                 return 0;
1157             }
1158         }
1159     }
1160 
1161     return 1;
1162 }
1163 
setup_tests(void)1164 int setup_tests(void)
1165 {
1166     ADD_ALL_TESTS(test_poly1305, OSSL_NELEM(tests));
1167     return 1;
1168 }
1169