use openssl::{hash::MessageDigest, pkey::PKey, rsa::Rsa, sign::Verifier};
use crate::raw_signature::{
openssl::OpenSslMutex, RawSignatureValidationError, RawSignatureValidator,
};
pub(crate) enum RsaLegacyValidator {
Sha1,
Rsa256,
Rsa384,
Rsa512,
}
impl RawSignatureValidator for RsaLegacyValidator {
fn validate(
&self,
sig: &[u8],
data: &[u8],
pkey: &[u8],
) -> Result<(), RawSignatureValidationError> {
let _openssl = OpenSslMutex::acquire()?;
let rsa = Rsa::public_key_from_der(pkey)?;
let n = rsa.n().to_owned()?;
let e = rsa.e().to_owned()?;
let new_rsa = Rsa::from_public_components(n, e)?;
let public_key = PKey::from_rsa(new_rsa)?;
let mut verifier = match self {
Self::Sha1 => Verifier::new(MessageDigest::sha1(), &public_key)?,
Self::Rsa256 => Verifier::new(MessageDigest::sha256(), &public_key)?,
Self::Rsa384 => Verifier::new(MessageDigest::sha384(), &public_key)?,
Self::Rsa512 => Verifier::new(MessageDigest::sha512(), &public_key)?,
};
if verifier.verify_oneshot(sig, data)? {
Ok(())
} else {
Err(RawSignatureValidationError::SignatureMismatch)
}
}
}