1 //! Counter Mode with a 32-bit big endian counter
2 
3 use cipher::{NewCipher, StreamCipher};
4 use hex_literal::hex;
5 
6 type Aes128Ctr = ctr::Ctr32BE<aes::Aes128>;
7 
8 const KEY: &[u8; 16] = &hex!("000102030405060708090A0B0C0D0E0F");
9 const NONCE1: &[u8; 16] = &hex!("11111111111111111111111111111111");
10 const NONCE2: &[u8; 16] = &hex!("222222222222222222222222FFFFFFFE");
11 
12 #[test]
counter_incr()13 fn counter_incr() {
14     let mut ctr = Aes128Ctr::new(KEY.into(), NONCE1.into());
15     assert_eq!(ctr.current_block(), 0);
16 
17     let mut buffer = [0u8; 64];
18     ctr.apply_keystream(&mut buffer);
19 
20     assert_eq!(ctr.current_block(), 4);
21     assert_eq!(
22         &buffer[..],
23         &hex!(
24             "35D14E6D3E3A279CF01E343E34E7DED36EEADB04F42E2251AB4377F257856DBA
25              0AB37657B9C2AA09762E518FC9395D5304E96C34CCD2F0A95CDE7321852D90C0"
26         )[..]
27     );
28 }
29 
30 #[test]
counter_seek()31 fn counter_seek() {
32     let mut ctr = Aes128Ctr::new(KEY.into(), NONCE1.into());
33     ctr.seek_block(1);
34     assert_eq!(ctr.current_block(), 1);
35 
36     let mut buffer = [0u8; 64];
37     ctr.apply_keystream(&mut buffer);
38 
39     assert_eq!(ctr.current_block(), 5);
40     assert_eq!(
41         &buffer[..],
42         &hex!(
43             "6EEADB04F42E2251AB4377F257856DBA0AB37657B9C2AA09762E518FC9395D53
44              04E96C34CCD2F0A95CDE7321852D90C0F7441EAB3811A03FDBD162AEC402F5AA"
45         )[..]
46     );
47 }
48 
49 #[test]
keystream_xor()50 fn keystream_xor() {
51     let mut ctr = Aes128Ctr::new(KEY.into(), NONCE1.into());
52     let mut buffer = [1u8; 64];
53 
54     ctr.apply_keystream(&mut buffer);
55     assert_eq!(
56         &buffer[..],
57         &hex!(
58             "34D04F6C3F3B269DF11F353F35E6DFD26FEBDA05F52F2350AA4276F356846CBB
59              0BB27756B8C3AB08772F508EC8385C5205E86D35CDD3F1A85DDF7220842C91C1"
60         )[..]
61     );
62 }
63 
64 #[test]
counter_wrap()65 fn counter_wrap() {
66     let mut ctr = Aes128Ctr::new(KEY.into(), NONCE2.into());
67     assert_eq!(ctr.current_block(), 0);
68 
69     let mut buffer = [0u8; 64];
70     ctr.apply_keystream(&mut buffer);
71 
72     assert_eq!(ctr.current_block(), 4);
73     assert_eq!(
74         &buffer[..],
75         &hex!(
76             "58FC849D1CF53C54C63E1B1D15CB3C8AAA335F72135585E9FF943F4DAC77CB63
77              BD1AE8716BE69C3B4D886B222B9B4E1E67548EF896A96E2746D8CA6476D8B183"
78         )[..]
79     );
80 }
81