use crate::Result;
use rand::{CryptoRng, RngCore};
use zeroize::{Zeroize, Zeroizing};
pub trait Signature {
type PublicKey: Clone;
type SecretKey: Zeroize + Clone;
type SignatureData: Clone;
type KeyPair;
fn name() -> &'static str;
fn keypair<R: CryptoRng + RngCore>(rng: &mut R) -> Result<Self::KeyPair>;
fn public_key(keypair: &Self::KeyPair) -> Self::PublicKey;
fn secret_key(keypair: &Self::KeyPair) -> Self::SecretKey;
fn sign(message: &[u8], secret_key: &Self::SecretKey) -> Result<Self::SignatureData>;
fn verify(
message: &[u8],
signature: &Self::SignatureData,
public_key: &Self::PublicKey,
) -> Result<()>;
}
pub trait SignatureSerialize: Signature {
const PUBLIC_KEY_SIZE: usize;
const SECRET_KEY_SIZE: usize;
const SIGNATURE_SIZE: usize;
fn serialize_public_key(key: &Self::PublicKey) -> Vec<u8>;
fn deserialize_public_key(bytes: &[u8]) -> Result<Self::PublicKey>;
fn serialize_secret_key(key: &Self::SecretKey) -> Zeroizing<Vec<u8>>;
fn deserialize_secret_key(bytes: &[u8]) -> Result<Self::SecretKey>;
fn serialize_signature(sig: &Self::SignatureData) -> Vec<u8>;
fn deserialize_signature(bytes: &[u8]) -> Result<Self::SignatureData>;
}
pub trait SignatureDerive: Signature {
const MIN_SEED_SIZE: usize;
fn derive_keypair(seed: &[u8]) -> Result<Self::KeyPair>;
fn derive_public_key(secret_key: &Self::SecretKey) -> Result<Self::PublicKey>;
}
pub trait SignatureMessageLimits: Signature {
const MAX_MESSAGE_SIZE: Option<usize>;
const REQUIRES_PREHASH: bool;
}
pub trait SignatureBatchVerify: Signature {
fn batch_verify(
messages: &[&[u8]],
signatures: &[Self::SignatureData],
public_keys: &[Self::PublicKey],
) -> Result<()>;
}
pub trait PublicKeyBytes: Sized {
fn from_bytes(bytes: &[u8]) -> Result<Self>;
fn to_bytes(&self) -> Vec<u8>;
}
pub trait SignatureBytes: Sized {
fn from_bytes(bytes: &[u8]) -> Result<Self>;
fn to_bytes(&self) -> Vec<u8>;
}