1use std::{fmt::Debug, hash::Hash};
8
9use primitives::{
10 algebra::{
11 elliptic_curve::{Curve, Curve25519Ristretto},
12 field::{mersenne::Mersenne107, PrimeFieldExtension, SubfieldElement},
13 },
14 sharing::FieldShare,
15 types::identifiers::Named,
16};
17
18pub trait MpcConfig:
26 'static + Sized + Send + Sync + Unpin + Copy + Default + Debug + Eq + Hash
27{
28 type Curve: Curve + Named;
29 type Field: PrimeFieldExtension;
30}
31
32#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
34pub struct DefaultConfig;
35
36impl MpcConfig for DefaultConfig {
37 type Curve = Curve25519Ristretto;
38 type Field = Mersenne107;
39}
40
41#[cfg(any(test, feature = "dev"))]
44#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
45pub struct Gf2_128Config;
46
47#[cfg(any(test, feature = "dev"))]
48impl MpcConfig for Gf2_128Config {
49 type Curve = Curve25519Ristretto;
50 type Field = primitives::algebra::field::binary::Gf2_128Field;
51}
52
53pub type CurveOf<Cfg> = <Cfg as MpcConfig>::Curve;
54pub type MpcFieldOf<Cfg> = <Cfg as MpcConfig>::Field;
55pub type ScalarFieldOf<Cfg> = <CurveOf<Cfg> as Curve>::Scalar;
56pub type BaseFieldOf<Cfg> = <CurveOf<Cfg> as Curve>::BaseField;
57pub type MpcFieldElement<Cfg> = SubfieldElement<MpcFieldOf<Cfg>>;
58pub type MpcFieldShare<Cfg> = FieldShare<MpcFieldOf<Cfg>>;
59
60pub fn name_tag<T: Named>() -> [u8; 32] {
63 let name = T::get_name();
64 let bytes = name.as_bytes();
65 assert!(
66 bytes.len() <= 32,
67 "name {name:?} exceeds the 32-byte circuit tag"
68 );
69 let mut tag = [0u8; 32];
70 tag[..bytes.len()].copy_from_slice(bytes);
71 tag
72}
73
74pub fn tag_name(tag: &[u8; 32]) -> String {
76 let end = tag.iter().position(|b| *b == 0).unwrap_or(32);
77 String::from_utf8_lossy(&tag[..end]).into_owned()
78}