59 #define BIG_TEST_SIZE 10240
61 static void hexdump(FILE *
f,
const char *title,
const unsigned char *s,
int l)
65 fprintf(f,
"%s",title);
69 fprintf(f,
"\n%04x",n);
70 fprintf(f,
" %02x",s[n]);
75 #define MAX_VECTOR_SIZE 64
79 const unsigned char key[16];
80 const unsigned char iv[32];
87 static struct ige_test const ige_test_vectors[] = {
88 { { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
89 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
90 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
91 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
92 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
93 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
94 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
98 { 0x1a, 0x85, 0x19, 0xa6, 0x55, 0x7b, 0xe6, 0x52,
99 0xe9, 0xda, 0x8e, 0x43, 0xda, 0x4e, 0xf4, 0x45,
100 0x3c, 0xf4, 0x56, 0xb4, 0xca, 0x48, 0x8a, 0xa3,
101 0x83, 0xc7, 0x9c, 0x98, 0xb3, 0x47, 0x97, 0xcb },
104 { { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
105 0x61, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65 },
106 { 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
107 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x47, 0x45,
108 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f,
109 0x72, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x53 },
110 { 0x4c, 0x2e, 0x20, 0x4c, 0x65, 0x74, 0x27, 0x73,
111 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x42, 0x65,
112 0x6e, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x69, 0x74,
113 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x21, 0x0a },
114 { 0x99, 0x70, 0x64, 0x87, 0xa1, 0xcd, 0xe6, 0x13,
115 0xbc, 0x6d, 0xe0, 0xb6, 0xf2, 0x4b, 0x1c, 0x7a,
116 0xa4, 0x48, 0xc8, 0xb9, 0xc3, 0x40, 0x3e, 0x34,
117 0x67, 0xa8, 0xca, 0xd8, 0x93, 0x40, 0xf5, 0x3b },
125 const unsigned char iv[64];
133 static struct bi_ige_test const bi_ige_test_vectors[] = {
134 { { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
135 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
136 { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
137 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
138 { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
139 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
140 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
141 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
142 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
143 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
144 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
145 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f },
146 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
150 { 0x14, 0x40, 0x6f, 0xae, 0xa2, 0x79, 0xf2, 0x56,
151 0x1f, 0x86, 0xeb, 0x3b, 0x7d, 0xff, 0x53, 0xdc,
152 0x4e, 0x27, 0x0c, 0x03, 0xde, 0x7c, 0xe5, 0x16,
153 0x6a, 0x9c, 0x20, 0x33, 0x9d, 0x33, 0xfe, 0x12 },
155 { { 0x58, 0x0a, 0x06, 0xe9, 0x97, 0x07, 0x59, 0x5c,
156 0x9e, 0x19, 0xd2, 0xa7, 0xbb, 0x40, 0x2b, 0x7a,
157 0xc7, 0xd8, 0x11, 0x9e, 0x4c, 0x51, 0x35, 0x75,
158 0x64, 0x28, 0x0f, 0x23, 0xad, 0x74, 0xac, 0x37 },
159 { 0xd1, 0x80, 0xa0, 0x31, 0x47, 0xa3, 0x11, 0x13,
160 0x86, 0x26, 0x9e, 0x6d, 0xff, 0xaf, 0x72, 0x74,
161 0x5b, 0xa2, 0x35, 0x81, 0xd2, 0xa6, 0x3d, 0x21,
162 0x67, 0x7b, 0x58, 0xa8, 0x18, 0xf9, 0x72, 0xe4 },
163 { 0x80, 0x3d, 0xbd, 0x4c, 0xe6, 0x7b, 0x06, 0xa9,
164 0x53, 0x35, 0xd5, 0x7e, 0x71, 0xc1, 0x70, 0x70,
165 0x74, 0x9a, 0x00, 0x28, 0x0c, 0xbf, 0x6c, 0x42,
166 0x9b, 0xa4, 0xdd, 0x65, 0x11, 0x77, 0x7c, 0x67,
167 0xfe, 0x76, 0x0a, 0xf0, 0xd5, 0xc6, 0x6e, 0x6a,
168 0xe7, 0x5e, 0x4c, 0xf2, 0x7e, 0x9e, 0xf9, 0x20,
169 0x0e, 0x54, 0x6f, 0x2d, 0x8a, 0x8d, 0x7e, 0xbd,
170 0x48, 0x79, 0x37, 0x99, 0xff, 0x27, 0x93, 0xa3 },
171 { 0xf1, 0x54, 0x3d, 0xca, 0xfe, 0xb5, 0xef, 0x1c,
172 0x4f, 0xa6, 0x43, 0xf6, 0xe6, 0x48, 0x57, 0xf0,
173 0xee, 0x15, 0x7f, 0xe3, 0xe7, 0x2f, 0xd0, 0x2f,
174 0x11, 0x95, 0x7a, 0x17, 0x00, 0xab, 0xa7, 0x0b,
175 0xbe, 0x44, 0x09, 0x9c, 0xcd, 0xac, 0xa8, 0x52,
176 0xa1, 0x8e, 0x7b, 0x75, 0xbc, 0xa4, 0x92, 0x5a,
177 0xab, 0x46, 0xd3, 0x3a, 0xa0, 0xd5, 0x35, 0x1c,
178 0x55, 0xa4, 0xb3, 0xa8, 0x40, 0x81, 0xa5, 0x0b},
179 { 0x42, 0xe5, 0x28, 0x30, 0x31, 0xc2, 0xa0, 0x23,
180 0x68, 0x49, 0x4e, 0xb3, 0x24, 0x59, 0x92, 0x79,
181 0xc1, 0xa5, 0xcc, 0xe6, 0x76, 0x53, 0xb1, 0xcf,
182 0x20, 0x86, 0x23, 0xe8, 0x72, 0x55, 0x99, 0x92,
183 0x0d, 0x16, 0x1c, 0x5a, 0x2f, 0xce, 0xcb, 0x51,
184 0xe2, 0x67, 0xfa, 0x10, 0xec, 0xcd, 0x3d, 0x67,
185 0xa5, 0xe6, 0xf7, 0x31, 0x26, 0xb0, 0x0d, 0x76,
186 0x5e, 0x28, 0xdc, 0x7f, 0x01, 0xc5, 0xa5, 0x4c},
191 static int run_test_vectors(
void)
196 for(n=0 ; n <
sizeof(ige_test_vectors)/
sizeof(ige_test_vectors[0]) ; ++n)
198 const struct ige_test *
const v = &ige_test_vectors[n];
209 memcpy(iv, v->
iv,
sizeof iv);
214 printf(
"IGE test vector %d failed\n", n);
215 hexdump(stdout,
"key", v->
key,
sizeof v->
key);
216 hexdump(stdout,
"iv", v->
iv,
sizeof v->
iv);
217 hexdump(stdout,
"in", v->
in, v->
length);
218 hexdump(stdout,
"expected", v->
out, v->
length);
219 hexdump(stdout,
"got", buf, v->
length);
225 memcpy(iv, v->
iv,
sizeof iv);
231 printf(
"IGE test vector %d failed (with in == out)\n", n);
232 hexdump(stdout,
"key", v->
key,
sizeof v->
key);
233 hexdump(stdout,
"iv", v->
iv,
sizeof v->
iv);
234 hexdump(stdout,
"in", v->
in, v->
length);
235 hexdump(stdout,
"expected", v->
out, v->
length);
236 hexdump(stdout,
"got", buf, v->
length);
242 for(n=0 ; n <
sizeof(bi_ige_test_vectors)/
sizeof(bi_ige_test_vectors[0])
245 const struct bi_ige_test *
const v = &bi_ige_test_vectors[n];
268 printf(
"Bidirectional IGE test vector %d failed\n", n);
269 hexdump(stdout,
"key 1", v->
key1,
sizeof v->
key1);
270 hexdump(stdout,
"key 2", v->
key2,
sizeof v->
key2);
271 hexdump(stdout,
"iv", v->
iv,
sizeof v->
iv);
272 hexdump(stdout,
"in", v->
in, v->
length);
273 hexdump(stdout,
"expected", v->
out, v->
length);
274 hexdump(stdout,
"got", buf, v->
length);
283 int main(
int argc,
char **argv)
285 unsigned char rkey[16];
286 unsigned char rkey2[16];
303 memcpy(saved_iv, iv,
sizeof saved_iv);
313 memcpy(iv, saved_iv,
sizeof iv);
317 if(memcmp(checktext, plaintext,
TEST_SIZE))
319 printf(
"Encrypt+decrypt doesn't match\n");
320 hexdump(stdout,
"Plaintext", plaintext,
TEST_SIZE);
321 hexdump(stdout,
"Checktext", checktext,
TEST_SIZE);
327 memcpy(iv, saved_iv,
sizeof iv);
335 memcpy(iv, saved_iv,
sizeof iv);
339 if(memcmp(checktext, plaintext,
TEST_SIZE))
341 printf(
"Chained encrypt+decrypt doesn't match\n");
342 hexdump(stdout,
"Plaintext", plaintext,
TEST_SIZE);
343 hexdump(stdout,
"Checktext", checktext,
TEST_SIZE);
349 memcpy(iv, saved_iv,
sizeof iv);
357 memcpy(iv, saved_iv,
sizeof iv);
364 if(memcmp(checktext, plaintext,
TEST_SIZE))
366 printf(
"Chained encrypt+chained decrypt doesn't match\n");
367 hexdump(stdout,
"Plaintext", plaintext,
TEST_SIZE);
368 hexdump(stdout,
"Checktext", checktext,
TEST_SIZE);
374 memcpy(iv, saved_iv,
sizeof iv);
379 ++ciphertext[
sizeof ciphertext/2];
381 memcpy(iv, saved_iv,
sizeof iv);
386 for(n=0 ; n <
sizeof checktext ; ++n)
387 if(checktext[n] == plaintext[n])
390 if(matches >
sizeof checktext/2+
sizeof checktext/100)
392 printf(
"More than 51%% matches after garbling\n");
396 if(matches <
sizeof checktext/2)
398 printf(
"Garble extends backwards!\n");
420 if(memcmp(checktext, plaintext,
TEST_SIZE))
422 printf(
"Encrypt+decrypt doesn't match\n");
423 hexdump(stdout,
"Plaintext", plaintext,
TEST_SIZE);
424 hexdump(stdout,
"Checktext", checktext,
TEST_SIZE);
435 ++ciphertext[
sizeof ciphertext/2];
442 for(n=0 ; n <
sizeof checktext ; ++n)
443 if(checktext[n] == plaintext[n])
446 if(matches >
sizeof checktext/100)
448 printf(
"More than 1%% matches after bidirectional garbling\n");
459 ++ciphertext[
sizeof ciphertext-1];
466 for(n=0 ; n <
sizeof checktext ; ++n)
467 if(checktext[n] == plaintext[n])
470 if(matches >
sizeof checktext/100)
472 printf(
"More than 1%% matches after bidirectional garbling (2)\n");
490 for(n=0 ; n <
sizeof checktext ; ++n)
491 if(checktext[n] == plaintext[n])
494 if(matches >
sizeof checktext/100)
496 printf(
"More than 1%% matches after bidirectional garbling (3)\n");
500 err += run_test_vectors();