1 /*	$OpenBSD: gcm128test.c,v 1.7 2022/09/05 21:06:31 tb Exp $	*/
2 /* ====================================================================
3  * Copyright (c) 2010 The OpenSSL Project.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in
14  *    the documentation and/or other materials provided with the
15  *    distribution.
16  *
17  * 3. All advertising materials mentioning features or use of this
18  *    software must display the following acknowledgment:
19  *    "This product includes software developed by the OpenSSL Project
20  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21  *
22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23  *    endorse or promote products derived from this software without
24  *    prior written permission. For written permission, please contact
25  *    openssl-core@openssl.org.
26  *
27  * 5. Products derived from this software may not be called "OpenSSL"
28  *    nor may "OpenSSL" appear in their names without prior written
29  *    permission of the OpenSSL Project.
30  *
31  * 6. Redistributions of any form whatsoever must retain the following
32  *    acknowledgment:
33  *    "This product includes software developed by the OpenSSL Project
34  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47  * OF THE POSSIBILITY OF SUCH DAMAGE.
48  * ====================================================================
49  */
50 
51 #include <err.h>
52 #include <stdio.h>
53 #include <stdint.h>
54 #include <stdlib.h>
55 #include <string.h>
56 
57 #include <openssl/aes.h>
58 #include <openssl/modes.h>
59 
60 /* XXX - something like this should be in the public headers. */
61 struct gcm128_context {
62 	uint64_t opaque[64];
63 };
64 
65 struct gcm128_test {
66 	const uint8_t K[128];
67 	size_t K_len;
68 	const uint8_t IV[128];
69 	size_t IV_len;
70 	const uint8_t P[512];
71 	size_t P_len;
72 	const uint8_t A[128];
73 	size_t A_len;
74 	const uint8_t C[512];
75 	size_t C_len;
76 	const uint8_t T[16];
77 };
78 
79 struct gcm128_test gcm128_tests[] = {
80 	{
81 		/* Test Case 1. */
82 		.K = {0},
83 		.K_len = 16,
84 		.IV = {0},
85 		.IV_len = 12,
86 		.P = {0},
87 		.P_len = 0,
88 		.A = {0},
89 		.A_len = 0,
90 		.C = {0},
91 		.C_len = 0,
92 		.T = {
93 			0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61,
94 			0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a,
95 		},
96 	},
97 	{
98 		/* Test Case 2. */
99 		.K = {0},
100 		.K_len = 16,
101 		.IV = {0},
102 		.IV_len = 12,
103 		.P = {0},
104 		.P_len = 16,
105 		.A = {0},
106 		.A_len = 0,
107 		.C = {
108 			0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92,
109 			0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78,
110 		},
111 		.C_len = 16,
112 		.T = {
113 			0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd,
114 			0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf,
115 		},
116 	},
117 	{
118 		/* Test Case 3. */
119 		.K = {
120 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
121 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
122 		},
123 		.K_len = 16,
124 		.IV = {
125 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
126 			0xde, 0xca, 0xf8, 0x88,
127 		},
128 		.IV_len = 12,
129 		.P = {
130 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
131 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
132 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
133 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
134 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
135 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
136 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
137 			0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55,
138 		},
139 		.P_len = 64,
140 		.A = {0},
141 		.A_len = 0,
142 		.C = {
143 			0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
144 			0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
145 			0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
146 			0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
147 			0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
148 			0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
149 			0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
150 			0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85,
151 		},
152 		.C_len = 64,
153 		.T = {
154 			0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6,
155 			0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4,
156 		}
157 	},
158 	{
159 		/* Test Case 4. */
160 		.K = {
161 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
162 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
163 		},
164 		.K_len = 16,
165 		.IV = {
166 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
167 			0xde, 0xca, 0xf8, 0x88,
168 		},
169 		.IV_len = 12,
170 		.P = {
171 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
172 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
173 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
174 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
175 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
176 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
177 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
178 			0xba, 0x63, 0x7b, 0x39,
179 		},
180 		.P_len = 60,
181 		.A = {
182 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
183 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
184 			0xab, 0xad, 0xda, 0xd2,
185 		},
186 		.A_len = 20,
187 		.C = {
188 			0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
189 			0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
190 			0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
191 			0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
192 			0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
193 			0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
194 			0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
195 			0x3d, 0x58, 0xe0, 0x91,
196 		},
197 		.C_len = 60,
198 		.T = {
199 			0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb,
200 			0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47,
201 		},
202 	},
203 	{
204 		/* Test Case 5. */
205 		/* K, P, A are the same as TC4. */
206 		.K = {
207 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
208 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
209 		},
210 		.K_len = 16,
211 		.IV = {
212 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
213 		},
214 		.IV_len = 8,
215 		.P = {
216 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
217 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
218 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
219 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
220 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
221 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
222 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
223 			0xba, 0x63, 0x7b, 0x39,
224 		},
225 		.P_len = 60,
226 		.A = {
227 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
228 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
229 			0xab, 0xad, 0xda, 0xd2,
230 		},
231 		.A_len = 20,
232 		.C = {
233 			0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a,
234 			0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55,
235 			0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8,
236 			0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23,
237 			0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2,
238 			0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42,
239 			0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07,
240 			0xc2, 0x3f, 0x45, 0x98,
241 		},
242 		.C_len = 60,
243 		.T = {
244 			0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85,
245 			0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb,
246 		},
247 	},
248 	{
249 		/* Test Case 6. */
250 		/* K, P, A are the same as TC4. */
251 		.K = {
252 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
253 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
254 		},
255 		.K_len = 16,
256 		.IV = {
257 			0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
258 			0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
259 			0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
260 			0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
261 			0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
262 			0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
263 			0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
264 			0xa6, 0x37, 0xb3, 0x9b,
265 		},
266 		.IV_len = 60,
267 		.P = {
268 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
269 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
270 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
271 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
272 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
273 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
274 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
275 			0xba, 0x63, 0x7b, 0x39,
276 		},
277 		.P_len = 60,
278 		.A = {
279 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
280 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
281 			0xab, 0xad, 0xda, 0xd2,
282 		},
283 		.A_len = 20,
284 		.C = {
285 			0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6,
286 			0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94,
287 			0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8,
288 			0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7,
289 			0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90,
290 			0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f,
291 			0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03,
292 			0x4c, 0x34, 0xae, 0xe5,
293 		},
294 		.C_len = 60,
295 		.T = {
296 			0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa,
297 			0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50,
298 		},
299 	},
300 	{
301 		/* Test Case 7. */
302 		.K = {0},
303 		.K_len = 24,
304 		.IV = {0},
305 		.IV_len = 12,
306 		.P = {0},
307 		.P_len = 0,
308 		.A = {0},
309 		.A_len = 0,
310 		.C = {0},
311 		.C_len = 0,
312 		.T = {
313 			0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b,
314 			0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35,
315 		},
316 	},
317 	{
318 		/* Test Case 8. */
319 		.K = {0},
320 		.K_len = 24,
321 		.IV = {0},
322 		.IV_len = 12,
323 		.P = {0},
324 		.P_len = 16,
325 		.A = {0},
326 		.A_len = 0,
327 		.C = {
328 			0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41,
329 			0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00,
330 		},
331 		.C_len = 16,
332 		.T = {
333 			0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab,
334 			0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb,
335 		},
336 	},
337 	{
338 		/* Test Case 9. */
339 		.K = {
340 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
341 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
342 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
343 		},
344 		.K_len = 24,
345 		.IV = {
346 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
347 			0xde, 0xca, 0xf8, 0x88,
348 		},
349 		.IV_len = 12,
350 		.P = {
351 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
352 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
353 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
354 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
355 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
356 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
357 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
358 			0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55,
359 		},
360 		.P_len = 64,
361 		.A = {0},
362 		.A_len = 0,
363 		.C = {
364 			0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,
365 			0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,
366 			0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,
367 			0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,
368 			0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,
369 			0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,
370 			0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,
371 			0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56,
372 		},
373 		.C_len = 64,
374 		.T = {
375 			0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf,
376 			0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14,
377 		},
378 	},
379 	{
380 		/* Test Case 10. */
381 		/* K and IV are the same as TC9. */
382 		.K = {
383 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
384 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
385 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
386 		},
387 		.K_len = 24,
388 		.IV = {
389 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
390 			0xde, 0xca, 0xf8, 0x88,
391 		},
392 		.IV_len = 12,
393 		.P = {
394 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
395 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
396 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
397 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
398 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
399 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
400 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
401 			0xba, 0x63, 0x7b, 0x39,
402 		},
403 		.P_len = 60,
404 		.A = {
405 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
406 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
407 			0xab, 0xad, 0xda, 0xd2,
408 		},
409 		.A_len = 20,
410 		.C = {
411 			0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,
412 			0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,
413 			0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,
414 			0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,
415 			0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,
416 			0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,
417 			0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,
418 			0xcc, 0xda, 0x27, 0x10,
419 		},
420 		.C_len = 60,
421 		.T = {
422 			0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f,
423 			0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c,
424 		},
425 	},
426 	{
427 		/* Test Case 11. */
428 		/* K is the same as TC9, P and A are the same as TC10. */
429 		.K = {
430 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
431 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
432 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
433 		},
434 		.K_len = 24,
435 		.IV = {
436 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
437 		},
438 		.IV_len = 8,
439 		.P = {
440 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
441 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
442 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
443 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
444 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
445 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
446 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
447 			0xba, 0x63, 0x7b, 0x39,
448 		},
449 		.P_len = 60,
450 		.A = {
451 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
452 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
453 			0xab, 0xad, 0xda, 0xd2,
454 		},
455 		.A_len = 20,
456 		.C = {
457 			0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54,
458 			0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8,
459 			0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f,
460 			0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57,
461 			0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75,
462 			0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9,
463 			0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f,
464 			0xa0, 0xf0, 0x62, 0xf7
465 		},
466 		.C_len = 60,
467 		.T = {
468 			0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24,
469 			0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8,
470 		},
471 	},
472 	{
473 		/* Test Case 12. */
474 		/* K is the same as TC9, P and A are the same as TC10. */
475 		.K = {
476 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
477 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
478 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
479 		},
480 		.K_len = 24,
481 		.IV = {
482 			0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
483 			0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
484 			0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
485 			0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
486 			0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
487 			0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
488 			0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
489 			0xa6, 0x37, 0xb3, 0x9b,
490 		},
491 		.IV_len = 60,
492 		.P = {
493 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
494 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
495 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
496 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
497 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
498 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
499 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
500 			0xba, 0x63, 0x7b, 0x39,
501 		},
502 		.P_len = 60,
503 		.A = {
504 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
505 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
506 			0xab, 0xad, 0xda, 0xd2,
507 		},
508 		.A_len = 20,
509 		.C = {
510 			0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c,
511 			0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff,
512 			0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef,
513 			0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45,
514 			0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9,
515 			0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3,
516 			0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7,
517 			0xe9, 0xb7, 0x37, 0x3b,
518 		},
519 		.C_len = 60,
520 		.T = {
521 			0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb,
522 			0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9,
523 		},
524 	},
525 	{
526 		/* Test Case 13. */
527 		.K = {0},
528 		.K_len = 32,
529 		.IV = {0},
530 		.IV_len = 12,
531 		.P = {0},
532 		.P_len = 0,
533 		.A = {0},
534 		.A_len = 0,
535 		.C = {0},
536 		.C_len = 0,
537 		.T = {
538 			0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9,
539 			0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b,
540 		},
541 	},
542 	{
543 		/* Test Case 14. */
544 		.K = {0},
545 		.K_len = 32,
546 		.IV = {0},
547 		.IV_len = 12,
548 		.P = {0},
549 		.P_len = 16,
550 		.A = {0},
551 		.A_len = 0,
552 		.C = {
553 			0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e,
554 			0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18,
555 		},
556 		.C_len = 16,
557 		.T = {
558 			0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0,
559 			0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19,
560 		},
561 	},
562 	{
563 		/* Test Case 15. */
564 		.K = {
565 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
566 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
567 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
568 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
569 		},
570 		.K_len = 32,
571 		.IV = {
572 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
573 			0xde, 0xca, 0xf8, 0x88,
574 		},
575 		.IV_len = 12,
576 		.P = {
577 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
578 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
579 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
580 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
581 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
582 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
583 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
584 			0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55,
585 		},
586 		.P_len = 64,
587 		.A = {0},
588 		.A_len = 0,
589 		.C = {
590 			0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
591 			0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
592 			0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
593 			0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
594 			0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
595 			0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
596 			0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
597 			0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad,
598 		},
599 		.C_len = 64,
600 		.T = {
601 			0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd,
602 			0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c,
603 		},
604 	},
605 	{
606 		/* Test Case 16. */
607 		/* K and IV are the same as TC15. */
608 		.K = {
609 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
610 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
611 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
612 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
613 		},
614 		.K_len = 32,
615 		.IV = {
616 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
617 			0xde, 0xca, 0xf8, 0x88,
618 		},
619 		.IV_len = 12,
620 		.P = {
621 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
622 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
623 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
624 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
625 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
626 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
627 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
628 			0xba, 0x63, 0x7b, 0x39,
629 		},
630 		.P_len = 60,
631 		.A = {
632 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
633 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
634 			0xab, 0xad, 0xda, 0xd2,
635 		},
636 		.A_len = 20,
637 		.C = {
638 			0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
639 			0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
640 			0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
641 			0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
642 			0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
643 			0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
644 			0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
645 			0xbc, 0xc9, 0xf6, 0x62,
646 		},
647 		.C_len = 60,
648 		.T = {
649 			0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68,
650 			0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b,
651 		},
652 	},
653 	{
654 		/* Test Case 17. */
655 		/* K is the same as TC15, P and A are the same as TC 16. */
656 		.K = {
657 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
658 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
659 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
660 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
661 		},
662 		.K_len = 32,
663 		.IV = {
664 			0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
665 		},
666 		.IV_len = 8,
667 		.P = {
668 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
669 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
670 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
671 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
672 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
673 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
674 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
675 			0xba, 0x63, 0x7b, 0x39,
676 		},
677 		.P_len = 60,
678 		.A = {
679 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
680 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
681 			0xab, 0xad, 0xda, 0xd2,
682 		},
683 		.A_len = 20,
684 		.C = {
685 			0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32,
686 			0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb,
687 			0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
688 			0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0,
689 			0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0,
690 			0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
691 			0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99,
692 			0xf4, 0x7c, 0x9b, 0x1f,
693 		},
694 		.C_len = 60,
695 		.T = {
696 			0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4,
697 			0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2,
698 		},
699 	},
700 	{
701 		/* Test Case 18. */
702 		/* K is the same as TC15, P and A are the same as TC 16. */
703 		.K = {
704 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
705 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
706 			0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
707 			0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
708 		},
709 		.K_len = 32,
710 		.IV = {
711 			0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
712 			0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
713 			0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
714 			0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
715 			0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
716 			0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
717 			0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
718 			0xa6, 0x37, 0xb3, 0x9b,
719 		},
720 		.IV_len = 60,
721 		.P = {
722 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
723 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
724 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
725 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
726 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
727 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
728 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
729 			0xba, 0x63, 0x7b, 0x39,
730 		},
731 		.P_len = 60,
732 		.A = {
733 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
734 			0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
735 			0xab, 0xad, 0xda, 0xd2,
736 		},
737 		.A_len = 20,
738 		.C = {
739 			0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1,
740 			0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20,
741 			0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19,
742 			0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4,
743 			0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45,
744 			0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde,
745 			0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e,
746 			0x44, 0xae, 0x7e, 0x3f,
747 		},
748 		.C_len = 60,
749 		.T = {
750 			0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0,
751 			0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a,
752 		},
753 	},
754 	{
755 		/* Test Case 19. */
756 		.K = {0},
757 		.K_len = 16,
758 		.IV = {0},
759 		.IV_len = 12,
760 		.P = {0},
761 		.P_len = 0,
762 		.A = {
763 			0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
764 			0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
765 			0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
766 			0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
767 			0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
768 			0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
769 			0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
770 			0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55,
771 			0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
772 			0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
773 			0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
774 			0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
775 			0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
776 			0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
777 			0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
778 			0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad,
779 		},
780 		.A_len = 128,
781 		.C = {0},
782 		.C_len = 0,
783 		.T = {
784 			0x5f, 0xea, 0x79, 0x3a, 0x2d, 0x6f, 0x97, 0x4d,
785 			0x37, 0xe6, 0x8e, 0x0c, 0xb8, 0xff, 0x94, 0x92,
786 		},
787 	},
788 	{
789 		/* Test Case 20. */
790 		.K = {0},
791 		.K_len = 16,
792 		.IV = {
793 			/* This results in 0xff in counter LSB. */
794 			0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
795 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802 		},
803 		.IV_len = 64,
804 		.P = {0},
805 		.P_len = 288,
806 		.A = {0},
807 		.A_len = 0,
808 		.C = {
809 			0x56, 0xb3, 0x37, 0x3c, 0xa9, 0xef, 0x6e, 0x4a,
810 			0x2b, 0x64, 0xfe, 0x1e, 0x9a, 0x17, 0xb6, 0x14,
811 			0x25, 0xf1, 0x0d, 0x47, 0xa7, 0x5a, 0x5f, 0xce,
812 			0x13, 0xef, 0xc6, 0xbc, 0x78, 0x4a, 0xf2, 0x4f,
813 			0x41, 0x41, 0xbd, 0xd4, 0x8c, 0xf7, 0xc7, 0x70,
814 			0x88, 0x7a, 0xfd, 0x57, 0x3c, 0xca, 0x54, 0x18,
815 			0xa9, 0xae, 0xff, 0xcd, 0x7c, 0x5c, 0xed, 0xdf,
816 			0xc6, 0xa7, 0x83, 0x97, 0xb9, 0xa8, 0x5b, 0x49,
817 			0x9d, 0xa5, 0x58, 0x25, 0x72, 0x67, 0xca, 0xab,
818 			0x2a, 0xd0, 0xb2, 0x3c, 0xa4, 0x76, 0xa5, 0x3c,
819 			0xb1, 0x7f, 0xb4, 0x1c, 0x4b, 0x8b, 0x47, 0x5c,
820 			0xb4, 0xf3, 0xf7, 0x16, 0x50, 0x94, 0xc2, 0x29,
821 			0xc9, 0xe8, 0xc4, 0xdc, 0x0a, 0x2a, 0x5f, 0xf1,
822 			0x90, 0x3e, 0x50, 0x15, 0x11, 0x22, 0x13, 0x76,
823 			0xa1, 0xcd, 0xb8, 0x36, 0x4c, 0x50, 0x61, 0xa2,
824 			0x0c, 0xae, 0x74, 0xbc, 0x4a, 0xcd, 0x76, 0xce,
825 			0xb0, 0xab, 0xc9, 0xfd, 0x32, 0x17, 0xef, 0x9f,
826 			0x8c, 0x90, 0xbe, 0x40, 0x2d, 0xdf, 0x6d, 0x86,
827 			0x97, 0xf4, 0xf8, 0x80, 0xdf, 0xf1, 0x5b, 0xfb,
828 			0x7a, 0x6b, 0x28, 0x24, 0x1e, 0xc8, 0xfe, 0x18,
829 			0x3c, 0x2d, 0x59, 0xe3, 0xf9, 0xdf, 0xff, 0x65,
830 			0x3c, 0x71, 0x26, 0xf0, 0xac, 0xb9, 0xe6, 0x42,
831 			0x11, 0xf4, 0x2b, 0xae, 0x12, 0xaf, 0x46, 0x2b,
832 			0x10, 0x70, 0xbe, 0xf1, 0xab, 0x5e, 0x36, 0x06,
833 			0x87, 0x2c, 0xa1, 0x0d, 0xee, 0x15, 0xb3, 0x24,
834 			0x9b, 0x1a, 0x1b, 0x95, 0x8f, 0x23, 0x13, 0x4c,
835 			0x4b, 0xcc, 0xb7, 0xd0, 0x32, 0x00, 0xbc, 0xe4,
836 			0x20, 0xa2, 0xf8, 0xeb, 0x66, 0xdc, 0xf3, 0x64,
837 			0x4d, 0x14, 0x23, 0xc1, 0xb5, 0x69, 0x90, 0x03,
838 			0xc1, 0x3e, 0xce, 0xf4, 0xbf, 0x38, 0xa3, 0xb6,
839 			0x0e, 0xed, 0xc3, 0x40, 0x33, 0xba, 0xc1, 0x90,
840 			0x27, 0x83, 0xdc, 0x6d, 0x89, 0xe2, 0xe7, 0x74,
841 			0x18, 0x8a, 0x43, 0x9c, 0x7e, 0xbc, 0xc0, 0x67,
842 			0x2d, 0xbd, 0xa4, 0xdd, 0xcf, 0xb2, 0x79, 0x46,
843 			0x13, 0xb0, 0xbe, 0x41, 0x31, 0x5e, 0xf7, 0x78,
844 			0x70, 0x8a, 0x70, 0xee, 0x7d, 0x75, 0x16, 0x5c,
845 		},
846 		.C_len = 288,
847 		.T = {
848 			0x8b, 0x30, 0x7f, 0x6b, 0x33, 0x28, 0x6d, 0x0a,
849 			0xb0, 0x26, 0xa9, 0xed, 0x3f, 0xe1, 0xe8, 0x5f,
850 		},
851 	},
852 };
853 
854 #define N_TESTS (sizeof(gcm128_tests) / sizeof(*gcm128_tests))
855 
856 static int
do_gcm128_test(int test_no,struct gcm128_test * tv)857 do_gcm128_test(int test_no, struct gcm128_test *tv)
858 {
859 	GCM128_CONTEXT ctx;
860 	AES_KEY key;
861 	uint8_t *out = NULL;
862 	size_t out_len;
863 	int ret = 1;
864 
865 	out_len = tv->P_len;
866 	if (out_len != 0) {
867 		out = malloc(out_len);
868 		if (out == NULL)
869 			err(1, "malloc");
870 	}
871 
872 	AES_set_encrypt_key(tv->K, tv->K_len * 8, &key);
873 
874 	if (out_len != 0)
875 		memset(out, 0, out_len);
876 	CRYPTO_gcm128_init(&ctx, &key, (block128_f)AES_encrypt);
877 	CRYPTO_gcm128_setiv(&ctx, tv->IV, tv->IV_len);
878 	if (tv->A_len > 0)
879 		CRYPTO_gcm128_aad(&ctx, tv->A, tv->A_len);
880 	if (tv->P_len > 0)
881 		CRYPTO_gcm128_encrypt(&ctx, tv->P, out, out_len);
882 	if (CRYPTO_gcm128_finish(&ctx, tv->T, 16)) {
883 		fprintf(stderr, "TEST %d: CRYPTO_gcm128_finish failed\n",
884 		    test_no);
885 		goto fail;
886 	}
887 	if (tv->C_len > 0 && memcmp(out, tv->C, out_len)) {
888 		fprintf(stderr, "TEST %d: encrypt failed\n", test_no);
889 		goto fail;
890 	}
891 
892 	if (out_len != 0)
893 		memset(out, 0, out_len);
894 	CRYPTO_gcm128_setiv(&ctx, tv->IV, tv->IV_len);
895 	if (tv->A_len > 0)
896 		CRYPTO_gcm128_aad(&ctx, tv->A, tv->A_len);
897 	if (tv->C_len > 0)
898 		CRYPTO_gcm128_decrypt(&ctx, tv->C, out, out_len);
899 	if (CRYPTO_gcm128_finish(&ctx, tv->T, 16)) {
900 		fprintf(stderr, "TEST %d: CRYPTO_gcm128_finish failed\n",
901 		    test_no);
902 		goto fail;
903 	}
904 	if (tv->P_len > 0 && memcmp(out, tv->P, out_len)) {
905 		fprintf(stderr, "TEST %d: decrypt failed\n", test_no);
906 		goto fail;
907 	}
908 
909 	ret = 0;
910 
911 fail:
912 	free(out);
913 	return (ret);
914 }
915 
916 int
main(int argc,char ** argv)917 main(int argc, char **argv)
918 {
919 	int ret = 0;
920 	size_t i;
921 
922 	for (i = 0; i < N_TESTS; i++)
923 		ret |= do_gcm128_test(i + 1, &gcm128_tests[i]);
924 
925 	return ret;
926 }
927