File: le.rs

package info (click to toggle)
rust-ctr 0.9.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 204 kB
  • sloc: makefile: 2
file content (96 lines) | stat: -rw-r--r-- 2,620 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//! Counter Mode with a 32-bit little endian counter

use cipher::{
    consts::U16, generic_array::GenericArray, KeyIvInit, StreamCipher, StreamCipherSeek,
    StreamCipherSeekCore,
};
use hex_literal::hex;

type Aes128Ctr = ctr::Ctr32LE<aes::Aes128>;

const KEY: &[u8; 16] = &hex!("000102030405060708090A0B0C0D0E0F");
const NONCE1: &[u8; 16] = &hex!("11111111111111111111111111111111");
const NONCE2: &[u8; 16] = &hex!("FEFFFFFF222222222222222222222222");

/// Compute nonce as used by AES-GCM-SIV
fn nonce(bytes: &[u8; 16]) -> GenericArray<u8, U16> {
    let mut n = *bytes;
    n[15] |= 0x80;
    n.into()
}

#[test]
fn counter_incr() {
    let mut ctr = Aes128Ctr::new(KEY.into(), &nonce(NONCE1));
    assert_eq!(ctr.get_core().get_block_pos(), 0);

    let mut buffer = [0u8; 64];
    ctr.apply_keystream(&mut buffer);

    // assert_eq!(ctr.current_ctr(), 4);
    assert_eq!(
        &buffer[..],
        &hex!(
            "2A0680B210CAD45E886D7EF6DAB357C9F18B39AFF6930FDB2D9FCE34261FF699"
            "EB96774669D24B560C9AD028C5C39C4580775A82065256B4787DC91C6942B700"
        )[..]
    );
}

#[test]
fn counter_seek() {
    let mut ctr = Aes128Ctr::new(KEY.into(), &nonce(NONCE1));
    ctr.seek(16);
    assert_eq!(ctr.get_core().get_block_pos(), 1);

    let mut buffer = [0u8; 64];
    ctr.apply_keystream(&mut buffer);

    assert_eq!(ctr.get_core().get_block_pos(), 5);
    assert_eq!(
        &buffer[..],
        &hex!(
            "F18B39AFF6930FDB2D9FCE34261FF699EB96774669D24B560C9AD028C5C39C45"
            "80775A82065256B4787DC91C6942B7001564DDA1B07DCED9201AB71BAF06905B"
        )[..]
    );
}

#[test]
fn keystream_xor() {
    let mut ctr = Aes128Ctr::new(KEY.into(), &nonce(NONCE1));
    let mut buffer = [1u8; 64];

    ctr.apply_keystream(&mut buffer);
    assert_eq!(
        &buffer[..],
        &hex!(
            "2B0781B311CBD55F896C7FF7DBB256C8F08A38AEF7920EDA2C9ECF35271EF798"
            "EA97764768D34A570D9BD129C4C29D4481765B83075357B5797CC81D6843B601"
        )[..]
    );
}

#[test]
fn counter_wrap() {
    let mut ctr = Aes128Ctr::new(KEY.into(), &nonce(NONCE2));
    assert_eq!(ctr.get_core().get_block_pos(), 0);

    let mut buffer = [0u8; 64];
    ctr.apply_keystream(&mut buffer);

    assert_eq!(ctr.get_core().get_block_pos(), 4);
    assert_eq!(
        &buffer[..],
        &hex!(
            "A1E649D8B382293DC28375C42443BB6A226BAADC9E9CCA8214F56E07A4024E06"
            "6355A0DA2E08FB00112FFA38C26189EE55DD5B0B130ED87096FE01B59A665A60"
        )[..]
    );
}

cipher::iv_state_test!(
    iv_state,
    ctr::CtrCore<aes::Aes128, ctr::flavors::Ctr32LE>,
    apply_ks,
);