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