3
|
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis |
|
2 * |
|
3 * LibTomCrypt is a library that provides various cryptographic |
|
4 * algorithms in a highly modular and flexible manner. |
|
5 * |
|
6 * The library is free for all purposes without any express |
|
7 * guarantee it works. |
|
8 * |
|
9 * Tom St Denis, [email protected], http://libtomcrypt.org |
|
10 */ |
|
11 /* OMAC1 Support by Tom St Denis (for 64 and 128 bit block ciphers only) */ |
|
12 #include "mycrypt.h" |
|
13 |
|
14 #ifdef OMAC |
|
15 |
|
16 int omac_test(void) |
|
17 { |
|
18 #if !defined(LTC_TEST) |
|
19 return CRYPT_NOP; |
|
20 #else |
|
21 static const struct { |
|
22 int keylen, msglen; |
|
23 unsigned char key[16], msg[64], tag[16]; |
|
24 } tests[] = { |
|
25 { 16, 0, |
|
26 { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, |
|
27 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, |
|
28 { 0x00 }, |
|
29 { 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, |
|
30 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 } |
|
31 }, |
|
32 { 16, 16, |
|
33 { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, |
|
34 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, |
|
35 { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, |
|
36 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a }, |
|
37 { 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, |
|
38 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c } |
|
39 }, |
|
40 { 16, 40, |
|
41 { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, |
|
42 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, |
|
43 { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, |
|
44 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, |
|
45 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, |
|
46 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, |
|
47 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11 }, |
|
48 { 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30, |
|
49 0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27 } |
|
50 }, |
|
51 { 16, 64, |
|
52 { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, |
|
53 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, |
|
54 { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, |
|
55 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, |
|
56 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, |
|
57 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, |
|
58 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, |
|
59 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, |
|
60 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, |
|
61 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }, |
|
62 { 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, |
|
63 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe } |
|
64 } |
|
65 |
|
66 }; |
|
67 unsigned char out[16]; |
143
|
68 int x, err, idx; |
3
|
69 unsigned long len; |
|
70 |
|
71 |
|
72 /* AES can be under rijndael or aes... try to find it */ |
|
73 if ((idx = find_cipher("aes")) == -1) { |
|
74 if ((idx = find_cipher("rijndael")) == -1) { |
|
75 return CRYPT_NOP; |
|
76 } |
|
77 } |
|
78 |
|
79 for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) { |
|
80 len = sizeof(out); |
|
81 if ((err = omac_memory(idx, tests[x].key, tests[x].keylen, tests[x].msg, tests[x].msglen, out, &len)) != CRYPT_OK) { |
|
82 return err; |
|
83 } |
|
84 |
|
85 if (memcmp(out, tests[x].tag, 16) != 0) { |
143
|
86 #if 0 |
|
87 int y; |
3
|
88 printf("\n\nTag: "); |
|
89 for (y = 0; y < 16; y++) printf("%02x", out[y]); printf("\n\n"); |
143
|
90 #endif |
3
|
91 return CRYPT_FAIL_TESTVECTOR; |
|
92 } |
|
93 } |
|
94 return CRYPT_OK; |
|
95 #endif |
|
96 } |
|
97 |
|
98 #endif |