use super::*;
use crate::Signature;
impl<N: Network> PrivateKey<N> {
pub fn sign<R: Rng + CryptoRng>(&self, message: &[Field<N>], rng: &mut R) -> Result<Signature<N>> {
Signature::sign(self, message, rng)
}
pub fn sign_bytes<R: Rng + CryptoRng>(&self, message: &[u8], rng: &mut R) -> Result<Signature<N>> {
Signature::sign_bytes(self, message, rng)
}
pub fn sign_bits<R: Rng + CryptoRng>(&self, message: &[bool], rng: &mut R) -> Result<Signature<N>> {
Signature::sign_bits(self, message, rng)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Address;
use snarkvm_console_network::MainnetV0;
type CurrentNetwork = MainnetV0;
const ITERATIONS: u64 = 100;
#[test]
fn test_sign_and_verify() -> Result<()> {
let rng = &mut TestRng::default();
for i in 0..ITERATIONS {
let private_key = PrivateKey::<CurrentNetwork>::new(rng)?;
let address = Address::try_from(&private_key)?;
let message: Vec<_> = (0..i).map(|_| Uniform::rand(rng)).collect();
let signature = private_key.sign(&message, rng)?;
assert!(signature.verify(&address, &message));
let failure_message: Vec<_> = (0..i).map(|_| Uniform::rand(rng)).collect();
if message != failure_message {
assert!(!signature.verify(&address, &failure_message));
}
}
Ok(())
}
#[test]
fn test_sign_and_verify_bytes() -> Result<()> {
let rng = &mut TestRng::default();
for i in 0..ITERATIONS {
let private_key = PrivateKey::<CurrentNetwork>::new(rng)?;
let address = Address::try_from(&private_key)?;
let message: Vec<_> = (0..i).map(|_| Uniform::rand(rng)).collect();
let signature = private_key.sign_bytes(&message, rng)?;
assert!(signature.verify_bytes(&address, &message));
let failure_message: Vec<_> = (0..i).map(|_| Uniform::rand(rng)).collect();
if message != failure_message {
assert!(!signature.verify_bytes(&address, &failure_message));
}
}
Ok(())
}
#[test]
fn test_sign_and_verify_bits() -> Result<()> {
let rng = &mut TestRng::default();
for i in 0..ITERATIONS {
let private_key = PrivateKey::<CurrentNetwork>::new(rng)?;
let address = Address::try_from(&private_key)?;
let message: Vec<_> = (0..i).map(|_| Uniform::rand(rng)).collect();
let signature = private_key.sign_bits(&message, rng)?;
assert!(signature.verify_bits(&address, &message));
let failure_message: Vec<_> = (0..i).map(|_| Uniform::rand(rng)).collect();
if message != failure_message {
assert!(!signature.verify_bits(&address, &failure_message));
}
}
Ok(())
}
}