1use crate::claim::{Secret, membership::Membership};
5use crate::wire::tail::Context;
6use anyhow::{Result, ensure};
7
8pub fn authenticate(membership: &Membership, context: &Context, bearer: &Secret) -> Result<()> {
10 membership.authenticate(&context.authentication(bearer), false)?;
11 let binding = membership.publication().binding();
12 ensure!(
13 context.stream == binding.stream_id && context.descriptor == binding.descriptor_commitment,
14 "error encrypted-tail-invalid"
15 );
16 Ok(())
17}
18
19pub fn admit_generations(
22 membership: &Membership,
23 generations: impl IntoIterator<Item = [u8; 32]>,
24) -> Result<()> {
25 ensure!(
26 !membership.rotation_pending(),
27 "error membership-rotation-pending"
28 );
29 ensure!(
30 generations
31 .into_iter()
32 .all(|generation| generation == membership.current_generation().id),
33 "error encrypted-tail-invalid"
34 );
35 Ok(())
36}
37
38pub fn eligible_image(membership: &Membership, generation: [u8; 32], admitted: bool) -> Result<()> {
41 ensure!(
42 membership.generations().iter().any(|g| g.id == generation)
43 && (generation == membership.current_generation().id || admitted),
44 "error encrypted-tail-invalid"
45 );
46 Ok(())
47}
48
49pub mod envelope;
50pub mod parent;
51
52#[cfg(test)]
53mod tests;