des_basic_quick_examples/
des_basic_quick_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
16// #![allow(missing_docs)]
17// #![allow(rustdoc::missing_doc_code_examples)]
18// #[allow(non_camel_case_types)]
19// #[allow(dead_code)]
20
21
22pub fn main()
23{
24    des_quick_start_main();
25    des_basic_operation_main();
26    des_encrypt_decrypt_u64_array_u64_main();
27}
28
29fn des_quick_start_main()
30{
31    des_quick_start_instantiation_with_key();
32    des_quick_start_instantiation_without_key();
33    des_quick_start_encryption_decryption_16_rounds();
34    des_quick_start_encryption_decryption_256_rounds();
35}
36
37fn des_quick_start_instantiation_with_key()
38{
39    println!("des_quick_start_instantiation_with_key()");
40    use cryptocol::symmetric::DES;
41
42    let key = 0x_1234567890ABCDEF_u64;
43    let mut _a_des = DES::new_with_key_u64(key);
44
45    let key = [0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8];
46    let mut _a_des = DES::new_with_key(key);
47    println!("-------------------------------");
48}
49
50fn des_quick_start_instantiation_without_key()
51{
52    println!("des_quick_start_instantiation_without_key()");
53    use cryptocol::symmetric::DES;
54
55    let mut a_des = DES::new();
56    let key = 0x_1234567890ABCDEF_u64;
57    a_des.set_key_u64(key);
58
59    let mut a_des = DES::new();
60    let key = [0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8];
61    a_des.set_key(key);
62    println!("-------------------------------");
63}
64
65fn des_quick_start_encryption_decryption_16_rounds()
66{
67    println!("des_quick_start_encryption_decryption_16_rounds()");
68    use std::io::Write;
69    use std::fmt::Write as _;
70    use cryptocol::symmetric::{ CBC_PKCS7, DES };
71    
72    let mut a_des = DES::new_with_key([0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8]);
73    let message = "In the beginning God created the heavens and the earth.";
74    println!("M =\t{}", message);
75    let iv = 0x_FEDCBA0987654321_u64;
76    println!("IV =\t{}", iv);
77    let mut cipher = Vec::<u8>::new();
78    a_des.encrypt_str_into_vec(iv, message, &mut cipher);
79    print!("C =\t");
80    for c in cipher.clone()
81        { print!("{:02X} ", c); }
82    println!();
83    let mut txt = String::new();
84    for c in cipher.clone()
85        { write!(txt, "{:02X} ", c); }
86    assert_eq!(txt, "4B B5 ED DC A0 58 7E 6D 6C 3B A2 00 38 C3 D4 29 42 B1 CF 0D E9 FA EA 11 11 6B C8 30 73 39 DD B7 3F 96 9B A3 76 05 34 7E 64 2F D4 CC B2 68 33 64 C5 9E EF 01 A9 4A FD 5B ");
87    
88    let mut recovered = String::new();
89    a_des.decrypt_vec_into_string(iv, &cipher, &mut recovered);
90    println!("B (16 rounds) =\t{}", recovered);
91    assert_eq!(recovered, "In the beginning God created the heavens and the earth.");
92    assert_eq!(recovered, message);
93    println!("-------------------------------");
94}
95
96fn des_quick_start_encryption_decryption_256_rounds()
97{
98    println!("des_quick_start_encryption_decryption_256_rounds()");
99    use std::io::Write;
100    use std::fmt::Write as _;
101    use cryptocol::symmetric::{ CBC_PKCS7, DES_Expanded };
102
103    let mut a_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key([0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8]);
104    let message = "In the beginning God created the heavens and the earth.";
105    println!("M =\t{}", message);
106    let iv = 0x_FEDCBA0987654321_u64;
107    println!("IV =\t{}", iv);
108    let mut cipher = Vec::<u8>::new();
109    a_des.encrypt_into_vec(iv, message.as_ptr(), message.len() as u64, &mut cipher);
110    print!("C =\t");
111    for c in cipher.clone()
112        { print!("{:02X} ", c); }
113    println!();
114    let mut txt = String::new();
115    for c in cipher.clone()
116        { write!(txt, "{:02X} ", c); }
117    assert_eq!(txt, "0B EA 6B BC 68 F9 B0 3E 7D AF DE 71 9C 08 AA 16 42 40 1C C8 DC 40 51 C6 8D D4 E7 D2 0B A4 F2 09 02 02 C2 6E 99 BC 9E 2A F4 11 7E 48 A7 ED 76 70 C6 9D C6 BD A6 9B 58 8B ");
118
119    let mut recovered = String::new();
120    a_des.decrypt_vec_into_string(iv, &cipher, &mut recovered);
121    println!("B =\t{}", recovered);
122    assert_eq!(recovered, "In the beginning God created the heavens and the earth.");
123    assert_eq!(recovered, message);
124    println!("-------------------------------");
125}
126
127fn des_basic_operation_main()
128{
129    des_new();
130    des_new_with_key();
131    des_new_with_key_u64();
132    des_encryptor_with_key();
133    des_encryptor_with_key_u64();
134    des_decryptor_with_key();
135    des_decryptor_with_key_u64();
136    des_get_key();
137    des_get_key_u64();
138    des_set_key();
139    des_set_key_u64();
140    des_turn_inverse();
141    des_turn_encryptor();
142    des_turn_decryptor();
143}
144
145fn des_new()
146{
147    println!("des_new()");
148    use cryptocol::symmetric::DES;
149
150    let mut des = DES::new();   // The default key is 0x0000000000000000 which is a weak key.
151    let plaintext = 0x1234567890ABCDEF_u64;
152    let ciphertext = des.encrypt_u64(plaintext);
153
154    println!("Plaintext:\t\t{:#018X}", plaintext);
155    println!("Ciphertext:\t\t{:#018X}", ciphertext);
156    assert_eq!(ciphertext, 0x1E32B46B44C69201_u64);
157
158    let cipher_cipher_text = des.encrypt_u64(ciphertext);
159    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
160    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
161    assert_eq!(cipher_cipher_text, plaintext);  // So, you can't use the default key!!!
162
163    #[cfg(test)]
164    des_compile_fail_new();
165    println!("-------------------------------");
166}
167
168#[test]
169fn des_compile_fail_new()
170{
171    use cryptocol::symmetric::DES;
172    let des = DES::new();
173    // It cannot be compiled!
174    #[cfg(compile_fail)]    des.encrypt_u64(0x1E32B46B44C69201_u64);
175}
176
177fn des_new_with_key()
178{
179    println!("des_new_with_key()");
180    use cryptocol::symmetric::DES;
181
182    // Normal case
183    let mut des = DES::new_with_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
184    let plaintext = 0x1234567890ABCDEF_u64;
185    let ciphertext = des.encrypt_u64(plaintext);
186
187    println!("Plaintext:\t\t{:#018X}", plaintext);
188    println!("Ciphertext:\t\t{:#018X}", ciphertext);
189    assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
190
191    let cipher_cipher_text = des.encrypt_u64(ciphertext);
192    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
193    assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
194    assert_ne!(cipher_cipher_text, plaintext);
195    println!();
196
197    // Weak key case 1 for [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
198    // The key [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] is the same key as the key
199    // [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01] because of parity bits.
200    let mut des1 = DES::new_with_key([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
201    let mut des2 = DES::new_with_key([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]);
202
203    let plaintext = 0x1234567890ABCDEF_u64;
204    let ciphertext1 = des1.encrypt_u64(plaintext);
205    let ciphertext2 = des2.encrypt_u64(plaintext);
206
207    println!("Plaintext:\t\t{:#018X}", plaintext);
208    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
209    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
210    assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
211    assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
212    assert_eq!(ciphertext1, ciphertext2);
213
214    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
215    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
216    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
217    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
218    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
219    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
220    assert_eq!(cipher_cipher_text1, plaintext);
221    assert_eq!(cipher_cipher_text2, plaintext);
222    println!();
223    // So, you can't use the weak key [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
224    // and [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]!!!
225
226
227    // Weak key case 2 for [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
228    // The key [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] is the same key as the key
229    // [0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE] because of parity bits.
230    let mut des1 = DES::new_with_key([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
231    let mut des2 = DES::new_with_key([0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE]);
232    let plaintext = 0x1234567890ABCDEF_u64;
233    let ciphertext1 = des1.encrypt_u64(plaintext);
234    let ciphertext2 = des2.encrypt_u64(plaintext);
235
236    println!("Plaintext:\t\t{:#018X}", plaintext);
237    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
238    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
239    assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
240    assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
241    assert_eq!(ciphertext1, ciphertext2);
242
243    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
244    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
245    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
246    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
247    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
248    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
249    assert_eq!(cipher_cipher_text1, plaintext);
250    assert_eq!(cipher_cipher_text2, plaintext);
251    println!();
252    // So, you can't use the weak key [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
253    // and [0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE]!!!
254
255    // Weak key case 3 for [0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]
256    // The key [0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1] is the same key as the key
257    // [0xE1, 0xE1, 0xE1, 0xE1, 0xF0, 0xF0, 0xF0, 0xF0] because of parity bits.
258    let mut des1 = DES::new_with_key([0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]);
259    let mut des2 = DES::new_with_key([0xE1, 0xE1, 0xE1, 0xE1, 0xF0, 0xF0, 0xF0, 0xF0]);
260    let plaintext = 0x1234567890ABCDEF_u64;
261    let ciphertext1 = des1.encrypt_u64(plaintext);
262    let ciphertext2 = des2.encrypt_u64(plaintext);
263
264    println!("Plaintext:\t\t{:#018X}", plaintext);
265    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
266    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
267    assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
268    assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
269    assert_eq!(ciphertext1, ciphertext2);
270
271    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
272    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
273    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
274    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
275    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
276    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
277    assert_eq!(cipher_cipher_text1, plaintext);
278    assert_eq!(cipher_cipher_text2, plaintext);
279    println!();
280    // So, you can't use the weak key [0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]
281    // and [0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1]!!!
282
283    // Weak key case 4 for [0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]
284    // The key [0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E] is the same key as the key
285    // [0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F] because of parity bits.
286    let mut des1 = DES::new_with_key([0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]);
287    let mut des2 = DES::new_with_key([0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F]);
288    let plaintext = 0x1234567890ABCDEF_u64;
289    let ciphertext1 = des1.encrypt_u64(plaintext);
290    let ciphertext2 = des2.encrypt_u64(plaintext);
291
292    println!("Plaintext:\t\t{:#018X}", plaintext);
293    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
294    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
295    assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
296    assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
297    assert_eq!(ciphertext1, ciphertext2);
298
299    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
300    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
301    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
302    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
303    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
304    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
305    assert_eq!(cipher_cipher_text1, plaintext);
306    assert_eq!(cipher_cipher_text2, plaintext);
307    println!();
308    // So, you can't use the weak key [0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]
309    // and [0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F]!!!
310
311    // Semi-Weak key case 1 for [0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E] and [0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]
312    let mut des1 = DES::new_with_key([0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E]);
313    let mut des2 = DES::new_with_key([0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]);
314
315    let plaintext = 0x1234567890ABCDEF_u64;
316    let ciphertext = des1.encrypt_u64(plaintext);
317    println!("Plaintext:\t\t{:#018X}", plaintext);
318    println!("Ciphertext:\t\t{:#018X}", ciphertext);
319    assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
320
321    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
322    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
323    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
324    assert_eq!(cipher_cipher_text, plaintext);
325
326    let ciphertext = des2.encrypt_u64(plaintext);
327    println!("Plaintext:\t\t{:#018X}", plaintext);
328    println!("Ciphertext:\t\t{:#018X}", ciphertext);
329    assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
330
331    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
332    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
333    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
334    assert_eq!(cipher_cipher_text, plaintext);
335    println!();
336    // So, you can't use the semi-weak keys [0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E] and [0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]!!!
337
338    // Semi-Weak key case 2 for [0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1] and [0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]
339    let mut des1 = DES::new_with_key([0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1]);
340    let mut des2 = DES::new_with_key([0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]);
341
342    let plaintext = 0x1234567890ABCDEF_u64;
343    let ciphertext = des1.encrypt_u64(plaintext);
344    println!("Plaintext:\t\t{:#018X}", plaintext);
345    println!("Ciphertext:\t\t{:#018X}", ciphertext);
346    assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
347
348    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
349    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
350    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
351    assert_eq!(cipher_cipher_text, plaintext);
352
353    let ciphertext = des2.encrypt_u64(plaintext);
354    println!("Plaintext:\t\t{:#018X}", plaintext);
355    println!("Ciphertext:\t\t{:#018X}", ciphertext);
356    assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
357
358    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
359    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
360    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
361    assert_eq!(cipher_cipher_text, plaintext);
362    println!();
363    // So, you can't use the semi-weak keys [0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1] and [0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]!!!
364
365    // Semi-Weak key case 3 for [0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE] and [0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]
366    let mut des1 = DES::new_with_key([0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE]);
367    let mut des2 = DES::new_with_key([0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]);
368
369    let plaintext = 0x1234567890ABCDEF_u64;
370    let ciphertext = des1.encrypt_u64(plaintext);
371    println!("Plaintext:\t\t{:#018X}", plaintext);
372    println!("Ciphertext:\t\t{:#018X}", ciphertext);
373    assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
374
375    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
376    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
377    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
378    assert_eq!(cipher_cipher_text, plaintext);
379
380    let ciphertext = des2.encrypt_u64(plaintext);
381    println!("Plaintext:\t\t{:#018X}", plaintext);
382    println!("Ciphertext:\t\t{:#018X}", ciphertext);
383    assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
384
385    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
386    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
387    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
388    assert_eq!(cipher_cipher_text, plaintext);
389    println!();
390    // So, you can't use the semi-weak keys [0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE] and [0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]!!!
391
392    // Semi-Weak key case 4 for [0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1] and [0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]
393    let mut des1 = DES::new_with_key([0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1]);
394    let mut des2 = DES::new_with_key([0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]);
395
396    let plaintext = 0x1234567890ABCDEF_u64;
397    let ciphertext = des1.encrypt_u64(plaintext);
398    println!("Plaintext:\t\t{:#018X}", plaintext);
399    println!("Ciphertext:\t\t{:#018X}", ciphertext);
400    assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
401
402    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
403    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
404    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
405    assert_eq!(cipher_cipher_text, plaintext);
406
407    let ciphertext = des2.encrypt_u64(plaintext);
408    println!("Plaintext:\t\t{:#018X}", plaintext);
409    println!("Ciphertext:\t\t{:#018X}", ciphertext);
410    assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
411
412    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
413    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
414    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
415    assert_eq!(cipher_cipher_text, plaintext);
416    println!();
417    // So, you can't use the semi-weak keys [0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1] and [0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]!!!
418
419    // Semi-Weak key case 5 for [0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE] and [0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]
420    let mut des1 = DES::new_with_key([0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE]);
421    let mut des2 = DES::new_with_key([0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]);
422
423    let plaintext = 0x1234567890ABCDEF_u64;
424    let ciphertext = des1.encrypt_u64(plaintext);
425    println!("Plaintext:\t\t{:#018X}", plaintext);
426    println!("Ciphertext:\t\t{:#018X}", ciphertext);
427    assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
428
429    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
430    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
431    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
432    assert_eq!(cipher_cipher_text, plaintext);
433
434    let ciphertext = des2.encrypt_u64(plaintext);
435    println!("Plaintext:\t\t{:#018X}", plaintext);
436    println!("Ciphertext:\t\t{:#018X}", ciphertext);
437    assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
438
439    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
440    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
441    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
442    assert_eq!(cipher_cipher_text, plaintext);
443    println!();
444    // So, you can't use the semi-weak keys [0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE] and [0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]!!!
445
446    // Semi-Weak key case 6 for [0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE] and [0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]
447    let mut des1 = DES::new_with_key([0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE]);
448    let mut des2 = DES::new_with_key([0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]);
449
450    let plaintext = 0x1234567890ABCDEF_u64;
451    let ciphertext = des1.encrypt_u64(plaintext);
452    println!("Plaintext:\t\t{:#018X}", plaintext);
453    println!("Ciphertext:\t\t{:#018X}", ciphertext);
454    assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
455
456    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
457    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
458    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
459    assert_eq!(cipher_cipher_text, plaintext);
460
461    let ciphertext = des2.encrypt_u64(plaintext);
462    println!("Plaintext:\t\t{:#018X}", plaintext);
463    println!("Ciphertext:\t\t{:#018X}", ciphertext);
464    assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
465
466    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
467    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
468    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
469    assert_eq!(cipher_cipher_text, plaintext);
470    // So, you can't use the semi-weak keys [0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE] and [0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]!!!
471
472    #[cfg(test)]
473    des_compile_fail_new_with_key();
474    println!("-------------------------------");
475}
476
477#[test]
478fn des_compile_fail_new_with_key()
479{
480    use cryptocol::symmetric::DES;
481    let des = DES::new_with_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
482    // It cannot be compiled!
483    #[cfg(compile_fail)]    des.encrypt_u64(0x1E32B46B44C69201_u64);
484}
485
486fn des_new_with_key_u64()
487{
488    println!("des_new_with_key_u64");
489    use cryptocol::symmetric::DES;
490
491    // Normal case
492    let mut des = DES::new_with_key_u64(0xEFCDAB9078563412);
493    let plaintext = 0x1234567890ABCDEF_u64;
494    let ciphertext = des.encrypt_u64(plaintext);
495
496    println!("Plaintext:\t\t{:#018X}", plaintext);
497    println!("Ciphertext:\t\t{:#018X}", ciphertext);
498    assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
499
500    let cipher_cipher_text = des.encrypt_u64(ciphertext);
501    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
502    assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
503    assert_ne!(cipher_cipher_text, plaintext);
504    println!();
505
506    // Weak key case 1 for 0x0000000000000000
507    // The key 0x0000000000000000 is the same key as the key 0x0101010101010101 because of parity bits.
508    let mut des1 = DES::new_with_key_u64(0x0000000000000000);
509    let mut des2 = DES::new_with_key_u64(0x0101010101010101);
510
511    let plaintext = 0x1234567890ABCDEF_u64;
512    let ciphertext1 = des1.encrypt_u64(plaintext);
513    let ciphertext2 = des2.encrypt_u64(plaintext);
514
515    println!("Plaintext:\t\t{:#018X}", plaintext);
516    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
517    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
518    assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
519    assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
520    assert_eq!(ciphertext1, ciphertext2);
521
522    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
523    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
524    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
525    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
526    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
527    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
528    assert_eq!(cipher_cipher_text1, plaintext);
529    assert_eq!(cipher_cipher_text2, plaintext);
530    println!();
531    // So, you can't use the weak key 0x0000000000000000 and 0x0101010101010101!!!
532
533    // Weak key case 2 for 0xFFFFFFFFFFFFFFFF
534    // The key 0xFFFFFFFFFFFFFFFF is the same key as the key 0xFEFEFEFEFEFEFEFE because of parity bits.
535    let mut des1 = DES::new_with_key_u64(0xFFFFFFFFFFFFFFFF);
536    let mut des2 = DES::new_with_key_u64(0xFEFEFEFEFEFEFEFE);
537    let plaintext = 0x1234567890ABCDEF_u64;
538    let ciphertext1 = des1.encrypt_u64(plaintext);
539    let ciphertext2 = des2.encrypt_u64(plaintext);
540
541    println!("Plaintext:\t\t{:#018X}", plaintext);
542    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
543    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
544    assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
545    assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
546    assert_eq!(ciphertext1, ciphertext2);
547
548    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
549    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
550    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
551    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
552    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
553    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
554    assert_eq!(cipher_cipher_text1, plaintext);
555    assert_eq!(cipher_cipher_text2, plaintext);
556    println!();
557    // So, you can't use the weak key 0xFFFFFFFFFFFFFFFF and 0xFEFEFEFEFEFEFEFE!!!
558
559    // Weak key case 3 for 0xF1F1F1F1E0E0E0E0 in little-endianness
560    // The key 0xF1F1F1F1E0E0E0E0 is the same key as the key 0xF0F0F0F0E1E1E1E1 because of parity bits.
561    let mut des1 = DES::new_with_key_u64(0xF1F1F1F1E0E0E0E0);
562    let mut des2 = DES::new_with_key_u64(0xF0F0F0F0E1E1E1E1);
563    let plaintext = 0x1234567890ABCDEF_u64;
564    let ciphertext1 = des1.encrypt_u64(plaintext);
565    let ciphertext2 = des2.encrypt_u64(plaintext);
566
567    println!("Plaintext:\t\t{:#018X}", plaintext);
568    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
569    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
570    assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
571    assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
572    assert_eq!(ciphertext1, ciphertext2);
573
574    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
575    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
576    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
577    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
578    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
579    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
580    assert_eq!(cipher_cipher_text1, plaintext);
581    assert_eq!(cipher_cipher_text2, plaintext);
582    println!();
583    // So, you can't use the weak key 0xF1F1F1F1E0E0E0E0 and 0xF0F0F0F0E1E1E1E1!!!
584
585    // Weak key case 4 for 0x0E0E0E0E1F1F1F1F in little-endianness
586    // The key 0x0E0E0E0E1F1F1F1F is the same key as the key 0x0F0F0F0F1E1E1E1E because of parity bits.
587    let mut des1 = DES::new_with_key_u64(0x0E0E0E0E1F1F1F1F);
588    let mut des2 = DES::new_with_key_u64(0x0F0F0F0F1E1E1E1E);
589    let plaintext = 0x1234567890ABCDEF_u64;
590    let ciphertext1 = des1.encrypt_u64(plaintext);
591    let ciphertext2 = des2.encrypt_u64(plaintext);
592
593    println!("Plaintext:\t\t{:#018X}", plaintext);
594    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
595    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
596    assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
597    assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
598    assert_eq!(ciphertext1, ciphertext2);
599
600    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
601    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
602    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
603    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
604    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
605    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
606    assert_eq!(cipher_cipher_text1, plaintext);
607    assert_eq!(cipher_cipher_text2, plaintext);
608    println!();
609    // So, you can't use the weak key 0x0E0E0E0E1F1F1F1F and 0x0F0F0F0F1E1E1E1E!!!
610
611    // Semi-Weak key case 1 for 0x0E010E011F011F01 and 0x010E010E011F011F in little-endianness
612    let mut des1 = DES::new_with_key_u64(0x0E010E011F011F01);
613    let mut des2 = DES::new_with_key_u64(0x010E010E011F011F);
614
615    let plaintext = 0x1234567890ABCDEF_u64;
616    let ciphertext = des1.encrypt_u64(plaintext);
617    println!("Plaintext:\t\t{:#018X}", plaintext);
618    println!("Ciphertext:\t\t{:#018X}", ciphertext);
619    assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
620
621    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
622    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
623    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
624    assert_eq!(cipher_cipher_text, plaintext);
625
626    let ciphertext = des2.encrypt_u64(plaintext);
627    println!("Plaintext:\t\t{:#018X}", plaintext);
628    println!("Ciphertext:\t\t{:#018X}", ciphertext);
629    assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
630
631    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
632    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
633    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
634    assert_eq!(cipher_cipher_text, plaintext);
635    println!();
636    // So, you can't use the semi-weak keys 0x0E010E011F011F01 and 0x010E010E011F011F!!!
637
638    // Semi-Weak key case 2 for 0xF101F101E001E001 and 0x01F101F101E001E0 in little-endianness
639    let mut des1 = DES::new_with_key_u64(0xF101F101E001E001);
640    let mut des2 = DES::new_with_key_u64(0x01F101F101E001E0);
641
642    let plaintext = 0x1234567890ABCDEF_u64;
643    let ciphertext = des1.encrypt_u64(plaintext);
644    println!("Plaintext:\t\t{:#018X}", plaintext);
645    println!("Ciphertext:\t\t{:#018X}", ciphertext);
646    assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
647
648    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
649    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
650    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
651    assert_eq!(cipher_cipher_text, plaintext);
652
653    let ciphertext = des2.encrypt_u64(plaintext);
654    println!("Plaintext:\t\t{:#018X}", plaintext);
655    println!("Ciphertext:\t\t{:#018X}", ciphertext);
656    assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
657
658    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
659    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
660    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
661    assert_eq!(cipher_cipher_text, plaintext);
662    println!();
663    // So, you can't use the semi-weak keys 0xF101F101E001E001 and 0x01F101F101E001E0!!!
664
665    // Semi-Weak key case 3 for 0xFE01FE01FE01FE01 and 0x01FE01FE01FE01FE in little-endianness
666    let mut des1 = DES::new_with_key_u64(0xFE01FE01FE01FE01);
667    let mut des2 = DES::new_with_key_u64(0x01FE01FE01FE01FE);
668
669    let plaintext = 0x1234567890ABCDEF_u64;
670    let ciphertext = des1.encrypt_u64(plaintext);
671    println!("Plaintext:\t\t{:#018X}", plaintext);
672    println!("Ciphertext:\t\t{:#018X}", ciphertext);
673    assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
674
675    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
676    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
677    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
678    assert_eq!(cipher_cipher_text, plaintext);
679
680    let ciphertext = des2.encrypt_u64(plaintext);
681    println!("Plaintext:\t\t{:#018X}", plaintext);
682    println!("Ciphertext:\t\t{:#018X}", ciphertext);
683    assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
684
685    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
686    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
687    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
688    assert_eq!(cipher_cipher_text, plaintext);
689    println!();
690    // So, you can't use the semi-weak keys 0xFE01FE01FE01FE01 and 0x01FE01FE01FE01FE!!!
691
692    // Semi-Weak key case 4 for 0xF10EF10EE01FE01F and 0x0EF10EF11FE01FE0 in little-endianness
693    let mut des1 = DES::new_with_key_u64(0xF10EF10EE01FE01F);
694    let mut des2 = DES::new_with_key_u64(0x0EF10EF11FE01FE0);
695
696    let plaintext = 0x1234567890ABCDEF_u64;
697    let ciphertext = des1.encrypt_u64(plaintext);
698    println!("Plaintext:\t\t{:#018X}", plaintext);
699    println!("Ciphertext:\t\t{:#018X}", ciphertext);
700    assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
701
702    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
703    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
704    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
705    assert_eq!(cipher_cipher_text, plaintext);
706
707    let ciphertext = des2.encrypt_u64(plaintext);
708    println!("Plaintext:\t\t{:#018X}", plaintext);
709    println!("Ciphertext:\t\t{:#018X}", ciphertext);
710    assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
711
712    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
713    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
714    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
715    assert_eq!(cipher_cipher_text, plaintext);
716    println!();
717    // So, you can't use the semi-weak keys 0xF10EF10EE01FE01F and 0x0EF10EF11FE01FE0!!!
718
719    // Semi-Weak key case 5 for 0xFE0EFE0EFE1FFE1F and 0x0EFE0EFE1FFE1FFE in little-endianness
720    let mut des1 = DES::new_with_key_u64(0xFE0EFE0EFE1FFE1F);
721    let mut des2 = DES::new_with_key_u64(0x0EFE0EFE1FFE1FFE);
722
723    let plaintext = 0x1234567890ABCDEF_u64;
724    let ciphertext = des1.encrypt_u64(plaintext);
725    println!("Plaintext:\t\t{:#018X}", plaintext);
726    println!("Ciphertext:\t\t{:#018X}", ciphertext);
727    assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
728
729    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
730    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
731    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
732    assert_eq!(cipher_cipher_text, plaintext);
733
734    let ciphertext = des2.encrypt_u64(plaintext);
735    println!("Plaintext:\t\t{:#018X}", plaintext);
736    println!("Ciphertext:\t\t{:#018X}", ciphertext);
737    assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
738
739    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
740    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
741    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
742    assert_eq!(cipher_cipher_text, plaintext);
743    println!();
744    // So, you can't use the semi-weak keys 0xFE0EFE0EFE1FFE1F and 0x0EFE0EFE1FFE1FFE!!!
745
746    // Semi-Weak key case 6 for 0xFEF1FEF1FEE0FEE0 and 0xF1FEF1FEE0FEE0FE in little-endianness 
747    let mut des1 = DES::new_with_key_u64(0xFEF1FEF1FEE0FEE0);
748    let mut des2 = DES::new_with_key_u64(0xF1FEF1FEE0FEE0FE);
749
750    let plaintext = 0x1234567890ABCDEF_u64;
751    let ciphertext = des1.encrypt_u64(plaintext);
752    println!("Plaintext:\t\t{:#018X}", plaintext);
753    println!("Ciphertext:\t\t{:#018X}", ciphertext);
754    assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
755
756    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
757    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
758    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
759    assert_eq!(cipher_cipher_text, plaintext);
760
761    let ciphertext = des2.encrypt_u64(plaintext);
762    println!("Plaintext:\t\t{:#018X}", plaintext);
763    println!("Ciphertext:\t\t{:#018X}", ciphertext);
764    assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
765
766    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
767    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
768    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
769    assert_eq!(cipher_cipher_text, plaintext);
770    // So, you can't use the semi-weak keys 0xFEF1FEF1FEE0FEE0 and 0xF1FEF1FEE0FEE0FE!!!
771    println!("-------------------------------");
772}
773
774fn des_encryptor_with_key()
775{
776    println!("des_encryptor_with_key");
777    use cryptocol::symmetric::{ DES, BigCryptor64, SmallCryptor };
778    
779    let keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
780            = [ Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])),
781                Box::new(DES::decryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])),
782                Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])) ];
783    let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
784    let plaintext = 0x_1234567890ABCDEF_u64;
785    let ciphertext = tdes.encrypt_u64(plaintext);
786    
787    println!("Plaintext:\t\t{:#018X}", plaintext);
788    println!("Ciphertext:\t\t{:#018X}", ciphertext);
789    assert_eq!(ciphertext, 0x272A2AC7B4E66748_u64);
790    
791    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
792    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
793    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
794    assert_eq!(cipher_cipher_text, plaintext);
795    println!();
796
797    // Operators
798    let mut tdes = BigCryptor64::new()
799                    + DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])
800                    - DES::encryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])
801                    + DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]);
802    let plaintext = 0x_1234567890ABCDEF_u64;
803    let ciphertext = tdes.encrypt_u64(plaintext);
804
805    println!("Plaintext:\t\t{:#018X}", plaintext);
806    println!("Ciphertext:\t\t{:#018X}", ciphertext);
807    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
808
809    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
810    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
811    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
812    assert_eq!(cipher_cipher_text, plaintext);
813    println!("-------------------------------");
814}
815
816fn des_encryptor_with_key_u64()
817{
818    println!("des_encryptor_with_key_u64");
819    use cryptocol::symmetric::{ BigCryptor64, DES };
820
821    let mut tdes = BigCryptor64::new_with_small_cryptor_array(
822                [Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)),
823                Box::new(DES::decryptor_with_key_u64(0x_FEDCBA0987654321_u64)),
824                Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64))]
825    );
826    let plaintext = 0x_1234567890ABCDEF_u64;
827    let ciphertext = tdes.encrypt_u64(plaintext);
828
829    println!("Plaintext:\t\t{:#018X}", plaintext);
830    println!("Ciphertext:\t\t{:#018X}", ciphertext);
831    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
832
833    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
834    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
835    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
836    assert_eq!(cipher_cipher_text, plaintext);
837    println!();
838
839    // Operators
840    let mut tdes = BigCryptor64::new()
841                    + DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)
842                    - DES::encryptor_with_key_u64(0x_FEDCBA0987654321_u64)
843                    + DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64);
844    let plaintext = 0x_1234567890ABCDEF_u64;
845    let ciphertext = tdes.encrypt_u64(plaintext);
846
847    println!("Plaintext:\t\t{:#018X}", plaintext);
848    println!("Ciphertext:\t\t{:#018X}", ciphertext);
849    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
850
851    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
852    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
853    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
854    assert_eq!(cipher_cipher_text, plaintext);
855    println!("-------------------------------");
856}
857
858fn des_decryptor_with_key()
859{
860    println!("des_decryptor_with_key_u64");
861    use cryptocol::symmetric::{ DES, BigCryptor64, SmallCryptor };
862    
863    let keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
864            = [ Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])),
865                Box::new(DES::decryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])),
866                Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])) ];
867    let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
868    let plaintext = 0x_1234567890ABCDEF_u64;
869    let ciphertext = tdes.encrypt_u64(plaintext);
870    
871    println!("Plaintext:\t\t{:#018X}", plaintext);
872    println!("Ciphertext:\t\t{:#018X}", ciphertext);
873    assert_eq!(ciphertext, 0x272A2AC7B4E66748_u64);
874    
875    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
876    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
877    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
878    assert_eq!(cipher_cipher_text, plaintext);
879    println!();
880
881    // Operators
882    let mut tdes = BigCryptor64::new()
883                    - DES::decryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])
884                    - DES::encryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])
885                    - DES::decryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]);
886    let plaintext = 0x_1234567890ABCDEF_u64;
887    let ciphertext = tdes.encrypt_u64(plaintext);
888
889    println!("Plaintext:\t\t{:#018X}", plaintext);
890    println!("Ciphertext:\t\t{:#018X}", ciphertext);
891    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
892
893    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
894    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
895    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
896    assert_eq!(cipher_cipher_text, plaintext);
897    println!("-------------------------------");
898}
899
900fn des_decryptor_with_key_u64()
901{
902    println!("des_decryptor_with_key_u64");
903    use cryptocol::symmetric::{ BigCryptor64, DES };
904
905    let mut tdes = BigCryptor64::new_with_small_cryptor_array(
906                    [ Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)),
907                                    Box::new(DES::decryptor_with_key_u64(0x_FEDCBA0987654321_u64)),
908                                    Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)) ] );
909    let plaintext = 0x_1234567890ABCDEF_u64;
910    let ciphertext = tdes.encrypt_u64(plaintext);
911
912    println!("Plaintext:\t\t{:#018X}", plaintext);
913    println!("Ciphertext:\t\t{:#018X}", ciphertext);
914    assert_eq!(ciphertext, 0x272A2AC7B4E66748_u64);
915
916    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
917    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
918    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
919    assert_eq!(cipher_cipher_text, plaintext);
920    println!();
921    
922
923    // Operators
924    let mut tdes = BigCryptor64::new()
925                    - DES::decryptor_with_key_u64(0x_1234567890ABCDEF_u64)
926                    + DES::decryptor_with_key_u64(0x_FEDCBA0987654321_u64)
927                    - DES::decryptor_with_key_u64(0x_1234567890ABCDEF_u64);
928    let plaintext = 0x_1234567890ABCDEF_u64;
929    let ciphertext = tdes.encrypt_u64(plaintext);
930
931    println!("Plaintext:\t\t{:#018X}", plaintext);
932    println!("Ciphertext:\t\t{:#018X}", ciphertext);
933    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
934
935    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
936    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
937    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
938    assert_eq!(cipher_cipher_text, plaintext);
939    println!("-------------------------------");
940}
941
942fn des_get_key()
943{
944    println!("des_get_key");
945    use cryptocol::symmetric::DES;
946
947    let mut des = DES::new();
948    des.set_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
949    let key = des.get_key();
950    print!("K = ");
951    for k in key
952        { print!("{:#02X} ", k); }
953    assert_eq!(key, [0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
954}
955
956fn des_get_key_u64()
957{
958    println!("des_get_key_u64");
959    use cryptocol::symmetric::DES;
960
961    let mut des = DES::new();
962    des.set_key_u64(0xEFCDAB9078563412);
963    let key = des.get_key_u64();
964    println!("Key = {}", key);
965    assert_eq!(key, 0xEFCDAB9078563412_u64);
966}
967
968fn des_set_key()
969{
970    println!("des_set_key");
971    use cryptocol::symmetric::DES;
972
973    // Normal case
974    let mut des = DES::new();
975    des.set_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
976    let plaintext = 0x1234567890ABCDEF_u64;
977    let ciphertext = des.encrypt_u64(plaintext);
978
979    println!("Plaintext:\t\t{:#018X}", plaintext);
980    println!("Ciphertext:\t\t{:#018X}", ciphertext);
981    assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
982
983    let cipher_cipher_text = des.encrypt_u64(ciphertext);
984    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
985    assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
986    assert_ne!(cipher_cipher_text, plaintext);
987    println!();
988
989    // Weak key case 1 for [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
990    // The key [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] is the same key as the key
991    // [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01] because of parity bits.
992    let mut des1 = DES::new();
993    let mut des2 = DES::new();
994    des1.set_key([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
995    des2.set_key([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]);
996
997    let plaintext = 0x1234567890ABCDEF_u64;
998    let ciphertext1 = des1.encrypt_u64(plaintext);
999    let ciphertext2 = des2.encrypt_u64(plaintext);
1000
1001    println!("Plaintext:\t\t{:#018X}", plaintext);
1002    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1003    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1004    assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
1005    assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
1006    assert_eq!(ciphertext1, ciphertext2);
1007
1008    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1009    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1010    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1011    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1012    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1013    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1014    assert_eq!(cipher_cipher_text1, plaintext);
1015    assert_eq!(cipher_cipher_text2, plaintext);
1016    println!();
1017    // So, you can't use the weak key [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
1018    // and [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]!!!
1019
1020
1021    // Weak key case 2 for [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
1022    // The key [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] is the same key as the key
1023    // [0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE] because of parity bits.
1024    let mut des1 = DES::new();
1025    let mut des2 = DES::new();
1026    des1.set_key([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
1027    des2.set_key([0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE]);
1028    let plaintext = 0x1234567890ABCDEF_u64;
1029    let ciphertext1 = des1.encrypt_u64(plaintext);
1030    let ciphertext2 = des2.encrypt_u64(plaintext);
1031
1032    println!("Plaintext:\t\t{:#018X}", plaintext);
1033    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1034    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1035    assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
1036    assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
1037    assert_eq!(ciphertext1, ciphertext2);
1038
1039    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1040    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1041    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1042    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1043    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1044    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1045    assert_eq!(cipher_cipher_text1, plaintext);
1046    assert_eq!(cipher_cipher_text2, plaintext);
1047    println!();
1048    // So, you can't use the weak key [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
1049    // and [0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE]!!!
1050
1051    // Weak key case 3 for [0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]
1052    // The key [0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0] is the same key as the key
1053    // [0xE1, 0xE1, 0xE1, 0xE1, 0xF0, 0xF0, 0xF0, 0xF0] because of parity bits.
1054    let mut des1 = DES::new();
1055    let mut des2 = DES::new();
1056    des1.set_key([0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]);
1057    des2.set_key([0xE1, 0xE1, 0xE1, 0xE1, 0xF0, 0xF0, 0xF0, 0xF0]);
1058    let plaintext = 0x1234567890ABCDEF_u64;
1059    let ciphertext1 = des1.encrypt_u64(plaintext);
1060    let ciphertext2 = des2.encrypt_u64(plaintext);
1061
1062    println!("Plaintext:\t\t{:#018X}", plaintext);
1063    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1064    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1065    assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
1066    assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
1067    assert_eq!(ciphertext1, ciphertext2);
1068
1069    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1070    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1071    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1072    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1073    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1074    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1075    assert_eq!(cipher_cipher_text1, plaintext);
1076    assert_eq!(cipher_cipher_text2, plaintext);
1077    println!();
1078    // So, you can't use the weak key [0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]
1079    // and [0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1, 0xE1]!!!
1080
1081    // Weak key case 4 for [0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]
1082    // The key [0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E] is the same key as the key
1083    // [0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F] because of parity bits.
1084    let mut des1 = DES::new();
1085    let mut des2 = DES::new();
1086    des1.set_key([0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]);
1087    des2.set_key([0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F]);
1088    let plaintext = 0x1234567890ABCDEF_u64;
1089    let ciphertext1 = des1.encrypt_u64(plaintext);
1090    let ciphertext2 = des2.encrypt_u64(plaintext);
1091
1092    println!("Plaintext:\t\t{:#018X}", plaintext);
1093    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1094    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1095    assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
1096    assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
1097    assert_eq!(ciphertext1, ciphertext2);
1098
1099    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1100    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1101    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1102    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1103    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1104    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1105    assert_eq!(cipher_cipher_text1, plaintext);
1106    assert_eq!(cipher_cipher_text2, plaintext);
1107    println!();
1108    // So, you can't use the weak key [0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]
1109    // and [0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F]!!!
1110
1111    // Semi-Weak key case 1 for [0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E] and [0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]
1112    let mut des1 = DES::new();
1113    let mut des2 = DES::new();
1114    des1.set_key([0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E]);
1115    des2.set_key([0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]);
1116
1117    let plaintext = 0x1234567890ABCDEF_u64;
1118    let ciphertext = des1.encrypt_u64(plaintext);
1119    println!("Plaintext:\t\t{:#018X}", plaintext);
1120    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1121    assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
1122
1123    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1124    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1125    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1126    assert_eq!(cipher_cipher_text, plaintext);
1127
1128    let ciphertext = des2.encrypt_u64(plaintext);
1129    println!("Plaintext:\t\t{:#018X}", plaintext);
1130    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1131    assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
1132
1133    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1134    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1135    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1136    assert_eq!(cipher_cipher_text, plaintext);
1137    println!();
1138    // So, you can't use the semi-weak keys [0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E]
1139    // and [0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]!!!
1140
1141    // Semi-Weak key case 2 for [0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1] and [0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]
1142    let mut des1 = DES::new();
1143    let mut des2 = DES::new();
1144    des1.set_key([0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1]);
1145    des2.set_key([0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]);
1146
1147    let plaintext = 0x1234567890ABCDEF_u64;
1148    let ciphertext = des1.encrypt_u64(plaintext);
1149    println!("Plaintext:\t\t{:#018X}", plaintext);
1150    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1151    assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
1152
1153    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1154    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1155    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1156    assert_eq!(cipher_cipher_text, plaintext);
1157
1158    let ciphertext = des2.encrypt_u64(plaintext);
1159    println!("Plaintext:\t\t{:#018X}", plaintext);
1160    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1161    assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
1162
1163    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1164    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1165    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1166    assert_eq!(cipher_cipher_text, plaintext);
1167    println!();
1168    // So, you can't use the semi-weak keys [0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1]
1169    // and [0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]!!!
1170
1171    // Semi-Weak key case 3 for [0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE] and [0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]
1172    let mut des1 = DES::new();
1173    let mut des2 = DES::new();
1174    des1.set_key([0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE]);
1175    des2.set_key([0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]);
1176
1177    let plaintext = 0x1234567890ABCDEF_u64;
1178    let ciphertext = des1.encrypt_u64(plaintext);
1179    println!("Plaintext:\t\t{:#018X}", plaintext);
1180    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1181    assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
1182
1183    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1184    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1185    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1186    assert_eq!(cipher_cipher_text, plaintext);
1187
1188    let ciphertext = des2.encrypt_u64(plaintext);
1189    println!("Plaintext:\t\t{:#018X}", plaintext);
1190    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1191    assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
1192
1193    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1194    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1195    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1196    assert_eq!(cipher_cipher_text, plaintext);
1197    println!();
1198    // So, you can't use the semi-weak keys [0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE]
1199    // and [0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]!!!
1200
1201    // Semi-Weak key case 4 for [0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1] and [0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]
1202    let mut des1 = DES::new();
1203    let mut des2 = DES::new();
1204    des1.set_key([0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1]);
1205    des2.set_key([0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]);
1206
1207    let plaintext = 0x1234567890ABCDEF_u64;
1208    let ciphertext = des1.encrypt_u64(plaintext);
1209    println!("Plaintext:\t\t{:#018X}", plaintext);
1210    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1211    assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
1212
1213    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1214    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1215    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1216    assert_eq!(cipher_cipher_text, plaintext);
1217
1218    let ciphertext = des2.encrypt_u64(plaintext);
1219    println!("Plaintext:\t\t{:#018X}", plaintext);
1220    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1221    assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
1222
1223    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1224    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1225    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1226    assert_eq!(cipher_cipher_text, plaintext);
1227    println!();
1228    // So, you can't use the semi-weak keys [0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1]
1229    // and [0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]!!!
1230
1231    // Semi-Weak key case 5 for [0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE] and [0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]
1232    let mut des1 = DES::new();
1233    let mut des2 = DES::new();
1234    des1.set_key([0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE]);
1235    des2.set_key([0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]);
1236
1237    let plaintext = 0x1234567890ABCDEF_u64;
1238    let ciphertext = des1.encrypt_u64(plaintext);
1239    println!("Plaintext:\t\t{:#018X}", plaintext);
1240    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1241    assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
1242
1243    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1244    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1245    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1246    assert_eq!(cipher_cipher_text, plaintext);
1247
1248    let ciphertext = des2.encrypt_u64(plaintext);
1249    println!("Plaintext:\t\t{:#018X}", plaintext);
1250    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1251    assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
1252
1253    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1254    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1255    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1256    assert_eq!(cipher_cipher_text, plaintext);
1257    println!();
1258    // So, you can't use the semi-weak keys [0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE]
1259    // and [0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]!!!
1260
1261    // Semi-Weak key case 6 for [0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE] and [0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]
1262    let mut des1 = DES::new();
1263    let mut des2 = DES::new();
1264    des1.set_key([0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE]);
1265    des2.set_key([0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]);
1266
1267    let plaintext = 0x1234567890ABCDEF_u64;
1268    let ciphertext = des1.encrypt_u64(plaintext);
1269    println!("Plaintext:\t\t{:#018X}", plaintext);
1270    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1271    assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
1272
1273    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1274    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1275    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1276    assert_eq!(cipher_cipher_text, plaintext);
1277
1278    let ciphertext = des2.encrypt_u64(plaintext);
1279    println!("Plaintext:\t\t{:#018X}", plaintext);
1280    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1281    assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
1282
1283    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1284    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1285    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1286    assert_eq!(cipher_cipher_text, plaintext);
1287    // So, you can't use the semi-weak keys [0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE]
1288    // and [0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]!!!
1289    println!("-------------------------------");
1290}
1291
1292fn des_set_key_u64()
1293{
1294    println!("des_set_key_u64");
1295    use cryptocol::symmetric::DES;
1296
1297    // Normal case
1298    let mut des = DES::new();
1299    des.set_key_u64(0xEFCDAB9078563412);
1300    let plaintext = 0x1234567890ABCDEF_u64;
1301    let ciphertext = des.encrypt_u64(plaintext);
1302
1303    println!("Plaintext:\t\t{:#018X}", plaintext);
1304    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1305    assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
1306
1307    let cipher_cipher_text = des.encrypt_u64(ciphertext);
1308    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1309    assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
1310    assert_ne!(cipher_cipher_text, plaintext);
1311    println!();
1312
1313    // Weak key case 1 for 0x0000000000000000
1314    // The key 0x0000000000000000 is the same key as the key 0x0101010101010101 because of parity bits.
1315    let mut des1 = DES::new();
1316    let mut des2 = DES::new();
1317    des1.set_key_u64(0x0000000000000000);
1318    des2.set_key_u64(0x0101010101010101);
1319
1320    let plaintext = 0x1234567890ABCDEF_u64;
1321    let ciphertext1 = des1.encrypt_u64(plaintext);
1322    let ciphertext2 = des2.encrypt_u64(plaintext);
1323
1324    println!("Plaintext:\t\t{:#018X}", plaintext);
1325    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1326    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1327    assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
1328    assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
1329    assert_eq!(ciphertext1, ciphertext2);
1330
1331    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1332    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1333    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1334    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1335    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1336    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1337    assert_eq!(cipher_cipher_text1, plaintext);
1338    assert_eq!(cipher_cipher_text2, plaintext);
1339    println!();
1340    // So, you can't use the weak key 0x0000000000000000 and 0x0101010101010101!!!
1341
1342    // Weak key case 2 for 0xFFFFFFFFFFFFFFFF
1343    // The key 0xFFFFFFFFFFFFFFFF is the same key as the key 0xFEFEFEFEFEFEFEFE because of parity bits.
1344    let mut des1 = DES::new();
1345    let mut des2 = DES::new();
1346    des1.set_key_u64(0xFFFFFFFFFFFFFFFF);
1347    des2.set_key_u64(0xFEFEFEFEFEFEFEFE);
1348    let plaintext = 0x1234567890ABCDEF_u64;
1349    let ciphertext1 = des1.encrypt_u64(plaintext);
1350    let ciphertext2 = des2.encrypt_u64(plaintext);
1351
1352    println!("Plaintext:\t\t{:#018X}", plaintext);
1353    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1354    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1355    assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
1356    assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
1357    assert_eq!(ciphertext1, ciphertext2);
1358
1359    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1360    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1361    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1362    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1363    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1364    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1365    assert_eq!(cipher_cipher_text1, plaintext);
1366    assert_eq!(cipher_cipher_text2, plaintext);
1367    println!();
1368    // So, you can't use the weak key 0xFFFFFFFFFFFFFFFF and 0xFEFEFEFEFEFEFEFE!!!
1369
1370    // Weak key case 3 for 0xF1F1F1F1E0E0E0E0 in little-endianness
1371    // The key 0xF1F1F1F1E0E0E0E0 is the same key as the key 0xF0F0F0F0E1E1E1E1 because of parity bits.
1372    let mut des1 = DES::new();
1373    let mut des2 = DES::new();
1374    des1.set_key_u64(0xF1F1F1F1E0E0E0E0);
1375    des2.set_key_u64(0xF0F0F0F0E1E1E1E1);
1376    let plaintext = 0x1234567890ABCDEF_u64;
1377    let ciphertext1 = des1.encrypt_u64(plaintext);
1378    let ciphertext2 = des2.encrypt_u64(plaintext);
1379
1380    println!("Plaintext:\t\t{:#018X}", plaintext);
1381    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1382    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1383    assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
1384    assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
1385    assert_eq!(ciphertext1, ciphertext2);
1386
1387    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1388    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1389    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1390    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1391    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1392    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1393    assert_eq!(cipher_cipher_text1, plaintext);
1394    assert_eq!(cipher_cipher_text2, plaintext);
1395    println!();
1396    // So, you can't use the weak key 0xF1F1F1F1E0E0E0E0 and 0xF0F0F0F0E1E1E1E1!!!
1397
1398    // Weak key case 4 for 0x0E0E0E0E1F1F1F1F in little-endianness
1399    // The key 0x0E0E0E0E1F1F1F1F is the same key as the key 0x0F0F0F0F1E1E1E1E because of parity bits.
1400    let mut des1 = DES::new();
1401    let mut des2 = DES::new();
1402    des1.set_key_u64(0x0E0E0E0E1F1F1F1F);
1403    des2.set_key_u64(0x0F0F0F0F1E1E1E1E);
1404    let plaintext = 0x1234567890ABCDEF_u64;
1405    let ciphertext1 = des1.encrypt_u64(plaintext);
1406    let ciphertext2 = des2.encrypt_u64(plaintext);
1407
1408    println!("Plaintext:\t\t{:#018X}", plaintext);
1409    println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
1410    println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
1411    assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
1412    assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
1413    assert_eq!(ciphertext1, ciphertext2);
1414
1415    let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
1416    let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
1417    println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
1418    println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
1419    assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
1420    assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
1421    assert_eq!(cipher_cipher_text1, plaintext);
1422    assert_eq!(cipher_cipher_text2, plaintext);
1423    println!();
1424    // So, you can't use the weak key 0x0E0E0E0E1F1F1F1F and 0x0F0F0F0F1E1E1E1E!!!
1425
1426    // Semi-Weak key case 1 for 0x0E010E011F011F01 and 0x010E010E011F011F in little-endianness
1427    let mut des1 = DES::new();
1428    let mut des2 = DES::new();
1429    des1.set_key_u64(0x0E010E011F011F01);
1430    des2.set_key_u64(0x010E010E011F011F);
1431
1432    let plaintext = 0x1234567890ABCDEF_u64;
1433    let ciphertext = des1.encrypt_u64(plaintext);
1434    println!("Plaintext:\t\t{:#018X}", plaintext);
1435    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1436    assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
1437
1438    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1439    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1440    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1441    assert_eq!(cipher_cipher_text, plaintext);
1442
1443    let ciphertext = des2.encrypt_u64(plaintext);
1444    println!("Plaintext:\t\t{:#018X}", plaintext);
1445    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1446    assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
1447
1448    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1449    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1450    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1451    assert_eq!(cipher_cipher_text, plaintext);
1452    println!();
1453    // So, you can't use the semi-weak keys 0x0E010E011F011F01 and 0x010E010E011F011F!!!
1454
1455    // Semi-Weak key case 2 for 0xF101F101E001E001 and 0x01F101F101E001E0 in little-endianness
1456    let mut des1 = DES::new();
1457    let mut des2 = DES::new();
1458    des1.set_key_u64(0xF101F101E001E001);
1459    des2.set_key_u64(0x01F101F101E001E0);
1460
1461    let plaintext = 0x1234567890ABCDEF_u64;
1462    let ciphertext = des1.encrypt_u64(plaintext);
1463    println!("Plaintext:\t\t{:#018X}", plaintext);
1464    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1465    assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
1466
1467    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1468    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1469    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1470    assert_eq!(cipher_cipher_text, plaintext);
1471
1472    let ciphertext = des2.encrypt_u64(plaintext);
1473    println!("Plaintext:\t\t{:#018X}", plaintext);
1474    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1475    assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
1476
1477    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1478    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1479    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1480    assert_eq!(cipher_cipher_text, plaintext);
1481    println!();
1482    // So, you can't use the semi-weak keys 0xF101F101E001E001 and 0x01F101F101E001E0!!!
1483
1484    // Semi-Weak key case 3 for 0xFE01FE01FE01FE01 and 0x01FE01FE01FE01FE in little-endianness
1485    let mut des1 = DES::new();
1486    let mut des2 = DES::new();
1487    des1.set_key_u64(0xFE01FE01FE01FE01);
1488    des2.set_key_u64(0x01FE01FE01FE01FE);
1489
1490    let plaintext = 0x1234567890ABCDEF_u64;
1491    let ciphertext = des1.encrypt_u64(plaintext);
1492    println!("Plaintext:\t\t{:#018X}", plaintext);
1493    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1494    assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
1495
1496    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1497    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1498    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1499    assert_eq!(cipher_cipher_text, plaintext);
1500
1501    let ciphertext = des2.encrypt_u64(plaintext);
1502    println!("Plaintext:\t\t{:#018X}", plaintext);
1503    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1504    assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
1505
1506    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1507    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1508    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1509    assert_eq!(cipher_cipher_text, plaintext);
1510    println!();
1511    // So, you can't use the semi-weak keys 0xFE01FE01FE01FE01 and 0x01FE01FE01FE01FE!!!
1512
1513    // Semi-Weak key case 4 for 0xF10EF10EE01FE01F and 0x0EF10EF11FE01FE0 in little-endianness
1514    let mut des1 = DES::new();
1515    let mut des2 = DES::new();
1516    des1.set_key_u64(0xF10EF10EE01FE01F);
1517    des2.set_key_u64(0x0EF10EF11FE01FE0);
1518
1519    let plaintext = 0x1234567890ABCDEF_u64;
1520    let ciphertext = des1.encrypt_u64(plaintext);
1521    println!("Plaintext:\t\t{:#018X}", plaintext);
1522    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1523    assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
1524
1525    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1526    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1527    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1528    assert_eq!(cipher_cipher_text, plaintext);
1529
1530    let ciphertext = des2.encrypt_u64(plaintext);
1531    println!("Plaintext:\t\t{:#018X}", plaintext);
1532    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1533    assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
1534
1535    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1536    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1537    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1538    assert_eq!(cipher_cipher_text, plaintext);
1539    println!();
1540    // So, you can't use the semi-weak keys 0xF10EF10EE01FE01F and 0x0EF10EF11FE01FE0!!!
1541
1542    // Semi-Weak key case 5 for 0xFE0EFE0EFE1FFE1F and 0x0EFE0EFE1FFE1FFE in little-endianness
1543    let mut des1 = DES::new();
1544    let mut des2 = DES::new();
1545    des1.set_key_u64(0xFE0EFE0EFE1FFE1F);
1546    des2.set_key_u64(0x0EFE0EFE1FFE1FFE);
1547
1548    let plaintext = 0x1234567890ABCDEF_u64;
1549    let ciphertext = des1.encrypt_u64(plaintext);
1550    println!("Plaintext:\t\t{:#018X}", plaintext);
1551    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1552    assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
1553
1554    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1555    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1556    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1557    assert_eq!(cipher_cipher_text, plaintext);
1558
1559    let ciphertext = des2.encrypt_u64(plaintext);
1560    println!("Plaintext:\t\t{:#018X}", plaintext);
1561    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1562    assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
1563
1564    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1565    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1566    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1567    assert_eq!(cipher_cipher_text, plaintext);
1568    println!();
1569    // So, you can't use the semi-weak keys 0xFE0EFE0EFE1FFE1F and 0x0EFE0EFE1FFE1FFE!!!
1570
1571    // Semi-Weak key case 6 for 0xFEF1FEF1FEE0FEE0 and 0xF1FEF1FEE0FEE0FE in little-endianness 
1572    let mut des1 = DES::new();
1573    let mut des2 = DES::new();
1574    des1.set_key_u64(0xFEF1FEF1FEE0FEE0);
1575    des2.set_key_u64(0xF1FEF1FEE0FEE0FE);
1576
1577    let plaintext = 0x1234567890ABCDEF_u64;
1578    let ciphertext = des1.encrypt_u64(plaintext);
1579    println!("Plaintext:\t\t{:#018X}", plaintext);
1580    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1581    assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
1582
1583    let cipher_cipher_text = des2.encrypt_u64(ciphertext);
1584    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1585    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1586    assert_eq!(cipher_cipher_text, plaintext);
1587
1588    let ciphertext = des2.encrypt_u64(plaintext);
1589    println!("Plaintext:\t\t{:#018X}", plaintext);
1590    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1591    assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
1592
1593    let cipher_cipher_text = des1.encrypt_u64(ciphertext);
1594    println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
1595    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1596    assert_eq!(cipher_cipher_text, plaintext);
1597    // So, you can't use the semi-weak keys 0xFEF1FEF1FEE0FEE0 and 0xF1FEF1FEE0FEE0FE!!!
1598    println!("-------------------------------");
1599}
1600
1601fn des_turn_inverse()
1602{
1603    println!("des_turn_inverse");
1604    use cryptocol::symmetric::{ BigCryptor64, DES, SmallCryptor };
1605
1606    let mut keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
1607                = [ Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)),
1608                    Box::new(DES::new_with_key_u64(0x_FEDCBA0987654321_u64)),
1609                    Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)) ];
1610    keys[1].turn_inverse();
1611
1612    let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
1613    let plaintext = 0x_1234567890ABCDEF_u64;
1614    let ciphertext = tdes.encrypt_u64(plaintext);
1615
1616    println!("Plaintext:\t\t{:#018X}", plaintext);
1617    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1618    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
1619
1620    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
1621    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
1622    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1623    assert_eq!(cipher_cipher_text, plaintext);
1624    println!();
1625    
1626
1627    // Operators
1628    let des1 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
1629    let mut des2 = DES::new_with_key_u64(0x_FEDCBA0987654321_u64);
1630    let des3 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
1631    des2.turn_inverse();
1632
1633    let mut tdes = BigCryptor64::new() + des1 + des2 + des3; 
1634    let plaintext = 0x_1234567890ABCDEF_u64;
1635    let ciphertext = tdes.encrypt_u64(plaintext);
1636
1637    println!("Plaintext:\t\t{:#018X}", plaintext);
1638    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1639    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
1640
1641    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
1642    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
1643    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
1644    assert_eq!(cipher_cipher_text, plaintext);
1645    println!("-------------------------------");
1646}
1647
1648fn des_turn_encryptor()
1649{
1650    println!("des_turn_encryptor");
1651    use cryptocol::symmetric::{ BigCryptor64, DES, SmallCryptor };
1652
1653    let mut keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
1654            = [ Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)),
1655                Box::new(DES::new_with_key_u64(0x_FEDCBA0987654321_u64)),
1656                Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)) ];
1657    keys[0].turn_encryptor();
1658
1659    let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
1660    let plaintext = 0x_1234567890ABCDEF_u64;
1661    let ciphertext = tdes.encrypt_u64(plaintext);
1662
1663    println!("Plaintext:\t\t{:#018X}", plaintext);
1664    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1665    assert_eq!(ciphertext, 0x_CDAC175F3B7EAA2B_u64);
1666
1667    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
1668    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
1669    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1670    assert_eq!(cipher_cipher_text, plaintext);
1671    println!();
1672    
1673
1674    // Operators
1675    let mut des1 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
1676    let des2 = DES::new_with_key_u64(0x_FEDCBA0987654321_u64);
1677    let des3 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
1678    des1.turn_encryptor();
1679
1680    let mut tdes = BigCryptor64::new() + des1 + des2 + des3; 
1681    let plaintext = 0x_1234567890ABCDEF_u64;
1682    let ciphertext = tdes.encrypt_u64(plaintext);
1683
1684    println!("Plaintext:\t\t{:#018X}", plaintext);
1685    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1686    assert_eq!(ciphertext, 0x_CDAC175F3B7EAA2B_u64);
1687
1688    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
1689    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
1690    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
1691    assert_eq!(cipher_cipher_text, plaintext);
1692    println!("-------------------------------");
1693}
1694
1695fn des_turn_decryptor()
1696{
1697    println!("des_turn_decryptor");
1698    use cryptocol::symmetric::{ BigCryptor64, DES, SmallCryptor };
1699
1700    let mut keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
1701                = [ Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)),
1702                    Box::new(DES::new_with_key_u64(0x_FEDCBA0987654321_u64)),
1703                    Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)) ];
1704    keys[1].turn_decryptor();
1705
1706    let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
1707    let plaintext = 0x_1234567890ABCDEF_u64;
1708    let ciphertext = tdes.encrypt_u64(plaintext);
1709
1710    println!("Plaintext:\t\t{:#018X}", plaintext);
1711    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1712    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
1713
1714    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
1715    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
1716    assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
1717    assert_eq!(cipher_cipher_text, plaintext);
1718    println!();
1719    
1720
1721    // Operators
1722    let des1 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
1723    let mut des2 = DES::new_with_key_u64(0x_FEDCBA0987654321_u64);
1724    let des3 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
1725    des2.turn_decryptor();
1726
1727    let mut tdes = BigCryptor64::new() + des1 + des2 + des3; 
1728    let plaintext = 0x_1234567890ABCDEF_u64;
1729    let ciphertext = tdes.encrypt_u64(plaintext);
1730
1731    println!("Plaintext:\t\t{:#018X}", plaintext);
1732    println!("Ciphertext:\t\t{:#018X}", ciphertext);
1733    assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
1734
1735    let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
1736    println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
1737    assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
1738    assert_eq!(cipher_cipher_text, plaintext);
1739    println!("-------------------------------");
1740}
1741
1742fn des_encrypt_decrypt_u64_array_u64_main()
1743{
1744    des_encrypt_u64();
1745    des_decrypt_u64();
1746    // des__encrypt();
1747    // des__decrypt();
1748    des_encrypt_array_u64();
1749    des_decrypt_array_u64();
1750    des_is_successful();
1751    des_is_failed();
1752    // des_set_successful();
1753    // des_set_failed();
1754    des_has_weak_key();
1755}
1756
1757fn des_encrypt_u64()
1758{
1759    println!("des_encrypt_u64");
1760    use cryptocol::symmetric::{ DES, DES_Expanded };
1761
1762    // Normal case
1763    let key = 0x_1234567890ABCDEF_u64;
1764    println!("K =\t{:#018X}", key);
1765    
1766    let message = 0x_1234567890ABCDEF_u64;
1767    println!("M_u64 =\t{:#018X}", message);
1768
1769    let mut a_des = DES::new_with_key_u64(key);
1770    let cipher = a_des.encrypt_u64(message);
1771    println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
1772    assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
1773    println!();
1774
1775    // Expanded case for 128 rounds
1776    let key = 0x_1234567890ABCDEF_u64;
1777    println!("K =\t{:#018X}", key);
1778    
1779    let message = 0x_1234567890ABCDEF_u64;
1780    println!("M_u64 =\t{:#018X}", message);
1781
1782    let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
1783    let cipher = b_des.encrypt_u64(message);
1784    println!("C_u64 (128 rounds) =\t{:#018X}", cipher);
1785    assert_eq!(cipher, 0x_21F25F81CE4D4AA3_u64);
1786    println!();
1787
1788    // Expanded case for 0 rounds which means that key is meaningless
1789    let key1 = 0x_1234567890ABCDEF_u64;
1790    let key2 = 0_u64;
1791    let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
1792    let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
1793    println!("K1 =\t{:#016x}", key1);
1794    
1795    let message = 0x_1234567890ABCDEF_u64;
1796    println!("M_u64 =\t{:#018X}", message);
1797
1798    let cipher1 = c_des.encrypt_u64(message);
1799    let cipher2 = d_des.encrypt_u64(message);
1800    println!("C_u64 (0 rounds) =\t{:#018X}", cipher1);
1801    assert_eq!(cipher1, 0x_2138A9B46057CEDF_u64);
1802
1803    println!("D_u64 (0 rounds) =\t{:#018X}", cipher);
1804    assert_eq!(cipher2, 0x_2138A9B46057CEDF_u64);
1805    assert_eq!(cipher1, cipher2);
1806    println!("-------------------------------");
1807}
1808
1809fn des_decrypt_u64()
1810{
1811    println!("des_decrypt_u64");
1812    use cryptocol::symmetric::{ DES, DES_Expanded };
1813
1814    // Normal case
1815    let key = 0x_1234567890ABCDEF_u64;
1816    println!("K =\t{:#018X}", key);
1817    
1818    let message = 0x_1234567890ABCDEF_u64;
1819    println!("M_u64 =\t{:#018X}", message);
1820
1821    let mut a_des = DES::new_with_key_u64(key);
1822    let cipher = a_des.encrypt_u64(message);
1823    println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
1824    assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
1825
1826    let recovered = a_des.decrypt_u64(cipher);
1827    println!("B_u64 (16 rounds) =\t{:#018X}", recovered);
1828    assert_eq!(recovered, 0x_1234567890ABCDEF_u64);
1829    assert_eq!(recovered, message);
1830    println!();
1831
1832    // Expanded case for 128 rounds
1833    let key = 0x_1234567890ABCDEF_u64;
1834    println!("K =\t{:#018X}", key);
1835    
1836    let message = 0x_1234567890ABCDEF_u64;
1837    println!("M_u64 =\t{:#018X}", message);
1838
1839    let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
1840    let cipher = b_des.encrypt_u64(message);
1841    println!("C_u64 (128 rounds) =\t{:#018X}", cipher);
1842    assert_eq!(cipher, 0x_21F25F81CE4D4AA3_u64);
1843
1844    let recovered = b_des.decrypt_u64(cipher);
1845    println!("B_u64 (16 rounds) =\t{:#018X}", recovered);
1846    assert_eq!(recovered, 0x_1234567890ABCDEF_u64);
1847    assert_eq!(recovered, message);
1848    println!();
1849
1850    // Expanded case for 0 rounds which means that key is meaningless
1851    let key1 = 0x_1234567890ABCDEF_u64;
1852    let key2 = 0_u64;
1853    let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
1854    let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
1855    println!("K =\t{:#018X}", key);
1856    
1857    let message = 0x_1234567890ABCDEF_u64;
1858    println!("M_u64 =\t{:#018X}", message);
1859
1860    let cipher1 = c_des.encrypt_u64(message);
1861    let cipher2 = d_des.encrypt_u64(message);
1862    println!("C_u64 (0 rounds) =\t{:#018X}", cipher1);
1863    assert_eq!(cipher1, 0x_2138A9B46057CEDF_u64);
1864
1865    println!("D_u64 (0 rounds) =\t{:#018X}", cipher);
1866    assert_eq!(cipher2, 0x_2138A9B46057CEDF_u64);
1867    assert_eq!(cipher1, cipher2);
1868
1869    let recovered1 = c_des.decrypt_u64(cipher1);
1870    let recovered2 = d_des.decrypt_u64(cipher2);
1871    println!("B1_u64 (0 rounds) =\t{:#018X}", recovered1);
1872    println!("B2_u64 (0 rounds) =\t{:#018X}", recovered2);
1873    assert_eq!(recovered1, 0x_1234567890ABCDEF_u64);
1874    assert_eq!(recovered1, message);
1875    assert_eq!(recovered2, 0x_1234567890ABCDEF_u64);
1876    assert_eq!(recovered2, message);
1877    assert_eq!(recovered1, recovered2);
1878    println!("-------------------------------");
1879}
1880
1881/*
1882fn des__encrypt()
1883{
1884    println!("des__encrypt");
1885    use cryptocol::symmetric::{ DES, DES_Expanded };
1886
1887    // Normal case
1888    let key = 0x_1234567890ABCDEF_u64;
1889    println!("K =\t{:#018X}", key);
1890    
1891    let message = 0x_1234567890ABCDEF_u64;
1892    println!("M_u64 =\t{:#018X}", message);
1893
1894    let mut a_des = DES::new_with_key_u64(key);
1895    let cipher = a_des._encrypt(message);
1896    println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
1897    assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
1898    println!();
1899
1900    // Expanded case for 128 rounds
1901    let key = 0x_1234567890ABCDEF_u64;
1902    println!("K =\t{:#018X}", key);
1903    
1904    let message = 0x_1234567890ABCDEF_u64;
1905    println!("M_u64 =\t{:#018X}", message);
1906
1907    let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
1908    let cipher = b_des._encrypt(message);
1909    println!("C_u64 (128 rounds) =\t{:#018X}", cipher);
1910    assert_eq!(cipher, 0x_21F25F81CE4D4AA3_u64);
1911    println!();
1912
1913    // Expanded case for 0 rounds which means that key is meaningless
1914    let key1 = 0x_1234567890ABCDEF_u64;
1915    let key2 = 0_u64;
1916    let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
1917    let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
1918    println!("K1 =\t{:#016x}", key1);
1919    
1920    let message = 0x_1234567890ABCDEF_u64;
1921    println!("M_u64 =\t{:#018X}", message);
1922
1923    let cipher1 = c_des._encrypt(message);
1924    let cipher2 = d_des._encrypt(message);
1925    println!("C_u64 (0 rounds) =\t{:#018X}", cipher1);
1926    assert_eq!(cipher1, 0x_2138A9B46057CEDF_u64);
1927
1928    println!("D_u64 (0 rounds) =\t{:#018X}", cipher);
1929    assert_eq!(cipher2, 0x_2138A9B46057CEDF_u64);
1930    assert_eq!(cipher1, cipher2);
1931    println!("-------------------------------");
1932}
1933
1934fn des__decrypt()
1935{
1936    println!("des__decrypt");
1937    use cryptocol::symmetric::{ DES, DES_Expanded };
1938
1939    // Normal case
1940    let key = 0x_1234567890ABCDEF_u64;
1941    println!("K =\t{:#018X}", key);
1942    
1943    let message = 0x_1234567890ABCDEF_u64;
1944    println!("M_u64 =\t{:#018X}", message);
1945
1946    let mut a_des = DES::new_with_key_u64(key);
1947    let cipher = a_des._encrypt(message);
1948    println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
1949    assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
1950
1951    let recovered = a_des._decrypt(cipher);
1952    println!("B_u64 (16 rounds) =\t{:#018X}", recovered);
1953    assert_eq!(recovered, 0x_1234567890ABCDEF_u64);
1954    assert_eq!(recovered, message);
1955    println!();
1956
1957    // Expanded case for 128 rounds
1958    let key = 0x_1234567890ABCDEF_u64;
1959    println!("K =\t{:#018X}", key);
1960    
1961    let message = 0x_1234567890ABCDEF_u64;
1962    println!("M_u64 =\t{:#018X}", message);
1963
1964    let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
1965    let cipher = b_des._encrypt(message);
1966    println!("C_u64 (128 rounds) =\t{:#018X}", cipher);
1967    assert_eq!(cipher, 0x_21F25F81CE4D4AA3_u64);
1968
1969    let recovered = b_des._decrypt(cipher);
1970    println!("B_u64 (16 rounds) =\t{:#018X}", recovered);
1971    assert_eq!(recovered, 0x_1234567890ABCDEF_u64);
1972    assert_eq!(recovered, message);
1973    println!();
1974
1975    // Expanded case for 0 rounds which means that key is meaningless
1976    let key1 = 0x_1234567890ABCDEF_u64;
1977    let key2 = 0_u64;
1978    let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
1979    let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
1980    println!("K =\t{:#018X}", key);
1981    
1982    let message = 0x_1234567890ABCDEF_u64;
1983    println!("M_u64 =\t{:#018X}", message);
1984
1985    let cipher1 = c_des._encrypt(message);
1986    let cipher2 = d_des._encrypt(message);
1987    println!("C_u64 (0 rounds) =\t{:#018X}", cipher1);
1988    assert_eq!(cipher1, 0x_2138A9B46057CEDF_u64);
1989
1990    println!("D_u64 (0 rounds) =\t{:#018X}", cipher);
1991    assert_eq!(cipher2, 0x_2138A9B46057CEDF_u64);
1992    assert_eq!(cipher1, cipher2);
1993
1994    let recovered1 = c_des._decrypt(cipher1);
1995    let recovered2 = d_des._decrypt(cipher2);
1996    println!("B1_u64 (0 rounds) =\t{:#018X}", recovered1);
1997    println!("B2_u64 (0 rounds) =\t{:#018X}", recovered2);
1998    assert_eq!(recovered1, 0x_1234567890ABCDEF_u64);
1999    assert_eq!(recovered1, message);
2000    assert_eq!(recovered2, 0x_1234567890ABCDEF_u64);
2001    assert_eq!(recovered2, message);
2002    assert_eq!(recovered1, recovered2);
2003    println!("-------------------------------");
2004}
2005*/
2006fn des_encrypt_array_u64()
2007{
2008    println!("des_encrypt_array_u64");
2009    use cryptocol::symmetric::{ DES, DES_Expanded };
2010
2011    // Normal case
2012    let key = 0x_1234567890ABCDEF_u64;
2013    println!("K =\t{:#018X}", key);
2014    
2015    let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
2016    print!("M =\t");
2017    for m in message
2018        { print!("{:#018X} ", m); }
2019    println!();
2020    let mut a_des = DES::new_with_key_u64(key);
2021
2022    let mut cipher = [0; 3];
2023    a_des.encrypt_array_u64(&message, &mut cipher);
2024    print!("C (16 rounds) =\t");
2025    for c in cipher
2026        { print!("{:#018X} ", c); }
2027    println!();
2028    assert_eq!(cipher[0], 0x_1BC4896735BBE206_u64);
2029    assert_eq!(cipher[1], 0x_1D8A61E5E62226A4_u64);
2030    assert_eq!(cipher[2], 0x_2990D69525C17067_u64);
2031    println!();
2032
2033    // Expanded case for 128 rounds
2034    let key = 0x_1234567890ABCDEF_u64;
2035    println!("K =\t{:#018X}", key);
2036    
2037    let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
2038    print!("M =\t");
2039    for m in message
2040        { print!("{:#018X} ", m); }
2041    println!();
2042    let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
2043
2044    let mut cipher = [0; 3];
2045    b_des.encrypt_array_u64(&message, &mut cipher);
2046    print!("C (128 rounds) =\t");
2047    for c in cipher
2048        { print!("{:#018X} ", c); }
2049    println!();
2050    assert_eq!(cipher[0], 0x_21F25F81CE4D4AA3_u64);
2051    assert_eq!(cipher[1], 0x_352F391A1482A504_u64);
2052    assert_eq!(cipher[2], 0x_F793546957AFDE50_u64);
2053    println!();
2054    
2055
2056    // Expanded case for 0 rounds which means that key is meaningless
2057    let key1 = 0x_1234567890ABCDEF_u64;
2058    let key2 = 0_u64;
2059    let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
2060    let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
2061    println!("K =\t{:#018X}", key);
2062
2063    let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
2064    print!("M =\t");
2065    for m in message
2066        { print!("{:#018X} ", m); }
2067    println!();
2068
2069    let mut cipher1 = [0; 3];
2070    let mut cipher2 = [0; 3];
2071    c_des.encrypt_array_u64(&message, &mut cipher1);
2072    d_des.encrypt_array_u64(&message, &mut cipher2);
2073    print!("C (0 rounds) =\t");
2074    for c in cipher1
2075        { print!("{:#018X} ", c); }
2076    println!();
2077    print!("D (0 rounds) =\t");
2078    for c in cipher2
2079        { print!("{:#018X} ", c); }
2080    println!();
2081    assert_eq!(cipher1[0], 0x_2138A9B46057CEDF_u64);
2082    assert_eq!(cipher1[1], 0x_DFCE5760B4A93821_u64);
2083    assert_eq!(cipher1[2], 0x_FDEC75064B9A8312_u64);
2084    assert_eq!(cipher2[0], 0x_2138A9B46057CEDF_u64);
2085    assert_eq!(cipher2[1], 0x_DFCE5760B4A93821_u64);
2086    assert_eq!(cipher2[2], 0x_FDEC75064B9A8312_u64);
2087    assert_eq!(cipher1[0], cipher2[0]);
2088    assert_eq!(cipher1[1], cipher2[1]);
2089    assert_eq!(cipher1[2], cipher2[2]);
2090    println!("-------------------------------");
2091}
2092
2093fn des_decrypt_array_u64()
2094{
2095    println!("des_decrypt_array_u64");
2096    use cryptocol::symmetric::{ DES, DES_Expanded };
2097
2098    // Normal case
2099    let key = 0x_1234567890ABCDEF_u64;
2100    println!("K =\t{:#018X}", key);
2101    
2102    let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
2103    print!("M =\t");
2104    for m in message
2105        { print!("{:#018X} ", m); }
2106    println!();
2107    let mut a_des = DES::new_with_key_u64(key);
2108
2109    let mut cipher = [0; 3];
2110    a_des.encrypt_array_u64(&message, &mut cipher);
2111    print!("C (16 rounds) =\t");
2112    for c in cipher
2113        { print!("{:#018X} ", c); }
2114    println!();
2115    assert_eq!(cipher[0], 0x_1BC4896735BBE206_u64);
2116    assert_eq!(cipher[1], 0x_1D8A61E5E62226A4_u64);
2117    assert_eq!(cipher[2], 0x_2990D69525C17067_u64);
2118
2119    let mut recovered = [0; 3];
2120    a_des.decrypt_array_u64(&cipher, &mut recovered);
2121    print!("B (16 rounds) =\t");
2122    for r in recovered
2123        { print!("{:#018X} ", r); }
2124    println!();
2125    assert_eq!(recovered[0], 0x_1234567890ABCDEF_u64);
2126    assert_eq!(recovered[1], 0x_EFCDAB9078563412_u64);
2127    assert_eq!(recovered[2], 0x_FEDCBA0987654321_u64);
2128    println!();
2129
2130    // Expanded case for 128 rounds
2131    let key = 0x_1234567890ABCDEF_u64;
2132    println!("K =\t{:#018X}", key);
2133    
2134    let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
2135    print!("M =\t");
2136    for m in message
2137        { print!("{:#018X} ", m); }
2138    println!();
2139    let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
2140
2141    let mut cipher = [0; 3];
2142    b_des.encrypt_array_u64(&message, &mut cipher);
2143    print!("C (128 rounds) =\t");
2144    for c in cipher
2145        { print!("{:#018X} ", c); }
2146    println!();
2147    assert_eq!(cipher[0], 0x_21F25F81CE4D4AA3_u64);
2148    assert_eq!(cipher[1], 0x_352F391A1482A504_u64);
2149    assert_eq!(cipher[2], 0x_F793546957AFDE50_u64);
2150
2151    let mut recovered = [0; 3];
2152    b_des.decrypt_array_u64(&cipher, &mut recovered);
2153    print!("B (128 rounds) =\t");
2154    for r in recovered
2155        { print!("{:#018X} ", r); }
2156    println!();
2157    assert_eq!(recovered[0], 0x_1234567890ABCDEF_u64);
2158    assert_eq!(recovered[1], 0x_EFCDAB9078563412_u64);
2159    assert_eq!(recovered[2], 0x_FEDCBA0987654321_u64);
2160
2161    // Expanded case for 0 rounds which means that key is meaningless
2162    let key1 = 0x_1234567890ABCDEF_u64;
2163    let key2 = 0_u64;
2164    let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
2165    let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
2166    println!("K =\t{:#018X}", key);
2167
2168    let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
2169    print!("M =\t");
2170    for m in message
2171        { print!("{:#018X} ", m); }
2172    println!();
2173
2174    let mut cipher1 = [0; 3];
2175    let mut cipher2 = [0; 3];
2176    c_des.encrypt_array_u64(&message, &mut cipher1);
2177    d_des.encrypt_array_u64(&message, &mut cipher2);
2178    print!("C (0 rounds) =\t");
2179    for c in cipher1
2180        { print!("{:#018X} ", c); }
2181    println!();
2182    print!("D (0 rounds) =\t");
2183    for c in cipher2
2184        { print!("{:#018X} ", c); }
2185    println!();
2186    assert_eq!(cipher1[0], 0x_2138A9B46057CEDF_u64);
2187    assert_eq!(cipher1[1], 0x_DFCE5760B4A93821_u64);
2188    assert_eq!(cipher1[2], 0x_FDEC75064B9A8312_u64);
2189    assert_eq!(cipher2[0], 0x_2138A9B46057CEDF_u64);
2190    assert_eq!(cipher2[1], 0x_DFCE5760B4A93821_u64);
2191    assert_eq!(cipher2[2], 0x_FDEC75064B9A8312_u64);
2192    assert_eq!(cipher1[0], cipher2[0]);
2193    assert_eq!(cipher1[1], cipher2[1]);
2194    assert_eq!(cipher1[2], cipher2[2]);
2195
2196    let mut recovered1 = [0; 3];
2197    let mut recovered2 = [0; 3];
2198    c_des.decrypt_array_u64(&cipher1, &mut recovered1);
2199    d_des.decrypt_array_u64(&cipher2, &mut recovered2);
2200    print!("B1 (0 rounds) =\t");
2201    for r in recovered1
2202        { print!("{:#018X} ", r); }
2203    println!();
2204    print!("B2 (0 rounds) =\t");
2205    for r in recovered2
2206        { print!("{:#018X} ", r); }
2207    println!();
2208    assert_eq!(recovered1[0], 0x_1234567890ABCDEF_u64);
2209    assert_eq!(recovered1[1], 0x_EFCDAB9078563412_u64);
2210    assert_eq!(recovered1[2], 0x_FEDCBA0987654321_u64);
2211    assert_eq!(recovered2[0], 0x_1234567890ABCDEF_u64);
2212    assert_eq!(recovered2[1], 0x_EFCDAB9078563412_u64);
2213    assert_eq!(recovered2[2], 0x_FEDCBA0987654321_u64);
2214    assert_eq!(recovered1[0], recovered2[0]);
2215    assert_eq!(recovered1[1], recovered2[1]);
2216    assert_eq!(recovered1[2], recovered2[2]);
2217    println!("-------------------------------");
2218}
2219
2220fn des_is_successful()
2221{
2222    println!("des_is_successful");
2223    use std::io::Write;
2224    use std::fmt::Write as _;
2225    use cryptocol::symmetric::DES;
2226
2227    {
2228        use cryptocol::symmetric::ECB_PKCS7;
2229
2230        // Successful case for the message of 0 bytes
2231        let key = 0x_1234567890ABCDEF_u64;
2232        println!("K =\t{:#018X}", key);
2233        let mut a_des = DES::new_with_key_u64(key);
2234        let message = "";
2235        println!("M =\t{}", message);
2236        let mut cipher = [0_u8; 8];
2237        let len = a_des.encrypt_into_array(message.as_ptr(), message.len() as u64, &mut cipher);
2238        println!("The length of ciphertext = {}", len);
2239        assert_eq!(len, 8);
2240        let success = a_des.is_successful();
2241        assert_eq!(success, true);
2242        print!("C =\t");
2243        for c in cipher.clone()
2244            { print!("{:02X} ", c); }
2245        println!();
2246        let mut txt = String::new();
2247        for c in cipher.clone()
2248            { write!(txt, "{:02X} ", c); }
2249        assert_eq!(txt, "41 7F 89 79 08 CD A1 4C ");
2250        println!();
2251    
2252        // Successful case for the original message of 0 bytes
2253        let key = 0x_1234567890ABCDEF_u64;
2254        println!("K =\t{:#018X}", key);
2255        let mut a_des = DES::new_with_key_u64(key);
2256    
2257        let cipher = [0x41u8, 0x7F, 0x89, 0x79, 0x08, 0xCD, 0xA1, 0x4C];
2258        print!("C =\t");
2259        for c in cipher.clone()
2260            { print!("{:02X} ", c); }
2261        println!();
2262        let mut recovered = [0u8; 8];
2263        let len = a_des.decrypt_array_into_array(&cipher, &mut recovered);
2264        println!("The length of plaintext = {}", len);
2265        assert_eq!(len, 0);
2266        let success = a_des.is_successful();
2267        assert_eq!(success, true);
2268        print!("Ba =\t");
2269        for b in recovered.clone()
2270            { print!("{:02X} ", b); }
2271        println!();
2272        let mut txt = String::new();
2273        for c in recovered.clone()
2274            { write!(txt, "{:02X} ", c); }
2275        assert_eq!(txt, "00 00 00 00 00 00 00 00 ");
2276    
2277        let mut converted = String::new();
2278        unsafe { converted.as_mut_vec() }.write(&recovered);
2279        unsafe { converted.as_mut_vec() }.truncate(len as usize);
2280        println!("Bb =\t{}", converted);
2281        assert_eq!(converted, "");
2282        assert_eq!(converted, message);
2283        println!();
2284    }
2285
2286    {
2287        use cryptocol::symmetric::CBC_ISO;
2288
2289        // Failure case for the message of 0 bytes
2290        let iv = 0x_FEDCBA0987654321_u64;
2291        println!("IV =	{}", iv);
2292        let key = 0x_1234567890ABCDEF_u64;
2293        println!("K =\t{:#018X}", key);
2294        let mut a_des = DES::new_with_key_u64(key);
2295        let message = "";
2296        println!("M =\t{}", message);
2297        let mut cipher = [0_u8; 4];
2298        let len = a_des.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
2299        println!("The length of ciphertext = {}", len);
2300        assert_eq!(len, 0);
2301        let success = a_des.is_successful();
2302        assert_eq!(success, false);
2303        print!("C =\t");
2304        for c in cipher.clone()
2305            { print!("{:02X} ", c); }
2306        println!();
2307        let mut txt = String::new();
2308        for c in cipher.clone()
2309            { write!(txt, "{:02X} ", c); }
2310        assert_eq!(txt, "00 00 00 00 ");
2311        println!();
2312
2313        // Failed case for decryption
2314        let iv = 0x_FEDCBA0987654321_u64;
2315        println!("IV =	{}", iv);
2316        let key = 0x_1234567890ABCDEF_u64;
2317        println!("K =\t{:#018X}", key);
2318        let mut a_des = DES::new_with_key_u64(key);
2319
2320        let cipher = [0u8; 4];
2321        print!("C =\t");
2322        for c in cipher.clone()
2323            { print!("{:02X} ", c); }
2324        println!();
2325        let mut recovered = [0u8; 8];
2326        let len = a_des.decrypt_array_into_array(iv, &cipher, &mut recovered);
2327        println!("The length of plaintext = {}", len);
2328        assert_eq!(len, 0);
2329        let success = a_des.is_successful();
2330        assert_eq!(success, false);
2331    }
2332    println!("-------------------------------");
2333}
2334
2335fn des_is_failed()
2336{
2337    println!("des_is_failed");
2338    use std::io::Write;
2339    use std::fmt::Write as _;
2340    use cryptocol::symmetric::DES;
2341
2342    {
2343        use cryptocol::symmetric::ECB_PKCS7;
2344
2345        // Successful case for the message of 0 bytes
2346        let key = 0x_1234567890ABCDEF_u64;
2347        println!("K =\t{:#018X}", key);
2348        let mut a_des = DES::new_with_key_u64(key);
2349        let message = "";
2350        println!("M =\t{}", message);
2351        let mut cipher = [0_u8; 8];
2352        let len = a_des.encrypt_into_array(message.as_ptr(), message.len() as u64, &mut cipher);
2353        println!("The length of ciphertext = {}", len);
2354        assert_eq!(len, 8);
2355        let failure = a_des.is_failed();
2356        assert_eq!(failure, false);
2357        print!("C =\t");
2358        for c in cipher.clone()
2359            { print!("{:02X} ", c); }
2360        println!();
2361        let mut txt = String::new();
2362        for c in cipher.clone()
2363            { write!(txt, "{:02X} ", c); }
2364        assert_eq!(txt, "41 7F 89 79 08 CD A1 4C ");
2365        println!();
2366    
2367        // Successful case for the original message of 0 bytes
2368        let key = 0x_1234567890ABCDEF_u64;
2369        println!("K =\t{:#018X}", key);
2370        let mut a_des = DES::new_with_key_u64(key);
2371    
2372        let cipher = [0x41u8, 0x7F, 0x89, 0x79, 0x08, 0xCD, 0xA1, 0x4C];
2373        print!("C =\t");
2374        for c in cipher.clone()
2375            { print!("{:02X} ", c); }
2376        println!();
2377        let mut recovered = [0u8; 8];
2378        let len = a_des.decrypt_array_into_array(&cipher, &mut recovered);
2379        println!("The length of plaintext = {}", len);
2380        assert_eq!(len, 0);
2381        let failure = a_des.is_failed();
2382        assert_eq!(failure, false);
2383        print!("Ba =\t");
2384        for b in recovered.clone()
2385            { print!("{:02X} ", b); }
2386        println!();
2387        let mut txt = String::new();
2388        for c in recovered.clone()
2389            { write!(txt, "{:02X} ", c); }
2390        assert_eq!(txt, "00 00 00 00 00 00 00 00 ");
2391    
2392        let mut converted = String::new();
2393        unsafe { converted.as_mut_vec() }.write(&recovered);
2394        unsafe { converted.as_mut_vec() }.truncate(len as usize);
2395        println!("Bb =\t{}", converted);
2396        assert_eq!(converted, "");
2397        assert_eq!(converted, message);
2398        println!();
2399    }
2400
2401    {
2402        use cryptocol::symmetric::CBC_ISO;
2403
2404        // Failure case for the message of 0 bytes
2405        let iv = 0x_FEDCBA0987654321_u64;
2406        println!("IV =	{}", iv);
2407        let key = 0x_1234567890ABCDEF_u64;
2408        println!("K =\t{:#018X}", key);
2409        let mut a_des = DES::new_with_key_u64(key);
2410        let message = "";
2411        println!("M =\t{}", message);
2412        let mut cipher = [0_u8; 4];
2413        let len = a_des.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
2414        println!("The length of ciphertext = {}", len);
2415        assert_eq!(len, 0);
2416        let failure = a_des.is_failed();
2417        assert_eq!(failure, true);
2418        print!("C =\t");
2419        for c in cipher.clone()
2420            { print!("{:02X} ", c); }
2421        println!();
2422        let mut txt = String::new();
2423        for c in cipher.clone()
2424            { write!(txt, "{:02X} ", c); }
2425        assert_eq!(txt, "00 00 00 00 ");
2426        println!();
2427        
2428        // Failed case for decryption
2429        let iv = 0x_FEDCBA0987654321_u64;
2430        println!("IV =	{}", iv);
2431        let key = 0x_1234567890ABCDEF_u64;
2432        println!("K =\t{:#018X}", key);
2433        let mut a_des = DES::new_with_key_u64(key);
2434
2435        let cipher = [0u8; 4];
2436        print!("C =\t");
2437        for c in cipher.clone()
2438            { print!("{:02X} ", c); }
2439        println!();
2440        let mut recovered = [0u8; 8];
2441        let len = a_des.decrypt_array_into_array(iv, &cipher, &mut recovered);
2442        println!("The length of plaintext = {}", len);
2443        assert_eq!(len, 0);
2444        let failure = a_des.is_failed();
2445        assert_eq!(failure, true);
2446    }
2447    println!("-------------------------------");
2448}
2449
2450// fn des_set_successful()
2451// {
2452//     println!("des_set_successful");
2453//     use cryptocol::symmetric::DES;
2454//     let mut a_des = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
2455//     assert_eq!(a_des.is_successful(), false);
2456
2457//     a_des.set_successful();
2458//     assert_eq!(a_des.is_successful(), true);
2459//     println!("-------------------------------");
2460// }
2461
2462// fn des_set_failed()
2463// {
2464//     println!("des_set_failed");
2465//     use cryptocol::symmetric::DES;
2466//     let mut a_des = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
2467//     a_des.encrypt_u64(0x1234567890ABCDEF_u64);
2468//     assert_eq!(a_des.is_failed(), false);
2469
2470//     a_des.set_failed();
2471//     assert_eq!(a_des.is_failed(), true);
2472//     println!("-------------------------------");
2473// }
2474
2475fn des_has_weak_key()
2476{
2477    println!("des_has_weak_key");
2478    use cryptocol::symmetric::DES;
2479
2480    let key = 0x_1234567890ABCDEF_u64;
2481    let mut a_des = DES::new_with_key_u64(key);
2482    let weak_key = a_des.has_weak_key();
2483    println!("{:016X} is {}a weak key.", key.to_be(), if weak_key {""} else {"not "});
2484    assert_eq!(weak_key, false);
2485
2486    let key = 0x_0000000000000000_u64;
2487    a_des.set_key_u64(key);
2488    let weak_key = a_des.has_weak_key();
2489    println!("{:016X} is {}a weak key.", key.to_be(), if weak_key {""} else {"not "});
2490    assert_eq!(weak_key, true);
2491    println!("-------------------------------");
2492}
2493
2494
2495///// For test during implementation //////
2496/*
2497use cryptocol::symmetric::DES;
2498use cryptocol::number::{ IntUnion };
2499
2500pub fn main()
2501{
2502    des_permutate_initially_finally();
2503    des_permutate_expansion();
2504    des_split();
2505    des_make_round_keys();
2506    des_slice_indices_combine();
2507    des_f();
2508}
2509
2510trait TestDes
2511{
2512    fn get_block(&self) -> u64;
2513    fn set_block(&mut self, block: u64);
2514    fn permutate_initially(&mut self);
2515    fn permutate_finally(&mut self);
2516    fn expand(&self, right: u32) -> u64;
2517    fn compress_into_56bits(&self) -> u64;
2518    fn split(&self) -> (IntUnion, IntUnion);
2519    fn make_round_keys(&mut self);
2520    fn get_round_key(&self, round: usize) -> u64;
2521    fn slice_indices(&self, indices: u64, array: &mut [usize; 8]);
2522    fn combine(&self, collector: &mut u32, piece: u32);
2523    fn f(&mut self, round: usize, right: u32) -> u32;
2524}
2525
2526impl TestDes for DES
2527{
2528    fn get_block(&self) -> u64          { self.test_get_block() }
2529    fn set_block(&mut self, block: u64) { self.test_set_block(block); }
2530    fn permutate_initially(&mut self)   { self.test_permutate_initially(); }
2531    fn permutate_finally(&mut self)     { self.test_permutate_finally(); }
2532    fn expand(&self, right: u32) -> u64     { self.test_expand(right) }
2533    fn compress_into_56bits(&self) -> u64   { self.test_compress_into_56bits() }
2534    fn split(&self) -> (IntUnion, IntUnion)     { self.test_split() }
2535    fn make_round_keys(&mut self)    { self.test_make_round_keys(); }
2536    fn get_round_key(&self, round: usize) -> u64  { self.test_get_round_key(round) }
2537    fn slice_indices(&self, indices: u64, array: &mut [usize; 8])   { self.test_slice_indices(indices, array) }
2538    fn combine(&self, collector: &mut u32, piece: u32) { self.test_combine(collector, piece); }
2539    fn f(&mut self, round: usize, right: u32) -> u32   { self.test_f(round, right) }
2540}
2541
2542
2543fn des_permutate_initially_finally()
2544{
2545    println!("des_permutate_initially_finally");
2546    use std::io::Write;
2547    use std::fmt::Write as _;
2548    use cryptocol::number::LongUnion;
2549    use cryptocol::symmetric::DES;
2550
2551    let mut a_des = DES::new();
2552    let block = (1_u64 << (8-2)) | (1_u64 << ((50-1) / 8 * 8 + (7 - (50-1) % 8)));
2553    a_des.set_block(block);
2554    a_des.permutate_initially();
2555    let out = a_des.get_block();
2556    let bu = LongUnion::new_with(block);
2557    print!("block =\t");
2558    for i in 0..8
2559        { print!("{:08b} ", bu.get_ubyte_(i)); }
2560    println!();
2561    let mut txt = String::new();
2562    for i in 0..8
2563        { write!(txt, "{:08b} ", bu.get_ubyte_(i)); }
2564    assert_eq!(txt, "01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 ");
2565
2566    let ou = LongUnion::new_with(out);
2567    print!("out =\t");
2568    for i in 0..8
2569        { print!("{:08b} ", ou.get_ubyte_(i)); }
2570    println!();
2571    let mut txt = String::new();
2572    for i in 0..8
2573        { write!(txt, "{:08b} ", ou.get_ubyte_(i)); }
2574    assert_eq!(txt, "01000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ");
2575
2576    a_des.permutate_finally();
2577    let back = a_des.get_block();
2578    let cu = LongUnion::new_with(back);
2579    print!("back =\t");
2580    for i in 0..8
2581        { print!("{:08b} ", cu.get_ubyte_(i)); }
2582    println!();
2583    let mut txt = String::new();
2584    for i in 0..8
2585        { write!(txt, "{:08b} ", cu.get_ubyte_(i)); }
2586    assert_eq!(txt, "01000000 00000000 00000000 00000000 00000000 00000000 01000000 00000000 ");
2587    println!("-------------------------------");
2588}
2589
2590fn des_permutate_expansion()
2591{
2592    println!("des_permutate_expansion");
2593    use std::io::Write;
2594    use std::fmt::Write as _;
2595    use cryptocol::number::{ IntUnion, LongUnion };
2596    use cryptocol::symmetric::DES;
2597    
2598    let mut right = IntUnion::new();
2599    let mut i = 0;
2600    for val in [0b_1111_0000_u8, 0b_1010_1010, 0b_1111_0000, 0b_1010_1010]
2601    {
2602        right.set_ubyte_(i, val);
2603        i += 1;
2604    }
2605    print!("right =\t");
2606    for i in 0..4
2607        { print!("{:08b} ", right.get_ubyte_(i)); }
2608    println!();
2609
2610    let a_des = DES::new();
2611    let out = a_des.expand(right.get());
2612
2613    let ou = LongUnion::new_with(out);
2614    print!("out =\t");
2615    for i in 0..6
2616        { print!("{:08b} ", ou.get_ubyte_(i)); }
2617    println!();
2618    let mut txt = String::new();
2619    for i in 0..6
2620        { write!(txt, "{:08b} ", ou.get_ubyte_(i)); }
2621    assert_eq!(txt, "01111010 00010101 01010101 01111010 00010101 01010101 ");
2622    println!("-------------------------------");
2623}
2624
2625fn des_split()
2626{
2627    println!("des_split");
2628    use std::io::Write;
2629    use std::fmt::Write as _;
2630    use cryptocol::number::LongUnion;
2631    use cryptocol::symmetric::DES;
2632    
2633    let key = [0b00010011_u8, 0b00110100, 0b01010111, 0b01111001, 0b10011011, 0b10111100, 0b11011111, 0b11110001];
2634    print!("K =\t");
2635    for i in 0..8
2636        { print!("{:08b} ", key[i]); }
2637    println!();
2638    let mut txt = String::new();
2639    for i in 0..8
2640        { write!(txt, "{:08b} ", key[i]); }
2641    assert_eq!(txt, "00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001 ");
2642
2643    let a_des = DES::new_with_key(key.clone());
2644    let key_56bit = LongUnion::new_with(a_des.compress_into_56bits());
2645    print!("K+ =\t");
2646    for i in 0..7
2647        { print!("{:08b} ", key_56bit.get_ubyte_(i)); }
2648    println!();
2649    let mut txt = String::new();
2650    for i in 0..7
2651        { write!(txt, "{:08b} ", key_56bit.get_ubyte_(i)); }
2652    assert_eq!(txt, "11110000 11001100 10101010 11110101 01010110 01100111 10001111 ");
2653
2654    let a_des = DES::new_with_key(key.clone());
2655    let (left, right) = a_des.split();
2656    print!("L =\t");
2657    for i in 0..4
2658        { print!("{:08b} ", left.get_ubyte_(i)); }
2659    println!();
2660    let mut txt = String::new();
2661    for i in 0..4
2662        { write!(txt, "{:08b} ", left.get_ubyte_(i)); }
2663    assert_eq!(txt, "11110000 11001100 10101010 11110000 ");
2664
2665    print!("R =\t");
2666    for i in 0..4
2667        { print!("{:08b} ", right.get_ubyte_(i)); }
2668    println!();
2669    let mut txt = String::new();
2670    for i in 0..4
2671        { write!(txt, "{:08b} ", right.get_ubyte_(i)); }
2672    assert_eq!(txt, "01010101 01100110 01111000 11110000 ");
2673    println!("-------------------------------");
2674}
2675
2676fn des_make_round_keys()
2677{
2678    println!("des_make_round_keys");
2679    use std::io::Write;
2680    use std::fmt::Write as _;
2681    use cryptocol::number::LongUnion;
2682    use cryptocol::symmetric::DES;
2683
2684    let key = [0b00010011_u8, 0b00110100, 0b01010111, 0b01111001, 0b10011011, 0b10111100, 0b11011111, 0b11110001];
2685    print!("K =\t");
2686    for i in 0..8
2687        { print!("{:08b} ", key[i]); }
2688    println!();
2689
2690    let a_des = DES::new_with_key(key);
2691    for i in 0..16
2692    {
2693        let round_key = LongUnion::new_with(a_des.get_round_key(i));
2694        print!("K({}) =\t", i);
2695        for j in 0..6
2696            { print!("{:08b} ", round_key.get_ubyte_(j)); }
2697        println!();
2698    }
2699
2700    let round_key = LongUnion::new_with(a_des.get_round_key(0));
2701    let mut txt = String::new();
2702    for j in 0..6
2703        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2704    assert_eq!(txt, "00011011 00000010 11101111 11111100 01110000 01110010 ");
2705
2706    let round_key = LongUnion::new_with(a_des.get_round_key(1));
2707    let mut txt = String::new();
2708    for j in 0..6
2709        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2710    assert_eq!(txt, "01111001 10101110 11011001 11011011 11001001 11100101 ");
2711
2712    let round_key = LongUnion::new_with(a_des.get_round_key(2));
2713    let mut txt = String::new();
2714    for j in 0..6
2715        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2716    assert_eq!(txt, "01010101 11111100 10001010 01000010 11001111 10011001 ");
2717
2718    let round_key = LongUnion::new_with(a_des.get_round_key(3));
2719    let mut txt = String::new();
2720    for j in 0..6
2721        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2722    assert_eq!(txt, "01110010 10101101 11010110 11011011 00110101 00011101 ");
2723
2724    let round_key = LongUnion::new_with(a_des.get_round_key(4));
2725    let mut txt = String::new();
2726    for j in 0..6
2727        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2728    assert_eq!(txt, "01111100 11101100 00000111 11101011 01010011 10101000 ");
2729
2730    let round_key = LongUnion::new_with(a_des.get_round_key(5));
2731    let mut txt = String::new();
2732    for j in 0..6
2733        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2734    assert_eq!(txt, "01100011 10100101 00111110 01010000 01111011 00101111 ");
2735
2736    let round_key = LongUnion::new_with(a_des.get_round_key(6));
2737    let mut txt = String::new();
2738    for j in 0..6
2739        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2740    assert_eq!(txt, "11101100 10000100 10110111 11110110 00011000 10111100 ");
2741
2742    let round_key = LongUnion::new_with(a_des.get_round_key(7));
2743    let mut txt = String::new();
2744    for j in 0..6
2745        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2746    assert_eq!(txt, "11110111 10001010 00111010 11000001 00111011 11111011 ");
2747
2748    let round_key = LongUnion::new_with(a_des.get_round_key(8));
2749    let mut txt = String::new();
2750    for j in 0..6
2751        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2752    assert_eq!(txt, "11100000 11011011 11101011 11101101 11100111 10000001 ");
2753
2754    let round_key = LongUnion::new_with(a_des.get_round_key(9));
2755    let mut txt = String::new();
2756    for j in 0..6
2757        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2758    assert_eq!(txt, "10110001 11110011 01000111 10111010 01000110 01001111 ");
2759
2760    let round_key = LongUnion::new_with(a_des.get_round_key(10));
2761    let mut txt = String::new();
2762    for j in 0..6
2763        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2764    assert_eq!(txt, "00100001 01011111 11010011 11011110 11010011 10000110 ");
2765
2766    let round_key = LongUnion::new_with(a_des.get_round_key(11));
2767    let mut txt = String::new();
2768    for j in 0..6
2769        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2770    assert_eq!(txt, "01110101 01110001 11110101 10010100 01100111 11101001 ");
2771
2772    let round_key = LongUnion::new_with(a_des.get_round_key(12));
2773    let mut txt = String::new();
2774    for j in 0..6
2775        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2776    assert_eq!(txt, "10010111 11000101 11010001 11111010 10111010 01000001 ");
2777
2778    let round_key = LongUnion::new_with(a_des.get_round_key(13));
2779    let mut txt = String::new();
2780    for j in 0..6
2781        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2782    assert_eq!(txt, "01011111 01000011 10110111 11110010 11100111 00111010 ");
2783
2784    let round_key = LongUnion::new_with(a_des.get_round_key(14));
2785    let mut txt = String::new();
2786    for j in 0..6
2787        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2788    assert_eq!(txt, "10111111 10010001 10001101 00111101 00111111 00001010 ");
2789
2790    let round_key = LongUnion::new_with(a_des.get_round_key(15));
2791    let mut txt = String::new();
2792    for j in 0..6
2793        { write!(txt, "{:08b} ", round_key.get_ubyte_(j)); }
2794    assert_eq!(txt, "11001011 00111101 10001011 00001110 00010111 11110101 ");
2795    println!("-------------------------------");
2796}
2797
2798fn des_slice_indices_combine()
2799{
2800    println!("des_slice_indices_combine");
2801    use cryptocol::number::LongUnion;
2802    use cryptocol::symmetric::DES;
2803
2804    let a_des = DES::new();
2805    let mut indices = LongUnion::new();
2806    indices.set_ubyte_(0, 0b_111111_00);
2807    indices.set_ubyte_(1, 0b_0000_1010);
2808    indices.set_ubyte_(2, 0b_10_100100);
2809    indices.set_ubyte_(3, 0b_010101_00);
2810    indices.set_ubyte_(4, 0b_1001_1101);
2811    indices.set_ubyte_(5, 0b_10_011011);
2812
2813    let mut index = [0_usize; 8];
2814    a_des.slice_indices(indices.get(), &mut index);
2815    for i in 0..8
2816        { println!("idx({}) = {:06b}", i, index[i]); }
2817    assert_eq!(index[0], 0b111111);
2818    assert_eq!(index[1], 0b000000);
2819    assert_eq!(index[2], 0b101010);
2820    assert_eq!(index[3], 0b100100);
2821    assert_eq!(index[4], 0b010101);
2822    assert_eq!(index[5], 0b001001);
2823    assert_eq!(index[6], 0b110110);
2824    assert_eq!(index[7], 0b011011);
2825
2826    let mut collector = 0_u32;
2827    let small = [0b1111_u32, 0b0101, 0b1000, 0b0111, 0b1100, 0b0011, 0b0001, 0b1001];
2828    let piece = [(small[0] << 4) | small[1], (small[2] << 4) | small[3],
2829                            (small[4] << 4) | small[5], (small[6] << 4) | small[7]];
2830    for i in 0..8
2831        { println!("{:04b} ", small[i]); }
2832    
2833    a_des.combine(&mut collector, piece[0]);
2834    a_des.combine(&mut collector, piece[1]);
2835    a_des.combine(&mut collector, piece[2]);
2836    a_des.combine(&mut collector, piece[3]);
2837    let col = IntUnion::new_with(collector);
2838    for i in 0..4
2839        { println!("{:08b} ", col.get_ubyte_(i)); }
2840    assert_eq!(col.get_ubyte_(0), 0b11110101);
2841    assert_eq!(col.get_ubyte_(1), 0b10000111);
2842    assert_eq!(col.get_ubyte_(2), 0b11000011);
2843    assert_eq!(col.get_ubyte_(3), 0b00011001);
2844    println!("-------------------------------");
2845}
2846
2847fn des_f()
2848{
2849    println!("des_f");
2850    use cryptocol::number::IntUnion;
2851    use cryptocol::symmetric::DES;
2852
2853    let key = [0b00010011_u8, 0b00110100, 0b01010111, 0b01111001, 0b10011011, 0b10111100, 0b11011111, 0b11110001];
2854    print!("K =\t");
2855    for i in 0..8
2856        { print!("{:08b} ", key[i]); }
2857    println!();
2858
2859    let mut right = IntUnion::new();
2860    right.set_ubyte_(0, 0b_1111_0000_u8);
2861    right.set_ubyte_(1, 0b_1010_1010_u8);
2862    right.set_ubyte_(2, 0b_1111_0000_u8);
2863    right.set_ubyte_(3, 0b_1010_1010_u8);
2864    print!("R =\t");
2865    for i in 0..4
2866        { print!("{:08b} ", right.get_ubyte_(i)); }
2867    println!();
2868
2869    let mut a_des = DES::new_with_key(key);
2870    let c = a_des.f(0, right.get());
2871    let cipher = IntUnion::new_with(c);
2872
2873    print!("F =\t");
2874    for i in 0..4
2875        { print!("{:08b} ", cipher.get_ubyte_(i)); }
2876    println!();
2877    println!("-------------------------------");
2878}
2879*/