primitives/algebra/field/binary/
gf2_128.rs1use 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 #[inline(always)]
42 pub fn first_bit(&self) -> Gf2 {
43 Gf2((self.data[0] & 1) as u8)
44 }
45}
46
47impl From<Gf2_128> for u128 {
48 fn from(value: Gf2_128) -> Self {
49 #[cfg(target_endian = "little")]
50 unsafe {
51 std::mem::transmute(value)
52 }
53 #[cfg(target_endian = "big")]
54 {
55 let bytes = value.to_le_bytes();
56 u128::from_le_bytes(bytes)
57 }
58 }
59}