use crate::claim::{Secret, membership::Membership};
use crate::wire::tail::Context;
use anyhow::{Result, ensure};
pub fn authenticate(membership: &Membership, context: &Context, bearer: &Secret) -> Result<()> {
membership.authenticate(&context.authentication(bearer), false)?;
let binding = membership.publication().binding();
ensure!(
context.stream == binding.stream_id && context.descriptor == binding.descriptor_commitment,
"error encrypted-tail-invalid"
);
Ok(())
}
pub fn admit_generations(
membership: &Membership,
generations: impl IntoIterator<Item = [u8; 32]>,
) -> Result<()> {
ensure!(
!membership.rotation_pending(),
"error membership-rotation-pending"
);
ensure!(
generations
.into_iter()
.all(|generation| generation == membership.current_generation().id),
"error encrypted-tail-invalid"
);
Ok(())
}
pub fn eligible_image(membership: &Membership, generation: [u8; 32], admitted: bool) -> Result<()> {
ensure!(
membership.generations().iter().any(|g| g.id == generation)
&& (generation == membership.current_generation().id || admitted),
"error encrypted-tail-invalid"
);
Ok(())
}
pub mod envelope;
pub mod parent;
#[cfg(test)]
mod tests;