arcium-primitives 0.4.3

Arcium primitives
Documentation
use aes::Block;

use crate::algebra::field::binary::{gf2_ext::*, Gf2};

define_gf2_extension!(Gf2_128, IdGf2_128, 2, [1, 2, 7]);

impl Gf2_128 {
    pub fn to_le_block(&self) -> Block {
        self.into_le_block()
    }

    pub fn into_le_block(self) -> Block {
        #[cfg(target_endian = "little")]
        unsafe {
            std::mem::transmute(self)
        }
        #[cfg(target_endian = "big")]
        {
            let block = self.to_le_bytes();
            Block::from_exact_iter(block).unwrap()
        }
    }

    pub fn as_ne_block_mut(&mut self) -> &mut Block {
        unsafe { std::mem::transmute(self) }
    }

    pub fn from_le_block(block: Block) -> Self {
        #[cfg(target_endian = "little")]
        unsafe {
            std::mem::transmute(block)
        }
        #[cfg(target_endian = "big")]
        {
            let block = block.to_le_bytes();
            Gf2_128::from_le_bytes(&block).unwrap()
        }
    }

    /// Returns the first bit (least significant bit) of the element.
    #[inline(always)]
    pub fn first_bit(&self) -> Gf2 {
        Gf2((self.data[0] & 1) as u8)
    }
}

impl From<Gf2_128> for u128 {
    fn from(value: Gf2_128) -> Self {
        #[cfg(target_endian = "little")]
        unsafe {
            std::mem::transmute(value)
        }
        #[cfg(target_endian = "big")]
        {
            let bytes = value.to_le_bytes();
            u128::from_le_bytes(bytes)
        }
    }
}