trigger-rs/crates/trigger-cryptography/src/mhy/aes.rs
traffic95 8f606a8256 Add property calculations (#5)
Reviewed-on: #5
Co-authored-by: traffic95 <traffic95@xeondev.com>
Co-committed-by: traffic95 <traffic95@xeondev.com>
2025-03-18 20:44:22 +00:00

178 lines
4.9 KiB
Rust

#![allow(unused)]
use super::tables::{
LOOKUP_G2, LOOKUP_G3, LOOKUP_G9, LOOKUP_G11, LOOKUP_G13, LOOKUP_G14, LOOKUP_RCON, LOOKUP_SBOX,
LOOKUP_SBOX_INV, SHIFT_ROWS_TABLE, SHIFT_ROWS_TABLE_INV,
};
fn xorr(a: &mut [u8], b: &[u8], n: usize) {
(0..n).for_each(|i| a[i] ^= b[i]);
}
fn xor_round_key(state: &mut [u8], keys: &[u8], round: usize) {
xorr(state, &keys[round * 16..], 16);
}
fn sub_bytes(a: &mut [u8], n: usize) {
(0..n).for_each(|i| a[i] = LOOKUP_SBOX[a[i] as usize]);
}
fn sub_bytes_inv(a: &mut [u8], n: usize) {
(0..n).for_each(|i| a[i] = LOOKUP_SBOX_INV[a[i] as usize]);
}
fn key_schedule_core(a: &mut [u8], i: usize) {
let temp = a[0];
a[0] = a[1];
a[1] = a[2];
a[2] = a[3];
a[3] = temp;
sub_bytes(a, 4);
a[0] ^= LOOKUP_RCON[i];
}
fn oqs_aes128_load_schedule_c(key: &[u8]) -> [u8; 176] {
let mut schedule = [0u8; 176];
let mut bytes = 16;
let mut i = 1;
let mut t = [0u8; 4];
schedule[0..16].copy_from_slice(key);
while bytes < 176 {
t.copy_from_slice(&schedule[bytes - 4..]);
key_schedule_core(&mut t, i);
i += 1;
xorr(&mut schedule[bytes..], &t, 4);
schedule[bytes..].copy_from_slice(&t);
bytes += 4;
for _ in 0..3 {
t.copy_from_slice(&schedule[bytes - 4..]);
xorr(&mut t, &schedule[bytes - 16..], 4);
schedule[bytes..].copy_from_slice(&t);
bytes += 4;
}
}
schedule
}
fn shift_rows(state: &mut [u8]) {
let temp = state.to_vec();
(0..16).for_each(|i| state[i] = temp[SHIFT_ROWS_TABLE[i] as usize]);
}
fn shift_rows_inv(state: &mut [u8]) {
let temp = state.to_vec();
(0..16).for_each(|i| state[i] = temp[SHIFT_ROWS_TABLE_INV[i] as usize]);
}
fn mix_col(state: &mut [u8]) {
let (a0, a1, a2, a3) = (state[0], state[1], state[2], state[3]);
state[0] = LOOKUP_G2[a0 as usize] ^ LOOKUP_G3[a1 as usize] ^ a2 ^ a3;
state[1] = LOOKUP_G2[a1 as usize] ^ LOOKUP_G3[a2 as usize] ^ a3 ^ a0;
state[2] = LOOKUP_G2[a2 as usize] ^ LOOKUP_G3[a3 as usize] ^ a0 ^ a1;
state[3] = LOOKUP_G2[a3 as usize] ^ LOOKUP_G3[a0 as usize] ^ a1 ^ a2;
}
fn mix_cols(state: &mut [u8]) {
mix_col(&mut state[0..4]);
mix_col(&mut state[4..8]);
mix_col(&mut state[8..12]);
mix_col(&mut state[12..16]);
}
fn mix_col_inv(state: &mut [u8]) {
let (a0, a1, a2, a3) = (state[0], state[1], state[2], state[3]);
state[0] = LOOKUP_G14[a0 as usize]
^ LOOKUP_G9[a3 as usize]
^ LOOKUP_G13[a2 as usize]
^ LOOKUP_G11[a1 as usize];
state[1] = LOOKUP_G14[a1 as usize]
^ LOOKUP_G9[a0 as usize]
^ LOOKUP_G13[a3 as usize]
^ LOOKUP_G11[a2 as usize];
state[2] = LOOKUP_G14[a2 as usize]
^ LOOKUP_G9[a1 as usize]
^ LOOKUP_G13[a0 as usize]
^ LOOKUP_G11[a3 as usize];
state[3] = LOOKUP_G14[a3 as usize]
^ LOOKUP_G9[a2 as usize]
^ LOOKUP_G13[a1 as usize]
^ LOOKUP_G11[a0 as usize];
}
fn mix_cols_inv(state: &mut [u8]) {
mix_col_inv(&mut state[0..4]);
mix_col_inv(&mut state[4..8]);
mix_col_inv(&mut state[8..12]);
mix_col_inv(&mut state[12..16]);
}
fn oqs_aes128_enc_c(plaintext: &[u8], schedule: &[u8], ciphertext: &mut [u8]) {
ciphertext.copy_from_slice(&plaintext[..16]);
xor_round_key(ciphertext, schedule, 0);
for i in 1..10 {
sub_bytes(ciphertext, 16);
shift_rows(ciphertext);
mix_cols(ciphertext);
xor_round_key(ciphertext, schedule, i);
}
sub_bytes(ciphertext, 16);
shift_rows(ciphertext);
xor_round_key(ciphertext, schedule, 10);
}
pub fn oqs_mhy128_enc_c(plaintext: &[u8], schedule: &[u8], ciphertext: &mut [u8]) {
ciphertext.copy_from_slice(&plaintext[..16]);
xor_round_key(ciphertext, schedule, 0);
for i in 1..10 {
sub_bytes_inv(ciphertext, 16);
shift_rows_inv(ciphertext);
mix_cols_inv(ciphertext);
xor_round_key(ciphertext, schedule, i);
}
sub_bytes_inv(ciphertext, 16);
shift_rows_inv(ciphertext);
xor_round_key(ciphertext, schedule, 10);
}
fn oqs_aes128_dec_c(ciphertext: &[u8], schedule: &[u8], plaintext: &mut [u8]) {
plaintext.copy_from_slice(&ciphertext[..16]);
xor_round_key(plaintext, schedule, 10);
shift_rows_inv(plaintext);
sub_bytes_inv(plaintext, 16);
for i in 0..9 {
xor_round_key(plaintext, schedule, 9 - i);
mix_cols_inv(plaintext);
shift_rows_inv(plaintext);
sub_bytes_inv(plaintext, 16);
}
xor_round_key(plaintext, schedule, 0);
}
fn oqs_mhy128_dec_c(ciphertext: &[u8], schedule: &[u8], plaintext: &mut [u8]) {
plaintext.copy_from_slice(&ciphertext[..16]);
xor_round_key(plaintext, schedule, 10);
shift_rows(plaintext);
sub_bytes(plaintext, 16);
for i in 0..9 {
xor_round_key(plaintext, schedule, 9 - i);
mix_cols(plaintext);
shift_rows(plaintext);
sub_bytes(plaintext, 16);
}
xor_round_key(plaintext, schedule, 0);
}