kuznechik/algorithms/
alg_ecb.rs

1use super::Kuznechik;
2use crate::types::mut_cast_unchecked;
3use crate::transforms::{addition_block128_2, addition_rev_block_2, encrypt_block, decrypt_block};
4use crate::key_store::KeyStore;
5
6pub struct AlgEcb<'k> {
7    kuz: &'k KeyStore
8}
9
10impl<'k> Kuznechik<'k> for AlgEcb<'k> {
11    fn new(kuz: &'k KeyStore) -> Self {
12        AlgEcb { kuz }
13    }
14
15    fn set_gamma(&mut self, _gamma: Vec<u8>) { }
16
17    fn encrypt(&mut self, mut data: Vec<u8>) -> Vec<u8> {
18        addition_block128_2(&mut data);
19
20        let count_blocks = data.len() / 16;
21
22        for i in 0..count_blocks {
23            encrypt_block(mut_cast_unchecked(&mut data[i*16 .. (i+1)*16]), &self.kuz.keys);
24        }
25        data
26    }
27
28    fn decrypt(&mut self, mut data: Vec<u8>) -> Vec<u8> {
29        let count_blocks = data.len() / 16;
30
31        for i in 0..count_blocks {
32            decrypt_block(mut_cast_unchecked(&mut data[i*16 .. (i+1)*16]), &self.kuz.keys);
33        }
34
35        addition_rev_block_2(&mut data);
36        data
37    }
38}