Skip to main content

primitives/algebra/field/binary/
gf2_128.rs

1use aes::Block;
2
3use crate::algebra::field::binary::{gf2_ext::*, Gf2};
4
5define_gf2_extension!(Gf2_128, IdGf2_128, 2, [1, 2, 7]);
6
7impl Gf2_128 {
8    pub fn to_le_block(&self) -> Block {
9        self.into_le_block()
10    }
11
12    pub fn into_le_block(self) -> Block {
13        #[cfg(target_endian = "little")]
14        unsafe {
15            std::mem::transmute(self)
16        }
17        #[cfg(target_endian = "big")]
18        {
19            let block = self.to_le_bytes();
20            Block::from_exact_iter(block).unwrap()
21        }
22    }
23
24    pub fn as_ne_block_mut(&mut self) -> &mut Block {
25        unsafe { std::mem::transmute(self) }
26    }
27
28    pub fn from_le_block(block: Block) -> Self {
29        #[cfg(target_endian = "little")]
30        unsafe {
31            std::mem::transmute(block)
32        }
33        #[cfg(target_endian = "big")]
34        {
35            let block = block.to_le_bytes();
36            Gf2_128::from_le_bytes(&block).unwrap()
37        }
38    }
39
40    /// Returns the first bit (least significant bit) of the element.
41    #[inline(always)]
42    pub fn first_bit(&self) -> Gf2 {
43        Gf2((self.data[0] & 1) as u8)
44    }
45
46    /// Clears the first bit (least significant bit) of the element.
47    #[inline(always)]
48    pub fn clear_first_bit(&mut self) {
49        self.data[0] &= !1;
50    }
51
52    /// Sets the first bit (least significant bit) of the element.
53    #[inline(always)]
54    pub fn set_first_bit(&mut self) {
55        self.data[0] |= 1;
56    }
57}
58
59impl From<Gf2_128> for u128 {
60    fn from(value: Gf2_128) -> Self {
61        #[cfg(target_endian = "little")]
62        unsafe {
63            std::mem::transmute(value)
64        }
65        #[cfg(target_endian = "big")]
66        {
67            let bytes = value.to_le_bytes();
68            u128::from_le_bytes(bytes)
69        }
70    }
71}