use alloc::boxed::Box;
use alloc::vec::Vec;
use crate::key::{
Algorithm, Error, PrivateKey as KeyPrivateKey, PublicKey as KeyPublicKey, SignParams,
};
use crate::rng::CryptoRngCore;
use super::{PrivateKey, PublicKey};
impl KeyPrivateKey for PrivateKey {
fn algorithm(&self) -> Algorithm {
Algorithm::SlhDsa
}
fn public_key(&self) -> Result<Box<dyn KeyPublicKey>, Error> {
Ok(Box::new(self.public_key()))
}
fn sign(
&self,
msg: &[u8],
params: &SignParams<'_>,
rng: &mut dyn CryptoRngCore,
) -> Result<Vec<u8>, Error> {
let mut p = params.reader();
let context = p.context();
let deterministic = p.deterministic();
p.finish()?;
let sig = if deterministic {
self.sign_deterministic(msg, context)
} else {
let mut rng = rng;
self.sign(&mut rng, msg, context)
};
sig.map_err(|_| Error::Signature)
}
}
impl KeyPublicKey for PublicKey {
fn algorithm(&self) -> Algorithm {
Algorithm::SlhDsa
}
fn as_any(&self) -> &dyn core::any::Any {
self
}
fn verify(&self, msg: &[u8], sig: &[u8], params: &SignParams<'_>) -> Result<(), Error> {
let mut p = params.reader();
let context = p.context();
p.finish()?;
if self.verify(sig, msg, context) {
Ok(())
} else {
Err(Error::Signature)
}
}
}