use super::VerificationConstraint;
use crate::cosign::signature_layers::SignatureLayer;
use crate::crypto::{CosignVerificationKey, SigningScheme};
use crate::errors::Result;
#[derive(Debug)]
pub struct PublicKeyVerifier {
key: CosignVerificationKey,
}
impl PublicKeyVerifier {
pub fn new(key_raw: &[u8], signing_scheme: &SigningScheme) -> Result<Self> {
let key = CosignVerificationKey::from_pem(key_raw, signing_scheme)?;
Ok(PublicKeyVerifier { key })
}
pub fn try_from(key_raw: &[u8]) -> Result<Self> {
let key = CosignVerificationKey::try_from_pem(key_raw)?;
Ok(PublicKeyVerifier { key })
}
}
impl VerificationConstraint for PublicKeyVerifier {
fn verify(&self, signature_layer: &SignatureLayer) -> Result<bool> {
Ok(signature_layer.is_signed_by_key(&self.key))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::cosign::signature_layers::tests::{
build_correct_signature_layer_with_certificate,
build_correct_signature_layer_without_bundle,
};
#[test]
fn pub_key_verifier() {
let (sl, key) = build_correct_signature_layer_without_bundle();
let vc = PublicKeyVerifier { key };
assert!(vc.verify(&sl).unwrap());
let sl = build_correct_signature_layer_with_certificate();
assert!(!vc.verify(&sl).unwrap());
}
}