use core::fmt::Debug;
use crate::crypto::x509::error::CertificateValidationError;
use crate::der::oid::ObjectIdentifier;
#[cfg(feature = "derive")]
use crate::Errorizable;
#[cfg_attr(feature = "derive", derive(Errorizable))]
#[derive(Debug)]
pub enum CryptoPolicyError {
#[cfg_attr(feature = "derive", error("Unsupported algorithm: {0}"))]
UnsupportedAlgorithm(ObjectIdentifier),
}
crate::impl_error_display!(CryptoPolicyError {
UnsupportedAlgorithm(oid) => "Unsupported algorithm: {oid}",
});
pub trait VerificationPolicy: Send + Sync + Debug {
fn verify_signature(
&self,
algorithm_oid: &ObjectIdentifier,
public_key_der: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), CertificateValidationError>;
}
#[cfg(all(feature = "secp256k1", feature = "signature"))]
#[derive(Debug, Clone, Copy, Default)]
pub struct Secp256k1Policy;
#[cfg(all(feature = "secp256k1", feature = "signature"))]
impl VerificationPolicy for Secp256k1Policy {
fn verify_signature(
&self,
_algorithm_oid: &ObjectIdentifier,
public_key_der: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), CertificateValidationError> {
use crate::crypto::sign::ecdsa::{Secp256k1Signature, Secp256k1VerifyingKey};
use crate::crypto::sign::Verifier;
use crate::spki::DecodePublicKey;
let verifying_key = Secp256k1VerifyingKey::from_public_key_der(public_key_der)?;
let sig = Secp256k1Signature::try_from(signature)?;
verifying_key.verify(message, &sig)?;
Ok(())
}
}