use crate::{admission_budget::SessionAdmissionBudget, portable::VerifiedPortableClaims};
use ic_auth_protocol_types::{PortableCredential, PortableProof};
use thiserror::Error;
pub enum PortableVerificationContext<'a> {
#[cfg(feature = "portable-signature-verification")]
Ed25519 {
claims: &'a crate::portable::PortableClaimsContext<'a>,
public_key: &'a [u8; 32],
},
#[cfg(feature = "token-verification")]
Certified(&'a crate::portable_certified::PortableCertifiedContext<'a>),
}
#[derive(Debug, Error, Eq, PartialEq)]
pub enum PortableCredentialError {
#[error("credential proof does not match the protected enrolled mechanism")]
MechanismMismatch,
#[cfg(feature = "portable-signature-verification")]
#[error(transparent)]
Ed25519(#[from] crate::portable_signature::PortableSignatureError),
#[cfg(feature = "token-verification")]
#[error(transparent)]
Certified(#[from] crate::portable_certified::PortableCertifiedError),
}
pub fn verify_credential(
budget: &mut SessionAdmissionBudget,
credential: &PortableCredential,
context: &PortableVerificationContext<'_>,
) -> Result<VerifiedPortableClaims, PortableCredentialError> {
match (context, &credential.proof) {
#[cfg(feature = "portable-signature-verification")]
(
PortableVerificationContext::Ed25519 { claims, public_key },
PortableProof::Ed25519 { signature },
) => Ok(crate::portable_signature::verify_ed25519_claims(
budget,
&credential.claims,
signature,
claims,
public_key,
)?),
#[cfg(feature = "token-verification")]
(
PortableVerificationContext::Certified(context),
PortableProof::Certified {
delegation,
issuer_signature,
},
) => Ok(crate::portable_certified::verify_certified_claims(
budget,
&credential.claims,
delegation,
issuer_signature,
context,
)?),
_ => Err(PortableCredentialError::MechanismMismatch),
}
}