use crate::Result;
use k256::schnorr::{
signature::{hazmat::PrehashSigner, Signer, Verifier},
SigningKey,
};
use rand::rngs::OsRng;
use std::borrow::Cow;
pub use k256::schnorr::{Signature, VerifyingKey};
pub struct SchnorrSigner<'a> {
signing_key: Cow<'a, SigningKey>,
}
impl<'a> SchnorrSigner<'a> {
pub fn new(signing_key: Cow<'a, SigningKey>) -> Self {
Self { signing_key }
}
pub fn from_slice(signing_key: &[u8]) -> Result<SigningKey> {
Ok(SigningKey::from_bytes(signing_key).map_err(Box::from)?)
}
pub fn random() -> SigningKey {
SigningKey::random(&mut OsRng)
}
pub fn sign(&self, message: &[u8]) -> Signature {
self.signing_key.sign(message)
}
pub fn sign_prehash(&self, prehash: &[u8]) -> Result<Signature> {
Ok(self
.signing_key
.sign_prehash(prehash)
.map_err(Box::from)?)
}
pub fn sign_raw(
&self,
msg_digest: &[u8],
aux_rand: &[u8; 32],
) -> Result<Signature> {
Ok(self
.signing_key
.sign_raw(msg_digest, aux_rand)
.map_err(Box::from)?)
}
pub fn verifying_key(&self) -> &VerifyingKey {
self.signing_key.verifying_key()
}
pub fn verify(
&self,
message: &[u8],
signature: &Signature,
) -> Result<()> {
Ok(self
.verifying_key()
.verify(message, signature)
.map_err(Box::from)?)
}
pub fn verify_raw(
&self,
message: &[u8],
signature: &Signature,
) -> Result<()> {
Ok(self
.verifying_key()
.verify_raw(message, signature)
.map_err(Box::from)?)
}
}