use std::sync::Arc;
use serde::{de::Error as DeError, Deserialize, Deserializer, Serialize, Serializer};
use crate::{
algebra::{
elliptic_curve::{Curve, Point},
field::{FieldElement, FieldExtension, SubfieldElement},
},
correlated_randomness::dabits::DaBit,
sharing::authenticated::{PairwiseAuthKey, PairwiseAuthShare},
utils::codec::InPlaceCodec,
};
pub trait LegacyBytes: Sized {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>;
}
pub fn serialize<T: LegacyBytes, S: Serializer>(
value: &T,
serializer: S,
) -> Result<S::Ok, S::Error> {
value.legacy_serialize(serializer)
}
pub fn deserialize<'de, T: LegacyBytes, D: Deserializer<'de>>(
deserializer: D,
) -> Result<T, D::Error> {
T::legacy_deserialize(deserializer)
}
struct Legacy<T>(T);
impl<T: LegacyBytes> Serialize for Legacy<&T> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.legacy_serialize(serializer)
}
}
impl<'de, T: LegacyBytes> Deserialize<'de> for Legacy<T> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
T::legacy_deserialize(deserializer).map(Legacy)
}
}
impl<F: FieldExtension> LegacyBytes for SubfieldElement<F> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serde_bytes::serialize(AsRef::<[u8]>::as_ref(&self.to_le_bytes()), serializer)
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let bytes: &[u8] = serde_bytes::deserialize(deserializer)?;
Self::from_le_bytes(bytes).map_err(DeError::custom)
}
}
impl<F: FieldExtension> LegacyBytes for FieldElement<F> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serde_bytes::serialize(AsRef::<[u8]>::as_ref(&self.to_le_bytes()), serializer)
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let bytes: &[u8] = serde_bytes::deserialize(deserializer)?;
Self::from_le_bytes(bytes).map_err(DeError::custom)
}
}
impl<C: Curve> LegacyBytes for Point<C> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut bytes = self.to_inplace_bytes();
if C::POINT_BIG_ENDIAN {
bytes.reverse();
}
serde_bytes::serialize(bytes.as_slice(), serializer)
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let bytes: &[u8] = serde_bytes::deserialize(deserializer)?;
let mut bytes = bytes.to_vec();
if C::POINT_BIG_ENDIAN {
bytes.reverse();
}
Self::read_le_bytes(&bytes).map_err(DeError::custom)
}
}
impl<T: LegacyBytes> LegacyBytes for Vec<T> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.collect_seq(self.iter().map(Legacy))
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Ok(Vec::<Legacy<T>>::deserialize(deserializer)?
.into_iter()
.map(|w| w.0)
.collect())
}
}
impl<T: LegacyBytes> LegacyBytes for Arc<[T]> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.collect_seq(self.iter().map(Legacy))
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Ok(Vec::<T>::legacy_deserialize(deserializer)?.into())
}
}
impl<A: LegacyBytes, B: LegacyBytes> LegacyBytes for PairwiseAuthKey<A, B> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeTuple;
let mut tup = serializer.serialize_tuple(2)?;
tup.serialize_element(&Legacy(&*self.alpha))?;
tup.serialize_element(&Legacy(&self.beta))?;
tup.end()
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let (alpha, beta) = <(Legacy<A>, Legacy<B>)>::deserialize(deserializer)?;
Ok(PairwiseAuthKey::new(Arc::new(alpha.0), beta.0))
}
}
impl<V: LegacyBytes, A: LegacyBytes, B: LegacyBytes> LegacyBytes for PairwiseAuthShare<V, A, B> {
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeTuple;
let mut tup = serializer.serialize_tuple(3)?;
tup.serialize_element(&Legacy(&self.value))?;
tup.serialize_element(&self.macs.iter().map(Legacy).collect::<Vec<_>>())?;
tup.serialize_element(&self.keys.iter().map(Legacy).collect::<Vec<_>>())?;
tup.end()
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let (value, macs, keys) = <(
Legacy<V>,
Vec<Legacy<B>>,
Vec<Legacy<PairwiseAuthKey<A, B>>>,
)>::deserialize(deserializer)?;
Ok(PairwiseAuthShare {
value: value.0,
macs: macs.into_iter().map(|m| m.0).collect(),
keys: keys.into_iter().map(|k| k.0).collect(),
})
}
}
impl<F: FieldExtension> LegacyBytes for DaBit<F>
where
crate::sharing::BitShare: LegacyBytes,
crate::sharing::FieldShare<F>: LegacyBytes,
{
fn legacy_serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeTuple;
let mut tup = serializer.serialize_tuple(2)?;
tup.serialize_element(&Legacy(&self.bit))?;
tup.serialize_element(&Legacy(&self.field))?;
tup.end()
}
fn legacy_deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let (bit, field) = <(
Legacy<crate::sharing::BitShare>,
Legacy<crate::sharing::FieldShare<F>>,
)>::deserialize(deserializer)?;
Ok(DaBit::new(bit.0, field.0))
}
}