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
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