use crate::primitives::arithmetic::{Field, Group};
pub trait Mode: 'static {
const BLINDING: bool;
fn sample<F: Field>() -> F;
fn mask<G: Group>(value: G, base: &G, blind: &G::Scalar) -> G;
}
pub struct Transparent;
impl Mode for Transparent {
const BLINDING: bool = false;
fn sample<F: Field>() -> F {
F::zero()
}
fn mask<G: Group>(value: G, _base: &G, _blind: &G::Scalar) -> G {
value
}
}
#[cfg(feature = "zk")]
pub struct ZK;
#[cfg(feature = "zk")]
impl Mode for ZK {
const BLINDING: bool = true;
fn sample<F: Field>() -> F {
F::random()
}
fn mask<G: Group>(value: G, base: &G, blind: &G::Scalar) -> G {
value + base.scale(blind)
}
}