Reviewed-on: #5 Co-authored-by: traffic95 <traffic95@xeondev.com> Co-committed-by: traffic95 <traffic95@xeondev.com>
178 lines
4.9 KiB
Rust
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);
|
|
}
|