1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
//! Generate keys, sign arbitrary messages, and deterministically verify untrusted signatures.
use bytes::Bytes;
pub mod bls12381;
pub mod ed25519;
pub mod utils;
/// Byte array representing an arbitrary public key.
pub type PublicKey = Bytes;
/// Byte array representing an arbitrary signature.
pub type Signature = Bytes;
/// Interface that commonware crates rely on for most cryptographic operations.
pub trait Scheme: Send + Sync + Clone + 'static {
/// Returns the public key of the signer.
fn me(&self) -> PublicKey;
/// Verify that a public key is well-formatted.
fn validate(public_key: &PublicKey) -> bool;
/// Sign the given message.
///
/// The message should not be hashed prior to calling this function. If a particular
/// scheme requires a payload to be hashed before it is signed, it will be done internally.
///
/// To protect against replay attacks, it is required to provide a namespace
/// to prefix any message. This ensures that a signature meant for one context cannot be used
/// unexpectedly in another (i.e. signing a message on the network layer can't accidentally
/// spend funds on the execution layer).
fn sign(&mut self, namespace: &[u8], message: &[u8]) -> Signature;
/// Check that a signature is valid for the given message and public key.
///
/// The message should not be hashed prior to calling this function. If a particular
/// scheme requires a payload to be hashed before it is signed, it will be done internally.
///
/// Because namespace is prepended to message before signing, the namespace provided here must
/// match the namespace provided during signing.
fn verify(
namespace: &[u8],
message: &[u8],
public_key: &PublicKey,
signature: &Signature,
) -> bool;
}