use derive_more::{Display, Error};
use zeroize::{Zeroize, ZeroizeOnDrop};
use rand::CryptoRng;
#[derive(Debug, Display, Error)]
pub enum Error {
#[display("Invalid signature")]
InvalidSignature,
#[display("Unusable or weak public key")]
UnusablePublicKey,
}
pub trait CalculateKeyPair<PrivT: AsRef<[u8]>, PubT: AsRef<[u8]>>: Zeroize + ZeroizeOnDrop {
fn calculate_key_pair(&self, sign: u8) -> (PrivT, PubT);
}
pub trait Sign<SigT, PrivT: AsRef<[u8]>, PubT: AsRef<[u8]>>: CalculateKeyPair<PrivT, PubT> {
fn sign(&self, message: &[u8], rng: impl CryptoRng) -> SigT;
}
pub trait ConvertMont<PubT: AsRef<[u8]>> {
fn convert_mont(&self, sign: u8) -> Result<PubT, Error>;
}
pub trait Verify<SigT, PubT: AsRef<[u8]>>: ConvertMont<PubT> {
fn verify(&self, message: &[u8], signature: &SigT) -> Result<(), Error>;
}