use super::errors::{NoSignatureVerifierError, NoSignerError, PrivateKeyError};
pub trait SignatureVerifier {
type Error: std::error::Error + Send + Sync + 'static;
fn verify_certificate_signature(
&self,
tbs_der: &[u8],
sig_alg_der: &[u8],
signature_bits: &[u8],
issuer_spki_der: &[u8],
) -> Result<(), Self::Error>;
}
pub struct NoSignatureVerifier;
impl SignatureVerifier for NoSignatureVerifier {
type Error = NoSignatureVerifierError;
fn verify_certificate_signature(
&self,
_tbs_der: &[u8],
_sig_alg_der: &[u8],
_signature_bits: &[u8],
_issuer_spki_der: &[u8],
) -> Result<(), NoSignatureVerifierError> {
Err(NoSignatureVerifierError)
}
}
pub trait CertificateSigner {
type Error: std::error::Error + Send + Sync + 'static;
fn signature_algorithm_der(&self) -> Result<Vec<u8>, Self::Error>;
fn sign_tbs(&self, tbs_der: &[u8]) -> Result<Vec<u8>, Self::Error>;
}
pub struct NoSigner;
impl CertificateSigner for NoSigner {
type Error = NoSignerError;
fn signature_algorithm_der(&self) -> Result<Vec<u8>, NoSignerError> {
Err(NoSignerError)
}
fn sign_tbs(&self, _tbs_der: &[u8]) -> Result<Vec<u8>, NoSignerError> {
Err(NoSignerError)
}
}
pub struct UnsignedCertificateSigner;
impl CertificateSigner for UnsignedCertificateSigner {
type Error = std::convert::Infallible;
fn signature_algorithm_der(&self) -> Result<Vec<u8>, std::convert::Infallible> {
use crate::{oids, AlgorithmIdentifier};
use synta::traits::Encode;
use synta::ObjectIdentifier;
let oid = ObjectIdentifier::new(oids::ALG_UNSIGNED)
.expect("ALG_UNSIGNED is a valid static OID constant");
let alg = AlgorithmIdentifier {
algorithm: oid,
parameters: None,
};
let mut enc = synta::Encoder::new(synta::Encoding::Der);
alg.encode(&mut enc)
.expect("AlgorithmIdentifier DER encoding is infallible for a plain OID");
Ok(enc
.finish()
.expect("DER encoder finalisation is infallible"))
}
fn sign_tbs(&self, _tbs_der: &[u8]) -> Result<Vec<u8>, std::convert::Infallible> {
Ok(Vec::new())
}
}
pub trait ErasedSignatureVerifier {
fn verify_certificate_signature_erased(
&self,
tbs_der: &[u8],
sig_alg_der: &[u8],
signature_bits: &[u8],
issuer_spki_der: &[u8],
) -> Result<(), PrivateKeyError>;
}
impl SignatureVerifier for dyn ErasedSignatureVerifier + '_ {
type Error = PrivateKeyError;
fn verify_certificate_signature(
&self,
tbs_der: &[u8],
sig_alg_der: &[u8],
signature_bits: &[u8],
issuer_spki_der: &[u8],
) -> Result<(), PrivateKeyError> {
self.verify_certificate_signature_erased(
tbs_der,
sig_alg_der,
signature_bits,
issuer_spki_der,
)
}
}
impl SignatureVerifier for Box<dyn ErasedSignatureVerifier> {
type Error = PrivateKeyError;
fn verify_certificate_signature(
&self,
tbs_der: &[u8],
sig_alg_der: &[u8],
signature_bits: &[u8],
issuer_spki_der: &[u8],
) -> Result<(), PrivateKeyError> {
self.as_ref().verify_certificate_signature_erased(
tbs_der,
sig_alg_der,
signature_bits,
issuer_spki_der,
)
}
}
pub fn default_signature_verifier() -> Box<dyn ErasedSignatureVerifier> {
#[cfg(all(feature = "nss", not(feature = "openssl")))]
{
crate::nss_backend::nss_signature_verifier()
}
#[cfg(feature = "openssl")]
{
crate::openssl_backend::openssl_signature_verifier()
}
#[cfg(not(any(feature = "openssl", feature = "nss")))]
{
Box::new(NoSignatureVerifierErased)
}
}
#[cfg(not(any(feature = "openssl", feature = "nss")))]
struct NoSignatureVerifierErased;
#[cfg(not(any(feature = "openssl", feature = "nss")))]
impl ErasedSignatureVerifier for NoSignatureVerifierErased {
fn verify_certificate_signature_erased(
&self,
_tbs_der: &[u8],
_sig_alg_der: &[u8],
_signature_bits: &[u8],
_issuer_spki_der: &[u8],
) -> Result<(), PrivateKeyError> {
Err(PrivateKeyError::new(NoSignatureVerifierError))
}
}