#[cfg(any(
feature = "portable-signature-verification",
feature = "certified-proof-verification"
))]
use super::PortableClaimsContext;
use crate::session_request::{SessionRequest, SessionRequestError, SessionTtlPolicy};
use ic_auth_protocol_types::{AuthRole, PortableClaims};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct VerifiedPortableClaims {
claims: PortableClaims,
fingerprint: [u8; 32],
verified_at_ns: u64,
authority_expires_at_ns: u64,
enrollment_expires_at_ns: u64,
}
impl VerifiedPortableClaims {
#[cfg(any(
feature = "portable-signature-verification",
feature = "certified-proof-verification"
))]
pub(crate) fn new(
claims: PortableClaims,
fingerprint: [u8; 32],
context: &PortableClaimsContext<'_>,
) -> Self {
Self {
claims,
fingerprint,
verified_at_ns: context.authority.now_ns,
authority_expires_at_ns: context.authority.authority_expires_at_ns,
enrollment_expires_at_ns: context.authority.enrollment_expires_at_ns,
}
}
pub fn session_expires_at_ns(
&self,
request: &SessionRequest,
role: &AuthRole,
policy: SessionTtlPolicy,
) -> Result<u64, SessionRequestError> {
let requested = request.evaluate(&self.claims.grants, role, self.verified_at_ns, policy)?;
Ok(requested
.min(self.claims.login_deadline_ns)
.min(self.authority_expires_at_ns)
.min(self.enrollment_expires_at_ns))
}
pub fn claims(&self) -> &PortableClaims {
&self.claims
}
pub fn fingerprint(&self) -> [u8; 32] {
self.fingerprint
}
pub fn verified_at_ns(&self) -> u64 {
self.verified_at_ns
}
}