]> gitweb.ps.run Git - matrix_esp_thesis/blob - ext/olm/lib/crypto-algorithms/aes_test.c
changes to olm and esp
[matrix_esp_thesis] / ext / olm / lib / crypto-algorithms / aes_test.c
1 /*********************************************************************\r
2 * Filename:   aes_test.c\r
3 * Author:     Brad Conte (brad AT bradconte.com)\r
4 * Copyright:\r
5 * Disclaimer: This code is presented "as is" without any guarantees.\r
6 * Details:    Performs known-answer tests on the corresponding AES\r
7               implementation. These tests do not encompass the full\r
8               range of available test vectors and are not sufficient\r
9               for FIPS-140 certification. However, if the tests pass\r
10               it is very, very likely that the code is correct and was\r
11               compiled properly. This code also serves as\r
12                   example usage of the functions.\r
13 *********************************************************************/\r
14 \r
15 /*************************** HEADER FILES ***************************/\r
16 #include <stdio.h>\r
17 #include <memory.h>\r
18 #include "aes.h"\r
19 \r
20 /*********************** FUNCTION DEFINITIONS ***********************/\r
21 void print_hex(BYTE str[], int len)\r
22 {\r
23         int idx;\r
24 \r
25         for(idx = 0; idx < len; idx++)\r
26                 printf("%02x", str[idx]);\r
27 }\r
28 \r
29 int aes_ecb_test()\r
30 {\r
31         WORD key_schedule[60], idx;\r
32         BYTE enc_buf[128];\r
33         BYTE plaintext[2][16] = {\r
34                 {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a},\r
35                 {0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51}\r
36         };\r
37         BYTE ciphertext[2][16] = {\r
38                 {0xf3,0xee,0xd1,0xbd,0xb5,0xd2,0xa0,0x3c,0x06,0x4b,0x5a,0x7e,0x3d,0xb1,0x81,0xf8},\r
39                 {0x59,0x1c,0xcb,0x10,0xd4,0x10,0xed,0x26,0xdc,0x5b,0xa7,0x4a,0x31,0x36,0x28,0x70}\r
40         };\r
41         BYTE key[1][32] = {\r
42                 {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4}\r
43         };\r
44         int pass = 1;\r
45 \r
46         // Raw ECB mode.\r
47         //printf("* ECB mode:\n");\r
48         aes_key_setup(key[0], key_schedule, 256);\r
49         //printf(  "Key          : ");\r
50         //print_hex(key[0], 32);\r
51 \r
52         for(idx = 0; idx < 2; idx++) {\r
53                 aes_encrypt(plaintext[idx], enc_buf, key_schedule, 256);\r
54                 //printf("\nPlaintext    : ");\r
55                 //print_hex(plaintext[idx], 16);\r
56                 //printf("\n-encrypted to: ");\r
57                 //print_hex(enc_buf, 16);\r
58                 pass = pass && !memcmp(enc_buf, ciphertext[idx], 16);\r
59 \r
60                 aes_decrypt(ciphertext[idx], enc_buf, key_schedule, 256);\r
61                 //printf("\nCiphertext   : ");\r
62                 //print_hex(ciphertext[idx], 16);\r
63                 //printf("\n-decrypted to: ");\r
64                 //print_hex(enc_buf, 16);\r
65                 pass = pass && !memcmp(enc_buf, plaintext[idx], 16);\r
66 \r
67                 //printf("\n\n");\r
68         }\r
69 \r
70         return(pass);\r
71 }\r
72 \r
73 int aes_cbc_test()\r
74 {\r
75         WORD key_schedule[60];\r
76         BYTE enc_buf[128];\r
77         BYTE plaintext[1][32] = {\r
78                 {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51}\r
79         };\r
80         BYTE ciphertext[2][32] = {\r
81                 {0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba,0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6,0x9c,0xfc,0x4e,0x96,0x7e,0xdb,0x80,0x8d,0x67,0x9f,0x77,0x7b,0xc6,0x70,0x2c,0x7d}\r
82         };\r
83         BYTE iv[1][16] = {\r
84                 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}\r
85         };\r
86         BYTE key[1][32] = {\r
87                 {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4}\r
88         };\r
89         int pass = 1;\r
90 \r
91         //printf("* CBC mode:\n");\r
92         aes_key_setup(key[0], key_schedule, 256);\r
93 \r
94         //printf(  "Key          : ");\r
95         //print_hex(key[0], 32);\r
96         //printf("\nIV           : ");\r
97         //print_hex(iv[0], 16);\r
98 \r
99         aes_encrypt_cbc(plaintext[0], 32, enc_buf, key_schedule, 256, iv[0]);\r
100         //printf("\nPlaintext    : ");\r
101         //print_hex(plaintext[0], 32);\r
102         //printf("\n-encrypted to: ");\r
103         //print_hex(enc_buf, 32);\r
104         //printf("\nCiphertext   : ");\r
105         //print_hex(ciphertext[0], 32);\r
106         pass = pass && !memcmp(enc_buf, ciphertext[0], 32);\r
107 \r
108         //printf("\n\n");\r
109         return(pass);\r
110 }\r
111 \r
112 int aes_ctr_test()\r
113 {\r
114         WORD key_schedule[60];\r
115         BYTE enc_buf[128];\r
116         BYTE plaintext[1][32] = {\r
117                 {0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51}\r
118         };\r
119         BYTE ciphertext[1][32] = {\r
120                 {0x60,0x1e,0xc3,0x13,0x77,0x57,0x89,0xa5,0xb7,0xa7,0xf5,0x04,0xbb,0xf3,0xd2,0x28,0xf4,0x43,0xe3,0xca,0x4d,0x62,0xb5,0x9a,0xca,0x84,0xe9,0x90,0xca,0xca,0xf5,0xc5}\r
121         };\r
122         BYTE iv[1][16] = {\r
123                 {0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff},\r
124         };\r
125         BYTE key[1][32] = {\r
126                 {0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4}\r
127         };\r
128         int pass = 1;\r
129 \r
130         //printf("* CTR mode:\n");\r
131         aes_key_setup(key[0], key_schedule, 256);\r
132 \r
133         //printf(  "Key          : ");\r
134         //print_hex(key[0], 32);\r
135         //printf("\nIV           : ");\r
136         //print_hex(iv[0], 16);\r
137 \r
138         aes_encrypt_ctr(plaintext[0], 32, enc_buf, key_schedule, 256, iv[0]);\r
139         //printf("\nPlaintext    : ");\r
140         //print_hex(plaintext[0], 32);\r
141         //printf("\n-encrypted to: ");\r
142         //print_hex(enc_buf, 32);\r
143         pass = pass && !memcmp(enc_buf, ciphertext[0], 32);\r
144 \r
145         aes_decrypt_ctr(ciphertext[0], 32, enc_buf, key_schedule, 256, iv[0]);\r
146         //printf("\nCiphertext   : ");\r
147         //print_hex(ciphertext[0], 32);\r
148         //printf("\n-decrypted to: ");\r
149         //print_hex(enc_buf, 32);\r
150         pass = pass && !memcmp(enc_buf, plaintext[0], 32);\r
151 \r
152         //printf("\n\n");\r
153         return(pass);\r
154 }\r
155 \r
156 int aes_ccm_test()\r
157 {\r
158         int mac_auth;\r
159         WORD enc_buf_len;\r
160         BYTE enc_buf[128];\r
161         BYTE plaintext[3][32] = {\r
162                 {0x20,0x21,0x22,0x23},\r
163                 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f},\r
164                 {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37}\r
165         };\r
166         BYTE assoc[3][32] = {\r
167                 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07},\r
168                 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f},\r
169                 {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13}\r
170         };\r
171         BYTE ciphertext[3][32 + 16] = {\r
172                 {0x71,0x62,0x01,0x5b,0x4d,0xac,0x25,0x5d},\r
173                 {0xd2,0xa1,0xf0,0xe0,0x51,0xea,0x5f,0x62,0x08,0x1a,0x77,0x92,0x07,0x3d,0x59,0x3d,0x1f,0xc6,0x4f,0xbf,0xac,0xcd},\r
174                 {0xe3,0xb2,0x01,0xa9,0xf5,0xb7,0x1a,0x7a,0x9b,0x1c,0xea,0xec,0xcd,0x97,0xe7,0x0b,0x61,0x76,0xaa,0xd9,0xa4,0x42,0x8a,0xa5,0x48,0x43,0x92,0xfb,0xc1,0xb0,0x99,0x51}\r
175         };\r
176         BYTE iv[3][16] = {\r
177                 {0x10,0x11,0x12,0x13,0x14,0x15,0x16},\r
178                 {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17},\r
179                 {0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b}\r
180         };\r
181         BYTE key[1][32] = {\r
182                 {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f}\r
183         };\r
184         int pass = 1;\r
185 \r
186         //printf("* CCM mode:\n");\r
187         //printf("Key           : ");\r
188         //print_hex(key[0], 16);\r
189 \r
190         //print_hex(plaintext[0], 4);\r
191         //print_hex(assoc[0], 8);\r
192         //print_hex(ciphertext[0], 8);\r
193         //print_hex(iv[0], 7);\r
194         //print_hex(key[0], 16);\r
195 \r
196         aes_encrypt_ccm(plaintext[0], 4, assoc[0], 8, iv[0], 7, enc_buf, &enc_buf_len, 4, key[0], 128);\r
197         //printf("\nNONCE        : ");\r
198         //print_hex(iv[0], 7);\r
199         //printf("\nAssoc. Data  : ");\r
200         //print_hex(assoc[0], 8);\r
201         //printf("\nPayload       : ");\r
202         //print_hex(plaintext[0], 4);\r
203         //printf("\n-encrypted to: ");\r
204         //print_hex(enc_buf, enc_buf_len);\r
205         pass = pass && !memcmp(enc_buf, ciphertext[0], enc_buf_len);\r
206 \r
207         aes_decrypt_ccm(ciphertext[0], 8, assoc[0], 8, iv[0], 7, enc_buf, &enc_buf_len, 4, &mac_auth, key[0], 128);\r
208         //printf("\n-Ciphertext  : ");\r
209         //print_hex(ciphertext[0], 8);\r
210         //printf("\n-decrypted to: ");\r
211         //print_hex(enc_buf, enc_buf_len);\r
212         //printf("\nAuthenticated: %d ", mac_auth);\r
213         pass = pass && !memcmp(enc_buf, plaintext[0], enc_buf_len) && mac_auth;\r
214 \r
215 \r
216         aes_encrypt_ccm(plaintext[1], 16, assoc[1], 16, iv[1], 8, enc_buf, &enc_buf_len, 6, key[0], 128);\r
217         //printf("\n\nNONCE        : ");\r
218         //print_hex(iv[1], 8);\r
219         //printf("\nAssoc. Data  : ");\r
220         //print_hex(assoc[1], 16);\r
221         //printf("\nPayload      : ");\r
222         //print_hex(plaintext[1], 16);\r
223         //printf("\n-encrypted to: ");\r
224         //print_hex(enc_buf, enc_buf_len);\r
225         pass = pass && !memcmp(enc_buf, ciphertext[1], enc_buf_len);\r
226 \r
227         aes_decrypt_ccm(ciphertext[1], 22, assoc[1], 16, iv[1], 8, enc_buf, &enc_buf_len, 6, &mac_auth, key[0], 128);\r
228         //printf("\n-Ciphertext  : ");\r
229         //print_hex(ciphertext[1], 22);\r
230         //printf("\n-decrypted to: ");\r
231         //print_hex(enc_buf, enc_buf_len);\r
232         //printf("\nAuthenticated: %d ", mac_auth);\r
233         pass = pass && !memcmp(enc_buf, plaintext[1], enc_buf_len) && mac_auth;\r
234 \r
235 \r
236         aes_encrypt_ccm(plaintext[2], 24, assoc[2], 20, iv[2], 12, enc_buf, &enc_buf_len, 8, key[0], 128);\r
237         //printf("\n\nNONCE        : ");\r
238         //print_hex(iv[2], 12);\r
239         //printf("\nAssoc. Data  : ");\r
240         //print_hex(assoc[2], 20);\r
241         //printf("\nPayload      : ");\r
242         //print_hex(plaintext[2], 24);\r
243         //printf("\n-encrypted to: ");\r
244         //print_hex(enc_buf, enc_buf_len);\r
245         pass = pass && !memcmp(enc_buf, ciphertext[2], enc_buf_len);\r
246 \r
247         aes_decrypt_ccm(ciphertext[2], 32, assoc[2], 20, iv[2], 12, enc_buf, &enc_buf_len, 8, &mac_auth, key[0], 128);\r
248         //printf("\n-Ciphertext  : ");\r
249         //print_hex(ciphertext[2], 32);\r
250         //printf("\n-decrypted to: ");\r
251         //print_hex(enc_buf, enc_buf_len);\r
252         //printf("\nAuthenticated: %d ", mac_auth);\r
253         pass = pass && !memcmp(enc_buf, plaintext[2], enc_buf_len) && mac_auth;\r
254 \r
255         //printf("\n\n");\r
256         return(pass);\r
257 }\r
258 \r
259 int aes_test()\r
260 {\r
261         int pass = 1;\r
262 \r
263         pass = pass && aes_ecb_test();\r
264         pass = pass && aes_cbc_test();\r
265         pass = pass && aes_ctr_test();\r
266         pass = pass && aes_ccm_test();\r
267 \r
268         return(pass);\r
269 }\r
270 \r
271 int main(int argc, char *argv[])\r
272 {\r
273         printf("AES Tests: %s\n", aes_test() ? "SUCCEEDED" : "FAILED");\r
274 \r
275         return(0);\r
276 }\r