use rand::{CryptoRng, RngCore};
use crate::keys::SpendAuthorizingKey;
impl super::Spend {
pub fn sign<R: RngCore + CryptoRng>(
&mut self,
sighash: [u8; 32],
ask: &SpendAuthorizingKey,
rng: R,
) -> Result<(), SignerError> {
let alpha = self.alpha.ok_or(SignerError::MissingSpendAuthRandomizer)?;
let rsk = ask.randomize(&alpha);
let rk = redjubjub::VerificationKey::from(&rsk);
if self.rk == rk {
self.spend_auth_sig = Some(rsk.sign(rng, &sighash));
Ok(())
} else {
Err(SignerError::WrongSpendAuthorizingKey)
}
}
}
#[derive(Debug)]
pub enum SignerError {
MissingSpendAuthRandomizer,
WrongSpendAuthorizingKey,
}