pub use schnorrkel::PublicKey as Public;
pub use schnorrkel::SecretKey as Secret;
pub use schnorrkel::Signature;
pub(crate) const SIGNING_CTX: &[u8] = b"substrate";
pub fn sign(secret: &Secret, msg: &[u8]) -> Result<Signature, schnorrkel::SignatureError> {
let public = secret.to_public();
secret.sign_simple_doublecheck(SIGNING_CTX, msg, &public)
}
pub fn generate_with_optional_seed(
seed: Option<&[u8]>,
) -> Result<Secret, schnorrkel::SignatureError> {
if let Some(seed) = seed {
secret_from_bytes(seed)
} else {
let rng = crate::random::getrandom_or_panic();
Ok(Secret::generate_with(rng))
}
}
pub fn secret_from_bytes(bytes: &[u8]) -> Result<Secret, schnorrkel::SignatureError> {
if bytes.len() == 32 {
let mini_secret = schnorrkel::MiniSecretKey::from_bytes(bytes)?;
Ok(mini_secret.expand(schnorrkel::MiniSecretKey::ED25519_MODE))
} else {
Secret::from_bytes(bytes)
}
}