1#![allow(missing_docs)]
10#![allow(unused_must_use)]
11#![allow(dead_code)]
12#![allow(unused_imports)]
13#![allow(non_snake_case)]
14
15
16pub fn main()
17{
18 aes_encrypt_ofb();
19 aes_encrypt_ofb_into_vec();
20 aes_encrypt_ofb_into_array();
21 aes_encrypt_str_ofb();
22 aes_encrypt_str_ofb_into_vec();
23 aes_encrypt_str_ofb_into_array();
24 aes_encrypt_string_ofb();
25 aes_encrypt_string_ofb_into_vec();
26 aes_encrypt_string_ofb_into_array();
27 aes_encrypt_vec_ofb();
28 aes_encrypt_vec_ofb_into_vec();
29 aes_encrypt_vec_ofb_into_array();
30 aes_encrypt_array_ofb();
31 aes_encrypt_array_ofb_into_vec();
32 aes_encrypt_array_ofb_into_array();
33
34 aes_decrypt_ofb();
35 aes_decrypt_ofb_into_vec();
36 aes_decrypt_ofb_into_array();
37 aes_decrypt_ofb_into_string();
38 aes_decrypt_vec_ofb();
39 aes_decrypt_vec_ofb_into_vec();
40 aes_decrypt_vec_ofb_into_array();
41 aes_decrypt_vec_ofb_into_string();
42 aes_decrypt_array_ofb();
43 aes_decrypt_array_ofb_into_vec();
44 aes_decrypt_array_ofb_into_array();
45 aes_decrypt_array_ofb_into_string();
46}
47
48fn aes_encrypt_ofb()
49{
50 println!("aes_encrypt_ofb");
51 use std::io::Write;
52 use std::fmt::Write as _;
53 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
54
55 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
57 println!("K =\t{:#016X}", key);
58 let mut a_aes = AES_128::new_with_key_u128(key);
59 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
60 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
61
62 let message = "In the beginning God created the heavens and the earth.";
63 println!("M =\t{}", message);
64 let mut cipher = [0_u8; 55];
65 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
66 print!("C =\t");
67 for c in cipher.clone()
68 { print!("{:02X} ", c); }
69 println!();
70 let mut txt = String::new();
71 for c in cipher.clone()
72 { write!(txt, "{:02X} ", c); }
73 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
74 println!();
75
76 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
78 print!("K =\t");
79 for i in 0..24
80 { print!("{:02X}", key[i]); }
81 println!();
82 let mut a_aes = AES_192::new_with_key(&key);
83 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
84 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
85
86 let message = "In the beginning God created the heavens and the earth.";
87 println!("M =\t{}", message);
88 let mut cipher = [0_u8; 55];
89 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
90 print!("C =\t");
91 for c in cipher.clone()
92 { print!("{:02X} ", c); }
93 println!();
94 let mut txt = String::new();
95 for c in cipher.clone()
96 { write!(txt, "{:02X} ", c); }
97 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
98 println!();
99
100 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
102 print!("K =\t");
103 for i in 0..32
104 { print!("{:02X}", key[i]); }
105 println!();
106 let mut a_aes = AES_256::new_with_key(&key);
107 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
108 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
109
110 let message = "In the beginning God created the heavens and the earth.";
111 println!("M =\t{}", message);
112 let mut cipher = [0_u8; 55];
113 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
114 print!("C =\t");
115 for c in cipher.clone()
116 { print!("{:02X} ", c); }
117 println!();
118 let mut txt = String::new();
119 for c in cipher.clone()
120 { write!(txt, "{:02X} ", c); }
121 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
122 println!();
123
124 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
126 print!("K =\t");
127 for i in 0..32
128 { print!("{:02X}", key[i]); }
129 println!();
130 let mut a_aes = Rijndael_256_256::new_with_key(&key);
131 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
132 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
133
134 let message = "In the beginning God created the heavens and the earth.";
135 println!("M =\t{}", message);
136 let mut cipher = [0_u8; 55];
137 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
138 print!("C =\t");
139 for c in cipher.clone()
140 { print!("{:02X} ", c); }
141 println!();
142 let mut txt = String::new();
143 for c in cipher.clone()
144 { write!(txt, "{:02X} ", c); }
145 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
146 println!();
147
148 use cryptocol::number::SharedArrays;
150 use cryptocol::hash::SHA3_512;
151 let mut sha3 = SHA3_512::new();
152 sha3.absorb_str("Post-quantum");
153 let key: [u8; 64] = sha3.get_hash_value_in_array();
154 print!("K =\t");
155 for i in 0..64
156 { print!("{:02X}", key[i]); }
157 println!();
158 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
159 sha3.absorb_str("Initialize");
160 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
161 iv.src = sha3.get_hash_value_in_array();
162 let iv = unsafe { iv.des };
163 print!("IV =\t");
164 for i in 0..16
165 { print!("{:08X}", iv[i].to_be()); }
166 println!();
167
168 let message = "In the beginning God created the heavens and the earth.";
169 println!("M =\t{}", message);
170 let mut cipher = [0_u8; 55];
171 a_rijndael.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
172 print!("C =\t");
173 for c in cipher.clone()
174 { print!("{:02X} ", c); }
175 println!();
176 let mut txt = String::new();
177 for c in cipher.clone()
178 { write!(txt, "{:02X} ", c); }
179 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
180 println!("-------------------------------");
181}
182
183fn aes_encrypt_ofb_into_vec()
184{
185 println!("aes_encrypt_ofb_into_vec()");
186 use std::io::Write;
187 use std::fmt::Write as _;
188 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
189
190 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
192 println!("K =\t{:#016X}", key);
193 let mut a_aes = AES_128::new_with_key_u128(key);
194 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
195 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
196
197 let message = "In the beginning God created the heavens and the earth.";
198 println!("M =\t{}", message);
199 let mut cipher = Vec::<u8>::new();
200 a_aes.encrypt_into_vec(iv, message.as_ptr(), message.len() as u64, &mut cipher);
201 print!("C =\t");
202 for c in cipher.clone()
203 { print!("{:02X} ", c); }
204 println!();
205 let mut txt = String::new();
206 for c in cipher.clone()
207 { write!(txt, "{:02X} ", c); }
208 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
209 println!();
210
211 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
213 print!("K =\t");
214 for i in 0..24
215 { print!("{:02X}", key[i]); }
216 println!();
217 let mut a_aes = AES_192::new_with_key(&key);
218 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
219 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
220
221 let message = "In the beginning God created the heavens and the earth.";
222 println!("M =\t{}", message);
223 let mut cipher = Vec::<u8>::new();
224 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
225 print!("C =\t");
226 for c in cipher.clone()
227 { print!("{:02X} ", c); }
228 println!();
229 let mut txt = String::new();
230 for c in cipher.clone()
231 { write!(txt, "{:02X} ", c); }
232 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
233 println!();
234
235 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
237 print!("K =\t");
238 for i in 0..32
239 { print!("{:02X}", key[i]); }
240 println!();
241 let mut a_aes = AES_256::new_with_key(&key);
242 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
243 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
244
245 let message = "In the beginning God created the heavens and the earth.";
246 println!("M =\t{}", message);
247 let mut cipher = Vec::<u8>::new();
248 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
249 print!("C =\t");
250 for c in cipher.clone()
251 { print!("{:02X} ", c); }
252 println!();
253 let mut txt = String::new();
254 for c in cipher.clone()
255 { write!(txt, "{:02X} ", c); }
256 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
257 println!();
258
259 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
261 print!("K =\t");
262 for i in 0..32
263 { print!("{:02X}", key[i]); }
264 println!();
265 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
266 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
267 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
268
269 let message = "In the beginning God created the heavens and the earth.";
270 println!("M =\t{}", message);
271 let mut cipher = Vec::<u8>::new();
272 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
273 print!("C =\t");
274 for c in cipher.clone()
275 { print!("{:02X} ", c); }
276 println!();
277 let mut txt = String::new();
278 for c in cipher.clone()
279 { write!(txt, "{:02X} ", c); }
280 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
281 println!();
282
283 use cryptocol::number::SharedArrays;
285 use cryptocol::hash::SHA3_512;
286 let mut sha3 = SHA3_512::new();
287 sha3.absorb_str("Post-quantum");
288 let key: [u8; 64] = sha3.get_hash_value_in_array();
289 print!("K =\t");
290 for i in 0..64
291 { print!("{:02X}", key[i]); }
292 println!();
293 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
294 sha3.absorb_str("Initialize");
295 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
296 iv.src = sha3.get_hash_value_in_array();
297 let iv = unsafe { iv.des };
298 print!("IV =\t");
299 for i in 0..16
300 { print!("{:08X}", iv[i].to_be()); }
301 println!();
302 let message = "In the beginning God created the heavens and the earth.";
303 println!("M =\t{}", message);
304 let mut cipher = Vec::<u8>::new();
305 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
306 print!("C =\t");
307 for c in cipher.clone()
308 { print!("{:02X} ", c); }
309 println!();
310 let mut txt = String::new();
311 for c in cipher.clone()
312 { write!(txt, "{:02X} ", c); }
313 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
314 println!("-------------------------------");
315}
316
317fn aes_encrypt_ofb_into_array()
318{
319 println!("aes_encrypt_ofb_into_array()");
320 use std::io::Write;
321 use std::fmt::Write as _;
322 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
323
324 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
326 println!("K =\t{:#016X}", key);
327 let mut a_aes = AES_128::new_with_key_u128(key);
328 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
329 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
330
331 let message = "In the beginning God created the heavens and the earth.";
332 println!("M =\t{}", message);
333 let mut cipher = [0_u8; 55];
334 a_aes.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
335 print!("C =\t");
336 for c in cipher.clone()
337 { print!("{:02X} ", c); }
338 println!();
339 let mut txt = String::new();
340 for c in cipher.clone()
341 { write!(txt, "{:02X} ", c); }
342 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
343 println!();
344
345 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
347 print!("K =\t");
348 for i in 0..24
349 { print!("{:02X}", key[i]); }
350 println!();
351 let mut a_aes = AES_192::new_with_key(&key);
352 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
353 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
354
355 let message = "In the beginning God created the heavens and the earth.";
356 println!("M =\t{}", message);
357 let mut cipher = [0_u8; 55];
358 a_aes.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
359 print!("C =\t");
360 for c in cipher.clone()
361 { print!("{:02X} ", c); }
362 println!();
363 let mut txt = String::new();
364 for c in cipher.clone()
365 { write!(txt, "{:02X} ", c); }
366 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
367 println!();
368
369 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
371 print!("K =\t");
372 for i in 0..32
373 { print!("{:02X}", key[i]); }
374 println!();
375 let mut a_aes = AES_256::new_with_key(&key);
376 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
377 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
378
379 let message = "In the beginning God created the heavens and the earth.";
380 println!("M =\t{}", message);
381 let mut cipher = [0_u8; 55];
382 a_aes.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
383 print!("C =\t");
384 for c in cipher.clone()
385 { print!("{:02X} ", c); }
386 println!();
387 let mut txt = String::new();
388 for c in cipher.clone()
389 { write!(txt, "{:02X} ", c); }
390 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
391 println!();
392
393 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
395 print!("K =\t");
396 for i in 0..32
397 { print!("{:02X}", key[i]); }
398 println!();
399 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
400 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
401 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
402
403 let message = "In the beginning God created the heavens and the earth.";
404 println!("M =\t{}", message);
405 let mut cipher = [0_u8; 55];
406 a_rijndael.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
407 print!("C =\t");
408 for c in cipher.clone()
409 { print!("{:02X} ", c); }
410 println!();
411 let mut txt = String::new();
412 for c in cipher.clone()
413 { write!(txt, "{:02X} ", c); }
414 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
415 println!();
416
417 use cryptocol::number::SharedArrays;
419 use cryptocol::hash::SHA3_512;
420 let mut sha3 = SHA3_512::new();
421 sha3.absorb_str("Post-quantum");
422 let key: [u8; 64] = sha3.get_hash_value_in_array();
423 print!("K =\t");
424 for i in 0..64
425 { print!("{:02X}", key[i]); }
426 println!();
427 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
428 sha3.absorb_str("Initialize");
429 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
430 iv.src = sha3.get_hash_value_in_array();
431 let iv = unsafe { iv.des };
432 print!("IV =\t");
433 for i in 0..16
434 { print!("{:08X}", iv[i].to_be()); }
435 println!();
436 let message = "In the beginning God created the heavens and the earth.";
437 println!("M =\t{}", message);
438 let mut cipher = [0_u8; 55];
439 a_rijndael.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
440 print!("C =\t");
441 for c in cipher.clone()
442 { print!("{:02X} ", c); }
443 println!();
444 let mut txt = String::new();
445 for c in cipher.clone()
446 { write!(txt, "{:02X} ", c); }
447 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
448 println!("-------------------------------");
449}
450
451fn aes_encrypt_str_ofb()
452{
453 println!("aes_encrypt_str_ofb()");
454 use std::io::Write;
455 use std::fmt::Write as _;
456 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
457
458 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
460 println!("K =\t{:#016X}", key);
461 let mut a_aes = AES_128::new_with_key_u128(key);
462 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
463 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
464
465 let message = "In the beginning God created the heavens and the earth.";
466 println!("M =\t{}", message);
467 let mut cipher = [0_u8; 55];
468 a_aes.encrypt_str(iv, &message, cipher.as_mut_ptr());
469 print!("C =\t");
470 for c in cipher.clone()
471 { print!("{:02X} ", c); }
472 println!();
473 let mut txt = String::new();
474 for c in cipher.clone()
475 { write!(txt, "{:02X} ", c); }
476 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
477 println!();
478
479 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
481 print!("K =\t");
482 for i in 0..24
483 { print!("{:02X}", key[i]); }
484 println!();
485 let mut a_aes = AES_192::new_with_key(&key);
486 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
487 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
488
489 let message = "In the beginning God created the heavens and the earth.";
490 println!("M =\t{}", message);
491 let mut cipher = [0_u8; 55];
492 a_aes.encrypt_str(iv, &message, cipher.as_mut_ptr());
493 print!("C =\t");
494 for c in cipher.clone()
495 { print!("{:02X} ", c); }
496 println!();
497 let mut txt = String::new();
498 for c in cipher.clone()
499 { write!(txt, "{:02X} ", c); }
500 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
501 println!();
502
503 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
505 print!("K =\t");
506 for i in 0..32
507 { print!("{:02X}", key[i]); }
508 println!();
509 let mut a_aes = AES_256::new_with_key(&key);
510 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
511 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
512
513 let message = "In the beginning God created the heavens and the earth.";
514 println!("M =\t{}", message);
515 let mut cipher = [0_u8; 55];
516 a_aes.encrypt_str(iv, &message, cipher.as_mut_ptr());
517 print!("C =\t");
518 for c in cipher.clone()
519 { print!("{:02X} ", c); }
520 println!();
521 let mut txt = String::new();
522 for c in cipher.clone()
523 { write!(txt, "{:02X} ", c); }
524 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
525 println!();
526
527 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
529 print!("K =\t");
530 for i in 0..32
531 { print!("{:02X}", key[i]); }
532 println!();
533 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
534 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
535 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
536
537 let message = "In the beginning God created the heavens and the earth.";
538 println!("M =\t{}", message);
539 let mut cipher = [0_u8; 55];
540 a_rijndael.encrypt_str(iv, &message, cipher.as_mut_ptr());
541 print!("C =\t");
542 for c in cipher.clone()
543 { print!("{:02X} ", c); }
544 println!();
545 let mut txt = String::new();
546 for c in cipher.clone()
547 { write!(txt, "{:02X} ", c); }
548 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
549 println!();
550
551 use cryptocol::number::SharedArrays;
553 use cryptocol::hash::SHA3_512;
554 let mut sha3 = SHA3_512::new();
555 sha3.absorb_str("Post-quantum");
556 let key: [u8; 64] = sha3.get_hash_value_in_array();
557 print!("K =\t");
558 for i in 0..64
559 { print!("{:02X}", key[i]); }
560 println!();
561 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
562 sha3.absorb_str("Initialize");
563 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
564 iv.src = sha3.get_hash_value_in_array();
565 let iv = unsafe { iv.des };
566 print!("IV =\t");
567 for i in 0..16
568 { print!("{:08X}", iv[i].to_be()); }
569 println!();
570 let message = "In the beginning God created the heavens and the earth.";
571 println!("M =\t{}", message);
572 let mut cipher = [0_u8; 55];
573 a_rijndael.encrypt_str(iv, &message, cipher.as_mut_ptr());
574 print!("C =\t");
575 for c in cipher.clone()
576 { print!("{:02X} ", c); }
577 println!();
578 let mut txt = String::new();
579 for c in cipher.clone()
580 { write!(txt, "{:02X} ", c); }
581 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
582 println!("-------------------------------");
583}
584
585fn aes_encrypt_str_ofb_into_vec()
586{
587 println!("aes_encrypt_str_ofb_into_vec()");
588 use std::io::Write;
589 use std::fmt::Write as _;
590 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
591
592 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
594 println!("K =\t{:#016X}", key);
595 let mut a_aes = AES_128::new_with_key_u128(key);
596 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
597 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
598
599 let message = "In the beginning God created the heavens and the earth.";
600 println!("M =\t{}", message);
601 let mut cipher = Vec::<u8>::new();
602 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
603 print!("C =\t");
604 for c in cipher.clone()
605 { print!("{:02X} ", c); }
606 println!();
607 let mut txt = String::new();
608 for c in cipher.clone()
609 { write!(txt, "{:02X} ", c); }
610 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
611 println!();
612
613 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
615 print!("K =\t");
616 for i in 0..24
617 { print!("{:02X}", key[i]); }
618 println!();
619 let mut a_aes = AES_192::new_with_key(&key);
620 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
621 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
622
623 let message = "In the beginning God created the heavens and the earth.";
624 println!("M =\t{}", message);
625 let mut cipher = Vec::<u8>::new();
626 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
627 print!("C =\t");
628 for c in cipher.clone()
629 { print!("{:02X} ", c); }
630 println!();
631 let mut txt = String::new();
632 for c in cipher.clone()
633 { write!(txt, "{:02X} ", c); }
634 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
635 println!();
636
637 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
639 print!("K =\t");
640 for i in 0..32
641 { print!("{:02X}", key[i]); }
642 println!();
643 let mut a_aes = AES_256::new_with_key(&key);
644 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
645 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
646
647 let message = "In the beginning God created the heavens and the earth.";
648 println!("M =\t{}", message);
649 let mut cipher = Vec::<u8>::new();
650 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
651 print!("C =\t");
652 for c in cipher.clone()
653 { print!("{:02X} ", c); }
654 println!();
655 let mut txt = String::new();
656 for c in cipher.clone()
657 { write!(txt, "{:02X} ", c); }
658 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
659 println!();
660
661 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
663 print!("K =\t");
664 for i in 0..32
665 { print!("{:02X}", key[i]); }
666 println!();
667 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
668 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
669 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
670
671 let message = "In the beginning God created the heavens and the earth.";
672 println!("M =\t{}", message);
673 let mut cipher = Vec::<u8>::new();
674 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
675 print!("C =\t");
676 for c in cipher.clone()
677 { print!("{:02X} ", c); }
678 println!();
679 let mut txt = String::new();
680 for c in cipher.clone()
681 { write!(txt, "{:02X} ", c); }
682 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
683 println!();
684
685 use cryptocol::number::SharedArrays;
687 use cryptocol::hash::SHA3_512;
688 let mut sha3 = SHA3_512::new();
689 sha3.absorb_str("Post-quantum");
690 let key: [u8; 64] = sha3.get_hash_value_in_array();
691 print!("K =\t");
692 for i in 0..64
693 { print!("{:02X}", key[i]); }
694 println!();
695 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
696 sha3.absorb_str("Initialize");
697 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
698 iv.src = sha3.get_hash_value_in_array();
699 let iv = unsafe { iv.des };
700 print!("IV =\t");
701 for i in 0..16
702 { print!("{:08X}", iv[i].to_be()); }
703 println!();
704 let message = "In the beginning God created the heavens and the earth.";
705 println!("M =\t{}", message);
706 let mut cipher = Vec::<u8>::new();
707 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
708 print!("C =\t");
709 for c in cipher.clone()
710 { print!("{:02X} ", c); }
711 println!();
712 let mut txt = String::new();
713 for c in cipher.clone()
714 { write!(txt, "{:02X} ", c); }
715 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
716 println!("-------------------------------");
717}
718
719fn aes_encrypt_str_ofb_into_array()
720{
721 println!("aes_encrypt_str_ofb_into_array()");
722 use std::io::Write;
723 use std::fmt::Write as _;
724 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
725
726 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
728 println!("K =\t{:#016X}", key);
729 let mut a_aes = AES_128::new_with_key_u128(key);
730 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
731 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
732
733 let message = "In the beginning God created the heavens and the earth.";
734 println!("M =\t{}", message);
735 let mut cipher = [0_u8; 55];
736 a_aes.encrypt_str_into_array(iv, &message, &mut cipher);
737 print!("C =\t");
738 for c in cipher.clone()
739 { print!("{:02X} ", c); }
740 println!();
741 let mut txt = String::new();
742 for c in cipher.clone()
743 { write!(txt, "{:02X} ", c); }
744 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
745 println!();
746
747 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
749 print!("K =\t");
750 for i in 0..24
751 { print!("{:02X}", key[i]); }
752 println!();
753 let mut a_aes = AES_192::new_with_key(&key);
754 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
755 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
756
757 let message = "In the beginning God created the heavens and the earth.";
758 println!("M =\t{}", message);
759 let mut cipher = [0_u8; 55];
760 a_aes.encrypt_str_into_array(iv, &message, &mut cipher);
761 print!("C =\t");
762 for c in cipher.clone()
763 { print!("{:02X} ", c); }
764 println!();
765 let mut txt = String::new();
766 for c in cipher.clone()
767 { write!(txt, "{:02X} ", c); }
768 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
769 println!();
770
771 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
773 print!("K =\t");
774 for i in 0..32
775 { print!("{:02X}", key[i]); }
776 println!();
777 let mut a_aes = AES_256::new_with_key(&key);
778 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
779 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
780
781 let message = "In the beginning God created the heavens and the earth.";
782 println!("M =\t{}", message);
783 let mut cipher = [0_u8; 55];
784 a_aes.encrypt_str_into_array(iv, &message, &mut cipher);
785 print!("C =\t");
786 for c in cipher.clone()
787 { print!("{:02X} ", c); }
788 println!();
789 let mut txt = String::new();
790 for c in cipher.clone()
791 { write!(txt, "{:02X} ", c); }
792 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
793 println!();
794
795 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
797 print!("K =\t");
798 for i in 0..32
799 { print!("{:02X}", key[i]); }
800 println!();
801 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
802 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
803 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
804
805 let message = "In the beginning God created the heavens and the earth.";
806 println!("M =\t{}", message);
807 let mut cipher = [0_u8; 55];
808 a_rijndael.encrypt_str_into_array(iv, &message, &mut cipher);
809 print!("C =\t");
810 for c in cipher.clone()
811 { print!("{:02X} ", c); }
812 println!();
813 let mut txt = String::new();
814 for c in cipher.clone()
815 { write!(txt, "{:02X} ", c); }
816 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
817 println!();
818
819 use cryptocol::number::SharedArrays;
821 use cryptocol::hash::SHA3_512;
822 let mut sha3 = SHA3_512::new();
823 sha3.absorb_str("Post-quantum");
824 let key: [u8; 64] = sha3.get_hash_value_in_array();
825 print!("K =\t");
826 for i in 0..64
827 { print!("{:02X}", key[i]); }
828 println!();
829 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
830 sha3.absorb_str("Initialize");
831 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
832 iv.src = sha3.get_hash_value_in_array();
833 let iv = unsafe { iv.des };
834 print!("IV =\t");
835 for i in 0..16
836 { print!("{:08X}", iv[i].to_be()); }
837 println!();
838 let message = "In the beginning God created the heavens and the earth.";
839 println!("M =\t{}", message);
840 let mut cipher = [0_u8; 55];
841 a_rijndael.encrypt_str_into_array(iv, &message, &mut cipher);
842 print!("C =\t");
843 for c in cipher.clone()
844 { print!("{:02X} ", c); }
845 println!();
846 let mut txt = String::new();
847 for c in cipher.clone()
848 { write!(txt, "{:02X} ", c); }
849 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
850 println!("-------------------------------");
851}
852
853fn aes_encrypt_string_ofb()
854{
855 println!("aes_encrypt_string_ofb()");
856 use std::io::Write;
857 use std::fmt::Write as _;
858 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
859
860 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
862 println!("K =\t{:#016X}", key);
863 let mut a_aes = AES_128::new_with_key_u128(key);
864 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
865 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
866
867 let message = "In the beginning God created the heavens and the earth.".to_string();
868 println!("M =\t{}", message);
869 let mut cipher = [0_u8; 55];
870 a_aes.encrypt_string(iv, &message, cipher.as_mut_ptr());
871 print!("C =\t");
872 for c in cipher.clone()
873 { print!("{:02X} ", c); }
874 println!();
875 let mut txt = String::new();
876 for c in cipher.clone()
877 { write!(txt, "{:02X} ", c); }
878 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
879 println!();
880
881 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
883 print!("K =\t");
884 for i in 0..24
885 { print!("{:02X}", key[i]); }
886 println!();
887 let mut a_aes = AES_192::new_with_key(&key);
888 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
889 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
890
891 let message = "In the beginning God created the heavens and the earth.".to_string();
892 println!("M =\t{}", message);
893 let mut cipher = [0_u8; 55];
894 a_aes.encrypt_string(iv, &message, cipher.as_mut_ptr());
895 print!("C =\t");
896 for c in cipher.clone()
897 { print!("{:02X} ", c); }
898 println!();
899 let mut txt = String::new();
900 for c in cipher.clone()
901 { write!(txt, "{:02X} ", c); }
902 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
903 println!();
904
905 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
907 print!("K =\t");
908 for i in 0..32
909 { print!("{:02X}", key[i]); }
910 println!();
911 let mut a_aes = AES_256::new_with_key(&key);
912 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
913 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
914
915 let message = "In the beginning God created the heavens and the earth.".to_string();
916 println!("M =\t{}", message);
917 let mut cipher = [0_u8; 55];
918 a_aes.encrypt_string(iv, &message, cipher.as_mut_ptr());
919 print!("C =\t");
920 for c in cipher.clone()
921 { print!("{:02X} ", c); }
922 println!();
923 let mut txt = String::new();
924 for c in cipher.clone()
925 { write!(txt, "{:02X} ", c); }
926 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
927 println!();
928
929 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
931 print!("K =\t");
932 for i in 0..32
933 { print!("{:02X}", key[i]); }
934 println!();
935 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
936 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
937 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
938
939 let message = "In the beginning God created the heavens and the earth.".to_string();
940 println!("M =\t{}", message);
941 let mut cipher = [0_u8; 55];
942 a_rijndael.encrypt_string(iv, &message, cipher.as_mut_ptr());
943 print!("C =\t");
944 for c in cipher.clone()
945 { print!("{:02X} ", c); }
946 println!();
947 let mut txt = String::new();
948 for c in cipher.clone()
949 { write!(txt, "{:02X} ", c); }
950 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
951 println!();
952
953 use cryptocol::number::SharedArrays;
955 use cryptocol::hash::SHA3_512;
956 let mut sha3 = SHA3_512::new();
957 sha3.absorb_str("Post-quantum");
958 let key: [u8; 64] = sha3.get_hash_value_in_array();
959 print!("K =\t");
960 for i in 0..64
961 { print!("{:02X}", key[i]); }
962 println!();
963 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
964 sha3.absorb_str("Initialize");
965 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
966 iv.src = sha3.get_hash_value_in_array();
967 let iv = unsafe { iv.des };
968 print!("IV =\t");
969 for i in 0..16
970 { print!("{:08X}", iv[i].to_be()); }
971 println!();
972
973 let message = "In the beginning God created the heavens and the earth.".to_string();
974 println!("M =\t{}", message);
975 let mut cipher = [0_u8; 55];
976 a_rijndael.encrypt_string(iv, &message, cipher.as_mut_ptr());
977 print!("C =\t");
978 for c in cipher.clone()
979 { print!("{:02X} ", c); }
980 println!();
981 let mut txt = String::new();
982 for c in cipher.clone()
983 { write!(txt, "{:02X} ", c); }
984 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
985 println!("-------------------------------");
986}
987
988fn aes_encrypt_string_ofb_into_vec()
989{
990 println!("aes_encrypt_string_ofb_into_vec()");
991 use std::io::Write;
992 use std::fmt::Write as _;
993 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
994
995 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
997 println!("K =\t{:#016X}", key);
998 let mut a_aes = AES_128::new_with_key_u128(key);
999 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1000 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1001
1002 let message = "In the beginning God created the heavens and the earth.".to_string();
1003 println!("M =\t{}", message);
1004 let mut cipher = Vec::<u8>::new();
1005 a_aes.encrypt_string_into_vec(iv, &message, &mut cipher);
1006 print!("C =\t");
1007 for c in cipher.clone()
1008 { print!("{:02X} ", c); }
1009 println!();
1010 let mut txt = String::new();
1011 for c in cipher.clone()
1012 { write!(txt, "{:02X} ", c); }
1013 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1014 println!();
1015
1016 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1018 print!("K =\t");
1019 for i in 0..24
1020 { print!("{:02X}", key[i]); }
1021 println!();
1022 let mut a_aes = AES_192::new_with_key(&key);
1023 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1024 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1025
1026 let message = "In the beginning God created the heavens and the earth.".to_string();
1027 println!("M =\t{}", message);
1028 let mut cipher = Vec::<u8>::new();
1029 a_aes.encrypt_string_into_vec(iv, &message, &mut cipher);
1030 print!("C =\t");
1031 for c in cipher.clone()
1032 { print!("{:02X} ", c); }
1033 println!();
1034 let mut txt = String::new();
1035 for c in cipher.clone()
1036 { write!(txt, "{:02X} ", c); }
1037 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1038 println!();
1039
1040 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1042 print!("K =\t");
1043 for i in 0..32
1044 { print!("{:02X}", key[i]); }
1045 println!();
1046 let mut a_aes = AES_256::new_with_key(&key);
1047 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1048 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1049
1050 let message = "In the beginning God created the heavens and the earth.".to_string();
1051 println!("M =\t{}", message);
1052 let mut cipher = Vec::<u8>::new();
1053 a_aes.encrypt_string_into_vec(iv, &message, &mut cipher);
1054 print!("C =\t");
1055 for c in cipher.clone()
1056 { print!("{:02X} ", c); }
1057 println!();
1058 let mut txt = String::new();
1059 for c in cipher.clone()
1060 { write!(txt, "{:02X} ", c); }
1061 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1062 println!();
1063
1064 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1066 print!("K =\t");
1067 for i in 0..32
1068 { print!("{:02X}", key[i]); }
1069 println!();
1070 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1071 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1072 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1073
1074 let message = "In the beginning God created the heavens and the earth.".to_string();
1075 println!("M =\t{}", message);
1076 let mut cipher = Vec::<u8>::new();
1077 a_rijndael.encrypt_string_into_vec(iv, &message, &mut cipher);
1078 print!("C =\t");
1079 for c in cipher.clone()
1080 { print!("{:02X} ", c); }
1081 println!();
1082 let mut txt = String::new();
1083 for c in cipher.clone()
1084 { write!(txt, "{:02X} ", c); }
1085 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1086 println!();
1087
1088 use cryptocol::number::SharedArrays;
1090 use cryptocol::hash::SHA3_512;
1091 let mut sha3 = SHA3_512::new();
1092 sha3.absorb_str("Post-quantum");
1093 let key: [u8; 64] = sha3.get_hash_value_in_array();
1094 print!("K =\t");
1095 for i in 0..64
1096 { print!("{:02X}", key[i]); }
1097 println!();
1098 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1099 sha3.absorb_str("Initialize");
1100 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1101 iv.src = sha3.get_hash_value_in_array();
1102 let iv = unsafe { iv.des };
1103 print!("IV =\t");
1104 for i in 0..16
1105 { print!("{:08X}", iv[i].to_be()); }
1106 println!();
1107 let message = "In the beginning God created the heavens and the earth.".to_string();
1108 println!("M =\t{}", message);
1109 let mut cipher = Vec::<u8>::new();
1110 a_rijndael.encrypt_string_into_vec(iv, &message, &mut cipher);
1111 print!("C =\t");
1112 for c in cipher.clone()
1113 { print!("{:02X} ", c); }
1114 println!();
1115 let mut txt = String::new();
1116 for c in cipher.clone()
1117 { write!(txt, "{:02X} ", c); }
1118 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1119 println!("-------------------------------");
1120}
1121
1122fn aes_encrypt_string_ofb_into_array()
1123{
1124 println!("aes_encrypt_string_ofb_into_array()");
1125 use std::io::Write;
1126 use std::fmt::Write as _;
1127 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1128
1129 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1131 println!("K =\t{:#016X}", key);
1132 let mut a_aes = AES_128::new_with_key_u128(key);
1133 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1134 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1135
1136 let message = "In the beginning God created the heavens and the earth.".to_string();
1137 println!("M =\t{}", message);
1138 let mut cipher = [0_u8; 55];
1139 a_aes.encrypt_string_into_array(iv, &message, &mut cipher);
1140 print!("C =\t");
1141 for c in cipher.clone()
1142 { print!("{:02X} ", c); }
1143 println!();
1144 let mut txt = String::new();
1145 for c in cipher.clone()
1146 { write!(txt, "{:02X} ", c); }
1147 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1148 println!();
1149
1150 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1152 print!("K =\t");
1153 for i in 0..24
1154 { print!("{:02X}", key[i]); }
1155 println!();
1156 let mut a_aes = AES_192::new_with_key(&key);
1157 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1158 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1159
1160 let message = "In the beginning God created the heavens and the earth.".to_string();
1161 println!("M =\t{}", message);
1162 let mut cipher = [0_u8; 55];
1163 a_aes.encrypt_string_into_array(iv, &message, &mut cipher);
1164 print!("C =\t");
1165 for c in cipher.clone()
1166 { print!("{:02X} ", c); }
1167 println!();
1168 let mut txt = String::new();
1169 for c in cipher.clone()
1170 { write!(txt, "{:02X} ", c); }
1171 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1172 println!();
1173
1174 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1176 print!("K =\t");
1177 for i in 0..32
1178 { print!("{:02X}", key[i]); }
1179 println!();
1180 let mut a_aes = AES_256::new_with_key(&key);
1181 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1182 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1183
1184 let message = "In the beginning God created the heavens and the earth.".to_string();
1185 println!("M =\t{}", message);
1186 let mut cipher = [0_u8; 55];
1187 a_aes.encrypt_string_into_array(iv, &message, &mut cipher);
1188 print!("C =\t");
1189 for c in cipher.clone()
1190 { print!("{:02X} ", c); }
1191 println!();
1192 let mut txt = String::new();
1193 for c in cipher.clone()
1194 { write!(txt, "{:02X} ", c); }
1195 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1196 println!();
1197
1198 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1200 print!("K =\t");
1201 for i in 0..32
1202 { print!("{:02X}", key[i]); }
1203 println!();
1204 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1205 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1206 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1207
1208 let message = "In the beginning God created the heavens and the earth.".to_string();
1209 println!("M =\t{}", message);
1210 let mut cipher = [0_u8; 55];
1211 a_rijndael.encrypt_string_into_array(iv, &message, &mut cipher);
1212 print!("C =\t");
1213 for c in cipher.clone()
1214 { print!("{:02X} ", c); }
1215 println!();
1216 let mut txt = String::new();
1217 for c in cipher.clone()
1218 { write!(txt, "{:02X} ", c); }
1219 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1220 println!();
1221
1222 use cryptocol::number::SharedArrays;
1224 use cryptocol::hash::SHA3_512;
1225 let mut sha3 = SHA3_512::new();
1226 sha3.absorb_str("Post-quantum");
1227 let key: [u8; 64] = sha3.get_hash_value_in_array();
1228 print!("K =\t");
1229 for i in 0..64
1230 { print!("{:02X}", key[i]); }
1231 println!();
1232 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1233 sha3.absorb_str("Initialize");
1234 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1235 iv.src = sha3.get_hash_value_in_array();
1236 let iv = unsafe { iv.des };
1237 print!("IV =\t");
1238 for i in 0..16
1239 { print!("{:08X}", iv[i].to_be()); }
1240 println!();
1241 let message = "In the beginning God created the heavens and the earth.".to_string();
1242 println!("M =\t{}", message);
1243 let mut cipher = [0_u8; 55];
1244 a_rijndael.encrypt_string_into_array(iv, &message, &mut cipher);
1245 print!("C =\t");
1246 for c in cipher.clone()
1247 { print!("{:02X} ", c); }
1248 println!();
1249 let mut txt = String::new();
1250 for c in cipher.clone()
1251 { write!(txt, "{:02X} ", c); }
1252 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1253 println!("-------------------------------");
1254}
1255
1256fn aes_encrypt_vec_ofb()
1257{
1258 println!("aes_encrypt_vec_ofb()");
1259 use std::io::Write;
1260 use std::fmt::Write as _;
1261 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1262
1263 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1265 println!("K =\t{:#016X}", key);
1266 let mut a_aes = AES_128::new_with_key_u128(key);
1267 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1268 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1269
1270 let message = "In the beginning God created the heavens and the earth.";
1271 println!("M =\t{}", message);
1272 let message = unsafe { message.to_string().as_mut_vec().clone() };
1273 let mut cipher = [0_u8; 55];
1274 a_aes.encrypt_vec(iv, &message, cipher.as_mut_ptr());
1275 print!("C =\t");
1276 for c in cipher.clone()
1277 { print!("{:02X} ", c); }
1278 println!();
1279 let mut txt = String::new();
1280 for c in cipher.clone()
1281 { write!(txt, "{:02X} ", c); }
1282 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1283 println!();
1284
1285 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1287 print!("K =\t");
1288 for i in 0..24
1289 { print!("{:02X}", key[i]); }
1290 println!();
1291 let mut a_aes = AES_192::new_with_key(&key);
1292 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1293 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1294
1295 let message = "In the beginning God created the heavens and the earth.";
1296 println!("M =\t{}", message);
1297 let message = unsafe { message.to_string().as_mut_vec().clone() };
1298 let mut cipher = [0_u8; 55];
1299 a_aes.encrypt_vec(iv, &message, cipher.as_mut_ptr());
1300 print!("C =\t");
1301 for c in cipher.clone()
1302 { print!("{:02X} ", c); }
1303 println!();
1304 let mut txt = String::new();
1305 for c in cipher.clone()
1306 { write!(txt, "{:02X} ", c); }
1307 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1308 println!();
1309
1310 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1312 print!("K =\t");
1313 for i in 0..32
1314 { print!("{:02X}", key[i]); }
1315 println!();
1316 let mut a_aes = AES_256::new_with_key(&key);
1317 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1318 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1319
1320 let message = "In the beginning God created the heavens and the earth.";
1321 println!("M =\t{}", message);
1322 let message = unsafe { message.to_string().as_mut_vec().clone() };
1323 let mut cipher = [0_u8; 55];
1324 a_aes.encrypt_vec(iv, &message, cipher.as_mut_ptr());
1325 print!("C =\t");
1326 for c in cipher.clone()
1327 { print!("{:02X} ", c); }
1328 println!();
1329 let mut txt = String::new();
1330 for c in cipher.clone()
1331 { write!(txt, "{:02X} ", c); }
1332 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1333 println!();
1334
1335 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1337 print!("K =\t");
1338 for i in 0..32
1339 { print!("{:02X}", key[i]); }
1340 println!();
1341 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1342 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1343 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1344
1345 let message = "In the beginning God created the heavens and the earth.";
1346 println!("M =\t{}", message);
1347 let message = unsafe { message.to_string().as_mut_vec().clone() };
1348 let mut cipher = [0_u8; 55];
1349 a_rijndael.encrypt_vec(iv, &message, cipher.as_mut_ptr());
1350 print!("C =\t");
1351 for c in cipher.clone()
1352 { print!("{:02X} ", c); }
1353 println!();
1354 let mut txt = String::new();
1355 for c in cipher.clone()
1356 { write!(txt, "{:02X} ", c); }
1357 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1358 println!();
1359
1360 use cryptocol::number::SharedArrays;
1362 use cryptocol::hash::SHA3_512;
1363 let mut sha3 = SHA3_512::new();
1364 sha3.absorb_str("Post-quantum");
1365 let key: [u8; 64] = sha3.get_hash_value_in_array();
1366 print!("K =\t");
1367 for i in 0..64
1368 { print!("{:02X}", key[i]); }
1369 println!();
1370 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1371 sha3.absorb_str("Initialize");
1372 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1373 iv.src = sha3.get_hash_value_in_array();
1374 let iv = unsafe { iv.des };
1375 print!("IV =\t");
1376 for i in 0..16
1377 { print!("{:08X}", iv[i].to_be()); }
1378 println!();
1379 let message = "In the beginning God created the heavens and the earth.";
1380 println!("M =\t{}", message);
1381 let message = unsafe { message.to_string().as_mut_vec().clone() };
1382 let mut cipher = [0_u8; 55];
1383 a_rijndael.encrypt_vec(iv, &message, cipher.as_mut_ptr());
1384 print!("C =\t");
1385 for c in cipher.clone()
1386 { print!("{:02X} ", c); }
1387 println!();
1388 let mut txt = String::new();
1389 for c in cipher.clone()
1390 { write!(txt, "{:02X} ", c); }
1391 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1392 println!("-------------------------------");
1393}
1394
1395fn aes_encrypt_vec_ofb_into_vec()
1396{
1397 println!("aes_encrypt_vec_ofb_into_vec()");
1398 use std::io::Write;
1399 use std::fmt::Write as _;
1400 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1401
1402 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1404 println!("K =\t{:#016X}", key);
1405 let mut a_aes = AES_128::new_with_key_u128(key);
1406 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1407 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1408
1409 let message = "In the beginning God created the heavens and the earth.";
1410 println!("M =\t{}", message);
1411 let message = unsafe { message.to_string().as_mut_vec().clone() };
1412 let mut cipher = Vec::<u8>::new();
1413 a_aes.encrypt_vec_into_vec(iv, &message, &mut cipher);
1414 print!("C =\t");
1415 for c in cipher.clone()
1416 { print!("{:02X} ", c); }
1417 println!();
1418 let mut txt = String::new();
1419 for c in cipher.clone()
1420 { write!(txt, "{:02X} ", c); }
1421 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1422 println!();
1423
1424 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1426 print!("K =\t");
1427 for i in 0..24
1428 { print!("{:02X}", key[i]); }
1429 println!();
1430 let mut a_aes = AES_192::new_with_key(&key);
1431 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1432 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1433
1434 let message = "In the beginning God created the heavens and the earth.";
1435 println!("M =\t{}", message);
1436 let message = unsafe { message.to_string().as_mut_vec().clone() };
1437 let mut cipher = Vec::<u8>::new();
1438 a_aes.encrypt_vec_into_vec(iv, &message, &mut cipher);
1439 print!("C =\t");
1440 for c in cipher.clone()
1441 { print!("{:02X} ", c); }
1442 println!();
1443 let mut txt = String::new();
1444 for c in cipher.clone()
1445 { write!(txt, "{:02X} ", c); }
1446 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1447 println!();
1448
1449 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1451 print!("K =\t");
1452 for i in 0..32
1453 { print!("{:02X}", key[i]); }
1454 println!();
1455 let mut a_aes = AES_256::new_with_key(&key);
1456 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1457 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1458
1459 let message = "In the beginning God created the heavens and the earth.";
1460 println!("M =\t{}", message);
1461 let message = unsafe { message.to_string().as_mut_vec().clone() };
1462 let mut cipher = Vec::<u8>::new();
1463 a_aes.encrypt_vec_into_vec(iv, &message, &mut cipher);
1464 print!("C =\t");
1465 for c in cipher.clone()
1466 { print!("{:02X} ", c); }
1467 println!();
1468 let mut txt = String::new();
1469 for c in cipher.clone()
1470 { write!(txt, "{:02X} ", c); }
1471 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1472 println!();
1473
1474 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1476 print!("K =\t");
1477 for i in 0..32
1478 { print!("{:02X}", key[i]); }
1479 println!();
1480 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1481 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1482 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1483
1484 let message = "In the beginning God created the heavens and the earth.";
1485 println!("M =\t{}", message);
1486 let message = unsafe { message.to_string().as_mut_vec().clone() };
1487 let mut cipher = Vec::<u8>::new();
1488 a_rijndael.encrypt_vec_into_vec(iv, &message, &mut cipher);
1489 print!("C =\t");
1490 for c in cipher.clone()
1491 { print!("{:02X} ", c); }
1492 println!();
1493 let mut txt = String::new();
1494 for c in cipher.clone()
1495 { write!(txt, "{:02X} ", c); }
1496 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1497 println!();
1498
1499 use cryptocol::number::SharedArrays;
1501 use cryptocol::hash::SHA3_512;
1502 let mut sha3 = SHA3_512::new();
1503 sha3.absorb_str("Post-quantum");
1504 let key: [u8; 64] = sha3.get_hash_value_in_array();
1505 print!("K =\t");
1506 for i in 0..64
1507 { print!("{:02X}", key[i]); }
1508 println!();
1509 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1510 sha3.absorb_str("Initialize");
1511 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1512 iv.src = sha3.get_hash_value_in_array();
1513 let iv = unsafe { iv.des };
1514 print!("IV =\t");
1515 for i in 0..16
1516 { print!("{:08X}", iv[i].to_be()); }
1517 println!();
1518 let message = "In the beginning God created the heavens and the earth.";
1519 println!("M =\t{}", message);
1520 let message = unsafe { message.to_string().as_mut_vec().clone() };
1521 let mut cipher = Vec::<u8>::new();
1522 a_rijndael.encrypt_vec_into_vec(iv, &message, &mut cipher);
1523 print!("C =\t");
1524 for c in cipher.clone()
1525 { print!("{:02X} ", c); }
1526 println!();
1527 let mut txt = String::new();
1528 for c in cipher.clone()
1529 { write!(txt, "{:02X} ", c); }
1530 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1531 println!("-------------------------------");
1532}
1533
1534fn aes_encrypt_vec_ofb_into_array()
1535{
1536 println!("aes_encrypt_vec_ofb_into_array()");
1537 use std::io::Write;
1538 use std::fmt::Write as _;
1539 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1540
1541 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1543 println!("K =\t{:#016X}", key);
1544 let mut a_aes = AES_128::new_with_key_u128(key);
1545 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1546 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1547
1548 let message = "In the beginning God created the heavens and the earth.";
1549 println!("M =\t{}", message);
1550 let message = unsafe { message.to_string().as_mut_vec().clone() };
1551 let mut cipher = [0_u8; 55];
1552 a_aes.encrypt_vec_into_array(iv, &message, &mut cipher);
1553 print!("C =\t");
1554 for c in cipher.clone()
1555 { print!("{:02X} ", c); }
1556 println!();
1557 let mut txt = String::new();
1558 for c in cipher.clone()
1559 { write!(txt, "{:02X} ", c); }
1560 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1561 println!();
1562
1563 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1565 print!("K =\t");
1566 for i in 0..24
1567 { print!("{:02X}", key[i]); }
1568 println!();
1569 let mut a_aes = AES_192::new_with_key(&key);
1570 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1571 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1572
1573 let message = "In the beginning God created the heavens and the earth.";
1574 println!("M =\t{}", message);
1575 let message = unsafe { message.to_string().as_mut_vec().clone() };
1576 let mut cipher = [0_u8; 55];
1577 a_aes.encrypt_vec_into_array(iv, &message, &mut cipher);
1578 print!("C =\t");
1579 for c in cipher.clone()
1580 { print!("{:02X} ", c); }
1581 println!();
1582 let mut txt = String::new();
1583 for c in cipher.clone()
1584 { write!(txt, "{:02X} ", c); }
1585 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1586 println!();
1587
1588 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1590 print!("K =\t");
1591 for i in 0..32
1592 { print!("{:02X}", key[i]); }
1593 println!();
1594 let mut a_aes = AES_256::new_with_key(&key);
1595 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1596 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1597
1598 let message = "In the beginning God created the heavens and the earth.";
1599 println!("M =\t{}", message);
1600 let message = unsafe { message.to_string().as_mut_vec().clone() };
1601 let mut cipher = [0_u8; 55];
1602 a_aes.encrypt_vec_into_array(iv, &message, &mut cipher);
1603 print!("C =\t");
1604 for c in cipher.clone()
1605 { print!("{:02X} ", c); }
1606 println!();
1607 let mut txt = String::new();
1608 for c in cipher.clone()
1609 { write!(txt, "{:02X} ", c); }
1610 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1611 println!();
1612
1613 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1615 print!("K =\t");
1616 for i in 0..32
1617 { print!("{:02X}", key[i]); }
1618 println!();
1619 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1620 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1621 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1622
1623 let message = "In the beginning God created the heavens and the earth.";
1624 println!("M =\t{}", message);
1625 let message = unsafe { message.to_string().as_mut_vec().clone() };
1626 let mut cipher = [0_u8; 55];
1627 a_rijndael.encrypt_vec_into_array(iv, &message, &mut cipher);
1628 print!("C =\t");
1629 for c in cipher.clone()
1630 { print!("{:02X} ", c); }
1631 println!();
1632 let mut txt = String::new();
1633 for c in cipher.clone()
1634 { write!(txt, "{:02X} ", c); }
1635 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1636 println!();
1637
1638 use cryptocol::number::SharedArrays;
1640 use cryptocol::hash::SHA3_512;
1641 let mut sha3 = SHA3_512::new();
1642 sha3.absorb_str("Post-quantum");
1643 let key: [u8; 64] = sha3.get_hash_value_in_array();
1644 print!("K =\t");
1645 for i in 0..64
1646 { print!("{:02X}", key[i]); }
1647 println!();
1648 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1649 sha3.absorb_str("Initialize");
1650 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1651 iv.src = sha3.get_hash_value_in_array();
1652 let iv = unsafe { iv.des };
1653 print!("IV =\t");
1654 for i in 0..16
1655 { print!("{:08X}", iv[i].to_be()); }
1656 println!();
1657 let message = "In the beginning God created the heavens and the earth.";
1658 println!("M =\t{}", message);
1659 let message = unsafe { message.to_string().as_mut_vec().clone() };
1660 let mut cipher = [0_u8; 55];
1661 a_rijndael.encrypt_vec_into_array(iv, &message, &mut cipher);
1662 print!("C =\t");
1663 for c in cipher.clone()
1664 { print!("{:02X} ", c); }
1665 println!();
1666 let mut txt = String::new();
1667 for c in cipher.clone()
1668 { write!(txt, "{:02X} ", c); }
1669 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1670 println!("-------------------------------");
1671}
1672
1673fn aes_encrypt_array_ofb()
1674{
1675 println!("aes_encrypt_array_ofb()");
1676 use std::io::Write;
1677 use std::fmt::Write as _;
1678 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1679
1680 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1682 println!("K =\t{:#016X}", key);
1683 let mut a_aes = AES_128::new_with_key_u128(key);
1684 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1685 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1686
1687 let mes = "In the beginning God created the heavens and the earth.";
1688 println!("M =\t{}", mes);
1689 let mut message = [0_u8; 55];
1690 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1691 let mut cipher = [0_u8; 55];
1692 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
1693 print!("C =\t");
1694 for c in cipher.clone()
1695 { print!("{:02X} ", c); }
1696 println!();
1697 let mut txt = String::new();
1698 for c in cipher.clone()
1699 { write!(txt, "{:02X} ", c); }
1700 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1701 println!();
1702
1703 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1705 print!("K =\t");
1706 for i in 0..24
1707 { print!("{:02X}", key[i]); }
1708 println!();
1709 let mut a_aes = AES_192::new_with_key(&key);
1710 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1711 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1712
1713 let mes = "In the beginning God created the heavens and the earth.";
1714 println!("M =\t{}", mes);
1715 let mut message = [0_u8; 55];
1716 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1717 let mut cipher = [0_u8; 55];
1718 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
1719 print!("C =\t");
1720 for c in cipher.clone()
1721 { print!("{:02X} ", c); }
1722 println!();
1723 let mut txt = String::new();
1724 for c in cipher.clone()
1725 { write!(txt, "{:02X} ", c); }
1726 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1727 println!();
1728
1729 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1731 print!("K =\t");
1732 for i in 0..32
1733 { print!("{:02X}", key[i]); }
1734 println!();
1735 let mut a_aes = AES_256::new_with_key(&key);
1736 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1737 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1738
1739 let mes = "In the beginning God created the heavens and the earth.";
1740 println!("M =\t{}", mes);
1741 let mut message = [0_u8; 55];
1742 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1743 let mut cipher = [0_u8; 55];
1744 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
1745 print!("C =\t");
1746 for c in cipher.clone()
1747 { print!("{:02X} ", c); }
1748 println!();
1749 let mut txt = String::new();
1750 for c in cipher.clone()
1751 { write!(txt, "{:02X} ", c); }
1752 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1753 println!();
1754
1755 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1757 print!("K =\t");
1758 for i in 0..32
1759 { print!("{:02X}", key[i]); }
1760 println!();
1761 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1762 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1763 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1764
1765 let mes = "In the beginning God created the heavens and the earth.";
1766 println!("M =\t{}", mes);
1767 let mut message = [0_u8; 55];
1768 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1769 let mut cipher = [0_u8; 55];
1770 a_rijndael.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
1771 print!("C =\t");
1772 for c in cipher.clone()
1773 { print!("{:02X} ", c); }
1774 println!();
1775 let mut txt = String::new();
1776 for c in cipher.clone()
1777 { write!(txt, "{:02X} ", c); }
1778 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1779 println!();
1780
1781 use cryptocol::number::SharedArrays;
1783 use cryptocol::hash::SHA3_512;
1784 let mut sha3 = SHA3_512::new();
1785 sha3.absorb_str("Post-quantum");
1786 let key: [u8; 64] = sha3.get_hash_value_in_array();
1787 print!("K =\t");
1788 for i in 0..64
1789 { print!("{:02X}", key[i]); }
1790 println!();
1791 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1792 sha3.absorb_str("Initialize");
1793 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1794 iv.src = sha3.get_hash_value_in_array();
1795 let iv = unsafe { iv.des };
1796 print!("IV =\t");
1797 for i in 0..16
1798 { print!("{:08X}", iv[i].to_be()); }
1799 println!();
1800 let mes = "In the beginning God created the heavens and the earth.";
1801 println!("M =\t{}", mes);
1802 let mut message = [0_u8; 55];
1803 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1804 let mut cipher = [0_u8; 55];
1805 a_rijndael.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
1806 print!("C =\t");
1807 for c in cipher.clone()
1808 { print!("{:02X} ", c); }
1809 println!();
1810 let mut txt = String::new();
1811 for c in cipher.clone()
1812 { write!(txt, "{:02X} ", c); }
1813 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1814 println!("-------------------------------");
1815}
1816
1817fn aes_encrypt_array_ofb_into_vec()
1818{
1819 println!("aes_encrypt_array_ofb_into_vec()");
1820 use std::io::Write;
1821 use std::fmt::Write as _;
1822 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1823
1824 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1826 println!("K =\t{:#016X}", key);
1827 let mut a_aes = AES_128::new_with_key_u128(key);
1828 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1829 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1830
1831 let mes = "In the beginning God created the heavens and the earth.";
1832 println!("M =\t{}", mes);
1833 let mut message = [0_u8; 55];
1834 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1835 let mut cipher = Vec::<u8>::new();
1836 a_aes.encrypt_array_into_vec(iv, &message, &mut cipher);
1837 print!("C =\t");
1838 for c in cipher.clone()
1839 { print!("{:02X} ", c); }
1840 println!();
1841 let mut txt = String::new();
1842 for c in cipher.clone()
1843 { write!(txt, "{:02X} ", c); }
1844 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1845 println!();
1846
1847 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1849 print!("K =\t");
1850 for i in 0..24
1851 { print!("{:02X}", key[i]); }
1852 println!();
1853 let mut a_aes = AES_192::new_with_key(&key);
1854 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1855 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1856
1857 let mes = "In the beginning God created the heavens and the earth.";
1858 println!("M =\t{}", mes);
1859 let mut message = [0_u8; 55];
1860 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1861 let mut cipher = Vec::<u8>::new();
1862 a_aes.encrypt_array_into_vec(iv, &message, &mut cipher);
1863 print!("C =\t");
1864 for c in cipher.clone()
1865 { print!("{:02X} ", c); }
1866 println!();
1867 let mut txt = String::new();
1868 for c in cipher.clone()
1869 { write!(txt, "{:02X} ", c); }
1870 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
1871 println!();
1872
1873 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1875 print!("K =\t");
1876 for i in 0..32
1877 { print!("{:02X}", key[i]); }
1878 println!();
1879 let mut a_aes = AES_256::new_with_key(&key);
1880 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1881 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1882
1883 let mes = "In the beginning God created the heavens and the earth.";
1884 println!("M =\t{}", mes);
1885 let mut message = [0_u8; 55];
1886 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1887 let mut cipher = Vec::<u8>::new();
1888 a_aes.encrypt_array_into_vec(iv, &message, &mut cipher);
1889 print!("C =\t");
1890 for c in cipher.clone()
1891 { print!("{:02X} ", c); }
1892 println!();
1893 let mut txt = String::new();
1894 for c in cipher.clone()
1895 { write!(txt, "{:02X} ", c); }
1896 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
1897 println!();
1898
1899 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1901 print!("K =\t");
1902 for i in 0..32
1903 { print!("{:02X}", key[i]); }
1904 println!();
1905 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
1906 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1907 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
1908
1909 let mes = "In the beginning God created the heavens and the earth.";
1910 println!("M =\t{}", mes);
1911 let mut message = [0_u8; 55];
1912 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1913 let mut cipher = Vec::<u8>::new();
1914 a_rijndael.encrypt_array_into_vec(iv, &message, &mut cipher);
1915 print!("C =\t");
1916 for c in cipher.clone()
1917 { print!("{:02X} ", c); }
1918 println!();
1919 let mut txt = String::new();
1920 for c in cipher.clone()
1921 { write!(txt, "{:02X} ", c); }
1922 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
1923 println!();
1924
1925 use cryptocol::number::SharedArrays;
1927 use cryptocol::hash::SHA3_512;
1928 let mut sha3 = SHA3_512::new();
1929 sha3.absorb_str("Post-quantum");
1930 let key: [u8; 64] = sha3.get_hash_value_in_array();
1931 print!("K =\t");
1932 for i in 0..64
1933 { print!("{:02X}", key[i]); }
1934 println!();
1935 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
1936 sha3.absorb_str("Initialize");
1937 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
1938 iv.src = sha3.get_hash_value_in_array();
1939 let iv = unsafe { iv.des };
1940 print!("IV =\t");
1941 for i in 0..16
1942 { print!("{:08X}", iv[i].to_be()); }
1943 println!();
1944 let mes = "In the beginning God created the heavens and the earth.";
1945 println!("M =\t{}", mes);
1946 let mut message = [0_u8; 55];
1947 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1948 let mut cipher = Vec::<u8>::new();
1949 a_rijndael.encrypt_array_into_vec(iv, &message, &mut cipher);
1950 print!("C =\t");
1951 for c in cipher.clone()
1952 { print!("{:02X} ", c); }
1953 println!();
1954 let mut txt = String::new();
1955 for c in cipher.clone()
1956 { write!(txt, "{:02X} ", c); }
1957 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
1958 println!("-------------------------------");
1959}
1960
1961fn aes_encrypt_array_ofb_into_array()
1962{
1963 println!("aes_encrypt_array_ofb_into_array()");
1964 use std::io::Write;
1965 use std::fmt::Write as _;
1966 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
1967
1968 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
1970 println!("K =\t{:#016X}", key);
1971 let mut a_aes = AES_128::new_with_key_u128(key);
1972 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1973 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
1974
1975 let mes = "In the beginning God created the heavens and the earth.";
1976 println!("M =\t{}", mes);
1977 let mut message = [0_u8; 55];
1978 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
1979 let mut cipher = [0_u8; 55];
1980 a_aes.encrypt_array_into_array(iv, &message, &mut cipher);
1981 print!("C =\t");
1982 for c in cipher.clone()
1983 { print!("{:02X} ", c); }
1984 println!();
1985 let mut txt = String::new();
1986 for c in cipher.clone()
1987 { write!(txt, "{:02X} ", c); }
1988 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
1989 println!();
1990
1991 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
1993 print!("K =\t");
1994 for i in 0..24
1995 { print!("{:02X}", key[i]); }
1996 println!();
1997 let mut a_aes = AES_192::new_with_key(&key);
1998 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
1999 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2000
2001 let mes = "In the beginning God created the heavens and the earth.";
2002 println!("M =\t{}", mes);
2003 let mut message = [0_u8; 55];
2004 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
2005 let mut cipher = [0_u8; 55];
2006 a_aes.encrypt_array_into_array(iv, &message, &mut cipher);
2007 print!("C =\t");
2008 for c in cipher.clone()
2009 { print!("{:02X} ", c); }
2010 println!();
2011 let mut txt = String::new();
2012 for c in cipher.clone()
2013 { write!(txt, "{:02X} ", c); }
2014 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
2015 println!();
2016
2017 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2019 print!("K =\t");
2020 for i in 0..32
2021 { print!("{:02X}", key[i]); }
2022 println!();
2023 let mut a_aes = AES_256::new_with_key(&key);
2024 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2025 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2026
2027 let mes = "In the beginning God created the heavens and the earth.";
2028 println!("M =\t{}", mes);
2029 let mut message = [0_u8; 55];
2030 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
2031 let mut cipher = [0_u8; 55];
2032 a_aes.encrypt_array_into_array(iv, &message, &mut cipher);
2033 print!("C =\t");
2034 for c in cipher.clone()
2035 { print!("{:02X} ", c); }
2036 println!();
2037 let mut txt = String::new();
2038 for c in cipher.clone()
2039 { write!(txt, "{:02X} ", c); }
2040 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
2041 println!();
2042
2043 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2045 print!("K =\t");
2046 for i in 0..32
2047 { print!("{:02X}", key[i]); }
2048 println!();
2049 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
2050 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2051 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
2052
2053 let mes = "In the beginning God created the heavens and the earth.";
2054 println!("M =\t{}", mes);
2055 let mut message = [0_u8; 55];
2056 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
2057 let mut cipher = [0_u8; 55];
2058 a_rijndael.encrypt_array_into_array(iv, &message, &mut cipher);
2059 print!("C =\t");
2060 for c in cipher.clone()
2061 { print!("{:02X} ", c); }
2062 println!();
2063 let mut txt = String::new();
2064 for c in cipher.clone()
2065 { write!(txt, "{:02X} ", c); }
2066 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
2067 println!();
2068
2069 use cryptocol::number::SharedArrays;
2071 use cryptocol::hash::SHA3_512;
2072 let mut sha3 = SHA3_512::new();
2073 sha3.absorb_str("Post-quantum");
2074 let key: [u8; 64] = sha3.get_hash_value_in_array();
2075 print!("K =\t");
2076 for i in 0..64
2077 { print!("{:02X}", key[i]); }
2078 println!();
2079 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
2080 sha3.absorb_str("Initialize");
2081 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
2082 iv.src = sha3.get_hash_value_in_array();
2083 let iv = unsafe { iv.des };
2084 print!("IV =\t");
2085 for i in 0..16
2086 { print!("{:08X}", iv[i].to_be()); }
2087 println!();
2088 let mes = "In the beginning God created the heavens and the earth.";
2089 println!("M =\t{}", mes);
2090 let mut message = [0_u8; 55];
2091 message.copy_from_slice(unsafe { mes.to_string().as_mut_vec() });
2092 let mut cipher = [0_u8; 55];
2093 a_rijndael.encrypt_array_into_array(iv, &message, &mut cipher);
2094 print!("C =\t");
2095 for c in cipher.clone()
2096 { print!("{:02X} ", c); }
2097 println!();
2098 let mut txt = String::new();
2099 for c in cipher.clone()
2100 { write!(txt, "{:02X} ", c); }
2101 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
2102 println!("-------------------------------");
2103}
2104
2105
2106fn aes_decrypt_ofb()
2107{
2108 println!("aes_decrypt_ofb");
2109 use std::io::Write;
2110 use std::fmt::Write as _;
2111 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
2112
2113 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
2115 println!("K =\t{:#016X}", key);
2116 let mut a_aes = AES_128::new_with_key_u128(key);
2117 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2118 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0], iv[1], iv[2], iv[3]);
2119
2120 let message = "In the beginning God created the heavens and the earth.";
2121 println!("M =\t{}", message);
2122 let mut cipher = [0_u8; 55];
2123 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
2124 print!("C =\t");
2125 for c in cipher.clone()
2126 { print!("{:02X} ", c); }
2127 println!();
2128 let mut txt = String::new();
2129 for c in cipher.clone()
2130 { write!(txt, "{:02X} ", c); }
2131 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
2132
2133 let mut recovered = vec![0; 55];
2134 a_aes.decrypt(iv, cipher.as_ptr(), cipher.len() as u64, recovered.as_mut_ptr());
2135 print!("Ba =\t");
2136 for b in recovered.clone()
2137 { print!("{:02X} ", b); }
2138 println!();
2139 let mut txt = String::new();
2140 for c in recovered.clone()
2141 { write!(txt, "{:02X} ", c); }
2142 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2143
2144 let mut converted = String::new();
2145 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2146
2147 println!("Bb =\t{}", converted);
2148 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2149 assert_eq!(converted, message);
2150 println!();
2151
2152 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2154 print!("K =\t");
2155 for i in 0..24
2156 { print!("{:02X}", key[i]); }
2157 println!();
2158 let mut a_aes = AES_192::new_with_key(&key);
2159 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2160 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2161
2162 let message = "In the beginning God created the heavens and the earth.";
2163 println!("M =\t{}", message);
2164 let mut cipher = [0_u8; 55];
2165 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
2166 print!("C =\t");
2167 for c in cipher.clone()
2168 { print!("{:02X} ", c); }
2169 println!();
2170 let mut txt = String::new();
2171 for c in cipher.clone()
2172 { write!(txt, "{:02X} ", c); }
2173 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
2174
2175 let mut recovered = vec![0; 55];
2176 a_aes.decrypt(iv, cipher.as_ptr(), cipher.len() as u64, recovered.as_mut_ptr());
2177 print!("Ba =\t");
2178 for b in recovered.clone()
2179 { print!("{:02X} ", b); }
2180 println!();
2181 let mut txt = String::new();
2182 for c in recovered.clone()
2183 { write!(txt, "{:02X} ", c); }
2184 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2185
2186 let mut converted = String::new();
2187 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2188
2189 println!("Bb =\t{}", converted);
2190 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2191 assert_eq!(converted, message);
2192 println!();
2193
2194 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2196 print!("K =\t");
2197 for i in 0..32
2198 { print!("{:02X}", key[i]); }
2199 println!();
2200 let mut a_aes = AES_256::new_with_key(&key);
2201 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2202 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2203
2204 let message = "In the beginning God created the heavens and the earth.";
2205 println!("M =\t{}", message);
2206 let mut cipher = [0_u8; 55];
2207 a_aes.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
2208 print!("C =\t");
2209 for c in cipher.clone()
2210 { print!("{:02X} ", c); }
2211 println!();
2212 let mut txt = String::new();
2213 for c in cipher.clone()
2214 { write!(txt, "{:02X} ", c); }
2215 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
2216
2217 let mut recovered = vec![0; 55];
2218 a_aes.decrypt(iv, cipher.as_ptr(), cipher.len() as u64, recovered.as_mut_ptr());
2219 print!("Ba =\t");
2220 for b in recovered.clone()
2221 { print!("{:02X} ", b); }
2222 println!();
2223 let mut txt = String::new();
2224 for c in recovered.clone()
2225 { write!(txt, "{:02X} ", c); }
2226 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2227
2228 let mut converted = String::new();
2229 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2230
2231 println!("Bb =\t{}", converted);
2232 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2233 assert_eq!(converted, message);
2234 println!();
2235
2236 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2238 print!("K =\t");
2239 for i in 0..32
2240 { print!("{:02X}", key[i]); }
2241 println!();
2242 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
2243 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2244 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
2245
2246 let message = "In the beginning God created the heavens and the earth.";
2247 println!("M =\t{}", message);
2248 let mut cipher = [0_u8; 55];
2249 a_rijndael.encrypt(iv, message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
2250 print!("C =\t");
2251 for c in cipher.clone()
2252 { print!("{:02X} ", c); }
2253 println!();
2254 let mut txt = String::new();
2255 for c in cipher.clone()
2256 { write!(txt, "{:02X} ", c); }
2257 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
2258
2259 let mut recovered = vec![0; 55];
2260 a_rijndael.decrypt(iv, cipher.as_ptr(), cipher.len() as u64, recovered.as_mut_ptr());
2261 print!("Ba =\t");
2262 for b in recovered.clone()
2263 { print!("{:02X} ", b); }
2264 println!();
2265 let mut txt = String::new();
2266 for c in recovered.clone()
2267 { write!(txt, "{:02X} ", c); }
2268 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2269
2270 let mut converted = String::new();
2271 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2272
2273 println!("Bb =\t{}", converted);
2274 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2275 assert_eq!(converted, message);
2276 println!();
2277
2278 use cryptocol::number::SharedArrays;
2280 use cryptocol::hash::SHA3_512;
2281 let mut sha3 = SHA3_512::new();
2282 sha3.absorb_str("Post-quantum");
2283 let key: [u8; 64] = sha3.get_hash_value_in_array();
2284 print!("K =\t");
2285 for i in 0..64
2286 { print!("{:02X}", key[i]); }
2287 println!();
2288 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
2289 sha3.absorb_str("Initialize");
2290 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
2291 iv.src = sha3.get_hash_value_in_array();
2292 let iv = unsafe { iv.des };
2293 print!("IV =\t");
2294 for i in 0..16
2295 { print!("{:08X}", iv[i].to_be()); }
2296 println!();
2297 let message = "In the beginning God created the heavens and the earth.";
2298 println!("M =\t{}", message);
2299 let mut cipher = [0_u8; 55];
2300 a_rijndael.encrypt(iv.clone(), message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
2301 print!("C =\t");
2302 for c in cipher.clone()
2303 { print!("{:02X} ", c); }
2304 println!();
2305 let mut txt = String::new();
2306 for c in cipher.clone()
2307 { write!(txt, "{:02X} ", c); }
2308 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
2309
2310 let mut recovered = vec![0; 55];
2311 a_rijndael.decrypt(iv, cipher.as_ptr(), cipher.len() as u64, recovered.as_mut_ptr());
2312 print!("Ba =\t");
2313 for b in recovered.clone()
2314 { print!("{:02X} ", b); }
2315 println!();
2316 let mut txt = String::new();
2317 for c in recovered.clone()
2318 { write!(txt, "{:02X} ", c); }
2319 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2320
2321 let mut converted = String::new();
2322 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2323
2324 println!("Bb =\t{}", converted);
2325 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2326 assert_eq!(converted, message);
2327 println!("-------------------------------");
2328}
2329
2330
2331fn aes_decrypt_ofb_into_vec()
2332{
2333 println!("aes_decrypt_ofb_into_vec()");
2334 use std::io::Write;
2335 use std::fmt::Write as _;
2336 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
2337
2338 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
2340 println!("K =\t{:#016X}", key);
2341 let mut a_aes = AES_128::new_with_key_u128(key);
2342 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2343 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2344
2345 let message = "In the beginning God created the heavens and the earth.";
2346 println!("M =\t{}", message);
2347 let mut cipher = [0_u8; 55];
2348 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2349 print!("C =\t");
2350 for c in cipher.clone()
2351 { print!("{:02X} ", c); }
2352 println!();
2353 let mut txt = String::new();
2354 for c in cipher.clone()
2355 { write!(txt, "{:02X} ", c); }
2356 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
2357 println!();
2358
2359 let mut recovered = Vec::<u8>::new();
2360 a_aes.decrypt_into_vec(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2361 print!("Ba =\t");
2362 for b in recovered.clone()
2363 { print!("{:02X} ", b); }
2364 println!();
2365 let mut txt = String::new();
2366 for c in recovered.clone()
2367 { write!(txt, "{:02X} ", c); }
2368 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2369
2370 let mut converted = String::new();
2371 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2372
2373 println!("Bb =\t{}", converted);
2374 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2375 assert_eq!(converted, message);
2376 println!();
2377
2378 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2380 print!("K =\t");
2381 for i in 0..24
2382 { print!("{:02X}", key[i]); }
2383 println!();
2384 let mut a_aes = AES_192::new_with_key(&key);
2385 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2386 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2387
2388 let message = "In the beginning God created the heavens and the earth.";
2389 println!("M =\t{}", message);
2390 let mut cipher = [0_u8; 55];
2391 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2392 print!("C =\t");
2393 for c in cipher.clone()
2394 { print!("{:02X} ", c); }
2395 println!();
2396 let mut txt = String::new();
2397 for c in cipher.clone()
2398 { write!(txt, "{:02X} ", c); }
2399 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
2400 println!();
2401
2402 let mut recovered = Vec::<u8>::new();
2403 a_aes.decrypt_into_vec(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2404 print!("Ba =\t");
2405 for b in recovered.clone()
2406 { print!("{:02X} ", b); }
2407 println!();
2408 let mut txt = String::new();
2409 for c in recovered.clone()
2410 { write!(txt, "{:02X} ", c); }
2411 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2412
2413 let mut converted = String::new();
2414 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2415
2416 println!("Bb =\t{}", converted);
2417 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2418 assert_eq!(converted, message);
2419 println!();
2420
2421 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2423 print!("K =\t");
2424 for i in 0..32
2425 { print!("{:02X}", key[i]); }
2426 println!();
2427 let mut a_aes = AES_256::new_with_key(&key);
2428 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2429 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2430
2431 let message = "In the beginning God created the heavens and the earth.";
2432 println!("M =\t{}", message);
2433 let mut cipher = [0_u8; 55];
2434 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2435 print!("C =\t");
2436 for c in cipher.clone()
2437 { print!("{:02X} ", c); }
2438 println!();
2439 let mut txt = String::new();
2440 for c in cipher.clone()
2441 { write!(txt, "{:02X} ", c); }
2442 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
2443 println!();
2444
2445 let mut recovered = Vec::<u8>::new();
2446 a_aes.decrypt_into_vec(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2447 print!("Ba =\t");
2448 for b in recovered.clone()
2449 { print!("{:02X} ", b); }
2450 println!();
2451 let mut txt = String::new();
2452 for c in recovered.clone()
2453 { write!(txt, "{:02X} ", c); }
2454 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2455
2456 let mut converted = String::new();
2457 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2458
2459 println!("Bb =\t{}", converted);
2460 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2461 assert_eq!(converted, message);
2462 println!();
2463
2464 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2466 print!("K =\t");
2467 for i in 0..32
2468 { print!("{:02X}", key[i]); }
2469 println!();
2470 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
2471 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2472 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
2473
2474 let message = "In the beginning God created the heavens and the earth.";
2475 println!("M =\t{}", message);
2476 let mut cipher = [0_u8; 55];
2477 a_rijndael.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2478 print!("C =\t");
2479 for c in cipher.clone()
2480 { print!("{:02X} ", c); }
2481 println!();
2482 let mut txt = String::new();
2483 for c in cipher.clone()
2484 { write!(txt, "{:02X} ", c); }
2485 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
2486 println!();
2487
2488 let mut recovered = Vec::<u8>::new();
2489 a_rijndael.decrypt_into_vec(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2490 print!("Ba =\t");
2491 for b in recovered.clone()
2492 { print!("{:02X} ", b); }
2493 println!();
2494 let mut txt = String::new();
2495 for c in recovered.clone()
2496 { write!(txt, "{:02X} ", c); }
2497 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2498
2499 let mut converted = String::new();
2500 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2501
2502 println!("Bb =\t{}", converted);
2503 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2504 assert_eq!(converted, message);
2505 println!();
2506
2507 use cryptocol::number::SharedArrays;
2509 use cryptocol::hash::SHA3_512;
2510 let mut sha3 = SHA3_512::new();
2511 sha3.absorb_str("Post-quantum");
2512 let key: [u8; 64] = sha3.get_hash_value_in_array();
2513 print!("K =\t");
2514 for i in 0..64
2515 { print!("{:02X}", key[i]); }
2516 println!();
2517 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
2518 sha3.absorb_str("Initialize");
2519 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
2520 iv.src = sha3.get_hash_value_in_array();
2521 let iv = unsafe { iv.des };
2522 print!("IV =\t");
2523 for i in 0..16
2524 { print!("{:08X}", iv[i].to_be()); }
2525 println!();
2526 let message = "In the beginning God created the heavens and the earth.";
2527 println!("M =\t{}", message);
2528 let mut cipher = [0_u8; 55];
2529 a_rijndael.encrypt(iv.clone(), message.as_ptr(), message.len() as u64, cipher.as_mut_ptr());
2530 print!("C =\t");
2531 for c in cipher.clone()
2532 { print!("{:02X} ", c); }
2533 println!();
2534 let mut txt = String::new();
2535 for c in cipher.clone()
2536 { write!(txt, "{:02X} ", c); }
2537 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
2538
2539 let mut recovered = Vec::<u8>::new();
2540 a_rijndael.decrypt_into_vec(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2541 print!("Ba =\t");
2542 for b in recovered.clone()
2543 { print!("{:02X} ", b); }
2544 println!();
2545 let mut txt = String::new();
2546 for c in recovered.clone()
2547 { write!(txt, "{:02X} ", c); }
2548 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2549
2550 let mut converted = String::new();
2551 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2552
2553 println!("Bb =\t{}", converted);
2554 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2555 assert_eq!(converted, message);
2556 println!("-------------------------------");
2557}
2558
2559fn aes_decrypt_ofb_into_array()
2560{
2561 println!("aes_decrypt_ofb_into_array()");
2562 use std::io::Write;
2563 use std::fmt::Write as _;
2564 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
2565
2566 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
2568 println!("K =\t{:#016X}", key);
2569 let mut a_aes = AES_128::new_with_key_u128(key);
2570 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2571 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2572
2573 let message = "In the beginning God created the heavens and the earth.";
2574 println!("M =\t{}", message);
2575 let mut cipher = [0_u8; 55];
2576 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2577 print!("C =\t");
2578 for c in cipher.clone()
2579 { print!("{:02X} ", c); }
2580 println!();
2581 let mut txt = String::new();
2582 for c in cipher.clone()
2583 { write!(txt, "{:02X} ", c); }
2584 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
2585
2586 let mut recovered = [0; 64];
2587 let len = a_aes.decrypt_into_array(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2588 print!("Ba =\t");
2589 for b in recovered.clone()
2590 { print!("{:02X} ", b); }
2591 println!();
2592 let mut txt = String::new();
2593 for c in recovered.clone()
2594 { write!(txt, "{:02X} ", c); }
2595 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
2596
2597 let mut converted = String::new();
2598 unsafe { converted.as_mut_vec() }.write(&recovered);
2599 unsafe { converted.as_mut_vec() }.truncate(len as usize);
2600
2601 println!("Bb =\t{}", converted);
2602 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2603 assert_eq!(converted, message);
2604 println!();
2605
2606 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2608 print!("K =\t");
2609 for i in 0..24
2610 { print!("{:02X}", key[i]); }
2611 println!();
2612 let mut a_aes = AES_192::new_with_key(&key);
2613 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2614 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2615
2616 let message = "In the beginning God created the heavens and the earth.";
2617 println!("M =\t{}", message);
2618 let mut cipher = [0_u8; 55];
2619 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2620 print!("C =\t");
2621 for c in cipher.clone()
2622 { print!("{:02X} ", c); }
2623 println!();
2624 let mut txt = String::new();
2625 for c in cipher.clone()
2626 { write!(txt, "{:02X} ", c); }
2627 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
2628
2629 let mut recovered = [0; 64];
2630 a_aes.decrypt_into_array(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2631 print!("Ba =\t");
2632 for b in recovered.clone()
2633 { print!("{:02X} ", b); }
2634 println!();
2635 let mut txt = String::new();
2636
2637 for c in recovered.clone()
2638 { write!(txt, "{:02X} ", c); }
2639 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
2640
2641 let mut converted = String::new();
2642 unsafe { converted.as_mut_vec() }.write(&recovered);
2643 unsafe { converted.as_mut_vec() }.truncate(len as usize);
2644
2645 println!("Bb =\t{}", converted);
2646 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2647 assert_eq!(converted, message);
2648 println!();
2649
2650 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2652 print!("K =\t");
2653 for i in 0..32
2654 { print!("{:02X}", key[i]); }
2655 println!();
2656 let mut a_aes = AES_256::new_with_key(&key);
2657 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2658 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2659
2660 let message = "In the beginning God created the heavens and the earth.";
2661 println!("M =\t{}", message);
2662 let mut cipher = [0_u8; 55];
2663 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2664 print!("C =\t");
2665 for c in cipher.clone()
2666 { print!("{:02X} ", c); }
2667 println!();
2668 let mut txt = String::new();
2669 for c in cipher.clone()
2670 { write!(txt, "{:02X} ", c); }
2671 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
2672
2673 let mut recovered = [0; 64];
2674 a_aes.decrypt_into_array(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2675 print!("Ba =\t");
2676 for b in recovered.clone()
2677 { print!("{:02X} ", b); }
2678 println!();
2679 let mut txt = String::new();
2680 for c in recovered.clone()
2681 { write!(txt, "{:02X} ", c); }
2682 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
2683
2684 let mut converted = String::new();
2685 unsafe { converted.as_mut_vec() }.write(&recovered);
2686 unsafe { converted.as_mut_vec() }.truncate(len as usize);
2687
2688 println!("Bb =\t{}", converted);
2689 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2690 assert_eq!(converted, message);
2691 println!();
2692
2693 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2695 print!("K =\t");
2696 for i in 0..32
2697 { print!("{:02X}", key[i]); }
2698 println!();
2699 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
2700 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2701 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
2702
2703 let message = "In the beginning God created the heavens and the earth.";
2704 println!("M =\t{}", message);
2705 let mut cipher = [0_u8; 55];
2706 a_rijndael.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2707 print!("C =\t");
2708 for c in cipher.clone()
2709 { print!("{:02X} ", c); }
2710 println!();
2711 let mut txt = String::new();
2712 for c in cipher.clone()
2713 { write!(txt, "{:02X} ", c); }
2714 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
2715
2716 let mut recovered = [0; 64];
2717 a_rijndael.decrypt_into_array(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2718 for b in recovered.clone()
2719 { print!("{:02X} ", b); }
2720 println!();
2721 let mut txt = String::new();
2722 for c in recovered.clone()
2723 { write!(txt, "{:02X} ", c); }
2724 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
2725
2726 let mut converted = String::new();
2727 unsafe { converted.as_mut_vec() }.write(&recovered);
2728 unsafe { converted.as_mut_vec() }.truncate(len as usize);
2729
2730 println!("Bb =\t{}", converted);
2731 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2732 assert_eq!(converted, message);
2733 println!();
2734
2735 use cryptocol::number::SharedArrays;
2737 use cryptocol::hash::SHA3_512;
2738 let mut sha3 = SHA3_512::new();
2739 sha3.absorb_str("Post-quantum");
2740 let key: [u8; 64] = sha3.get_hash_value_in_array();
2741 print!("K =\t");
2742 for i in 0..64
2743 { print!("{:02X}", key[i]); }
2744 println!();
2745 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
2746 sha3.absorb_str("Initialize");
2747 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
2748 iv.src = sha3.get_hash_value_in_array();
2749 let iv = unsafe { iv.des };
2750 print!("IV =\t");
2751 for i in 0..16
2752 { print!("{:08X}", iv[i].to_be()); }
2753 println!();
2754
2755 let message = "In the beginning God created the heavens and the earth.";
2756 println!("M =\t{}", message);
2757 let mut cipher = [0_u8; 55];
2758 a_rijndael.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2759 print!("C =\t");
2760 for c in cipher.clone()
2761 { print!("{:02X} ", c); }
2762 println!();
2763 let mut txt = String::new();
2764 for c in cipher.clone()
2765 { write!(txt, "{:02X} ", c); }
2766 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
2767
2768 let mut recovered = [0; 64];
2769 a_rijndael.decrypt_into_array(iv, cipher.as_ptr(), cipher.len() as u64, &mut recovered);
2770 print!("Ba =\t");
2771 for b in recovered.clone()
2772 { print!("{:02X} ", b); }
2773 println!();
2774 let mut txt = String::new();
2775 for c in recovered.clone()
2776 { write!(txt, "{:02X} ", c); }
2777 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
2778
2779 let mut converted = String::new();
2780 unsafe { converted.as_mut_vec() }.write(&recovered);
2781 unsafe { converted.as_mut_vec() }.truncate(len as usize);
2782
2783 println!("Bb =\t{}", converted);
2784 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2785 assert_eq!(converted, message);
2786 println!("-------------------------------");
2787}
2788
2789fn aes_decrypt_ofb_into_string()
2790{
2791 println!("aes_decrypt_ofb_into_string()");
2792 use std::io::Write;
2793 use std::fmt::Write as _;
2794 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
2795
2796 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
2798 println!("K =\t{:#016X}", key);
2799 let mut a_aes = AES_128::new_with_key_u128(key);
2800 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2801 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2802
2803 let message = "In the beginning God created the heavens and the earth.";
2804 println!("M =\t{}", message);
2805 let mut cipher = [0_u8; 55];
2806 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2807 print!("C =\t");
2808 for c in cipher.clone()
2809 { print!("{:02X} ", c); }
2810 println!();
2811 let mut txt = String::new();
2812 for c in cipher.clone()
2813 { write!(txt, "{:02X} ", c); }
2814 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
2815
2816 let mut converted= String::new();
2817 a_aes.decrypt_into_string(iv, cipher.as_ptr(), cipher.len() as u64, &mut converted);
2818 println!("B =\t{}", converted);
2819 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2820 assert_eq!(converted, message);
2821 println!();
2822
2823 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2825 print!("K =\t");
2826 for i in 0..24
2827 { print!("{:02X}", key[i]); }
2828 println!();
2829 let mut a_aes = AES_192::new_with_key(&key);
2830 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2831 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2832
2833 let message = "In the beginning God created the heavens and the earth.";
2834 println!("M =\t{}", message);
2835 let mut cipher = [0_u8; 55];
2836 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2837 print!("C =\t");
2838 for c in cipher.clone()
2839 { print!("{:02X} ", c); }
2840 println!();
2841 let mut txt = String::new();
2842 for c in cipher.clone()
2843 { write!(txt, "{:02X} ", c); }
2844 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
2845
2846 let mut converted= String::new();
2847 a_aes.decrypt_into_string(iv, cipher.as_ptr(), cipher.len() as u64, &mut converted);
2848 println!("B =\t{}", converted);
2849 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2850 assert_eq!(converted, message);
2851 println!();
2852
2853 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2855 print!("K =\t");
2856 for i in 0..32
2857 { print!("{:02X}", key[i]); }
2858 println!();
2859 let mut a_aes = AES_256::new_with_key(&key);
2860 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2861 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2862
2863 let message = "In the beginning God created the heavens and the earth.";
2864 println!("M =\t{}", message);
2865 let mut cipher = [0_u8; 55];
2866 a_aes.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2867 print!("C =\t");
2868 for c in cipher.clone()
2869 { print!("{:02X} ", c); }
2870 println!();
2871 let mut txt = String::new();
2872 for c in cipher.clone()
2873 { write!(txt, "{:02X} ", c); }
2874 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
2875
2876 let mut converted= String::new();
2877 a_aes.decrypt_into_string(iv, cipher.as_ptr(), cipher.len() as u64, &mut converted);
2878 println!("B =\t{}", converted);
2879 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2880 assert_eq!(converted, message);
2881 println!();
2882
2883 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
2885 print!("K =\t");
2886 for i in 0..32
2887 { print!("{:02X}", key[i]); }
2888 println!();
2889 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
2890 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2891 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
2892
2893 let message = "In the beginning God created the heavens and the earth.";
2894 println!("M =\t{}", message);
2895 let mut cipher = [0_u8; 55];
2896 a_rijndael.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2897 print!("C =\t");
2898 for c in cipher.clone()
2899 { print!("{:02X} ", c); }
2900 println!();
2901 let mut txt = String::new();
2902 for c in cipher.clone()
2903 { write!(txt, "{:02X} ", c); }
2904 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
2905
2906 let mut converted= String::new();
2907 a_rijndael.decrypt_into_string(iv, cipher.as_ptr(), cipher.len() as u64, &mut converted);
2908 println!("B =\t{}", converted);
2909 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2910 assert_eq!(converted, message);
2911 println!();
2912
2913 use cryptocol::number::SharedArrays;
2915 use cryptocol::hash::SHA3_512;
2916 let mut sha3 = SHA3_512::new();
2917 sha3.absorb_str("Post-quantum");
2918 let key: [u8; 64] = sha3.get_hash_value_in_array();
2919 print!("K =\t");
2920 for i in 0..64
2921 { print!("{:02X}", key[i]); }
2922 println!();
2923 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
2924 sha3.absorb_str("Initialize");
2925 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
2926 iv.src = sha3.get_hash_value_in_array();
2927 let iv = unsafe { iv.des };
2928 print!("IV =\t");
2929 for i in 0..16
2930 { print!("{:08X}", iv[i].to_be()); }
2931 println!();
2932 let message = "In the beginning God created the heavens and the earth.";
2933 println!("M =\t{}", message);
2934 let mut cipher = [0_u8; 55];
2935 a_rijndael.encrypt_str(iv.clone(), &message, cipher.as_mut_ptr());
2936 print!("C =\t");
2937 for c in cipher.clone()
2938 { print!("{:02X} ", c); }
2939 println!();
2940 let mut txt = String::new();
2941 for c in cipher.clone()
2942 { write!(txt, "{:02X} ", c); }
2943 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
2944
2945 let mut converted= String::new();
2946 a_rijndael.decrypt_into_string(iv, cipher.as_ptr(), cipher.len() as u64, &mut converted);
2947 println!("B =\t{}", converted);
2948 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2949 assert_eq!(converted, message);
2950 println!("-------------------------------");
2951}
2952
2953fn aes_decrypt_vec_ofb()
2954{
2955 println!("aes_decrypt_vec_ofb()");
2956 use std::io::Write;
2957 use std::fmt::Write as _;
2958 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
2959
2960 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
2962 println!("K =\t{:#016X}", key);
2963 let mut a_aes = AES_128::new_with_key_u128(key);
2964 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
2965 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
2966
2967 let message = "In the beginning God created the heavens and the earth.";
2968 println!("M =\t{}", message);
2969 let mut cipher = Vec::<u8>::new();
2970 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
2971 print!("C =\t");
2972 for c in cipher.clone()
2973 { print!("{:02X} ", c); }
2974 println!();
2975 let mut txt = String::new();
2976 for c in cipher.clone()
2977 { write!(txt, "{:02X} ", c); }
2978 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
2979
2980 let mut recovered = vec![0; 55];
2981 a_aes.decrypt_vec(iv, &cipher, recovered.as_mut_ptr());
2982 print!("Ba =\t");
2983 for b in recovered.clone()
2984 { print!("{:02X} ", b); }
2985 println!();
2986 let mut txt = String::new();
2987 for c in recovered.clone()
2988 { write!(txt, "{:02X} ", c); }
2989 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
2990
2991 let mut converted = String::new();
2992 unsafe { converted.as_mut_vec() }.append(&mut recovered);
2993
2994 println!("Bb =\t{}", converted);
2995 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
2996 assert_eq!(converted, message);
2997 println!();
2998
2999 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3001 print!("K =\t");
3002 for i in 0..24
3003 { print!("{:02X}", key[i]); }
3004 println!();
3005 let mut a_aes = AES_192::new_with_key(&key);
3006 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3007 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3008
3009 let message = "In the beginning God created the heavens and the earth.";
3010 println!("M =\t{}", message);
3011 let mut cipher = Vec::<u8>::new();
3012 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3013 print!("C =\t");
3014 for c in cipher.clone()
3015 { print!("{:02X} ", c); }
3016 println!();
3017 let mut txt = String::new();
3018 for c in cipher.clone()
3019 { write!(txt, "{:02X} ", c); }
3020 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
3021
3022 let mut recovered = vec![0; 55];
3023 a_aes.decrypt_vec(iv, &cipher, recovered.as_mut_ptr());
3024 print!("Ba =\t");
3025 for b in recovered.clone()
3026 { print!("{:02X} ", b); }
3027 println!();
3028 let mut txt = String::new();
3029 for c in recovered.clone()
3030 { write!(txt, "{:02X} ", c); }
3031 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3032
3033 let mut converted = String::new();
3034 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3035
3036 println!("Bb =\t{}", converted);
3037 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3038 assert_eq!(converted, message);
3039 println!();
3040
3041 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3043 print!("K =\t");
3044 for i in 0..32
3045 { print!("{:02X}", key[i]); }
3046 println!();
3047 let mut a_aes = AES_256::new_with_key(&key);
3048 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3049 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3050
3051 let message = "In the beginning God created the heavens and the earth.";
3052 println!("M =\t{}", message);
3053 let mut cipher = Vec::<u8>::new();
3054 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3055 print!("C =\t");
3056 for c in cipher.clone()
3057 { print!("{:02X} ", c); }
3058 println!();
3059 let mut txt = String::new();
3060 for c in cipher.clone()
3061 { write!(txt, "{:02X} ", c); }
3062 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
3063
3064 let mut recovered = vec![0; 55];
3065 a_aes.decrypt_vec(iv, &cipher, recovered.as_mut_ptr());
3066 print!("Ba =\t");
3067 for b in recovered.clone()
3068 { print!("{:02X} ", b); }
3069 println!();
3070 let mut txt = String::new();
3071 for c in recovered.clone()
3072 { write!(txt, "{:02X} ", c); }
3073 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3074
3075 let mut converted = String::new();
3076 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3077
3078 println!("Bb =\t{}", converted);
3079 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3080 assert_eq!(converted, message);
3081 println!();
3082
3083 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3085 print!("K =\t");
3086 for i in 0..32
3087 { print!("{:02X}", key[i]); }
3088 println!();
3089 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
3090 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3091 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
3092
3093 let message = "In the beginning God created the heavens and the earth.";
3094 println!("M =\t{}", message);
3095 let mut cipher = Vec::<u8>::new();
3096 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3097 print!("C =\t");
3098 for c in cipher.clone()
3099 { print!("{:02X} ", c); }
3100 println!();
3101 let mut txt = String::new();
3102 for c in cipher.clone()
3103 { write!(txt, "{:02X} ", c); }
3104 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
3105
3106 let mut recovered = vec![0; 55];
3107 a_rijndael.decrypt_vec(iv, &cipher, recovered.as_mut_ptr());
3108 print!("Ba =\t");
3109 for b in recovered.clone()
3110 { print!("{:02X} ", b); }
3111 println!();
3112 let mut txt = String::new();
3113 for c in recovered.clone()
3114 { write!(txt, "{:02X} ", c); }
3115 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3116
3117 let mut converted = String::new();
3118 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3119
3120 println!("Bb =\t{}", converted);
3121 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3122 assert_eq!(converted, message);
3123 println!();
3124
3125 use cryptocol::number::SharedArrays;
3127 use cryptocol::hash::SHA3_512;
3128 let mut sha3 = SHA3_512::new();
3129 sha3.absorb_str("Post-quantum");
3130 let key: [u8; 64] = sha3.get_hash_value_in_array();
3131 print!("K =\t");
3132 for i in 0..64
3133 { print!("{:02X}", key[i]); }
3134 println!();
3135 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
3136 sha3.absorb_str("Initialize");
3137 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
3138 iv.src = sha3.get_hash_value_in_array();
3139 let iv = unsafe { iv.des };
3140 print!("IV =\t");
3141 for i in 0..16
3142 { print!("{:08X}", iv[i].to_be()); }
3143 println!();
3144 let message = "In the beginning God created the heavens and the earth.";
3145 println!("M =\t{}", message);
3146 let mut cipher = Vec::<u8>::new();
3147 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3148 print!("C =\t");
3149 for c in cipher.clone()
3150 { print!("{:02X} ", c); }
3151 println!();
3152 let mut txt = String::new();
3153 for c in cipher.clone()
3154 { write!(txt, "{:02X} ", c); }
3155 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
3156
3157 let mut recovered = vec![0; 55];
3158 a_rijndael.decrypt_vec(iv, &cipher, recovered.as_mut_ptr());
3159 print!("Ba =\t");
3160 for b in recovered.clone()
3161 { print!("{:02X} ", b); }
3162 println!();
3163 let mut txt = String::new();
3164 for c in recovered.clone()
3165 { write!(txt, "{:02X} ", c); }
3166 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3167
3168 let mut converted = String::new();
3169 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3170
3171 println!("Bb =\t{}", converted);
3172 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3173 assert_eq!(converted, message);
3174 println!("-------------------------------");
3175}
3176
3177fn aes_decrypt_vec_ofb_into_vec()
3178{
3179 println!("aes_decrypt_vec_ofb_into_vec()");
3180 use std::io::Write;
3181 use std::fmt::Write as _;
3182 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
3183
3184 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
3186 println!("K =\t{:#016X}", key);
3187 let mut a_aes = AES_128::new_with_key_u128(key);
3188 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3189 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3190
3191 let message = "In the beginning God created the heavens and the earth.";
3192 println!("M =\t{}", message);
3193 let mut cipher = Vec::<u8>::new();
3194 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3195 print!("C =\t");
3196 for c in cipher.clone()
3197 { print!("{:02X} ", c); }
3198 println!();
3199 let mut txt = String::new();
3200 for c in cipher.clone()
3201 { write!(txt, "{:02X} ", c); }
3202 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
3203
3204 let mut recovered = Vec::<u8>::new();
3205 a_aes.decrypt_vec_into_vec(iv, &cipher, &mut recovered);
3206 print!("Ba =\t");
3207 for b in recovered.clone()
3208 { print!("{:02X} ", b); }
3209 println!();
3210 let mut txt = String::new();
3211 for c in recovered.clone()
3212 { write!(txt, "{:02X} ", c); }
3213 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3214
3215 let mut converted = String::new();
3216 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3217
3218 println!("Bb =\t{}", converted);
3219 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3220 assert_eq!(converted, message);
3221 println!();
3222
3223 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3225 print!("K =\t");
3226 for i in 0..24
3227 { print!("{:02X}", key[i]); }
3228 println!();
3229 let mut a_aes = AES_192::new_with_key(&key);
3230 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3231 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3232
3233 let message = "In the beginning God created the heavens and the earth.";
3234 println!("M =\t{}", message);
3235 let mut cipher = Vec::<u8>::new();
3236 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3237 print!("C =\t");
3238 for c in cipher.clone()
3239 { print!("{:02X} ", c); }
3240 println!();
3241 let mut txt = String::new();
3242 for c in cipher.clone()
3243 { write!(txt, "{:02X} ", c); }
3244 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
3245
3246 let mut recovered = Vec::<u8>::new();
3247 a_aes.decrypt_vec_into_vec(iv, &cipher, &mut recovered);
3248 print!("Ba =\t");
3249 for b in recovered.clone()
3250 { print!("{:02X} ", b); }
3251 println!();
3252 let mut txt = String::new();
3253 for c in recovered.clone()
3254 { write!(txt, "{:02X} ", c); }
3255 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3256
3257 let mut converted = String::new();
3258 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3259
3260 println!("Bb =\t{}", converted);
3261 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3262 assert_eq!(converted, message);
3263 println!();
3264
3265 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3267 print!("K =\t");
3268 for i in 0..32
3269 { print!("{:02X}", key[i]); }
3270 println!();
3271 let mut a_aes = AES_256::new_with_key(&key);
3272 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3273 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3274
3275 let message = "In the beginning God created the heavens and the earth.";
3276 println!("M =\t{}", message);
3277 let mut cipher = Vec::<u8>::new();
3278 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3279 print!("C =\t");
3280 for c in cipher.clone()
3281 { print!("{:02X} ", c); }
3282 println!();
3283 let mut txt = String::new();
3284 for c in cipher.clone()
3285 { write!(txt, "{:02X} ", c); }
3286 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
3287
3288 let mut recovered = Vec::<u8>::new();
3289 a_aes.decrypt_vec_into_vec(iv, &cipher, &mut recovered);
3290 print!("Ba =\t");
3291 for b in recovered.clone()
3292 { print!("{:02X} ", b); }
3293 println!();
3294 let mut txt = String::new();
3295 for c in recovered.clone()
3296 { write!(txt, "{:02X} ", c); }
3297 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3298
3299 let mut converted = String::new();
3300 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3301
3302 println!("Bb =\t{}", converted);
3303 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3304 assert_eq!(converted, message);
3305 println!();
3306
3307 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3309 print!("K =\t");
3310 for i in 0..32
3311 { print!("{:02X}", key[i]); }
3312 println!();
3313 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
3314 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3315 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
3316
3317 let message = "In the beginning God created the heavens and the earth.";
3318 println!("M =\t{}", message);
3319 let mut cipher = Vec::<u8>::new();
3320 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3321 print!("C =\t");
3322 for c in cipher.clone()
3323 { print!("{:02X} ", c); }
3324 println!();
3325 let mut txt = String::new();
3326 for c in cipher.clone()
3327 { write!(txt, "{:02X} ", c); }
3328 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
3329
3330 let mut recovered = Vec::<u8>::new();
3331 a_rijndael.decrypt_vec_into_vec(iv, &cipher, &mut recovered);
3332 print!("Ba =\t");
3333 for b in recovered.clone()
3334 { print!("{:02X} ", b); }
3335 println!();
3336 let mut txt = String::new();
3337 for c in recovered.clone()
3338 { write!(txt, "{:02X} ", c); }
3339 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3340
3341 let mut converted = String::new();
3342 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3343
3344 println!("Bb =\t{}", converted);
3345 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3346 assert_eq!(converted, message);
3347 println!();
3348
3349 use cryptocol::number::SharedArrays;
3351 use cryptocol::hash::SHA3_512;
3352 let mut sha3 = SHA3_512::new();
3353 sha3.absorb_str("Post-quantum");
3354 let key: [u8; 64] = sha3.get_hash_value_in_array();
3355 print!("K =\t");
3356 for i in 0..64
3357 { print!("{:02X}", key[i]); }
3358 println!();
3359 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
3360 sha3.absorb_str("Initialize");
3361 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
3362 iv.src = sha3.get_hash_value_in_array();
3363 let iv = unsafe { iv.des };
3364 print!("IV =\t");
3365 for i in 0..16
3366 { print!("{:08X}", iv[i].to_be()); }
3367 println!();
3368
3369 let message = "In the beginning God created the heavens and the earth.";
3370 println!("M =\t{}", message);
3371 let mut cipher = Vec::<u8>::new();
3372 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3373 print!("C =\t");
3374 for c in cipher.clone()
3375 { print!("{:02X} ", c); }
3376 println!();
3377 let mut txt = String::new();
3378 for c in cipher.clone()
3379 { write!(txt, "{:02X} ", c); }
3380 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
3381
3382 let mut recovered = Vec::<u8>::new();
3383 a_rijndael.decrypt_vec_into_vec(iv, &cipher, &mut recovered);
3384 print!("Ba =\t");
3385 for b in recovered.clone()
3386 { print!("{:02X} ", b); }
3387 println!();
3388 let mut txt = String::new();
3389 for c in recovered.clone()
3390 { write!(txt, "{:02X} ", c); }
3391 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3392
3393 let mut converted = String::new();
3394 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3395
3396 println!("Bb =\t{}", converted);
3397 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3398 assert_eq!(converted, message);
3399 println!("-------------------------------");
3400}
3401
3402fn aes_decrypt_vec_ofb_into_array()
3403{
3404 println!("aes_decrypt_vec_ofb_into_array()");
3405 use std::io::Write;
3406 use std::fmt::Write as _;
3407 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
3408
3409 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
3411 println!("K =\t{:#016X}", key);
3412 let mut a_aes = AES_128::new_with_key_u128(key);
3413 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3414 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3415
3416 let message = "In the beginning God created the heavens and the earth.";
3417 println!("M =\t{}", message);
3418 let mut cipher = Vec::<u8>::new();
3419 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3420 print!("C =\t");
3421 for c in cipher.clone()
3422 { print!("{:02X} ", c); }
3423 println!();
3424 let mut txt = String::new();
3425 for c in cipher.clone()
3426 { write!(txt, "{:02X} ", c); }
3427 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
3428
3429 let mut recovered = [0; 64];
3430 let len = a_aes.decrypt_vec_into_array(iv, &cipher, &mut recovered);
3431 print!("Ba =\t");
3432 for b in recovered.clone()
3433 { print!("{:02X} ", b); }
3434 println!();
3435 let mut txt = String::new();
3436 for c in recovered.clone()
3437 { write!(txt, "{:02X} ", c); }
3438 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
3439
3440 let mut converted = String::new();
3441 unsafe { converted.as_mut_vec() }.write(&recovered);
3442 unsafe { converted.as_mut_vec() }.truncate(len as usize);
3443 println!("Bb =\t{}", converted);
3444 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3445 assert_eq!(converted, message);
3446 println!();
3447
3448 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3450 print!("K =\t");
3451 for i in 0..24
3452 { print!("{:02X}", key[i]); }
3453 println!();
3454 let mut a_aes = AES_192::new_with_key(&key);
3455 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3456 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3457
3458 let message = "In the beginning God created the heavens and the earth.";
3459 println!("M =\t{}", message);
3460 let mut cipher = Vec::<u8>::new();
3461 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3462 print!("C =\t");
3463 for c in cipher.clone()
3464 { print!("{:02X} ", c); }
3465 println!();
3466 let mut txt = String::new();
3467 for c in cipher.clone()
3468 { write!(txt, "{:02X} ", c); }
3469 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
3470
3471 let mut recovered = [0; 64];
3472 a_aes.decrypt_vec_into_array(iv, &cipher, &mut recovered);
3473 print!("Ba =\t");
3474 for b in recovered.clone()
3475 { print!("{:02X} ", b); }
3476 println!();
3477 let mut txt = String::new();
3478 for c in recovered.clone()
3479 { write!(txt, "{:02X} ", c); }
3480 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
3481
3482 let mut converted = String::new();
3483 unsafe { converted.as_mut_vec() }.write(&recovered);
3484 unsafe { converted.as_mut_vec() }.truncate(len as usize);
3485 println!("Bb =\t{}", converted);
3486 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3487 assert_eq!(converted, message);
3488 println!();
3489
3490 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3492 print!("K =\t");
3493 for i in 0..32
3494 { print!("{:02X}", key[i]); }
3495 println!();
3496 let mut a_aes = AES_256::new_with_key(&key);
3497 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3498 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3499
3500 let message = "In the beginning God created the heavens and the earth.";
3501 println!("M =\t{}", message);
3502 let mut cipher = Vec::<u8>::new();
3503 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3504 print!("C =\t");
3505 for c in cipher.clone()
3506 { print!("{:02X} ", c); }
3507 println!();
3508 let mut txt = String::new();
3509 for c in cipher.clone()
3510 { write!(txt, "{:02X} ", c); }
3511 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
3512
3513 let mut recovered = [0; 64];
3514 a_aes.decrypt_vec_into_array(iv, &cipher, &mut recovered);
3515 print!("Ba =\t");
3516 for b in recovered.clone()
3517 { print!("{:02X} ", b); }
3518 println!();
3519 let mut txt = String::new();
3520 for c in recovered.clone()
3521 { write!(txt, "{:02X} ", c); }
3522 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
3523
3524 let mut converted = String::new();
3525 unsafe { converted.as_mut_vec() }.write(&recovered);
3526 unsafe { converted.as_mut_vec() }.truncate(len as usize);
3527 println!("Bb =\t{}", converted);
3528 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3529 assert_eq!(converted, message);
3530 println!();
3531
3532 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3534 print!("K =\t");
3535 for i in 0..32
3536 { print!("{:02X}", key[i]); }
3537 println!();
3538 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
3539 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3540 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
3541
3542 let message = "In the beginning God created the heavens and the earth.";
3543 println!("M =\t{}", message);
3544 let mut cipher = Vec::<u8>::new();
3545 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3546 print!("C =\t");
3547 for c in cipher.clone()
3548 { print!("{:02X} ", c); }
3549 println!();
3550 let mut txt = String::new();
3551 for c in cipher.clone()
3552 { write!(txt, "{:02X} ", c); }
3553 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
3554
3555 let mut recovered = [0; 64];
3556 a_rijndael.decrypt_vec_into_array(iv, &cipher, &mut recovered);
3557 print!("Ba =\t");
3558 for b in recovered.clone()
3559 { print!("{:02X} ", b); }
3560 println!();
3561 let mut txt = String::new();
3562 for c in recovered.clone()
3563 { write!(txt, "{:02X} ", c); }
3564 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
3565
3566 let mut converted = String::new();
3567 unsafe { converted.as_mut_vec() }.write(&recovered);
3568 unsafe { converted.as_mut_vec() }.truncate(len as usize);
3569 println!("Bb =\t{}", converted);
3570 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3571 assert_eq!(converted, message);
3572 println!();
3573
3574 use cryptocol::number::SharedArrays;
3576 use cryptocol::hash::SHA3_512;
3577 let mut sha3 = SHA3_512::new();
3578 sha3.absorb_str("Post-quantum");
3579 let key: [u8; 64] = sha3.get_hash_value_in_array();
3580 print!("K =\t");
3581 for i in 0..64
3582 { print!("{:02X}", key[i]); }
3583 println!();
3584 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
3585 sha3.absorb_str("Initialize");
3586 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
3587 iv.src = sha3.get_hash_value_in_array();
3588 let iv = unsafe { iv.des };
3589 print!("IV =\t");
3590 for i in 0..16
3591 { print!("{:08X}", iv[i].to_be()); }
3592 println!();
3593
3594 let message = "In the beginning God created the heavens and the earth.";
3595 println!("M =\t{}", message);
3596 let mut cipher = Vec::<u8>::new();
3597 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3598 print!("C =\t");
3599 for c in cipher.clone()
3600 { print!("{:02X} ", c); }
3601 println!();
3602 let mut txt = String::new();
3603 for c in cipher.clone()
3604 { write!(txt, "{:02X} ", c); }
3605 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
3606
3607 let mut recovered = [0; 64];
3608 a_rijndael.decrypt_vec_into_array(iv, &cipher, &mut recovered);
3609 print!("Ba =\t");
3610 for b in recovered.clone()
3611 { print!("{:02X} ", b); }
3612 println!();
3613 let mut txt = String::new();
3614 for c in recovered.clone()
3615 { write!(txt, "{:02X} ", c); }
3616 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
3617
3618 let mut converted = String::new();
3619 unsafe { converted.as_mut_vec() }.write(&recovered);
3620 unsafe { converted.as_mut_vec() }.truncate(len as usize);
3621 println!("Bb =\t{}", converted);
3622 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3623 assert_eq!(converted, message);
3624 println!("-------------------------------");
3625}
3626
3627fn aes_decrypt_vec_ofb_into_string()
3628{
3629 println!("aes_decrypt_vec_ofb_into_string()");
3630 use std::io::Write;
3631 use std::fmt::Write as _;
3632 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
3633
3634 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
3636 println!("K =\t{:#016X}", key);
3637 let mut a_aes = AES_128::new_with_key_u128(key);
3638 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3639 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3640
3641 let message = "In the beginning God created the heavens and the earth.";
3642 println!("M =\t{}", message);
3643 let mut cipher = Vec::<u8>::new();
3644 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3645 print!("C =\t");
3646 for c in cipher.clone()
3647 { print!("{:02X} ", c); }
3648 println!();
3649 let mut txt = String::new();
3650 for c in cipher.clone()
3651 { write!(txt, "{:02X} ", c); }
3652 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
3653
3654 let mut converted= String::new();
3655 a_aes.decrypt_vec_into_string(iv, &cipher, &mut converted);
3656 println!("B =\t{}", converted);
3657 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3658 assert_eq!(converted, message);
3659 println!();
3660
3661 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3663 print!("K =\t");
3664 for i in 0..24
3665 { print!("{:02X}", key[i]); }
3666 println!();
3667 let mut a_aes = AES_192::new_with_key(&key);
3668 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3669 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3670
3671 let message = "In the beginning God created the heavens and the earth.";
3672 println!("M =\t{}", message);
3673 let mut cipher = Vec::<u8>::new();
3674 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3675 print!("C =\t");
3676 for c in cipher.clone()
3677 { print!("{:02X} ", c); }
3678 println!();
3679 let mut txt = String::new();
3680 for c in cipher.clone()
3681 { write!(txt, "{:02X} ", c); }
3682 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
3683
3684 let mut converted= String::new();
3685 a_aes.decrypt_vec_into_string(iv, &cipher, &mut converted);
3686 println!("B =\t{}", converted);
3687 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3688 assert_eq!(converted, message);
3689 println!();
3690
3691 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3693 print!("K =\t");
3694 for i in 0..32
3695 { print!("{:02X}", key[i]); }
3696 println!();
3697 let mut a_aes = AES_256::new_with_key(&key);
3698 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3699 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3700
3701 let message = "In the beginning God created the heavens and the earth.";
3702 println!("M =\t{}", message);
3703 let mut cipher = Vec::<u8>::new();
3704 a_aes.encrypt_str_into_vec(iv, &message, &mut cipher);
3705 print!("C =\t");
3706 for c in cipher.clone()
3707 { print!("{:02X} ", c); }
3708 println!();
3709 let mut txt = String::new();
3710 for c in cipher.clone()
3711 { write!(txt, "{:02X} ", c); }
3712 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
3713
3714 let mut converted= String::new();
3715 a_aes.decrypt_vec_into_string(iv, &cipher, &mut converted);
3716 println!("B =\t{}", converted);
3717 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3718 assert_eq!(converted, message);
3719 println!();
3720
3721 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3723 print!("K =\t");
3724 for i in 0..32
3725 { print!("{:02X}", key[i]); }
3726 println!();
3727 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
3728 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3729 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
3730
3731 let message = "In the beginning God created the heavens and the earth.";
3732 println!("M =\t{}", message);
3733 let mut cipher = Vec::<u8>::new();
3734 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3735 print!("C =\t");
3736 for c in cipher.clone()
3737 { print!("{:02X} ", c); }
3738 println!();
3739 let mut txt = String::new();
3740 for c in cipher.clone()
3741 { write!(txt, "{:02X} ", c); }
3742 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
3743
3744 let mut converted= String::new();
3745 a_rijndael.decrypt_vec_into_string(iv, &cipher, &mut converted);
3746 println!("B =\t{}", converted);
3747 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3748 assert_eq!(converted, message);
3749 println!();
3750
3751 use cryptocol::number::SharedArrays;
3753 use cryptocol::hash::SHA3_512;
3754 let mut sha3 = SHA3_512::new();
3755 sha3.absorb_str("Post-quantum");
3756 let key: [u8; 64] = sha3.get_hash_value_in_array();
3757 print!("K =\t");
3758 for i in 0..64
3759 { print!("{:02X}", key[i]); }
3760 println!();
3761 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
3762 sha3.absorb_str("Initialize");
3763 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
3764 iv.src = sha3.get_hash_value_in_array();
3765 let iv = unsafe { iv.des };
3766 print!("IV =\t");
3767 for i in 0..16
3768 { print!("{:08X}", iv[i].to_be()); }
3769 println!();
3770
3771 let message = "In the beginning God created the heavens and the earth.";
3772 println!("M =\t{}", message);
3773 let mut cipher = Vec::<u8>::new();
3774 a_rijndael.encrypt_str_into_vec(iv, &message, &mut cipher);
3775 print!("C =\t");
3776 for c in cipher.clone()
3777 { print!("{:02X} ", c); }
3778 println!();
3779 let mut txt = String::new();
3780 for c in cipher.clone()
3781 { write!(txt, "{:02X} ", c); }
3782 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
3783
3784 let mut converted= String::new();
3785 a_rijndael.decrypt_vec_into_string(iv, &cipher, &mut converted);
3786 println!("B =\t{}", converted);
3787 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3788 assert_eq!(converted, message);
3789 println!("-------------------------------");
3790}
3791
3792fn aes_decrypt_array_ofb()
3793{
3794 println!("aes_decrypt_array_ofb()");
3795 use std::io::Write;
3796 use std::fmt::Write as _;
3797 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
3798
3799 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
3801 println!("K =\t{:#016X}", key);
3802 let mut a_aes = AES_128::new_with_key_u128(key);
3803 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3804 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3805
3806 let message = "In the beginning God created the heavens and the earth.";
3807 println!("M =\t{}", message);
3808 let mut cipher = [0_u8; 55];
3809 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
3810 print!("C =\t");
3811 for c in cipher.clone()
3812 { print!("{:02X} ", c); }
3813 println!();
3814 let mut txt = String::new();
3815 for c in cipher.clone()
3816 { write!(txt, "{:02X} ", c); }
3817 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
3818
3819 let mut recovered = vec![0; 55];
3820 a_aes.decrypt_array(iv, &cipher, recovered.as_mut_ptr());
3821 print!("Ba =\t");
3822 for b in recovered.clone()
3823 { print!("{:02X} ", b); }
3824 println!();
3825 let mut txt = String::new();
3826 for c in recovered.clone()
3827 { write!(txt, "{:02X} ", c); }
3828 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3829
3830 let mut converted = String::new();
3831 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3832
3833 println!("Bb =\t{}", converted);
3834 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3835 assert_eq!(converted, message);
3836 println!();
3837
3838 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3840 print!("K =\t");
3841 for i in 0..24
3842 { print!("{:02X}", key[i]); }
3843 println!();
3844 let mut a_aes = AES_192::new_with_key(&key);
3845 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3846 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3847
3848 let message = "In the beginning God created the heavens and the earth.";
3849 println!("M =\t{}", message);
3850 let mut cipher = [0_u8; 55];
3851 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
3852 print!("C =\t");
3853 for c in cipher.clone()
3854 { print!("{:02X} ", c); }
3855 println!();
3856 let mut txt = String::new();
3857 for c in cipher.clone()
3858 { write!(txt, "{:02X} ", c); }
3859 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
3860
3861 let mut recovered = vec![0; 55];
3862 a_aes.decrypt_array(iv, &cipher, recovered.as_mut_ptr());
3863 print!("Ba =\t");
3864 for b in recovered.clone()
3865 { print!("{:02X} ", b); }
3866 println!();
3867 let mut txt = String::new();
3868 for c in recovered.clone()
3869 { write!(txt, "{:02X} ", c); }
3870 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3871
3872 let mut converted = String::new();
3873 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3874
3875 println!("Bb =\t{}", converted);
3876 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3877 assert_eq!(converted, message);
3878 println!();
3879
3880 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3882 print!("K =\t");
3883 for i in 0..32
3884 { print!("{:02X}", key[i]); }
3885 println!();
3886 let mut a_aes = AES_256::new_with_key(&key);
3887 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3888 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
3889
3890 let message = "In the beginning God created the heavens and the earth.";
3891 println!("M =\t{}", message);
3892 let mut cipher = [0_u8; 55];
3893 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
3894 print!("C =\t");
3895 for c in cipher.clone()
3896 { print!("{:02X} ", c); }
3897 println!();
3898 let mut txt = String::new();
3899 for c in cipher.clone()
3900 { write!(txt, "{:02X} ", c); }
3901 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
3902
3903 let mut recovered = vec![0; 55];
3904 a_aes.decrypt_array(iv, &cipher, recovered.as_mut_ptr());
3905 print!("Ba =\t");
3906 for b in recovered.clone()
3907 { print!("{:02X} ", b); }
3908 println!();
3909 let mut txt = String::new();
3910 for c in recovered.clone()
3911 { write!(txt, "{:02X} ", c); }
3912 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3913
3914 let mut converted = String::new();
3915 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3916
3917 println!("Bb =\t{}", converted);
3918 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3919 assert_eq!(converted, message);
3920 println!();
3921
3922 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
3924 print!("K =\t");
3925 for i in 0..32
3926 { print!("{:02X}", key[i]); }
3927 println!();
3928 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
3929 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
3930 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
3931
3932 let message = "In the beginning God created the heavens and the earth.";
3933 println!("M =\t{}", message);
3934 let mut cipher = [0_u8; 55];
3935 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
3936 print!("C =\t");
3937 for c in cipher.clone()
3938 { print!("{:02X} ", c); }
3939 println!();
3940 let mut txt = String::new();
3941 for c in cipher.clone()
3942 { write!(txt, "{:02X} ", c); }
3943 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
3944
3945 let mut recovered = vec![0; 55];
3946 a_rijndael.decrypt_array(iv, &cipher, recovered.as_mut_ptr());
3947 print!("Ba =\t");
3948 for b in recovered.clone()
3949 { print!("{:02X} ", b); }
3950 println!();
3951 let mut txt = String::new();
3952 for c in recovered.clone()
3953 { write!(txt, "{:02X} ", c); }
3954 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
3955
3956 let mut converted = String::new();
3957 unsafe { converted.as_mut_vec() }.append(&mut recovered);
3958
3959 println!("Bb =\t{}", converted);
3960 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
3961 assert_eq!(converted, message);
3962 println!();
3963
3964 use cryptocol::number::SharedArrays;
3966 use cryptocol::hash::SHA3_512;
3967 let mut sha3 = SHA3_512::new();
3968 sha3.absorb_str("Post-quantum");
3969 let key: [u8; 64] = sha3.get_hash_value_in_array();
3970 print!("K =\t");
3971 for i in 0..64
3972 { print!("{:02X}", key[i]); }
3973 println!();
3974 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
3975 sha3.absorb_str("Initialize");
3976 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
3977 iv.src = sha3.get_hash_value_in_array();
3978 let iv = unsafe { iv.des };
3979 print!("IV =\t");
3980 for i in 0..16
3981 { print!("{:08X}", iv[i].to_be()); }
3982 println!();
3983 let message = "In the beginning God created the heavens and the earth.";
3984 println!("M =\t{}", message);
3985 let mut cipher = [0_u8; 55];
3986 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
3987 print!("C =\t");
3988 for c in cipher.clone()
3989 { print!("{:02X} ", c); }
3990 println!();
3991 let mut txt = String::new();
3992 for c in cipher.clone()
3993 { write!(txt, "{:02X} ", c); }
3994 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
3995
3996 let mut recovered = vec![0; 55];
3997 a_rijndael.decrypt_array(iv, &cipher, recovered.as_mut_ptr());
3998 print!("Ba =\t");
3999 for b in recovered.clone()
4000 { print!("{:02X} ", b); }
4001 println!();
4002 let mut txt = String::new();
4003 for c in recovered.clone()
4004 { write!(txt, "{:02X} ", c); }
4005 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
4006
4007 let mut converted = String::new();
4008 unsafe { converted.as_mut_vec() }.append(&mut recovered);
4009
4010 println!("Bb =\t{}", converted);
4011 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4012 assert_eq!(converted, message);
4013 println!("-------------------------------");
4014}
4015
4016fn aes_decrypt_array_ofb_into_vec()
4017{
4018 println!("aes_decrypt_array_ofb_into_vec()");
4019 use std::io::Write;
4020 use std::fmt::Write as _;
4021 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
4022
4023 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
4025 println!("K =\t{:#016X}", key);
4026 let mut a_aes = AES_128::new_with_key_u128(key);
4027 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4028 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4029
4030 let message = "In the beginning God created the heavens and the earth.";
4031 println!("M =\t{}", message);
4032 let mut cipher = [0_u8; 55];
4033 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4034 print!("C =\t");
4035 for c in cipher.clone()
4036 { print!("{:02X} ", c); }
4037 println!();
4038 let mut txt = String::new();
4039 for c in cipher.clone()
4040 { write!(txt, "{:02X} ", c); }
4041 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
4042
4043 let mut recovered = vec![0; 55];
4044 a_aes.decrypt_array_into_vec(iv, &cipher, &mut recovered);
4045 print!("Ba =\t");
4046 for b in recovered.clone()
4047 { print!("{:02X} ", b); }
4048 println!();
4049 let mut txt = String::new();
4050 for c in recovered.clone()
4051 { write!(txt, "{:02X} ", c); }
4052 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
4053
4054 let mut converted = String::new();
4055 unsafe { converted.as_mut_vec() }.append(&mut recovered);
4056
4057 println!("Bb =\t{}", converted);
4058 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4059 assert_eq!(converted, message);
4060 println!();
4061
4062 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4064 print!("K =\t");
4065 for i in 0..24
4066 { print!("{:02X}", key[i]); }
4067 println!();
4068 let mut a_aes = AES_192::new_with_key(&key);
4069 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4070 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4071
4072 let message = "In the beginning God created the heavens and the earth.";
4073 println!("M =\t{}", message);
4074 let mut cipher = [0_u8; 55];
4075 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4076 print!("C =\t");
4077 for c in cipher.clone()
4078 { print!("{:02X} ", c); }
4079 println!();
4080 let mut txt = String::new();
4081 for c in cipher.clone()
4082 { write!(txt, "{:02X} ", c); }
4083 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
4084
4085 let mut recovered = vec![0; 55];
4086 a_aes.decrypt_array_into_vec(iv, &cipher, &mut recovered);
4087 print!("Ba =\t");
4088 for b in recovered.clone()
4089 { print!("{:02X} ", b); }
4090 println!();
4091 let mut txt = String::new();
4092 for c in recovered.clone()
4093 { write!(txt, "{:02X} ", c); }
4094 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
4095
4096 let mut converted = String::new();
4097 unsafe { converted.as_mut_vec() }.append(&mut recovered);
4098
4099 println!("Bb =\t{}", converted);
4100 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4101 assert_eq!(converted, message);
4102 println!();
4103
4104 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4106 print!("K =\t");
4107 for i in 0..32
4108 { print!("{:02X}", key[i]); }
4109 println!();
4110 let mut a_aes = AES_256::new_with_key(&key);
4111 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4112 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4113
4114 let message = "In the beginning God created the heavens and the earth.";
4115 println!("M =\t{}", message);
4116 let mut cipher = [0_u8; 55];
4117 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4118 print!("C =\t");
4119 for c in cipher.clone()
4120 { print!("{:02X} ", c); }
4121 println!();
4122 let mut txt = String::new();
4123 for c in cipher.clone()
4124 { write!(txt, "{:02X} ", c); }
4125 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
4126
4127 let mut recovered = vec![0; 55];
4128 a_aes.decrypt_array_into_vec(iv, &cipher, &mut recovered);
4129 print!("Ba =\t");
4130 for b in recovered.clone()
4131 { print!("{:02X} ", b); }
4132 println!();
4133 let mut txt = String::new();
4134 for c in recovered.clone()
4135 { write!(txt, "{:02X} ", c); }
4136 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
4137
4138 let mut converted = String::new();
4139 unsafe { converted.as_mut_vec() }.append(&mut recovered);
4140
4141 println!("Bb =\t{}", converted);
4142 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4143 assert_eq!(converted, message);
4144 println!();
4145
4146 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4148 print!("K =\t");
4149 for i in 0..32
4150 { print!("{:02X}", key[i]); }
4151 println!();
4152 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
4153 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4154 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
4155
4156 let message = "In the beginning God created the heavens and the earth.";
4157 println!("M =\t{}", message);
4158 let mut cipher = [0_u8; 55];
4159 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4160 print!("C =\t");
4161 for c in cipher.clone()
4162 { print!("{:02X} ", c); }
4163 println!();
4164 let mut txt = String::new();
4165 for c in cipher.clone()
4166 { write!(txt, "{:02X} ", c); }
4167 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
4168
4169 let mut recovered = vec![0; 55];
4170 a_rijndael.decrypt_array_into_vec(iv, &cipher, &mut recovered);
4171 print!("Ba =\t");
4172 for b in recovered.clone()
4173 { print!("{:02X} ", b); }
4174 println!();
4175 let mut txt = String::new();
4176 for c in recovered.clone()
4177 { write!(txt, "{:02X} ", c); }
4178 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
4179
4180 let mut converted = String::new();
4181 unsafe { converted.as_mut_vec() }.append(&mut recovered);
4182
4183 println!("Bb =\t{}", converted);
4184 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4185 assert_eq!(converted, message);
4186 println!();
4187
4188 use cryptocol::number::SharedArrays;
4190 use cryptocol::hash::SHA3_512;
4191 let mut sha3 = SHA3_512::new();
4192 sha3.absorb_str("Post-quantum");
4193 let key: [u8; 64] = sha3.get_hash_value_in_array();
4194 print!("K =\t");
4195 for i in 0..64
4196 { print!("{:02X}", key[i]); }
4197 println!();
4198 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
4199 sha3.absorb_str("Initialize");
4200 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
4201 iv.src = sha3.get_hash_value_in_array();
4202 let iv = unsafe { iv.des };
4203 print!("IV =\t");
4204 for i in 0..16
4205 { print!("{:08X}", iv[i].to_be()); }
4206 println!();
4207 let message = "In the beginning God created the heavens and the earth.";
4208 println!("M =\t{}", message);
4209 let mut cipher = [0_u8; 55];
4210 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4211 print!("C =\t");
4212 for c in cipher.clone()
4213 { print!("{:02X} ", c); }
4214 println!();
4215 let mut txt = String::new();
4216 for c in cipher.clone()
4217 { write!(txt, "{:02X} ", c); }
4218 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
4219
4220 let mut recovered = vec![0; 55];
4221 a_rijndael.decrypt_array_into_vec(iv, &cipher, &mut recovered);
4222 print!("Ba =\t");
4223 for b in recovered.clone()
4224 { print!("{:02X} ", b); }
4225 println!();
4226 let mut txt = String::new();
4227 for c in recovered.clone()
4228 { write!(txt, "{:02X} ", c); }
4229 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E ");
4230
4231 let mut converted = String::new();
4232 unsafe { converted.as_mut_vec() }.append(&mut recovered);
4233
4234 println!("Bb =\t{}", converted);
4235 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4236 assert_eq!(converted, message);
4237 println!("-------------------------------");
4238}
4239
4240fn aes_decrypt_array_ofb_into_array()
4241{
4242 println!("aes_decrypt_array_ofb_into_array()");
4243 use std::io::Write;
4244 use std::fmt::Write as _;
4245 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
4246
4247 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
4249 println!("K =\t{:#016X}", key);
4250 let mut a_aes = AES_128::new_with_key_u128(key);
4251 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4252 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4253
4254 let message = "In the beginning God created the heavens and the earth.";
4255 println!("M =\t{}", message);
4256 let mut cipher = [0_u8; 55];
4257 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4258 print!("C =\t");
4259 for c in cipher.clone()
4260 { print!("{:02X} ", c); }
4261 println!();
4262 let mut txt = String::new();
4263 for c in cipher.clone()
4264 { write!(txt, "{:02X} ", c); }
4265 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
4266
4267 let mut recovered = [0; 64];
4268 let len = a_aes.decrypt_array_into_array(iv, &cipher, &mut recovered);
4269 print!("Ba =\t");
4270 for b in recovered.clone()
4271 { print!("{:02X} ", b); }
4272 println!();
4273 let mut txt = String::new();
4274 for c in recovered.clone()
4275 { write!(txt, "{:02X} ", c); }
4276 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
4277
4278 let mut converted = String::new();
4279 unsafe { converted.as_mut_vec() }.write(&recovered);
4280 unsafe { converted.as_mut_vec() }.truncate(len as usize);
4281 println!("Bb =\t{}", converted);
4282 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4283 assert_eq!(converted, message);
4284 println!();
4285
4286 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4288 print!("K =\t");
4289 for i in 0..24
4290 { print!("{:02X}", key[i]); }
4291 println!();
4292 let mut a_aes = AES_192::new_with_key(&key);
4293 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4294 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4295
4296 let message = "In the beginning God created the heavens and the earth.";
4297 println!("M =\t{}", message);
4298 let mut cipher = [0_u8; 55];
4299 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4300 print!("C =\t");
4301 for c in cipher.clone()
4302 { print!("{:02X} ", c); }
4303 println!();
4304 let mut txt = String::new();
4305 for c in cipher.clone()
4306 { write!(txt, "{:02X} ", c); }
4307 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
4308
4309 let mut recovered = [0; 64];
4310 let len = a_aes.decrypt_array_into_array(iv, &cipher, &mut recovered);
4311 print!("Ba =\t");
4312 for b in recovered.clone()
4313 { print!("{:02X} ", b); }
4314 println!();
4315 let mut txt = String::new();
4316 for c in recovered.clone()
4317 { write!(txt, "{:02X} ", c); }
4318 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
4319
4320 let mut converted = String::new();
4321 unsafe { converted.as_mut_vec() }.write(&recovered);
4322 unsafe { converted.as_mut_vec() }.truncate(len as usize);
4323 println!("Bb =\t{}", converted);
4324 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4325 assert_eq!(converted, message);
4326 println!();
4327
4328 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4330 print!("K =\t");
4331 for i in 0..32
4332 { print!("{:02X}", key[i]); }
4333 println!();
4334 let mut a_aes = AES_256::new_with_key(&key);
4335 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4336 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4337
4338 let message = "In the beginning God created the heavens and the earth.";
4339 println!("M =\t{}", message);
4340 let mut cipher = [0_u8; 55];
4341 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4342 print!("C =\t");
4343 for c in cipher.clone()
4344 { print!("{:02X} ", c); }
4345 println!();
4346 let mut txt = String::new();
4347 for c in cipher.clone()
4348 { write!(txt, "{:02X} ", c); }
4349 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
4350
4351 let mut recovered = [0; 64];
4352 let len = a_aes.decrypt_array_into_array(iv, &cipher, &mut recovered);
4353 print!("Ba =\t");
4354 for b in recovered.clone()
4355 { print!("{:02X} ", b); }
4356 println!();
4357 let mut txt = String::new();
4358 for c in recovered.clone()
4359 { write!(txt, "{:02X} ", c); }
4360 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
4361
4362 let mut converted = String::new();
4363 unsafe { converted.as_mut_vec() }.write(&recovered);
4364 unsafe { converted.as_mut_vec() }.truncate(len as usize);
4365 println!("Bb =\t{}", converted);
4366 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4367 assert_eq!(converted, message);
4368 println!();
4369
4370 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4372 print!("K =\t");
4373 for i in 0..32
4374 { print!("{:02X}", key[i]); }
4375 println!();
4376 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
4377 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4378 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
4379
4380 let message = "In the beginning God created the heavens and the earth.";
4381 println!("M =\t{}", message);
4382 let mut cipher = [0_u8; 55];
4383 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4384 print!("C =\t");
4385 for c in cipher.clone()
4386 { print!("{:02X} ", c); }
4387 println!();
4388 let mut txt = String::new();
4389 for c in cipher.clone()
4390 { write!(txt, "{:02X} ", c); }
4391 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
4392
4393 let mut recovered = [0; 64];
4394 let len = a_rijndael.decrypt_array_into_array(iv, &cipher, &mut recovered);
4395 print!("Ba =\t");
4396 for b in recovered.clone()
4397 { print!("{:02X} ", b); }
4398 println!();
4399 let mut txt = String::new();
4400 for c in recovered.clone()
4401 { write!(txt, "{:02X} ", c); }
4402 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
4403
4404 let mut converted = String::new();
4405 unsafe { converted.as_mut_vec() }.write(&recovered);
4406 unsafe { converted.as_mut_vec() }.truncate(len as usize);
4407 println!("Bb =\t{}", converted);
4408 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4409 assert_eq!(converted, message);
4410 println!();
4411
4412 use cryptocol::number::SharedArrays;
4414 use cryptocol::hash::SHA3_512;
4415 let mut sha3 = SHA3_512::new();
4416 sha3.absorb_str("Post-quantum");
4417 let key: [u8; 64] = sha3.get_hash_value_in_array();
4418 print!("K =\t");
4419 for i in 0..64
4420 { print!("{:02X}", key[i]); }
4421 println!();
4422 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
4423 sha3.absorb_str("Initialize");
4424 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
4425 iv.src = sha3.get_hash_value_in_array();
4426 let iv = unsafe { iv.des };
4427 print!("IV =\t");
4428 for i in 0..16
4429 { print!("{:08X}", iv[i].to_be()); }
4430 println!();
4431 let message = "In the beginning God created the heavens and the earth.";
4432 println!("M =\t{}", message);
4433 let mut cipher = [0_u8; 55];
4434 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4435 print!("C =\t");
4436 for c in cipher.clone()
4437 { print!("{:02X} ", c); }
4438 println!();
4439 let mut txt = String::new();
4440 for c in cipher.clone()
4441 { write!(txt, "{:02X} ", c); }
4442 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
4443
4444 let mut recovered = [0; 64];
4445 let len = a_rijndael.decrypt_array_into_array(iv, &cipher, &mut recovered);
4446 print!("Ba =\t");
4447 for b in recovered.clone()
4448 { print!("{:02X} ", b); }
4449 println!();
4450 let mut txt = String::new();
4451 for c in recovered.clone()
4452 { write!(txt, "{:02X} ", c); }
4453 assert_eq!(txt, "49 6E 20 74 68 65 20 62 65 67 69 6E 6E 69 6E 67 20 47 6F 64 20 63 72 65 61 74 65 64 20 74 68 65 20 68 65 61 76 65 6E 73 20 61 6E 64 20 74 68 65 20 65 61 72 74 68 2E 00 00 00 00 00 00 00 00 00 ");
4454
4455 let mut converted = String::new();
4456 unsafe { converted.as_mut_vec() }.write(&recovered);
4457 unsafe { converted.as_mut_vec() }.truncate(len as usize);
4458 println!("Bb =\t{}", converted);
4459 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4460 assert_eq!(converted, message);
4461 println!("-------------------------------");
4462}
4463
4464fn aes_decrypt_array_ofb_into_string()
4465{
4466 println!("aes_decrypt_array_ofb_into_string()");
4467 use std::io::Write;
4468 use std::fmt::Write as _;
4469 use cryptocol::symmetric::{ AES_128, AES_192, AES_256, Rijndael_256_256, Rijndael_512_512, OFB };
4470
4471 let key = 0x_1234567890ABCDEF1234567890ABCDEF_u128;
4473 println!("K =\t{:#016X}", key);
4474 let mut a_aes = AES_128::new_with_key_u128(key);
4475 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4476 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4477
4478 let message = "In the beginning God created the heavens and the earth.";
4479 println!("M =\t{}", message);
4480 let mut cipher = [0_u8; 55];
4481 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4482 print!("C =\t");
4483 for c in cipher.clone()
4484 { print!("{:02X} ", c); }
4485 println!();
4486 let mut txt = String::new();
4487 for c in cipher.clone()
4488 { write!(txt, "{:02X} ", c); }
4489 assert_eq!(txt, "B9 AD 7F CB 45 2A B9 31 89 15 16 47 4C A9 F3 D1 37 0B 09 FA 85 70 29 5C 99 3A DB F3 A9 A2 B8 C6 5B 39 CF A6 07 29 23 FF 8B 1E B6 26 29 D6 C8 19 41 A5 4C A0 49 82 F6 ");
4490
4491 let mut converted= String::new();
4492 a_aes.decrypt_array_into_string(iv, &cipher, &mut converted);
4493 println!("B =\t{}", converted);
4494 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4495 assert_eq!(converted, message);
4496 println!();
4497
4498 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4500 print!("K =\t");
4501 for i in 0..24
4502 { print!("{:02X}", key[i]); }
4503 println!();
4504 let mut a_aes = AES_192::new_with_key(&key);
4505 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4506 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4507
4508 let message = "In the beginning God created the heavens and the earth.";
4509 println!("M =\t{}", message);
4510 let mut cipher = [0_u8; 55];
4511 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4512 print!("C =\t");
4513 for c in cipher.clone()
4514 { print!("{:02X} ", c); }
4515 println!();
4516 let mut txt = String::new();
4517 for c in cipher.clone()
4518 { write!(txt, "{:02X} ", c); }
4519 assert_eq!(txt, "AF 45 AD 45 36 8B 38 2A 69 F1 50 31 1D F6 90 88 31 2D 9D 2C FD E3 21 61 10 F7 18 81 AB 72 7F 21 37 D0 34 87 EE 62 70 BC 45 89 B2 F7 F3 9F 1D 27 D1 2D 8F FC 73 0D 68 ");
4520
4521 let mut converted= String::new();
4522 a_aes.decrypt_array_into_string(iv, &cipher, &mut converted);
4523 println!("B =\t{}", converted);
4524 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4525 assert_eq!(converted, message);
4526 println!();
4527
4528 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4530 print!("K =\t");
4531 for i in 0..32
4532 { print!("{:02X}", key[i]); }
4533 println!();
4534 let mut a_aes = AES_256::new_with_key(&key);
4535 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4536 println!("IV =\t{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be());
4537
4538 let message = "In the beginning God created the heavens and the earth.";
4539 println!("M =\t{}", message);
4540 let mut cipher = [0_u8; 55];
4541 a_aes.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4542 print!("C =\t");
4543 for c in cipher.clone()
4544 { print!("{:02X} ", c); }
4545 println!();
4546 let mut txt = String::new();
4547 for c in cipher.clone()
4548 { write!(txt, "{:02X} ", c); }
4549 assert_eq!(txt, "9B 2F 4A C9 65 B3 7C 61 E7 DE 9B 97 F1 4C A2 B6 41 17 10 CE 43 B6 36 4A 7C 4C DD E9 73 E5 8F 5E C5 AC B0 0A 00 02 4F 85 A9 37 2C 2D D3 C7 29 F7 45 F1 5C C7 7A D3 B8 ");
4550
4551 let mut converted= String::new();
4552 a_aes.decrypt_array_into_string(iv, &cipher, &mut converted);
4553 println!("B =\t{}", converted);
4554 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4555 assert_eq!(converted, message);
4556 println!();
4557
4558 let key = [0x12_u8, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF];
4560 print!("K =\t");
4561 for i in 0..32
4562 { print!("{:02X}", key[i]); }
4563 println!();
4564 let mut a_rijndael = Rijndael_256_256::new_with_key(&key);
4565 let iv = [0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32, 0x87654321_u32, 0xFEDCBA09_u32];
4566 println!("IV =\t{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}{:08X}", iv[0].to_be(), iv[1].to_be(), iv[2].to_be(), iv[3].to_be(), iv[4].to_be(), iv[5].to_be(), iv[6].to_be(), iv[7].to_be());
4567
4568 let message = "In the beginning God created the heavens and the earth.";
4569 println!("M =\t{}", message);
4570 let mut cipher = [0_u8; 55];
4571 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4572 print!("C =\t");
4573 for c in cipher.clone()
4574 { print!("{:02X} ", c); }
4575 println!();
4576 let mut txt = String::new();
4577 for c in cipher.clone()
4578 { write!(txt, "{:02X} ", c); }
4579 assert_eq!(txt, "A0 84 D5 64 D1 8C FD B4 67 7F 5F 01 DA FF 1F A3 39 F8 F4 66 5C D4 54 87 2C CA 6C 2B AB C3 FD CC A5 C8 17 32 0C 84 F6 A6 71 D4 DA C4 DB 82 8C C7 67 BF CD 28 7C 52 DA ");
4580
4581 let mut converted= String::new();
4582 a_rijndael.decrypt_array_into_string(iv, &cipher, &mut converted);
4583 println!("B =\t{}", converted);
4584 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4585 assert_eq!(converted, message);
4586 println!();
4587
4588 use cryptocol::number::SharedArrays;
4590 use cryptocol::hash::SHA3_512;
4591 let mut sha3 = SHA3_512::new();
4592 sha3.absorb_str("Post-quantum");
4593 let key: [u8; 64] = sha3.get_hash_value_in_array();
4594 print!("K =\t");
4595 for i in 0..64
4596 { print!("{:02X}", key[i]); }
4597 println!();
4598 let mut a_rijndael = Rijndael_512_512::new_with_key(&key);
4599 sha3.absorb_str("Initialize");
4600 let mut iv = SharedArrays::<u32, 16, u8, 64>::new();
4601 iv.src = sha3.get_hash_value_in_array();
4602 let iv = unsafe { iv.des };
4603 print!("IV =\t");
4604 for i in 0..16
4605 { print!("{:08X}", iv[i].to_be()); }
4606 println!();
4607 let message = "In the beginning God created the heavens and the earth.";
4608 println!("M =\t{}", message);
4609 let mut cipher = [0_u8; 55];
4610 a_rijndael.encrypt_str_into_array(iv.clone(), &message, &mut cipher);
4611 print!("C =\t");
4612 for c in cipher.clone()
4613 { print!("{:02X} ", c); }
4614 println!();
4615 let mut txt = String::new();
4616 for c in cipher.clone()
4617 { write!(txt, "{:02X} ", c); }
4618 assert_eq!(txt, "B7 50 B4 3D 3C 4A C7 58 C2 1E 11 33 FD A8 BE AC 3A 56 2F DF 89 F4 57 4F A6 E8 98 61 A6 30 EF 7C 2B 09 2A 18 59 AF AC 5E 31 22 9A E1 8C 4A 63 6F 06 C5 F2 41 23 60 54 ");
4619
4620 let mut converted= String::new();
4621 a_rijndael.decrypt_array_into_string(iv, &cipher, &mut converted);
4622 println!("B =\t{}", converted);
4623 assert_eq!(converted, "In the beginning God created the heavens and the earth.");
4624 assert_eq!(converted, message);
4625 println!("-------------------------------");
4626}