aria 0.2.0

Pure Rust implementation of the ARIA Encryption Algorithm
Documentation
use crate::consts::{DIFFUSE_CONSTS, SB1, SB2, SB3, SB4};

#[inline(always)]
fn diffuse(x: [u8; 16]) -> u128 {
    DIFFUSE_CONSTS
        .iter()
        .zip(x)
        .map(|(a, b)| a * b as u128)
        .fold(0, |a, v| a ^ v)
}

#[inline(always)]
pub(crate) fn a(x128: u128) -> u128 {
    diffuse(x128.to_be_bytes())
}

pub(crate) fn sl2(x128: u128) -> u128 {
    let x = x128.to_be_bytes();
    let y = [
        SB3[x[0] as usize],
        SB4[x[1] as usize],
        SB1[x[2] as usize],
        SB2[x[3] as usize],
        SB3[x[4] as usize],
        SB4[x[5] as usize],
        SB1[x[6] as usize],
        SB2[x[7] as usize],
        SB3[x[8] as usize],
        SB4[x[9] as usize],
        SB1[x[10] as usize],
        SB2[x[11] as usize],
        SB3[x[12] as usize],
        SB4[x[13] as usize],
        SB1[x[14] as usize],
        SB2[x[15] as usize],
    ];
    u128::from_be_bytes(y)
}

pub(crate) fn fo(x128: u128) -> u128 {
    let x = x128.to_be_bytes();
    diffuse([
        SB1[x[0] as usize],
        SB2[x[1] as usize],
        SB3[x[2] as usize],
        SB4[x[3] as usize],
        SB1[x[4] as usize],
        SB2[x[5] as usize],
        SB3[x[6] as usize],
        SB4[x[7] as usize],
        SB1[x[8] as usize],
        SB2[x[9] as usize],
        SB3[x[10] as usize],
        SB4[x[11] as usize],
        SB1[x[12] as usize],
        SB2[x[13] as usize],
        SB3[x[14] as usize],
        SB4[x[15] as usize],
    ])
}

pub(crate) fn fe(x128: u128) -> u128 {
    let x = x128.to_be_bytes();
    diffuse([
        SB3[x[0] as usize],
        SB4[x[1] as usize],
        SB1[x[2] as usize],
        SB2[x[3] as usize],
        SB3[x[4] as usize],
        SB4[x[5] as usize],
        SB1[x[6] as usize],
        SB2[x[7] as usize],
        SB3[x[8] as usize],
        SB4[x[9] as usize],
        SB1[x[10] as usize],
        SB2[x[11] as usize],
        SB3[x[12] as usize],
        SB4[x[13] as usize],
        SB1[x[14] as usize],
        SB2[x[15] as usize],
    ])
}