mod domain;
mod keys;
mod public;
mod secret;
mod sig;
pub use domain::Domain;
pub use keys::Keys;
pub use public::PublicKey;
pub use secret::SecretKey;
pub use sig::Signature;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Error {
InvalidSecretKey,
FailedDecompression,
WeakPublicKey,
NonCanonicalSignature,
SignatureMismatch,
}
#[cfg(test)]
const MSG0: &[u8] = b"'Twas brillig and the slithy toves";
#[cfg(test)]
const MSG1: &[u8] = b"All mimsy were the borogoves,";
#[cfg(test)]
const D0: Domain = Domain(b"test domain for running tests...");
#[cfg(test)]
const D1: Domain = Domain(b"test domain for documentation...");
#[test]
fn fail_to_verify_with_wrong_key() {
use rand::{rngs::OsRng, RngCore};
let mut csprng = OsRng;
let mut raw_key = [0u8; 32];
csprng.fill_bytes(&mut raw_key);
let ska = SecretKey::from_bits(&raw_key);
let pka = ska.derive_public();
let sig = ska.sign(MSG0);
csprng.fill_bytes(&mut raw_key);
let skb = SecretKey::from_bits(&raw_key);
let pkb = skb.derive_public();
assert!(pka.verify(&sig, MSG0).is_ok());
assert_eq!(pkb.verify(&sig, MSG0), Err(Error::SignatureMismatch));
}
#[test]
fn fail_to_verify_with_wrong_domain() {
use rand::{rngs::OsRng, RngCore};
let mut csprng = OsRng;
let mut raw_key = [0u8; 32];
csprng.fill_bytes(&mut raw_key);
let ska = SecretKey::from_bits(&raw_key);
let pka = ska.derive_public();
let sig = ska.sign_domain(D0, MSG0);
assert!(pka.verify_domain(D0, &sig, MSG0).is_ok());
assert_eq!(
pka.verify_domain(D1, &sig, MSG0),
Err(Error::SignatureMismatch)
);
}
#[test]
fn different_nonces_for_different_messages() {
use rand::{rngs::OsRng, RngCore};
let mut csprng = OsRng;
let mut raw_key = [0u8; 32];
csprng.fill_bytes(&mut raw_key);
let ska = SecretKey::from_bits(&raw_key);
let n0 = ska.derive_nonce(D0, MSG0);
let n1 = ska.derive_nonce(D0, MSG1);
assert!(n0 != n1);
}
#[test]
fn different_nonces_for_different_domains() {
use rand::{rngs::OsRng, RngCore};
let mut csprng = OsRng;
let mut raw_key = [0u8; 32];
csprng.fill_bytes(&mut raw_key);
let ska = SecretKey::from_bits(&raw_key);
let n0 = ska.derive_nonce(D0, MSG0);
let n1 = ska.derive_nonce(D1, MSG0);
assert!(n0 != n1);
}