primitives/sharing/authenticated/
mod.rs1pub mod pairwise;
2
3use itertools::enumerate;
4pub use pairwise::*;
5
6use crate::{errors::PrimitiveError, sharing::Reconstructible, types::PeerIndex};
7
8pub trait Verifiable: Reconstructible {
10 fn verify(&self, openings: Vec<Self::Opening>) -> Result<(), PrimitiveError>;
12
13 fn verify_from(
16 &self,
17 _opening: Self::Opening,
18 _peer_index: PeerIndex,
19 ) -> Result<(), PrimitiveError> {
20 unimplemented!(
21 "Type {} does not implement verify_from",
22 std::any::type_name::<Self>()
23 )
24 }
25
26 fn verify_all(shares: Vec<Self>) -> Result<(), PrimitiveError> {
29 if shares.len() < 2 {
30 return Err(PrimitiveError::MinimumLength(2, shares.len()));
31 }
32 let mut all_openings = shares
34 .iter()
35 .map(|share| share.open_to_all_others())
36 .collect::<Vec<_>>();
37 enumerate(shares.iter()).try_for_each(|(i, share)| {
39 let my_openings = enumerate(all_openings.iter_mut())
40 .filter(|(j, _)| i != *j)
41 .map(|(_, opening)| opening.next())
42 .collect::<Option<Vec<_>>>()
43 .ok_or(PrimitiveError::InvalidPeerIndex(i, shares.len() - 1))?;
44 share.verify(my_openings)
45 })
46 }
47}