1 /*
2 * Copyright 2006-2017 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 /* The AES_ige_* functions are deprecated, so we suppress warnings about them */
11 #define OPENSSL_SUPPRESS_DEPRECATED
12
13 #include <openssl/crypto.h>
14 #include <openssl/aes.h>
15 #include <openssl/rand.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include "internal/nelem.h"
19 #include "testutil.h"
20
21 #ifndef OPENSSL_NO_DEPRECATED_3_0
22
23 # define TEST_SIZE 128
24 # define BIG_TEST_SIZE 10240
25
26 # if BIG_TEST_SIZE < TEST_SIZE
27 # error BIG_TEST_SIZE is smaller than TEST_SIZE
28 # endif
29
30 static unsigned char rkey[16];
31 static unsigned char rkey2[16];
32 static unsigned char plaintext[BIG_TEST_SIZE];
33 static unsigned char saved_iv[AES_BLOCK_SIZE * 4];
34
35 # define MAX_VECTOR_SIZE 64
36
37 struct ige_test {
38 const unsigned char key[16];
39 const unsigned char iv[32];
40 const unsigned char in[MAX_VECTOR_SIZE];
41 const unsigned char out[MAX_VECTOR_SIZE];
42 const size_t length;
43 const int encrypt;
44 };
45
46 static struct ige_test const ige_test_vectors[] = {
47 {{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
48 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, /* key */
49 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
50 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
51 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
52 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}, /* iv */
53 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* in */
57 {0x1a, 0x85, 0x19, 0xa6, 0x55, 0x7b, 0xe6, 0x52,
58 0xe9, 0xda, 0x8e, 0x43, 0xda, 0x4e, 0xf4, 0x45,
59 0x3c, 0xf4, 0x56, 0xb4, 0xca, 0x48, 0x8a, 0xa3,
60 0x83, 0xc7, 0x9c, 0x98, 0xb3, 0x47, 0x97, 0xcb}, /* out */
61 32, AES_ENCRYPT}, /* test vector 0 */
62
63 {{0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
64 0x61, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65}, /* key */
65 {0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
66 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x47, 0x45,
67 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f,
68 0x72, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x53}, /* iv */
69 {0x4c, 0x2e, 0x20, 0x4c, 0x65, 0x74, 0x27, 0x73,
70 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x42, 0x65,
71 0x6e, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x69, 0x74,
72 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x21, 0x0a}, /* in */
73 {0x99, 0x70, 0x64, 0x87, 0xa1, 0xcd, 0xe6, 0x13,
74 0xbc, 0x6d, 0xe0, 0xb6, 0xf2, 0x4b, 0x1c, 0x7a,
75 0xa4, 0x48, 0xc8, 0xb9, 0xc3, 0x40, 0x3e, 0x34,
76 0x67, 0xa8, 0xca, 0xd8, 0x93, 0x40, 0xf5, 0x3b}, /* out */
77 32, AES_DECRYPT}, /* test vector 1 */
78 };
79
80 struct bi_ige_test {
81 const unsigned char key1[32];
82 const unsigned char key2[32];
83 const unsigned char iv[64];
84 const unsigned char in[MAX_VECTOR_SIZE];
85 const unsigned char out[MAX_VECTOR_SIZE];
86 const size_t keysize;
87 const size_t length;
88 const int encrypt;
89 };
90
91 static struct bi_ige_test const bi_ige_test_vectors[] = {
92 {{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
93 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, /* key1 */
94 {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
95 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f}, /* key2 */
96 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
97 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
98 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
99 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
100 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
101 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
102 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
103 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f}, /* iv */
104 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* in */
108 {0x14, 0x40, 0x6f, 0xae, 0xa2, 0x79, 0xf2, 0x56,
109 0x1f, 0x86, 0xeb, 0x3b, 0x7d, 0xff, 0x53, 0xdc,
110 0x4e, 0x27, 0x0c, 0x03, 0xde, 0x7c, 0xe5, 0x16,
111 0x6a, 0x9c, 0x20, 0x33, 0x9d, 0x33, 0xfe, 0x12}, /* out */
112 16, 32, AES_ENCRYPT}, /* test vector 0 */
113 {{0x58, 0x0a, 0x06, 0xe9, 0x97, 0x07, 0x59, 0x5c,
114 0x9e, 0x19, 0xd2, 0xa7, 0xbb, 0x40, 0x2b, 0x7a,
115 0xc7, 0xd8, 0x11, 0x9e, 0x4c, 0x51, 0x35, 0x75,
116 0x64, 0x28, 0x0f, 0x23, 0xad, 0x74, 0xac, 0x37}, /* key1 */
117 {0xd1, 0x80, 0xa0, 0x31, 0x47, 0xa3, 0x11, 0x13,
118 0x86, 0x26, 0x9e, 0x6d, 0xff, 0xaf, 0x72, 0x74,
119 0x5b, 0xa2, 0x35, 0x81, 0xd2, 0xa6, 0x3d, 0x21,
120 0x67, 0x7b, 0x58, 0xa8, 0x18, 0xf9, 0x72, 0xe4}, /* key2 */
121 {0x80, 0x3d, 0xbd, 0x4c, 0xe6, 0x7b, 0x06, 0xa9,
122 0x53, 0x35, 0xd5, 0x7e, 0x71, 0xc1, 0x70, 0x70,
123 0x74, 0x9a, 0x00, 0x28, 0x0c, 0xbf, 0x6c, 0x42,
124 0x9b, 0xa4, 0xdd, 0x65, 0x11, 0x77, 0x7c, 0x67,
125 0xfe, 0x76, 0x0a, 0xf0, 0xd5, 0xc6, 0x6e, 0x6a,
126 0xe7, 0x5e, 0x4c, 0xf2, 0x7e, 0x9e, 0xf9, 0x20,
127 0x0e, 0x54, 0x6f, 0x2d, 0x8a, 0x8d, 0x7e, 0xbd,
128 0x48, 0x79, 0x37, 0x99, 0xff, 0x27, 0x93, 0xa3}, /* iv */
129 {0xf1, 0x54, 0x3d, 0xca, 0xfe, 0xb5, 0xef, 0x1c,
130 0x4f, 0xa6, 0x43, 0xf6, 0xe6, 0x48, 0x57, 0xf0,
131 0xee, 0x15, 0x7f, 0xe3, 0xe7, 0x2f, 0xd0, 0x2f,
132 0x11, 0x95, 0x7a, 0x17, 0x00, 0xab, 0xa7, 0x0b,
133 0xbe, 0x44, 0x09, 0x9c, 0xcd, 0xac, 0xa8, 0x52,
134 0xa1, 0x8e, 0x7b, 0x75, 0xbc, 0xa4, 0x92, 0x5a,
135 0xab, 0x46, 0xd3, 0x3a, 0xa0, 0xd5, 0x35, 0x1c,
136 0x55, 0xa4, 0xb3, 0xa8, 0x40, 0x81, 0xa5, 0x0b}, /* in */
137 {0x42, 0xe5, 0x28, 0x30, 0x31, 0xc2, 0xa0, 0x23,
138 0x68, 0x49, 0x4e, 0xb3, 0x24, 0x59, 0x92, 0x79,
139 0xc1, 0xa5, 0xcc, 0xe6, 0x76, 0x53, 0xb1, 0xcf,
140 0x20, 0x86, 0x23, 0xe8, 0x72, 0x55, 0x99, 0x92,
141 0x0d, 0x16, 0x1c, 0x5a, 0x2f, 0xce, 0xcb, 0x51,
142 0xe2, 0x67, 0xfa, 0x10, 0xec, 0xcd, 0x3d, 0x67,
143 0xa5, 0xe6, 0xf7, 0x31, 0x26, 0xb0, 0x0d, 0x76,
144 0x5e, 0x28, 0xdc, 0x7f, 0x01, 0xc5, 0xa5, 0x4c}, /* out */
145 32, 64, AES_ENCRYPT}, /* test vector 1 */
146
147 };
148
test_ige_vectors(int n)149 static int test_ige_vectors(int n)
150 {
151 const struct ige_test *const v = &ige_test_vectors[n];
152 AES_KEY key;
153 unsigned char buf[MAX_VECTOR_SIZE];
154 unsigned char iv[AES_BLOCK_SIZE * 2];
155 int testresult = 1;
156
157 if (!TEST_int_le(v->length, MAX_VECTOR_SIZE))
158 return 0;
159
160 if (v->encrypt == AES_ENCRYPT)
161 AES_set_encrypt_key(v->key, 8 * sizeof(v->key), &key);
162 else
163 AES_set_decrypt_key(v->key, 8 * sizeof(v->key), &key);
164 memcpy(iv, v->iv, sizeof(iv));
165 AES_ige_encrypt(v->in, buf, v->length, &key, iv, v->encrypt);
166
167 if (!TEST_mem_eq(v->out, v->length, buf, v->length)) {
168 TEST_info("IGE test vector %d failed", n);
169 test_output_memory("key", v->key, sizeof(v->key));
170 test_output_memory("iv", v->iv, sizeof(v->iv));
171 test_output_memory("in", v->in, v->length);
172 testresult = 0;
173 }
174
175 /* try with in == out */
176 memcpy(iv, v->iv, sizeof(iv));
177 memcpy(buf, v->in, v->length);
178 AES_ige_encrypt(buf, buf, v->length, &key, iv, v->encrypt);
179
180 if (!TEST_mem_eq(v->out, v->length, buf, v->length)) {
181 TEST_info("IGE test vector %d failed (with in == out)", n);
182 test_output_memory("key", v->key, sizeof(v->key));
183 test_output_memory("iv", v->iv, sizeof(v->iv));
184 test_output_memory("in", v->in, v->length);
185 testresult = 0;
186 }
187
188 return testresult;
189 }
190
test_bi_ige_vectors(int n)191 static int test_bi_ige_vectors(int n)
192 {
193 const struct bi_ige_test *const v = &bi_ige_test_vectors[n];
194 AES_KEY key1;
195 AES_KEY key2;
196 unsigned char buf[MAX_VECTOR_SIZE];
197
198 if (!TEST_int_le(v->length, MAX_VECTOR_SIZE))
199 return 0;
200
201 if (v->encrypt == AES_ENCRYPT) {
202 AES_set_encrypt_key(v->key1, 8 * v->keysize, &key1);
203 AES_set_encrypt_key(v->key2, 8 * v->keysize, &key2);
204 } else {
205 AES_set_decrypt_key(v->key1, 8 * v->keysize, &key1);
206 AES_set_decrypt_key(v->key2, 8 * v->keysize, &key2);
207 }
208
209 AES_bi_ige_encrypt(v->in, buf, v->length, &key1, &key2, v->iv,
210 v->encrypt);
211
212 if (!TEST_mem_eq(v->out, v->length, buf, v->length)) {
213 test_output_memory("key 1", v->key1, sizeof(v->key1));
214 test_output_memory("key 2", v->key2, sizeof(v->key2));
215 test_output_memory("iv", v->iv, sizeof(v->iv));
216 test_output_memory("in", v->in, v->length);
217 return 0;
218 }
219
220 return 1;
221 }
222
test_ige_enc_dec(void)223 static int test_ige_enc_dec(void)
224 {
225 AES_KEY key;
226 unsigned char iv[AES_BLOCK_SIZE * 4];
227 unsigned char ciphertext[BIG_TEST_SIZE];
228 unsigned char checktext[BIG_TEST_SIZE];
229
230 memcpy(iv, saved_iv, sizeof(iv));
231 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
232 AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, iv, AES_ENCRYPT);
233
234 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
235 memcpy(iv, saved_iv, sizeof(iv));
236 AES_ige_encrypt(ciphertext, checktext, TEST_SIZE, &key, iv, AES_DECRYPT);
237
238 return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
239 }
240
test_ige_enc_chaining(void)241 static int test_ige_enc_chaining(void)
242 {
243 AES_KEY key;
244 unsigned char iv[AES_BLOCK_SIZE * 4];
245 unsigned char ciphertext[BIG_TEST_SIZE];
246 unsigned char checktext[BIG_TEST_SIZE];
247
248 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
249 memcpy(iv, saved_iv, sizeof(iv));
250 AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE / 2, &key, iv,
251 AES_ENCRYPT);
252 AES_ige_encrypt(plaintext + TEST_SIZE / 2,
253 ciphertext + TEST_SIZE / 2, TEST_SIZE / 2,
254 &key, iv, AES_ENCRYPT);
255
256 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
257 memcpy(iv, saved_iv, sizeof(iv));
258 AES_ige_encrypt(ciphertext, checktext, TEST_SIZE, &key, iv, AES_DECRYPT);
259
260 return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
261 }
262
test_ige_dec_chaining(void)263 static int test_ige_dec_chaining(void)
264 {
265 AES_KEY key;
266 unsigned char iv[AES_BLOCK_SIZE * 4];
267 unsigned char ciphertext[BIG_TEST_SIZE];
268 unsigned char checktext[BIG_TEST_SIZE];
269
270 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
271 memcpy(iv, saved_iv, sizeof(iv));
272 AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE / 2, &key, iv,
273 AES_ENCRYPT);
274 AES_ige_encrypt(plaintext + TEST_SIZE / 2,
275 ciphertext + TEST_SIZE / 2, TEST_SIZE / 2,
276 &key, iv, AES_ENCRYPT);
277
278 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
279 memcpy(iv, saved_iv, sizeof(iv));
280 AES_ige_encrypt(ciphertext, checktext, TEST_SIZE / 2, &key, iv,
281 AES_DECRYPT);
282 AES_ige_encrypt(ciphertext + TEST_SIZE / 2,
283 checktext + TEST_SIZE / 2, TEST_SIZE / 2, &key, iv,
284 AES_DECRYPT);
285
286 return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
287 }
288
test_ige_garble_forwards(void)289 static int test_ige_garble_forwards(void)
290 {
291 AES_KEY key;
292 unsigned char iv[AES_BLOCK_SIZE * 4];
293 unsigned char ciphertext[BIG_TEST_SIZE];
294 unsigned char checktext[BIG_TEST_SIZE];
295 unsigned int n;
296 int testresult = 1;
297 const size_t ctsize = sizeof(checktext);
298 size_t matches;
299
300 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
301 memcpy(iv, saved_iv, sizeof(iv));
302 AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
303 AES_ENCRYPT);
304
305 /* corrupt halfway through */
306 ++ciphertext[sizeof(ciphertext) / 2];
307 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
308 memcpy(iv, saved_iv, sizeof(iv));
309 AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
310 AES_DECRYPT);
311
312 matches = 0;
313 for (n = 0; n < sizeof(checktext); ++n)
314 if (checktext[n] == plaintext[n])
315 ++matches;
316
317 /* Fail if there is more than 51% matching bytes */
318 if (!TEST_size_t_le(matches, ctsize / 2 + ctsize / 100))
319 testresult = 0;
320
321 /* Fail if the garble goes backwards */
322 if (!TEST_size_t_gt(matches, ctsize / 2))
323 testresult = 0;
324 return testresult;
325 }
326
test_bi_ige_enc_dec(void)327 static int test_bi_ige_enc_dec(void)
328 {
329 AES_KEY key, key2;
330 unsigned char iv[AES_BLOCK_SIZE * 4];
331 unsigned char ciphertext[BIG_TEST_SIZE];
332 unsigned char checktext[BIG_TEST_SIZE];
333
334 memcpy(iv, saved_iv, sizeof(iv));
335 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
336 AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
337 AES_bi_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, &key2, iv,
338 AES_ENCRYPT);
339
340 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
341 AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
342 AES_bi_ige_encrypt(ciphertext, checktext, TEST_SIZE, &key, &key2, iv,
343 AES_DECRYPT);
344
345 return TEST_mem_eq(checktext, TEST_SIZE, plaintext, TEST_SIZE);
346 }
347
test_bi_ige_garble1(void)348 static int test_bi_ige_garble1(void)
349 {
350 AES_KEY key, key2;
351 unsigned char iv[AES_BLOCK_SIZE * 4];
352 unsigned char ciphertext[BIG_TEST_SIZE];
353 unsigned char checktext[BIG_TEST_SIZE];
354 unsigned int n;
355 size_t matches;
356
357 memcpy(iv, saved_iv, sizeof(iv));
358 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
359 AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
360 AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
361 AES_ENCRYPT);
362
363 /* corrupt halfway through */
364 ++ciphertext[sizeof(ciphertext) / 2];
365 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
366 AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
367 AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
368 AES_DECRYPT);
369
370 matches = 0;
371 for (n = 0; n < sizeof(checktext); ++n)
372 if (checktext[n] == plaintext[n])
373 ++matches;
374
375 /* Fail if there is more than 1% matching bytes */
376 return TEST_size_t_le(matches, sizeof(checktext) / 100);
377 }
378
test_bi_ige_garble2(void)379 static int test_bi_ige_garble2(void)
380 {
381 AES_KEY key, key2;
382 unsigned char iv[AES_BLOCK_SIZE * 4];
383 unsigned char ciphertext[BIG_TEST_SIZE];
384 unsigned char checktext[BIG_TEST_SIZE];
385 unsigned int n;
386 size_t matches;
387
388 memcpy(iv, saved_iv, sizeof(iv));
389 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
390 AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
391 AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
392 AES_ENCRYPT);
393
394 /* corrupt right at the end */
395 ++ciphertext[sizeof(ciphertext) - 1];
396 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
397 AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
398 AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
399 AES_DECRYPT);
400
401 matches = 0;
402 for (n = 0; n < sizeof(checktext); ++n)
403 if (checktext[n] == plaintext[n])
404 ++matches;
405
406 /* Fail if there is more than 1% matching bytes */
407 return TEST_size_t_le(matches, sizeof(checktext) / 100);
408 }
409
test_bi_ige_garble3(void)410 static int test_bi_ige_garble3(void)
411 {
412 AES_KEY key, key2;
413 unsigned char iv[AES_BLOCK_SIZE * 4];
414 unsigned char ciphertext[BIG_TEST_SIZE];
415 unsigned char checktext[BIG_TEST_SIZE];
416 unsigned int n;
417 size_t matches;
418
419 memcpy(iv, saved_iv, sizeof(iv));
420 AES_set_encrypt_key(rkey, 8 * sizeof(rkey), &key);
421 AES_set_encrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
422 AES_ige_encrypt(plaintext, ciphertext, sizeof(plaintext), &key, iv,
423 AES_ENCRYPT);
424
425 /* corrupt right at the start */
426 ++ciphertext[0];
427 AES_set_decrypt_key(rkey, 8 * sizeof(rkey), &key);
428 AES_set_decrypt_key(rkey2, 8 * sizeof(rkey2), &key2);
429 AES_ige_encrypt(ciphertext, checktext, sizeof(checktext), &key, iv,
430 AES_DECRYPT);
431
432 matches = 0;
433 for (n = 0; n < sizeof(checktext); ++n)
434 if (checktext[n] == plaintext[n])
435 ++matches;
436
437 /* Fail if there is more than 1% matching bytes */
438 return TEST_size_t_le(matches, sizeof(checktext) / 100);
439 }
440 #endif
441
setup_tests(void)442 int setup_tests(void)
443 {
444 #ifndef OPENSSL_NO_DEPRECATED_3_0
445 RAND_bytes(rkey, sizeof(rkey));
446 RAND_bytes(rkey2, sizeof(rkey2));
447 RAND_bytes(plaintext, sizeof(plaintext));
448 RAND_bytes(saved_iv, sizeof(saved_iv));
449
450 ADD_TEST(test_ige_enc_dec);
451 ADD_TEST(test_ige_enc_chaining);
452 ADD_TEST(test_ige_dec_chaining);
453 ADD_TEST(test_ige_garble_forwards);
454 ADD_TEST(test_bi_ige_enc_dec);
455 ADD_TEST(test_bi_ige_garble1);
456 ADD_TEST(test_bi_ige_garble2);
457 ADD_TEST(test_bi_ige_garble3);
458 ADD_ALL_TESTS(test_ige_vectors, OSSL_NELEM(ige_test_vectors));
459 ADD_ALL_TESTS(test_bi_ige_vectors, OSSL_NELEM(bi_ige_test_vectors));
460 #endif
461 return 1;
462 }
463