use std::{fmt::Debug, ops::Mul};
use crate::{
algebra::field::{FieldExtension, SubfieldElement},
correlated_randomness::triples::{BeaverTriple, Triple, UnauthenticatedTriple},
sharing::{FieldShare, Reconstructible, SecretShare},
};
pub trait ThreatModel: Copy + Clone + Debug + Default + Send + Sync + 'static {
type Share<F: FieldExtension>: SecretShare
+ Reconstructible<Value = SubfieldElement<F>>
+ for<'a> Mul<&'a SubfieldElement<F>, Output = Self::Share<F>>;
type Triple<F: FieldExtension>: BeaverTriple<Share = Self::Share<F>> + Send + Sync + 'static;
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct Malicious;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct SemiHonest;
impl ThreatModel for Malicious {
type Share<F: FieldExtension> = FieldShare<F>;
type Triple<F: FieldExtension> = Triple<F>;
}
impl ThreatModel for SemiHonest {
type Share<F: FieldExtension> = SubfieldElement<F>;
type Triple<F: FieldExtension> = UnauthenticatedTriple<F>;
}