use std::{fmt::Debug, hash::Hash};
use primitives::{
algebra::{
elliptic_curve::{Curve, Curve25519Ristretto},
field::{mersenne::Mersenne107, PrimeFieldExtension, SubfieldElement},
},
sharing::FieldShare,
types::identifiers::Named,
};
pub trait MpcConfig:
'static + Sized + Send + Sync + Unpin + Copy + Default + Debug + Eq + Hash
{
type Curve: Curve + Named;
type Field: PrimeFieldExtension;
}
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
pub struct DefaultConfig;
impl MpcConfig for DefaultConfig {
type Curve = Curve25519Ristretto;
type Field = Mersenne107;
}
#[cfg(any(test, feature = "dev"))]
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
pub struct Gf2_128Config;
#[cfg(any(test, feature = "dev"))]
impl MpcConfig for Gf2_128Config {
type Curve = Curve25519Ristretto;
type Field = primitives::algebra::field::binary::Gf2_128Field;
}
pub type CurveOf<Cfg> = <Cfg as MpcConfig>::Curve;
pub type MpcFieldOf<Cfg> = <Cfg as MpcConfig>::Field;
pub type ScalarFieldOf<Cfg> = <CurveOf<Cfg> as Curve>::Scalar;
pub type BaseFieldOf<Cfg> = <CurveOf<Cfg> as Curve>::BaseField;
pub type MpcFieldElement<Cfg> = SubfieldElement<MpcFieldOf<Cfg>>;
pub type MpcFieldShare<Cfg> = FieldShare<MpcFieldOf<Cfg>>;
pub fn name_tag<T: Named>() -> [u8; 32] {
let name = T::get_name();
let bytes = name.as_bytes();
assert!(
bytes.len() <= 32,
"name {name:?} exceeds the 32-byte circuit tag"
);
let mut tag = [0u8; 32];
tag[..bytes.len()].copy_from_slice(bytes);
tag
}
pub fn tag_name(tag: &[u8; 32]) -> String {
let end = tag.iter().position(|b| *b == 0).unwrap_or(32);
String::from_utf8_lossy(&tag[..end]).into_owned()
}