Coverage Report

Created: 2026-09-06 07:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/aes-0.7.5/src/ni/aes192.rs
Line
Count
Source
1
use super::{
2
    arch::*,
3
    utils::{aesdec8, aesdeclast8, aesenc8, aesenclast8, load8, store8, xor8, U128x8},
4
};
5
use crate::{Block, ParBlocks};
6
use cipher::{
7
    consts::{U16, U24, U8},
8
    generic_array::GenericArray,
9
    BlockCipher, BlockDecrypt, BlockEncrypt, NewBlockCipher,
10
};
11
12
mod expand;
13
#[cfg(test)]
14
mod test_expand;
15
16
/// AES-192 round keys
17
type RoundKeys = [__m128i; 13];
18
19
/// AES-192 block cipher
20
#[derive(Clone)]
21
pub struct Aes192 {
22
    encrypt_keys: RoundKeys,
23
    decrypt_keys: RoundKeys,
24
}
25
26
impl Aes192 {
27
    #[inline(always)]
28
0
    pub(crate) fn encrypt8(&self, mut blocks: U128x8) -> U128x8 {
29
        #[inline]
30
        #[target_feature(enable = "aes")]
31
0
        unsafe fn aesni192_encrypt8(keys: &RoundKeys, blocks: &mut U128x8) {
32
0
            xor8(blocks, keys[0]);
33
0
            aesenc8(blocks, keys[1]);
34
0
            aesenc8(blocks, keys[2]);
35
0
            aesenc8(blocks, keys[3]);
36
0
            aesenc8(blocks, keys[4]);
37
0
            aesenc8(blocks, keys[5]);
38
0
            aesenc8(blocks, keys[6]);
39
0
            aesenc8(blocks, keys[7]);
40
0
            aesenc8(blocks, keys[8]);
41
0
            aesenc8(blocks, keys[9]);
42
0
            aesenc8(blocks, keys[10]);
43
0
            aesenc8(blocks, keys[11]);
44
0
            aesenclast8(blocks, keys[12]);
45
0
        }
46
0
        unsafe { aesni192_encrypt8(&self.encrypt_keys, &mut blocks) };
47
0
        blocks
48
0
    }
49
50
    #[inline(always)]
51
0
    pub(crate) fn encrypt(&self, block: __m128i) -> __m128i {
52
        #[inline]
53
        #[target_feature(enable = "aes")]
54
0
        unsafe fn aesni192_encrypt1(keys: &RoundKeys, mut block: __m128i) -> __m128i {
55
0
            block = _mm_xor_si128(block, keys[0]);
56
0
            block = _mm_aesenc_si128(block, keys[1]);
57
0
            block = _mm_aesenc_si128(block, keys[2]);
58
0
            block = _mm_aesenc_si128(block, keys[3]);
59
0
            block = _mm_aesenc_si128(block, keys[4]);
60
0
            block = _mm_aesenc_si128(block, keys[5]);
61
0
            block = _mm_aesenc_si128(block, keys[6]);
62
0
            block = _mm_aesenc_si128(block, keys[7]);
63
0
            block = _mm_aesenc_si128(block, keys[8]);
64
0
            block = _mm_aesenc_si128(block, keys[9]);
65
0
            block = _mm_aesenc_si128(block, keys[10]);
66
0
            block = _mm_aesenc_si128(block, keys[11]);
67
0
            _mm_aesenclast_si128(block, keys[12])
68
0
        }
69
0
        unsafe { aesni192_encrypt1(&self.encrypt_keys, block) }
70
0
    }
71
}
72
73
impl NewBlockCipher for Aes192 {
74
    type KeySize = U24;
75
76
    #[inline]
77
0
    fn new(key: &GenericArray<u8, U24>) -> Self {
78
0
        let key = unsafe { &*(key as *const _ as *const [u8; 24]) };
79
0
        let (encrypt_keys, decrypt_keys) = expand::expand(key);
80
0
        Self {
81
0
            encrypt_keys,
82
0
            decrypt_keys,
83
0
        }
84
0
    }
85
}
86
87
impl BlockCipher for Aes192 {
88
    type BlockSize = U16;
89
    type ParBlocks = U8;
90
}
91
92
impl BlockEncrypt for Aes192 {
93
    #[inline]
94
0
    fn encrypt_block(&self, block: &mut Block) {
95
        // Safety: `loadu` and `storeu` support unaligned access
96
        #[allow(clippy::cast_ptr_alignment)]
97
0
        unsafe {
98
0
            let b = _mm_loadu_si128(block.as_ptr() as *const __m128i);
99
0
            let b = self.encrypt(b);
100
0
            _mm_storeu_si128(block.as_mut_ptr() as *mut __m128i, b);
101
0
        }
102
0
    }
103
104
    #[inline]
105
0
    fn encrypt_par_blocks(&self, blocks: &mut ParBlocks) {
106
0
        let b = self.encrypt8(load8(blocks));
107
0
        store8(blocks, b);
108
0
    }
109
}
110
111
impl BlockDecrypt for Aes192 {
112
    #[inline]
113
0
    fn decrypt_block(&self, block: &mut Block) {
114
        #[inline]
115
        #[target_feature(enable = "aes")]
116
0
        unsafe fn aes192_decrypt1(block: &mut Block, keys: &RoundKeys) {
117
            // Safety: `loadu` and `storeu` support unaligned access
118
            #[allow(clippy::cast_ptr_alignment)]
119
0
            let mut b = _mm_loadu_si128(block.as_ptr() as *const __m128i);
120
121
0
            b = _mm_xor_si128(b, keys[12]);
122
0
            b = _mm_aesdec_si128(b, keys[11]);
123
0
            b = _mm_aesdec_si128(b, keys[10]);
124
0
            b = _mm_aesdec_si128(b, keys[9]);
125
0
            b = _mm_aesdec_si128(b, keys[8]);
126
0
            b = _mm_aesdec_si128(b, keys[7]);
127
0
            b = _mm_aesdec_si128(b, keys[6]);
128
0
            b = _mm_aesdec_si128(b, keys[5]);
129
0
            b = _mm_aesdec_si128(b, keys[4]);
130
0
            b = _mm_aesdec_si128(b, keys[3]);
131
0
            b = _mm_aesdec_si128(b, keys[2]);
132
0
            b = _mm_aesdec_si128(b, keys[1]);
133
0
            b = _mm_aesdeclast_si128(b, keys[0]);
134
135
            // Safety: `loadu` and `storeu` support unaligned access
136
            #[allow(clippy::cast_ptr_alignment)]
137
0
            _mm_storeu_si128(block.as_mut_ptr() as *mut __m128i, b);
138
0
        }
139
140
0
        unsafe { aes192_decrypt1(block, &self.decrypt_keys) }
141
0
    }
142
143
    #[inline]
144
0
    fn decrypt_par_blocks(&self, blocks: &mut ParBlocks) {
145
        #[inline]
146
        #[target_feature(enable = "aes")]
147
0
        unsafe fn aes192_decrypt8(blocks: &mut ParBlocks, keys: &RoundKeys) {
148
0
            let mut b = load8(blocks);
149
0
            xor8(&mut b, keys[12]);
150
0
            aesdec8(&mut b, keys[11]);
151
0
            aesdec8(&mut b, keys[10]);
152
0
            aesdec8(&mut b, keys[9]);
153
0
            aesdec8(&mut b, keys[8]);
154
0
            aesdec8(&mut b, keys[7]);
155
0
            aesdec8(&mut b, keys[6]);
156
0
            aesdec8(&mut b, keys[5]);
157
0
            aesdec8(&mut b, keys[4]);
158
0
            aesdec8(&mut b, keys[3]);
159
0
            aesdec8(&mut b, keys[2]);
160
0
            aesdec8(&mut b, keys[1]);
161
0
            aesdeclast8(&mut b, keys[0]);
162
0
            store8(blocks, b);
163
0
        }
164
165
0
        unsafe { aes192_decrypt8(blocks, &self.decrypt_keys) }
166
0
    }
167
}
168
169
opaque_debug::implement!(Aes192);