use alloc::vec::Vec;
use crate::key::{Algorithm, Error, PublicKey, SignParams, StatefulSigner};
use crate::rng::CryptoRngCore;
use super::{XmssMtPrivateKey, XmssMtPublicKey, XmssPrivateKey, XmssPublicKey};
impl StatefulSigner for XmssPrivateKey {
fn sign(&mut self, msg: &[u8], _rng: &mut dyn CryptoRngCore) -> Result<Vec<u8>, Error> {
self.sign(msg).map_err(|_| Error::Signature)
}
fn remaining(&self) -> u64 {
self.remaining()
}
}
impl PublicKey for XmssPublicKey {
fn algorithm(&self) -> Algorithm {
Algorithm::Xmss
}
fn as_any(&self) -> &dyn core::any::Any {
self
}
fn verify(&self, msg: &[u8], sig: &[u8], params: &SignParams<'_>) -> Result<(), Error> {
params.reader().finish()?;
if self.verify(msg, sig) {
Ok(())
} else {
Err(Error::Signature)
}
}
}
impl StatefulSigner for XmssMtPrivateKey {
fn sign(&mut self, msg: &[u8], _rng: &mut dyn CryptoRngCore) -> Result<Vec<u8>, Error> {
self.sign(msg).map_err(|_| Error::Signature)
}
fn remaining(&self) -> u64 {
self.remaining()
}
}
impl PublicKey for XmssMtPublicKey {
fn algorithm(&self) -> Algorithm {
Algorithm::XmssMt
}
fn as_any(&self) -> &dyn core::any::Any {
self
}
fn verify(&self, msg: &[u8], sig: &[u8], params: &SignParams<'_>) -> Result<(), Error> {
params.reader().finish()?;
if self.verify(msg, sig) {
Ok(())
} else {
Err(Error::Signature)
}
}
}