use ecdsa::{signature::Verifier as EcdsaVerifier, Signature as EcdsaSignature};
use p256::ecdsa::VerifyingKey as P256VerifyingKey;
use p384::ecdsa::VerifyingKey as P384VerifyingKey;
use spki::DecodePublicKey;
use crate::raw_signature::{RawSignatureValidationError, RawSignatureValidator};
pub enum EcdsaValidator {
Es256,
Es384,
}
impl RawSignatureValidator for EcdsaValidator {
fn validate(
&self,
sig: &[u8],
data: &[u8],
public_key: &[u8],
) -> Result<(), RawSignatureValidationError> {
let result = match self {
Self::Es256 => {
let signature = EcdsaSignature::from_slice(sig)
.map_err(|_| RawSignatureValidationError::InvalidSignature)?;
let vk = P256VerifyingKey::from_public_key_der(public_key)
.map_err(|_| RawSignatureValidationError::InvalidPublicKey)?;
vk.verify(&data, &signature)
}
Self::Es384 => {
let signature = EcdsaSignature::from_slice(sig)
.map_err(|_| RawSignatureValidationError::InvalidSignature)?;
let vk = P384VerifyingKey::from_public_key_der(public_key)
.map_err(|_| RawSignatureValidationError::InvalidPublicKey)?;
vk.verify(&data, &signature)
}
};
match result {
Ok(_) => Ok(()),
Err(err) => {
web_sys::console::debug_2(
&"ECDSA validation failed:".into(),
&err.to_string().into(),
);
Err(RawSignatureValidationError::SignatureMismatch)
}
}
}
}