dcrypt_api/traits/
signature.rs1use crate::Result;
7use rand::{CryptoRng, RngCore};
8use zeroize::Zeroize;
9
10pub trait Signature {
12 type PublicKey: AsRef<[u8]> + AsMut<[u8]> + Clone;
14
15 type SecretKey: Zeroize + AsRef<[u8]> + AsMut<[u8]> + Clone;
17
18 type SignatureData: AsRef<[u8]> + AsMut<[u8]> + Clone;
20
21 type KeyPair: Clone;
23
24 fn name() -> &'static str;
26
27 fn keypair<R: CryptoRng + RngCore>(rng: &mut R) -> Result<Self::KeyPair>;
29
30 fn public_key(keypair: &Self::KeyPair) -> Self::PublicKey;
32
33 fn secret_key(keypair: &Self::KeyPair) -> Self::SecretKey;
35
36 fn sign(message: &[u8], secret_key: &Self::SecretKey) -> Result<Self::SignatureData>;
38
39 fn verify(
41 message: &[u8],
42 signature: &Self::SignatureData,
43 public_key: &Self::PublicKey,
44 ) -> Result<()>;
45
46 fn batch_sign(
48 messages: &[&[u8]],
49 secret_key: &Self::SecretKey,
50 ) -> Result<Vec<Self::SignatureData>> {
51 messages
53 .iter()
54 .map(|message| Self::sign(message, secret_key))
55 .collect()
56 }
57
58 fn batch_verify(
60 message_signature_pairs: &[(&[u8], &Self::SignatureData)],
61 public_key: &Self::PublicKey,
62 ) -> Result<()> {
63 for (message, signature) in message_signature_pairs {
65 Self::verify(message, signature, public_key)?;
66 }
67 Ok(())
68 }
69}