use crate::{
crypto::{
DynSigningOutput, EcdsaP256SigningKeyGlobal, EcdsaP384SigningKeyGlobal,
Ed25519SigningKeyGlobal, RsaPkcs1SigningKeyGlobal, RsaPssSigningKeyGlobal, SigningKey as _,
},
rng::CryptoRng,
};
#[derive(Debug)]
pub enum DynSigningKey {
EcdsaP256(EcdsaP256SigningKeyGlobal),
EcdsaP384(EcdsaP384SigningKeyGlobal),
Ed25519(Ed25519SigningKeyGlobal),
RsaPkcs1(RsaPkcs1SigningKeyGlobal),
RsaPss(RsaPssSigningKeyGlobal),
}
impl DynSigningKey {
#[inline]
pub fn sign<RNG>(&self, msg: &[u8], rng: &mut RNG) -> crate::Result<DynSigningOutput>
where
RNG: CryptoRng,
{
Ok(match self {
Self::EcdsaP256(el) => {
DynSigningOutput::EcdsaP256(EcdsaP256SigningKeyGlobal::sign(el, msg, rng)?)
}
Self::EcdsaP384(el) => {
DynSigningOutput::EcdsaP384(EcdsaP384SigningKeyGlobal::sign(el, msg, rng)?)
}
Self::Ed25519(el) => DynSigningOutput::Ed25519(Ed25519SigningKeyGlobal::sign(el, msg, rng)?),
Self::RsaPkcs1(el) => {
DynSigningOutput::RsaPkcs1(RsaPkcs1SigningKeyGlobal::sign(el, msg, rng)?)
}
Self::RsaPss(el) => DynSigningOutput::RsaPss(RsaPssSigningKeyGlobal::sign(el, msg, rng)?),
})
}
}