aes_ofb_examples/
aes_ofb_examples.rs

1// Copyright 2025 PARK Youngho.
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
6// This file may not be copied, modified, or distributed
7// except according to those terms.
8
9#![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    // Normal case for AES-128
56    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    // Normal case for AES-192
77    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    // Normal case for AES-256
101    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    // Normal case for Rijndael-256-256
125    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    // Normal case for Rijndael-512-512 for post-quantum
149    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    // Normal case for AES-128
191    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    // Normal case for AES-192
212    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    // Normal case for AES-256
236    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    // Normal case for Rijndael-256-256
260    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    // Normal case for Rijndael-512-512 for post-quantum
284    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    // Normal case for AES-128
325    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    // Normal case for AES-192
346    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    // Normal case for AES-256
370    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    // Normal case for Rijndael-256-256
394    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    // Normal case for Rijndael-512-512 for post-quantum
418    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    // Normal case for AES-128
459    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    // Normal case for AES-192
480    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    // Normal case for AES-256
504    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    // Normal case for Rijndael-256-256
528    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    // Normal case for Rijndael-512-512 for post-quantum
552    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    // Normal case for AES-128
593    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    // Normal case for AES-192
614    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    // Normal case for AES-256
638    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    // Normal case for Rijndael-256-256
662    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    // Normal case for Rijndael-512-512 for post-quantum
686    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    // Normal case for AES-128
727    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    // Normal case for AES-192
748    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    // Normal case for AES-256
772    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    // Normal case for Rijndael-256-256
796    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    // Normal case for Rijndael-512-512 for post-quantum
820    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    // Normal case for AES-128
861    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    // Normal case for AES-192
882    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    // Normal case for AES-256
906    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    // Normal case for Rijndael-256-256
930    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    // Normal case for Rijndael-512-512 for post-quantum
954    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    // Normal case for AES-128
996    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    // Normal case for AES-192
1017    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    // Normal case for AES-256
1041    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    // Normal case for Rijndael-256-256
1065    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    // Normal case for Rijndael-512-512 for post-quantum
1089    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    // Normal case for AES-128
1130    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    // Normal case for AES-192
1151    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    // Normal case for AES-256
1175    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    // Normal case for Rijndael-256-256
1199    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    // Normal case for Rijndael-512-512 for post-quantum
1223    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    // Normal case for AES-128
1264    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    // Normal case for AES-192
1286    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    // Normal case for AES-256
1311    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    // Normal case for Rijndael-256-256
1336    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    // Normal case for Rijndael-512-512 for post-quantum
1361    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    // Normal case for AES-128
1403    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    // Normal case for AES-192
1425    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    // Normal case for AES-256
1450    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    // Normal case for Rijndael-256-256
1475    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    // Normal case for Rijndael-512-512 for post-quantum
1500    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    // Normal case for AES-128
1542    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    // Normal case for AES-192
1564    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    // Normal case for AES-256
1589    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    // Normal case for Rijndael-256-256
1614    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    // Normal case for Rijndael-512-512 for post-quantum
1639    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    // Normal case for AES-128
1681    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    // Normal case for AES-192
1704    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    // Normal case for AES-256
1730    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    // Normal case for Rijndael-256-256
1756    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    // Normal case for Rijndael-512-512 for post-quantum
1782    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    // Normal case for AES-128
1825    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    // Normal case for AES-192
1848    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    // Normal case for AES-256
1874    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    // Normal case for Rijndael-256-256
1900    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    // Normal case for Rijndael-512-512 for post-quantum
1926    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    // Normal case for AES-128
1969    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    // Normal case for AES-192
1992    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    // Normal case for AES-256
2018    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    // Normal case for Rijndael-256-256
2044    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    // Normal case for Rijndael-512-512 for post-quantum
2070    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    // Normal case for AES-128
2114    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    // Normal case for AES-192
2153    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    // Normal case for AES-256
2195    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    // Normal case for Rijndael-256-256
2237    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    // Normal case for Rijndael-512-512 for post-quantum
2279    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    // Normal case for AES-128
2339    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    // Normal case for AES-192
2379    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    // Normal case for AES-256
2422    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    // Normal case for Rijndael-256-256
2465    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    // Normal case for Rijndael-512-512 for post-quantum
2508    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    // Normal case for AES-128
2567    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    // Normal case for AES-192
2607    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    // Normal case for AES-256
2651    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    // Normal case for Rijndael-256-256
2694    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    // Normal case for Rijndael-512-512 for post-quantum
2736    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    // Normal case for AES-128
2797    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    // Normal case for AES-192
2824    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    // Normal case for AES-256
2854    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    // Normal case for Rijndael-256-256
2884    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    // Normal case for Rijndael-512-512 for post-quantum
2914    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    // Normal case for AES-128
2961    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    // Normal case for AES-192
3000    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    // Normal case for AES-256
3042    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    // Normal case for Rijndael-256-256
3084    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    // Normal case for Rijndael-512-512 for post-quantum
3126    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    // Normal case for AES-128
3185    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    // Normal case for AES-192
3224    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    // Normal case for AES-256
3266    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    // Normal case for Rijndael-256-256
3308    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    // Normal case for Rijndael-512-512 for post-quantum
3350    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    // Normal case for AES-128
3410    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    // Normal case for AES-192
3449    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    // Normal case for AES-256
3491    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    // Normal case for Rijndael-256-256
3533    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    // Normal case for Rijndael-512-512 for post-quantum
3575    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    // Normal case for AES-128
3635    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    // Normal case for AES-192
3662    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    // Normal case for AES-256
3692    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    // Normal case for Rijndael-256-256
3722    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    // Normal case for Rijndael-512-512 for post-quantum
3752    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    // Normal case for AES-128
3800    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    // Normal case for AES-192
3839    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    // Normal case for AES-256
3881    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    // Normal case for Rijndael-256-256
3923    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    // Normal case for Rijndael-512-512 for post-quantum
3965    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    // Normal case for AES-128
4024    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    // Normal case for AES-192
4063    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    // Normal case for AES-256
4105    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    // Normal case for Rijndael-256-256
4147    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    // Normal case for Rijndael-512-512 for post-quantum
4189    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    // Normal case for AES-128
4248    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    // Normal case for AES-192
4287    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    // Normal case for AES-256
4329    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    // Normal case for Rijndael-256-256
4371    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    // Normal case for Rijndael-512-512 for post-quantum
4413    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    // Normal case for AES-128
4472    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    // Normal case for AES-192
4499    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    // Normal case for AES-256
4529    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    // Normal case for Rijndael-256-256
4559    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    // Normal case for Rijndael-512-512 for post-quantum
4589    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}