]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/modes_internal_test.c
Create a prototype for OPENSSL_rdtsc
[thirdparty/openssl.git] / test / modes_internal_test.c
1 /*
2 * Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /* Internal tests for the modes module */
11
12 #include <stdio.h>
13 #include <string.h>
14
15 #include <openssl/aes.h>
16 #include <openssl/modes.h>
17 #include "../crypto/modes/modes_lcl.h"
18 #include "testutil.h"
19 #include "internal/nelem.h"
20 #include "internal/cryptlib.h"
21
22 typedef struct {
23 size_t size;
24 const unsigned char *data;
25 } SIZED_DATA;
26
27 /**********************************************************************
28 *
29 * Test of cts128
30 *
31 ***/
32
33 /* cts128 test vectors from RFC 3962 */
34 static const unsigned char cts128_test_key[16] = "chicken teriyaki";
35 static const unsigned char cts128_test_input[64] =
36 "I would like the" " General Gau's C"
37 "hicken, please, " "and wonton soup.";
38 static const unsigned char cts128_test_iv[] =
39 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
40
41 static const unsigned char vector_17[17] = {
42 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
43 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
44 0x97
45 };
46
47 static const unsigned char vector_31[31] = {
48 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
49 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
50 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
51 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
52 };
53
54 static const unsigned char vector_32[32] = {
55 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
56 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
57 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
58 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84
59 };
60
61 static const unsigned char vector_47[47] = {
62 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
63 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
64 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
65 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
66 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
67 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5
68 };
69
70 static const unsigned char vector_48[48] = {
71 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
72 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
73 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
74 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
75 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
76 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8
77 };
78
79 static const unsigned char vector_64[64] = {
80 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
81 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
82 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
83 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
84 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
85 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
86 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
87 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8
88 };
89
90 #define CTS128_TEST_VECTOR(len) \
91 { \
92 sizeof(vector_##len), vector_##len \
93 }
94 static const SIZED_DATA aes_cts128_vectors[] = {
95 CTS128_TEST_VECTOR(17),
96 CTS128_TEST_VECTOR(31),
97 CTS128_TEST_VECTOR(32),
98 CTS128_TEST_VECTOR(47),
99 CTS128_TEST_VECTOR(48),
100 CTS128_TEST_VECTOR(64),
101 };
102
103 static AES_KEY *cts128_encrypt_key_schedule()
104 {
105 static int init_key = 1;
106 static AES_KEY ks;
107
108 if (init_key) {
109 AES_set_encrypt_key(cts128_test_key, 128, &ks);
110 init_key = 0;
111 }
112 return &ks;
113 }
114
115 static AES_KEY *cts128_decrypt_key_schedule()
116 {
117 static int init_key = 1;
118 static AES_KEY ks;
119
120 if (init_key) {
121 AES_set_decrypt_key(cts128_test_key, 128, &ks);
122 init_key = 0;
123 }
124 return &ks;
125 }
126
127 typedef struct {
128 const char *case_name;
129 size_t (*last_blocks_correction)(const unsigned char *in,
130 unsigned char *out, size_t len);
131 size_t (*encrypt_block)(const unsigned char *in,
132 unsigned char *out, size_t len,
133 const void *key, unsigned char ivec[16],
134 block128_f block);
135 size_t (*encrypt_stream)(const unsigned char *in, unsigned char *out,
136 size_t len, const void *key,
137 unsigned char ivec[16], cbc128_f cbc);
138 size_t (*decrypt_block)(const unsigned char *in,
139 unsigned char *out, size_t len,
140 const void *key, unsigned char ivec[16],
141 block128_f block);
142 size_t (*decrypt_stream)(const unsigned char *in, unsigned char *out,
143 size_t len, const void *key,
144 unsigned char ivec[16], cbc128_f cbc);
145 } CTS128_FIXTURE;
146
147 static size_t last_blocks_correction(const unsigned char *in,
148 unsigned char *out, size_t len)
149 {
150 size_t tail;
151
152 memcpy(out, in, len);
153 if ((tail = len % 16) == 0)
154 tail = 16;
155 tail += 16;
156
157 return tail;
158 }
159
160 static size_t last_blocks_correction_nist(const unsigned char *in,
161 unsigned char *out, size_t len)
162 {
163 size_t tail;
164
165 if ((tail = len % 16) == 0)
166 tail = 16;
167 len -= 16 + tail;
168 memcpy(out, in, len);
169 /* flip two last blocks */
170 memcpy(out + len, in + len + 16, tail);
171 memcpy(out + len + tail, in + len, 16);
172 len += 16 + tail;
173 tail = 16;
174
175 return tail;
176 }
177
178 static int execute_cts128(const CTS128_FIXTURE *fixture, int num)
179 {
180 const unsigned char *test_iv = cts128_test_iv;
181 size_t test_iv_len = sizeof(cts128_test_iv);
182 const unsigned char *orig_vector = aes_cts128_vectors[num].data;
183 size_t len = aes_cts128_vectors[num].size;
184 const unsigned char *test_input = cts128_test_input;
185 const AES_KEY *encrypt_key_schedule = cts128_encrypt_key_schedule();
186 const AES_KEY *decrypt_key_schedule = cts128_decrypt_key_schedule();
187 unsigned char iv[16];
188 /* The largest test inputs are = 64 bytes. */
189 unsigned char cleartext[64], ciphertext[64], vector[64];
190 size_t tail, size;
191
192 TEST_info("%s_vector_%lu", fixture->case_name, (unsigned long)len);
193
194 tail = fixture->last_blocks_correction(orig_vector, vector, len);
195
196 /* test block-based encryption */
197 memcpy(iv, test_iv, test_iv_len);
198 if (!TEST_size_t_eq(fixture->encrypt_block(test_input, ciphertext, len,
199 encrypt_key_schedule, iv,
200 (block128_f)AES_encrypt), len)
201 || !TEST_mem_eq(ciphertext, len, vector, len)
202 || !TEST_mem_eq(iv, sizeof(iv), vector + len - tail, sizeof(iv)))
203 return 0;
204
205 /* test block-based decryption */
206 memcpy(iv, test_iv, test_iv_len);
207 size = fixture->decrypt_block(ciphertext, cleartext, len,
208 decrypt_key_schedule, iv,
209 (block128_f)AES_decrypt);
210 if (!TEST_true(len == size || len + 16 == size)
211 || !TEST_mem_eq(cleartext, len, test_input, len)
212 || !TEST_mem_eq(iv, sizeof(iv), vector + len - tail, sizeof(iv)))
213 return 0;
214
215 /* test streamed encryption */
216 memcpy(iv, test_iv, test_iv_len);
217 if (!TEST_size_t_eq(fixture->encrypt_stream(test_input, ciphertext, len,
218 encrypt_key_schedule, iv,
219 (cbc128_f) AES_cbc_encrypt),
220 len)
221 || !TEST_mem_eq(ciphertext, len, vector, len)
222 || !TEST_mem_eq(iv, sizeof(iv), vector + len - tail, sizeof(iv)))
223 return 0;
224
225 /* test streamed decryption */
226 memcpy(iv, test_iv, test_iv_len);
227 if (!TEST_size_t_eq(fixture->decrypt_stream(ciphertext, cleartext, len,
228 decrypt_key_schedule, iv,
229 (cbc128_f)AES_cbc_encrypt),
230 len)
231 || !TEST_mem_eq(cleartext, len, test_input, len)
232 || !TEST_mem_eq(iv, sizeof(iv), vector + len - tail, sizeof(iv)))
233 return 0;
234
235 return 1;
236 }
237
238 static int test_aes_cts128(int idx)
239 {
240 static const CTS128_FIXTURE fixture_cts128 = {
241 "aes_cts128", last_blocks_correction,
242 CRYPTO_cts128_encrypt_block, CRYPTO_cts128_encrypt,
243 CRYPTO_cts128_decrypt_block, CRYPTO_cts128_decrypt
244 };
245
246 return execute_cts128(&fixture_cts128, idx);
247 }
248
249 static int test_aes_cts128_nist(int idx)
250 {
251 static const CTS128_FIXTURE fixture_cts128_nist = {
252 "aes_cts128_nist", last_blocks_correction_nist,
253 CRYPTO_nistcts128_encrypt_block, CRYPTO_nistcts128_encrypt,
254 CRYPTO_nistcts128_decrypt_block, CRYPTO_nistcts128_decrypt
255 };
256
257 return execute_cts128(&fixture_cts128_nist, idx);
258 }
259
260 /*
261 *
262 * Test of gcm128
263 *
264 */
265
266 /* Test Case 1 */
267 static const u8 K1[16], P1[] = { 0 }, A1[] = { 0 }, IV1[12], C1[] = { 0 };
268 static const u8 T1[] = {
269 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61,
270 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a
271 };
272
273 /* Test Case 2 */
274 # define K2 K1
275 # define A2 A1
276 # define IV2 IV1
277 static const u8 P2[16];
278 static const u8 C2[] = {
279 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92,
280 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78
281 };
282
283 static const u8 T2[] = {
284 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd,
285 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf
286 };
287
288 /* Test Case 3 */
289 # define A3 A2
290 static const u8 K3[] = {
291 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
292 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
293 };
294
295 static const u8 P3[] = {
296 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
297 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
298 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
299 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
300 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
301 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
302 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
303 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55
304 };
305
306 static const u8 IV3[] = {
307 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
308 0xde, 0xca, 0xf8, 0x88
309 };
310
311 static const u8 C3[] = {
312 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
313 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
314 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
315 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
316 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
317 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
318 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
319 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85
320 };
321
322 static const u8 T3[] = {
323 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6,
324 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4
325 };
326
327 /* Test Case 4 */
328 # define K4 K3
329 # define IV4 IV3
330 static const u8 P4[] = {
331 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
332 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
333 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
334 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
335 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
336 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
337 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
338 0xba, 0x63, 0x7b, 0x39
339 };
340
341 static const u8 A4[] = {
342 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
343 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
344 0xab, 0xad, 0xda, 0xd2
345 };
346
347 static const u8 C4[] = {
348 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
349 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
350 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
351 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
352 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
353 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
354 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
355 0x3d, 0x58, 0xe0, 0x91
356 };
357
358 static const u8 T4[] = {
359 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb,
360 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47
361 };
362
363 /* Test Case 5 */
364 # define K5 K4
365 # define P5 P4
366 # define A5 A4
367 static const u8 IV5[] = {
368 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad
369 };
370
371 static const u8 C5[] = {
372 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a,
373 0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55,
374 0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8,
375 0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23,
376 0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2,
377 0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42,
378 0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07,
379 0xc2, 0x3f, 0x45, 0x98
380 };
381
382 static const u8 T5[] = {
383 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85,
384 0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb
385 };
386
387 /* Test Case 6 */
388 # define K6 K5
389 # define P6 P5
390 # define A6 A5
391 static const u8 IV6[] = {
392 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
393 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
394 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
395 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
396 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
397 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
398 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
399 0xa6, 0x37, 0xb3, 0x9b
400 };
401
402 static const u8 C6[] = {
403 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6,
404 0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94,
405 0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8,
406 0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7,
407 0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90,
408 0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f,
409 0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03,
410 0x4c, 0x34, 0xae, 0xe5
411 };
412
413 static const u8 T6[] = {
414 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa,
415 0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50
416 };
417
418 /* Test Case 7 */
419 static const u8 K7[24], P7[] = { 0 }, A7[] = { 0 }, IV7[12], C7[] = { 0 };
420 static const u8 T7[] = {
421 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b,
422 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35
423 };
424
425 /* Test Case 8 */
426 # define K8 K7
427 # define IV8 IV7
428 # define A8 A7
429 static const u8 P8[16];
430 static const u8 C8[] = {
431 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41,
432 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00
433 };
434
435 static const u8 T8[] = {
436 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab,
437 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb
438 };
439
440 /* Test Case 9 */
441 # define A9 A8
442 static const u8 K9[] = {
443 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
444 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
445 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c
446 };
447
448 static const u8 P9[] = {
449 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
450 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
451 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
452 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
453 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
454 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
455 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
456 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55
457 };
458
459 static const u8 IV9[] = {
460 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
461 0xde, 0xca, 0xf8, 0x88
462 };
463
464 static const u8 C9[] = {
465 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,
466 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,
467 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,
468 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,
469 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,
470 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,
471 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,
472 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56
473 };
474
475 static const u8 T9[] = {
476 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf,
477 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14
478 };
479
480 /* Test Case 10 */
481 # define K10 K9
482 # define IV10 IV9
483 static const u8 P10[] = {
484 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
485 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
486 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
487 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
488 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
489 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
490 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
491 0xba, 0x63, 0x7b, 0x39
492 };
493
494 static const u8 A10[] = {
495 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
496 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
497 0xab, 0xad, 0xda, 0xd2
498 };
499
500 static const u8 C10[] = {
501 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,
502 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,
503 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,
504 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,
505 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,
506 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,
507 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,
508 0xcc, 0xda, 0x27, 0x10
509 };
510
511 static const u8 T10[] = {
512 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f,
513 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c
514 };
515
516 /* Test Case 11 */
517 # define K11 K10
518 # define P11 P10
519 # define A11 A10
520 static const u8 IV11[] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad };
521
522 static const u8 C11[] = {
523 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54,
524 0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8,
525 0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f,
526 0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57,
527 0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75,
528 0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9,
529 0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f,
530 0xa0, 0xf0, 0x62, 0xf7
531 };
532
533 static const u8 T11[] = {
534 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24,
535 0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8
536 };
537
538 /* Test Case 12 */
539 # define K12 K11
540 # define P12 P11
541 # define A12 A11
542 static const u8 IV12[] = {
543 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
544 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
545 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
546 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
547 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
548 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
549 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
550 0xa6, 0x37, 0xb3, 0x9b
551 };
552
553 static const u8 C12[] = {
554 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c,
555 0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff,
556 0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef,
557 0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45,
558 0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9,
559 0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3,
560 0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7,
561 0xe9, 0xb7, 0x37, 0x3b
562 };
563
564 static const u8 T12[] = {
565 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb,
566 0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9
567 };
568
569 /* Test Case 13 */
570 static const u8 K13[32], P13[] = { 0 }, A13[] = { 0 }, IV13[12], C13[] = { 0 };
571 static const u8 T13[] = {
572 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9,
573 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b
574 };
575
576 /* Test Case 14 */
577 # define K14 K13
578 # define A14 A13
579 static const u8 P14[16], IV14[12];
580 static const u8 C14[] = {
581 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e,
582 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18
583 };
584
585 static const u8 T14[] = {
586 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0,
587 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19
588 };
589
590 /* Test Case 15 */
591 # define A15 A14
592 static const u8 K15[] = {
593 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
594 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
595 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
596 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
597 };
598
599 static const u8 P15[] = {
600 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
601 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
602 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
603 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
604 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
605 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
606 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
607 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55
608 };
609
610 static const u8 IV15[] = {
611 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
612 0xde, 0xca, 0xf8, 0x88
613 };
614
615 static const u8 C15[] = {
616 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
617 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
618 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
619 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
620 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
621 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
622 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
623 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad
624 };
625
626 static const u8 T15[] = {
627 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd,
628 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c
629 };
630
631 /* Test Case 16 */
632 # define K16 K15
633 # define IV16 IV15
634 static const u8 P16[] = {
635 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
636 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
637 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
638 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
639 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
640 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
641 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
642 0xba, 0x63, 0x7b, 0x39
643 };
644
645 static const u8 A16[] = {
646 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
647 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
648 0xab, 0xad, 0xda, 0xd2
649 };
650
651 static const u8 C16[] = {
652 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
653 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
654 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
655 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
656 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
657 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
658 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
659 0xbc, 0xc9, 0xf6, 0x62
660 };
661
662 static const u8 T16[] = {
663 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68,
664 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b
665 };
666
667 /* Test Case 17 */
668 # define K17 K16
669 # define P17 P16
670 # define A17 A16
671 static const u8 IV17[] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad };
672
673 static const u8 C17[] = {
674 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32,
675 0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb,
676 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
677 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0,
678 0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0,
679 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
680 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99,
681 0xf4, 0x7c, 0x9b, 0x1f
682 };
683
684 static const u8 T17[] = {
685 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4,
686 0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2
687 };
688
689 /* Test Case 18 */
690 # define K18 K17
691 # define P18 P17
692 # define A18 A17
693 static const u8 IV18[] = {
694 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
695 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
696 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
697 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
698 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
699 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
700 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
701 0xa6, 0x37, 0xb3, 0x9b
702 };
703
704 static const u8 C18[] = {
705 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1,
706 0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20,
707 0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19,
708 0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4,
709 0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45,
710 0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde,
711 0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e,
712 0x44, 0xae, 0x7e, 0x3f
713 };
714
715 static const u8 T18[] = {
716 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0,
717 0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a
718 };
719
720 /* Test Case 19 */
721 # define K19 K1
722 # define P19 P1
723 # define IV19 IV1
724 # define C19 C1
725 static const u8 A19[] = {
726 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
727 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
728 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
729 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
730 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
731 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
732 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
733 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55,
734 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
735 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
736 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
737 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
738 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
739 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
740 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
741 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad
742 };
743
744 static const u8 T19[] = {
745 0x5f, 0xea, 0x79, 0x3a, 0x2d, 0x6f, 0x97, 0x4d,
746 0x37, 0xe6, 0x8e, 0x0c, 0xb8, 0xff, 0x94, 0x92
747 };
748
749 /* Test Case 20 */
750 # define K20 K1
751 # define A20 A1
752 /* this results in 0xff in counter LSB */
753 static const u8 IV20[64] = { 0xff, 0xff, 0xff, 0xff };
754
755 static const u8 P20[288];
756 static const u8 C20[] = {
757 0x56, 0xb3, 0x37, 0x3c, 0xa9, 0xef, 0x6e, 0x4a,
758 0x2b, 0x64, 0xfe, 0x1e, 0x9a, 0x17, 0xb6, 0x14,
759 0x25, 0xf1, 0x0d, 0x47, 0xa7, 0x5a, 0x5f, 0xce,
760 0x13, 0xef, 0xc6, 0xbc, 0x78, 0x4a, 0xf2, 0x4f,
761 0x41, 0x41, 0xbd, 0xd4, 0x8c, 0xf7, 0xc7, 0x70,
762 0x88, 0x7a, 0xfd, 0x57, 0x3c, 0xca, 0x54, 0x18,
763 0xa9, 0xae, 0xff, 0xcd, 0x7c, 0x5c, 0xed, 0xdf,
764 0xc6, 0xa7, 0x83, 0x97, 0xb9, 0xa8, 0x5b, 0x49,
765 0x9d, 0xa5, 0x58, 0x25, 0x72, 0x67, 0xca, 0xab,
766 0x2a, 0xd0, 0xb2, 0x3c, 0xa4, 0x76, 0xa5, 0x3c,
767 0xb1, 0x7f, 0xb4, 0x1c, 0x4b, 0x8b, 0x47, 0x5c,
768 0xb4, 0xf3, 0xf7, 0x16, 0x50, 0x94, 0xc2, 0x29,
769 0xc9, 0xe8, 0xc4, 0xdc, 0x0a, 0x2a, 0x5f, 0xf1,
770 0x90, 0x3e, 0x50, 0x15, 0x11, 0x22, 0x13, 0x76,
771 0xa1, 0xcd, 0xb8, 0x36, 0x4c, 0x50, 0x61, 0xa2,
772 0x0c, 0xae, 0x74, 0xbc, 0x4a, 0xcd, 0x76, 0xce,
773 0xb0, 0xab, 0xc9, 0xfd, 0x32, 0x17, 0xef, 0x9f,
774 0x8c, 0x90, 0xbe, 0x40, 0x2d, 0xdf, 0x6d, 0x86,
775 0x97, 0xf4, 0xf8, 0x80, 0xdf, 0xf1, 0x5b, 0xfb,
776 0x7a, 0x6b, 0x28, 0x24, 0x1e, 0xc8, 0xfe, 0x18,
777 0x3c, 0x2d, 0x59, 0xe3, 0xf9, 0xdf, 0xff, 0x65,
778 0x3c, 0x71, 0x26, 0xf0, 0xac, 0xb9, 0xe6, 0x42,
779 0x11, 0xf4, 0x2b, 0xae, 0x12, 0xaf, 0x46, 0x2b,
780 0x10, 0x70, 0xbe, 0xf1, 0xab, 0x5e, 0x36, 0x06,
781 0x87, 0x2c, 0xa1, 0x0d, 0xee, 0x15, 0xb3, 0x24,
782 0x9b, 0x1a, 0x1b, 0x95, 0x8f, 0x23, 0x13, 0x4c,
783 0x4b, 0xcc, 0xb7, 0xd0, 0x32, 0x00, 0xbc, 0xe4,
784 0x20, 0xa2, 0xf8, 0xeb, 0x66, 0xdc, 0xf3, 0x64,
785 0x4d, 0x14, 0x23, 0xc1, 0xb5, 0x69, 0x90, 0x03,
786 0xc1, 0x3e, 0xce, 0xf4, 0xbf, 0x38, 0xa3, 0xb6,
787 0x0e, 0xed, 0xc3, 0x40, 0x33, 0xba, 0xc1, 0x90,
788 0x27, 0x83, 0xdc, 0x6d, 0x89, 0xe2, 0xe7, 0x74,
789 0x18, 0x8a, 0x43, 0x9c, 0x7e, 0xbc, 0xc0, 0x67,
790 0x2d, 0xbd, 0xa4, 0xdd, 0xcf, 0xb2, 0x79, 0x46,
791 0x13, 0xb0, 0xbe, 0x41, 0x31, 0x5e, 0xf7, 0x78,
792 0x70, 0x8a, 0x70, 0xee, 0x7d, 0x75, 0x16, 0x5c
793 };
794
795 static const u8 T20[] = {
796 0x8b, 0x30, 0x7f, 0x6b, 0x33, 0x28, 0x6d, 0x0a,
797 0xb0, 0x26, 0xa9, 0xed, 0x3f, 0xe1, 0xe8, 0x5f
798 };
799
800 #define GCM128_TEST_VECTOR(n) \
801 { \
802 {sizeof(K##n), K##n}, \
803 {sizeof(IV##n), IV##n}, \
804 {sizeof(A##n), A##n}, \
805 {sizeof(P##n), P##n}, \
806 {sizeof(C##n), C##n}, \
807 {sizeof(T##n), T##n} \
808 }
809 static struct gcm128_data {
810 const SIZED_DATA K;
811 const SIZED_DATA IV;
812 const SIZED_DATA A;
813 const SIZED_DATA P;
814 const SIZED_DATA C;
815 const SIZED_DATA T;
816 } gcm128_vectors[] = {
817 GCM128_TEST_VECTOR(1),
818 GCM128_TEST_VECTOR(2),
819 GCM128_TEST_VECTOR(3),
820 GCM128_TEST_VECTOR(4),
821 GCM128_TEST_VECTOR(5),
822 GCM128_TEST_VECTOR(6),
823 GCM128_TEST_VECTOR(7),
824 GCM128_TEST_VECTOR(8),
825 GCM128_TEST_VECTOR(9),
826 GCM128_TEST_VECTOR(10),
827 GCM128_TEST_VECTOR(11),
828 GCM128_TEST_VECTOR(12),
829 GCM128_TEST_VECTOR(13),
830 GCM128_TEST_VECTOR(14),
831 GCM128_TEST_VECTOR(15),
832 GCM128_TEST_VECTOR(16),
833 GCM128_TEST_VECTOR(17),
834 GCM128_TEST_VECTOR(18),
835 GCM128_TEST_VECTOR(19),
836 GCM128_TEST_VECTOR(20)
837 };
838
839 static int test_gcm128(int idx)
840 {
841 unsigned char out[512];
842 SIZED_DATA K = gcm128_vectors[idx].K;
843 SIZED_DATA IV = gcm128_vectors[idx].IV;
844 SIZED_DATA A = gcm128_vectors[idx].A;
845 SIZED_DATA P = gcm128_vectors[idx].P;
846 SIZED_DATA C = gcm128_vectors[idx].C;
847 SIZED_DATA T = gcm128_vectors[idx].T;
848 GCM128_CONTEXT ctx;
849 AES_KEY key;
850
851 /* Size 1 inputs are special-cased to signal NULL. */
852 if (A.size == 1)
853 A.data = NULL;
854 if (P.size == 1)
855 P.data = NULL;
856 if (C.size == 1)
857 C.data = NULL;
858
859 AES_set_encrypt_key(K.data, K.size * 8, &key);
860
861 CRYPTO_gcm128_init(&ctx, &key, (block128_f)AES_encrypt);
862 CRYPTO_gcm128_setiv(&ctx, IV.data, IV.size);
863 memset(out, 0, P.size);
864 if (A.data != NULL)
865 CRYPTO_gcm128_aad(&ctx, A.data, A.size);
866 if (P.data != NULL)
867 CRYPTO_gcm128_encrypt( &ctx, P.data, out, P.size);
868 if (!TEST_false(CRYPTO_gcm128_finish(&ctx, T.data, 16))
869 || (C.data != NULL
870 && !TEST_mem_eq(out, P.size, C.data, P.size)))
871 return 0;
872
873 CRYPTO_gcm128_setiv(&ctx, IV.data, IV.size);
874 memset(out, 0, P.size);
875 if (A.data != NULL)
876 CRYPTO_gcm128_aad(&ctx, A.data, A.size);
877 if (C.data != NULL)
878 CRYPTO_gcm128_decrypt(&ctx, C.data, out, P.size);
879 if (!TEST_false(CRYPTO_gcm128_finish(&ctx, T.data, 16))
880 || (P.data != NULL
881 && !TEST_mem_eq(out, P.size, P.data, P.size)))
882 return 0;
883
884 return 1;
885 }
886
887 static void benchmark_gcm128(const unsigned char *K, size_t Klen,
888 const unsigned char *IV, size_t IVlen)
889 {
890 #ifdef OPENSSL_CPUID_OBJ
891 GCM128_CONTEXT ctx;
892 AES_KEY key;
893 uint32_t start, gcm_t, ctr_t;
894 union {
895 u64 u;
896 u8 c[1024];
897 } buf;
898
899 AES_set_encrypt_key(K, Klen * 8, &key);
900 CRYPTO_gcm128_init(&ctx, &key, (block128_f) AES_encrypt);
901 CRYPTO_gcm128_setiv(&ctx, IV, IVlen);
902
903 CRYPTO_gcm128_encrypt(&ctx, buf.c, buf.c, sizeof(buf));
904 start = OPENSSL_rdtsc();
905 CRYPTO_gcm128_encrypt(&ctx, buf.c, buf.c, sizeof(buf));
906 gcm_t = OPENSSL_rdtsc() - start;
907
908 CRYPTO_ctr128_encrypt(buf.c, buf.c, sizeof(buf),
909 &key, ctx.Yi.c, ctx.EKi.c, &ctx.mres,
910 (block128_f) AES_encrypt);
911 start = OPENSSL_rdtsc();
912 CRYPTO_ctr128_encrypt(buf.c, buf.c, sizeof(buf),
913 &key, ctx.Yi.c, ctx.EKi.c, &ctx.mres,
914 (block128_f) AES_encrypt);
915 ctr_t = OPENSSL_rdtsc() - start;
916
917 printf("%.2f-%.2f=%.2f\n",
918 gcm_t / (double)sizeof(buf),
919 ctr_t / (double)sizeof(buf),
920 (gcm_t - ctr_t) / (double)sizeof(buf));
921 # ifdef GHASH
922 {
923 void (*gcm_ghash_p) (u64 Xi[2], const u128 Htable[16],
924 const u8 *inp, size_t len) = ctx.ghash;
925
926 GHASH((&ctx), buf.c, sizeof(buf));
927 start = OPENSSL_rdtsc();
928 for (i = 0; i < 100; ++i)
929 GHASH((&ctx), buf.c, sizeof(buf));
930 gcm_t = OPENSSL_rdtsc() - start;
931 printf("%.2f\n", gcm_t / (double)sizeof(buf) / (double)i);
932 }
933 # endif
934 #else
935 fprintf(stderr,
936 "Benchmarking of modes isn't available on this platform\n");
937 #endif
938 }
939
940 int setup_tests(void)
941 {
942 if (test_has_option("-h")) {
943 printf("-h\tThis help\n");
944 printf("-b\tBenchmark gcm128 in addition to the tests\n");
945 return 1;
946 }
947
948 ADD_ALL_TESTS(test_aes_cts128, OSSL_NELEM(aes_cts128_vectors));
949 ADD_ALL_TESTS(test_aes_cts128_nist, OSSL_NELEM(aes_cts128_vectors));
950 ADD_ALL_TESTS(test_gcm128, OSSL_NELEM(gcm128_vectors));
951 return 1;
952 }
953
954 void cleanup_tests(void)
955 {
956 if (test_has_option("-b"))
957 benchmark_gcm128(K1, sizeof(K1), IV1, sizeof(IV1));
958 }