pub use super::tbls::Share; use crate::{
group::{Element, Point, Scalar},
poly::Poly,
};
use rand_core::RngCore;
use serde::{de::DeserializeOwned, Serialize};
use std::{error::Error, fmt::Debug};
pub trait Scheme: Debug {
type Private: Scalar<RHS = Self::Private>;
type Public: Point<RHS = Self::Private> + Serialize + DeserializeOwned;
type Signature: Point<RHS = Self::Private> + Serialize + DeserializeOwned;
fn keypair<R: RngCore>(rng: &mut R) -> (Self::Private, Self::Public) {
let private = Self::Private::rand(rng);
let mut public = Self::Public::one();
public.mul(&private);
(private, public)
}
}
pub trait SignatureScheme: Scheme {
type Error: Error;
fn sign(private: &Self::Private, msg: &[u8]) -> Result<Vec<u8>, Self::Error>;
fn verify(public: &Self::Public, msg: &[u8], sig: &[u8]) -> Result<(), Self::Error>;
fn aggregation_verify_on_the_same_msg(
partial_publics: &[Self::Public],
msg: &[u8],
sig_bytes: &[&[u8]],
) -> Result<(), Self::Error>;
}
pub trait BlindScheme: Scheme {
type Token: Serialize + DeserializeOwned;
type Error: Error;
fn blind_msg<R: RngCore>(msg: &[u8], rng: &mut R) -> (Self::Token, Vec<u8>);
fn unblind_sig(t: &Self::Token, blinded_message: &[u8]) -> Result<Vec<u8>, Self::Error>;
fn blind_sign(private: &Self::Private, blinded_msg: &[u8]) -> Result<Vec<u8>, Self::Error>;
fn blind_verify(
public: &Self::Public,
blinded_msg: &[u8],
blinded_sig: &[u8],
) -> Result<(), Self::Error>;
}
pub type Partial = Vec<u8>;
pub trait ThresholdScheme: Scheme {
type Error: Error;
fn partial_sign(private: &Share<Self::Private>, msg: &[u8]) -> Result<Partial, Self::Error>;
fn partial_verify(
public: &Poly<Self::Public>,
msg: &[u8],
partial: &[u8],
) -> Result<(), Self::Error>;
fn aggregate(threshold: usize, partials: &[Partial]) -> Result<Vec<u8>, Self::Error>;
}
pub trait BlindThresholdScheme: BlindScheme {
type Error: Error;
fn sign_blind_partial(
private: &Share<Self::Private>,
blinded_msg: &[u8],
) -> Result<Partial, <Self as BlindThresholdScheme>::Error>;
fn unblind_partial_sig(
t: &Self::Token,
partial: &[u8],
) -> Result<Partial, <Self as BlindThresholdScheme>::Error>;
fn verify_blind_partial(
public: &Poly<Self::Public>,
blind_msg: &[u8],
blind_partial: &[u8],
) -> Result<(), <Self as BlindThresholdScheme>::Error>;
}