4 #include "knuth-lfib.h"
6 /* Test with more data and inplace decryption, to check that the
7 * cbc_decrypt buffering works. */
8 #define CBC_BULK_DATA 0x2710 /* 10000 */
13 struct knuth_lfib_ctx random;
15 uint8_t clear[CBC_BULK_DATA];
17 uint8_t cipher[CBC_BULK_DATA + 1];
19 const uint8_t *key = H("966c7bf00bebe6dc 8abd37912384958a"
20 "743008105a08657d dcaad4128eee38b3");
22 const uint8_t *start_iv = H("11adbff119749103 207619cfa0e8d13a");
23 const uint8_t *end_iv = H("c7a42a569b421224 d0c23e52f46f97f5");
25 struct CBC_CTX(struct aes_ctx, AES_BLOCK_SIZE) aes;
27 knuth_lfib_init(&random, CBC_BULK_DATA);
28 knuth_lfib_random(&random, CBC_BULK_DATA, clear);
30 /* Byte that should not be overwritten */
31 cipher[CBC_BULK_DATA] = 17;
33 aes_set_encrypt_key(&aes.ctx, 32, key);
34 CBC_SET_IV(&aes, start_iv);
36 CBC_ENCRYPT(&aes, aes_encrypt, CBC_BULK_DATA, cipher, clear);
38 if (cipher[CBC_BULK_DATA] != 17)
43 printf("IV after bulk encryption: ");
44 print_hex(AES_BLOCK_SIZE, aes.iv);
48 if (!MEMEQ(AES_BLOCK_SIZE, aes.iv, end_iv))
51 /* Decrypt, in place */
52 aes_set_decrypt_key(&aes.ctx, 32, key);
53 CBC_SET_IV(&aes, start_iv);
54 CBC_DECRYPT(&aes, aes_decrypt, CBC_BULK_DATA, cipher, cipher);
56 if (cipher[CBC_BULK_DATA] != 17)
61 printf("IV after bulk decryption: ");
62 print_hex(AES_BLOCK_SIZE, aes.iv);
66 if (!MEMEQ(AES_BLOCK_SIZE, aes.iv, end_iv))
69 if (!MEMEQ(CBC_BULK_DATA, clear, cipher))
76 static const uint8_t msg[2 * AES_BLOCK_SIZE] = "Listen, I'll say this only once!";
78 /* Intermediate values:
79 * iv XOR first message block:
80 * "a5 ce 55 d4 21 15 a1 c6 4a a4 0c b2 ca a6 d1 37"
81 * First ciphertext block, c1:
82 * "1f 94 fc 85 f2 36 21 06 4a ea e3 c9 cc 38 01 0e"
83 * c1 XOR second message block:
84 * "3f e0 94 ec 81 16 4e 68 26 93 c3 a6 a2 5b 64 2f"
85 * Second ciphertext block, c1:
86 * "7b f6 5f c5 02 59 2e 71 af bf 34 87 c0 36 2a 16"
89 test_cipher_cbc(&nettle_aes256,
90 HL("8d ae 93 ff fc 78 c9 44"
91 "2a bd 0c 1e 68 bc a6 c7"
92 "05 c7 84 e3 5a a9 11 8b"
93 "d3 16 aa 54 9b 44 08 9e"),
94 2 * AES_BLOCK_SIZE, msg,
95 H("1f 94 fc 85 f2 36 21 06"
96 "4a ea e3 c9 cc 38 01 0e"
97 "7b f6 5f c5 02 59 2e 71"
98 "af bf 34 87 c0 36 2a 16"),
99 H("e9 a7 26 a0 44 7b 8d e6 03 83 60 de ea d5 b0 4e"));
101 /* From NIST spec 800-38a on AES modes.
103 * F.2 CBC Example Vectors
104 * F.2.1 CBC-AES128.Encrypt
107 /* Intermediate values, blocks input to AES:
109 * 6bc0bce12a459991e134741a7f9e1925
110 * d86421fb9f1a1eda505ee1375746972c
111 * 604ed7ddf32efdff7020d0238b7c2a5d
112 * 8521f2fd3c8eef2cdc3da7e5c44ea206
114 test_cipher_cbc(&nettle_aes128,
115 HL("2b7e151628aed2a6abf7158809cf4f3c"),
116 HL("6bc1bee22e409f96e93d7e117393172a"
117 "ae2d8a571e03ac9c9eb76fac45af8e51"
118 "30c81c46a35ce411e5fbc1191a0a52ef"
119 "f69f2445df4f9b17ad2b417be66c3710"),
120 H("7649abac8119b246cee98e9b12e9197d"
121 "5086cb9b507219ee95db113a917678b2"
122 "73bed6b8e3c1743b7116e69e22229516"
123 "3ff1caa1681fac09120eca307586e1a7"),
124 H("000102030405060708090a0b0c0d0e0f"));
126 /* F.2.3 CBC-AES192.Encrypt */
128 /* Intermediate values, blcoks input to AES:
130 * 6bc0bce12a459991e134741a7f9e1925
131 * e12f97e55dbfcfa1efcf7796da0fffb9
132 * 8411b1ef0e2109e5001cf96f256346b5
133 * a1840065cdb4e1f7d282fbd7db9d35f0
136 test_cipher_cbc(&nettle_aes192,
137 HL("8e73b0f7da0e6452c810f32b809079e5"
139 HL("6bc1bee22e409f96e93d7e117393172a"
140 "ae2d8a571e03ac9c9eb76fac45af8e51"
141 "30c81c46a35ce411e5fbc1191a0a52ef"
142 "f69f2445df4f9b17ad2b417be66c3710"),
143 H("4f021db243bc633d7178183a9fa071e8"
144 "b4d9ada9ad7dedf4e5e738763f69145a"
145 "571b242012fb7ae07fa9baac3df102e0"
146 "08b0e27988598881d920a9e64f5615cd"),
147 H("000102030405060708090a0b0c0d0e0f"));
149 /* F.2.5 CBC-AES256.Encrypt */
151 /* Intermediate values, blcoks input to AES:
153 * 6bc0bce12a459991e134741a7f9e1925
154 * 5ba1c653c8e65d26e929c4571ad47587
155 * ac3452d0dd87649c8264b662dc7a7e92
156 * cf6d172c769621d8081ba318e24f2371
159 test_cipher_cbc(&nettle_aes256,
160 HL("603deb1015ca71be2b73aef0857d7781"
161 "1f352c073b6108d72d9810a30914dff4"),
162 HL("6bc1bee22e409f96e93d7e117393172a"
163 "ae2d8a571e03ac9c9eb76fac45af8e51"
164 "30c81c46a35ce411e5fbc1191a0a52ef"
165 "f69f2445df4f9b17ad2b417be66c3710"),
166 H("f58c4c04d6e5f1ba779eabfb5f7bfbd6"
167 "9cfc4e967edb808d679f777bc6702c7d"
168 "39f23369a9d9bacfa530e26304231461"
169 "b2eb05e2c39be9fcda6c19078c6a9d1b"),
170 H("000102030405060708090a0b0c0d0e0f"));
179 000102030405060708090a0b0c0d0e0f
181 Plaintext 6bc1bee22e409f96e93d7e117393172a
182 Input Block 6bc0bce12a459991e134741a7f9e1925
183 Output Block 7649abac8119b246cee98e9b12e9197d
184 Ciphertext 7649abac8119b246cee98e9b12e9197d
186 Plaintext ae2d8a571e03ac9c9eb76fac45af8e51
187 Input Block d86421fb9f1a1eda505ee1375746972c
188 Output Block 5086cb9b507219ee95db113a917678b2
189 Ciphertext 5086cb9b507219ee95db113a917678b2
191 Plaintext 30c81c46a35ce411e5fbc1191a0a52ef
192 Input Block 604ed7ddf32efdff7020d0238b7c2a5d
193 Output Block 73bed6b8e3c1743b7116e69e22229516
194 Ciphertext 73bed6b8e3c1743b7116e69e22229516
196 Plaintext f69f2445df4f9b17ad2b417be66c3710
197 Input Block 8521f2fd3c8eef2cdc3da7e5c44ea206
198 Output Block 3ff1caa1681fac09120eca307586e1a7
199 Ciphertext 3ff1caa1681fac09120eca307586e1a7
200 F.2.2 CBC-AES128.Decrypt
202 2b7e151628aed2a6abf7158809cf4f3c
204 000102030405060708090a0b0c0d0e0f
206 Ciphertext 7649abac8119b246cee98e9b12e9197d
207 Input Block 7649abac8119b246cee98e9b12e9197d
208 Output Block 6bc0bce12a459991e134741a7f9e1925
209 Plaintext 6bc1bee22e409f96e93d7e117393172a
211 Ciphertext 5086cb9b507219ee95db113a917678b2
212 Input Block 5086cb9b507219ee95db113a917678b2
213 Output Block d86421fb9f1a1eda505ee1375746972c
214 Plaintext ae2d8a571e03ac9c9eb76fac45af8e51
216 Ciphertext 73bed6b8e3c1743b7116e69e22229516
217 Input Block 73bed6b8e3c1743b7116e69e22229516
218 Output Block 604ed7ddf32efdff7020d0238b7c2a5d
219 Plaintext 30c81c46a35ce411e5fbc1191a0a52ef
221 Ciphertext 3ff1caa1681fac09120eca307586e1a7
222 Input Block 3ff1caa1681fac09120eca307586e1a7
225 Output Block 8521f2fd3c8eef2cdc3da7e5c44ea206
226 Plaintext f69f2445df4f9b17ad2b417be66c3710
227 F.2.3 CBC-AES192.Encrypt
229 8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b
231 000102030405060708090a0b0c0d0e0f
233 Plaintext 6bc1bee22e409f96e93d7e117393172a
234 Input Block 6bc0bce12a459991e134741a7f9e1925
235 Output Block 4f021db243bc633d7178183a9fa071e8
236 Ciphertext 4f021db243bc633d7178183a9fa071e8
238 Plaintext ae2d8a571e03ac9c9eb76fac45af8e51
239 Input Block e12f97e55dbfcfa1efcf7796da0fffb9
240 Output Block b4d9ada9ad7dedf4e5e738763f69145a
241 Ciphertext b4d9ada9ad7dedf4e5e738763f69145a
243 Plaintext 30c81c46a35ce411e5fbc1191a0a52ef
244 Input Block 8411b1ef0e2109e5001cf96f256346b5
245 Output Block 571b242012fb7ae07fa9baac3df102e0
246 Ciphertext 571b242012fb7ae07fa9baac3df102e0
248 Plaintext f69f2445df4f9b17ad2b417be66c3710
249 Input Block a1840065cdb4e1f7d282fbd7db9d35f0
250 Output Block 08b0e27988598881d920a9e64f5615cd
251 Ciphertext 08b0e27988598881d920a9e64f5615cd
252 F.2.4 CBC-AES192.Decrypt
254 8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b
256 000102030405060708090a0b0c0d0e0f
258 Ciphertext 4f021db243bc633d7178183a9fa071e8
259 Input Block 4f021db243bc633d7178183a9fa071e8
260 Output Block 6bc0bce12a459991e134741a7f9e1925
261 Plaintext 6bc1bee22e409f96e93d7e117393172a
263 Ciphertext b4d9ada9ad7dedf4e5e738763f69145a
264 Input Block b4d9ada9ad7dedf4e5e738763f69145a
265 Output Block e12f97e55dbfcfa1efcf7796da0fffb9
266 Plaintext ae2d8a571e03ac9c9eb76fac45af8e51
268 Ciphertext 571b242012fb7ae07fa9baac3df102e0
269 Input Block 571b242012fb7ae07fa9baac3df102e0
270 Output Block 8411b1ef0e2109e5001cf96f256346b5
271 Plaintext 30c81c46a35ce411e5fbc1191a0a52ef
273 Ciphertext 08b0e27988598881d920a9e64f5615cd
274 Input Block 08b0e27988598881d920a9e64f5615cd
275 Output Block a1840065cdb4e1f7d282fbd7db9d35f0
276 Plaintext f69f2445df4f9b17ad2b417be66c3710
277 F.2.5 CBC-AES256.Encrypt
279 603deb1015ca71be2b73aef0857d7781
280 1f352c073b6108d72d9810a30914dff4
282 000102030405060708090a0b0c0d0e0f
284 Plaintext 6bc1bee22e409f96e93d7e117393172a
285 Input Block 6bc0bce12a459991e134741a7f9e1925
286 Output Block f58c4c04d6e5f1ba779eabfb5f7bfbd6
287 Ciphertext f58c4c04d6e5f1ba779eabfb5f7bfbd6
289 Plaintext ae2d8a571e03ac9c9eb76fac45af8e51
290 Input Block 5ba1c653c8e65d26e929c4571ad47587
291 Output Block 9cfc4e967edb808d679f777bc6702c7d
292 Ciphertext 9cfc4e967edb808d679f777bc6702c7d
294 Plaintext 30c81c46a35ce411e5fbc1191a0a52ef
295 Input Block ac3452d0dd87649c8264b662dc7a7e92
296 Output Block 39f23369a9d9bacfa530e26304231461
297 Ciphertext 39f23369a9d9bacfa530e26304231461
299 Plaintext f69f2445df4f9b17ad2b417be66c3710
300 Input Block cf6d172c769621d8081ba318e24f2371
301 Output Block b2eb05e2c39be9fcda6c19078c6a9d1b
302 Ciphertext b2eb05e2c39be9fcda6c19078c6a9d1b
303 F.2.6 CBC-AES256.Decrypt
305 603deb1015ca71be2b73aef0857d7781
306 1f352c073b6108d72d9810a30914dff4
308 000102030405060708090a0b0c0d0e0f
310 Ciphertext f58c4c04d6e5f1ba779eabfb5f7bfbd6
311 Input Block f58c4c04d6e5f1ba779eabfb5f7bfbd6
312 Output Block 6bc0bce12a459991e134741a7f9e1925
313 Plaintext 6bc1bee22e409f96e93d7e117393172a
315 Ciphertext 9cfc4e967edb808d679f777bc6702c7d
316 Input Block 9cfc4e967edb808d679f777bc6702c7d
317 Output Block 5ba1c653c8e65d26e929c4571ad47587
318 Plaintext ae2d8a571e03ac9c9eb76fac45af8e51
320 Ciphertext 39f23369a9d9bacfa530e26304231461
321 Input Block 39f23369a9d9bacfa530e26304231461
322 Output Block ac3452d0dd87649c8264b662dc7a7e92
323 Plaintext 30c81c46a35ce411e5fbc1191a0a52ef
325 Ciphertext b2eb05e2c39be9fcda6c19078c6a9d1b
326 Input Block b2eb05e2c39be9fcda6c19078c6a9d1b
327 Output Block cf6d172c769621d8081ba318e24f2371
328 Plaintext f69f2445df4f9b17ad2b417be66c3710