pub use ed25519_dalek::{Keypair, PublicKey, Signature, Verifier};
use ed25519_dalek::ExpandedSecretKey;
use std::ops::RangeInclusive;
use xor_name::{XorName, XOR_NAME_LEN};
pub type Digest256 = [u8; 32];
pub fn sign(msg: &[u8], keypair: &Keypair) -> Signature {
let expanded_secret_key = ExpandedSecretKey::from(&keypair.secret);
expanded_secret_key.sign(msg, &keypair.public)
}
pub fn pub_key(name: &XorName) -> Result<PublicKey, ed25519_dalek::SignatureError> {
PublicKey::from_bytes(&name.0)
}
pub fn name(public_key: &PublicKey) -> XorName {
XorName(public_key.to_bytes())
}
pub fn gen_name_with_age(age: u8) -> XorName {
loop {
let name: XorName = xor_name::rand::random();
if age == name[XOR_NAME_LEN - 1] {
return name;
}
}
}
pub fn gen_keypair(range: &RangeInclusive<XorName>, age: u8) -> Keypair {
use rayon::prelude::*;
let parallelism = std::thread::available_parallelism()
.map(|s| s.get())
.unwrap_or(1);
let result = (0..parallelism)
.par_bridge()
.map(|_| loop {
let keypair = Keypair::generate(&mut rand_07::thread_rng());
let new_name = XorName::from(crate::types::PublicKey::Ed25519(keypair.public));
if range.contains(&new_name) && age == new_name[XOR_NAME_LEN - 1] {
return Some(keypair);
}
})
.find_map_any(|keypair| keypair);
match result {
Some(keypair) => keypair,
None => gen_keypair_single_thread(range, age),
}
}
fn gen_keypair_single_thread(range: &RangeInclusive<XorName>, age: u8) -> Keypair {
let mut rng = rand_07::thread_rng();
loop {
let keypair = Keypair::generate(&mut rng);
let new_name = XorName::from(crate::types::PublicKey::Ed25519(keypair.public));
if range.contains(&new_name) && age == new_name[XOR_NAME_LEN - 1] {
return keypair;
}
}
}
#[cfg(feature = "proptest")]
#[allow(clippy::unwrap_used)]
pub mod proptesting {
pub use ed25519_dalek::{Keypair, PublicKey, Signature, Verifier};
use ed25519_dalek::{SecretKey, SECRET_KEY_LENGTH};
use proptest::prelude::*;
pub fn arbitrary_keypair() -> impl Strategy<Value = Keypair> {
any::<[u8; SECRET_KEY_LENGTH]>().prop_map(|bytes| {
let secret = SecretKey::from_bytes(&bytes[..]).unwrap();
let public = PublicKey::from(&secret);
Keypair { secret, public }
})
}
}