use std::mem::MaybeUninit;
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use crate::{
algebra::{
elliptic_curve::{BaseField, Point, ScalarField},
field::{binary::Gf2_128, FieldElement, SubfieldElement},
},
errors::PrimitiveError,
types::heap_array::{CurvePoints, FieldElements, SubfieldElements},
utils::codec::InPlaceCodec,
};
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "V: Serialize + DeserializeOwned, Mac: Serialize + DeserializeOwned")]
#[repr(C)]
pub struct PairwiseAuthOpenShare<V, Mac> {
pub value: V,
pub mac: Mac,
}
unsafe impl<V: InPlaceCodec, Mac: InPlaceCodec> InPlaceCodec for PairwiseAuthOpenShare<V, Mac> {
const ENCODED_SIZE: usize = V::ENCODED_SIZE + Mac::ENCODED_SIZE;
fn write_le_bytes(&self, out: &mut [MaybeUninit<u8>]) {
let (value, mac) = out.split_at_mut(V::ENCODED_SIZE);
self.value.write_le_bytes(value);
self.mac.write_le_bytes(mac);
}
fn read_le_bytes(bytes: &[u8]) -> Result<Self, PrimitiveError> {
let (value, mac) = bytes.split_at(V::ENCODED_SIZE);
Ok(Self {
value: V::read_le_bytes(value)?,
mac: Mac::read_le_bytes(mac)?,
})
}
}
impl<V, Mac> PairwiseAuthOpenShare<V, Mac> {
pub fn new(value: V, mac: Mac) -> Self {
Self { value, mac }
}
pub fn get_value(&self) -> &V {
&self.value
}
pub fn get_mac(&self) -> &Mac {
&self.mac
}
}
pub type OpenFieldShare<F> = PairwiseAuthOpenShare<SubfieldElement<F>, FieldElement<F>>;
pub type OpenPointShare<C> = PairwiseAuthOpenShare<Point<C>, Point<C>>;
pub type OpenScalarShare<C> = OpenFieldShare<ScalarField<C>>;
pub type OpenBaseFieldShare<C> = OpenFieldShare<BaseField<C>>;
pub type OpenBitShare = OpenFieldShare<Gf2_128>;
pub type OpenFieldShares<F, M> = PairwiseAuthOpenShare<SubfieldElements<F, M>, FieldElements<F, M>>;
pub type OpenPointShares<C, M> = PairwiseAuthOpenShare<CurvePoints<C, M>, CurvePoints<C, M>>;
pub type OpenScalarShares<C, M> = OpenFieldShares<ScalarField<C>, M>;
pub type OpenBaseFieldShares<C, M> = OpenFieldShares<BaseField<C>, M>;