1mod core;
7
8use alloc::{vec, vec::Vec};
9
10use jose_b64::stream::Update;
11use rand_core::RngCore;
12
13use crate::{Flattened, General, Jws, Protected, Signature, Unprotected};
14
15pub trait Signer: Update {
17 #[allow(missing_docs)]
18 type FinishError: From<Self::Error>;
19
20 fn finish(self, rng: impl 'static + RngCore) -> Result<Signature, Self::FinishError>;
22}
23
24pub trait SigningKey<'a> {
26 #[allow(missing_docs)]
27 type StartError: From<<Self::Signer as Update>::Error>;
28
29 type Signer: Signer;
31
32 fn sign(
34 &'a self,
35 prot: Option<Protected>,
36 head: Option<Unprotected>,
37 ) -> Result<Self::Signer, Self::StartError>;
38}
39
40pub trait Verifier<'a>: Update {
42 #[allow(missing_docs)]
43 type FinishError: From<Self::Error>;
44
45 fn finish(self) -> Result<(), Self::FinishError>;
47}
48
49impl<'a, T: Verifier<'a>> Verifier<'a> for Vec<T>
50where
51 T::FinishError: Default,
52{
53 type FinishError = T::FinishError;
54
55 fn finish(self) -> Result<(), Self::FinishError> {
56 let mut last = T::FinishError::default();
57
58 for x in self {
59 match x.finish() {
60 Ok(()) => return Ok(()),
61 Err(e) => last = e,
62 }
63 }
64
65 Err(last)
66 }
67}
68
69pub trait VerifyingKey<'a, T> {
71 #[allow(missing_docs)]
72 type StartError: From<<Self::Verifier as Update>::Error>;
73
74 type Verifier: Verifier<'a>;
76
77 fn verify(&'a self, val: T) -> Result<Self::Verifier, Self::StartError>;
79}
80
81impl<'a, A, T, V> VerifyingKey<'a, A> for [T]
82where
83 T: VerifyingKey<'a, A, Verifier = Vec<V>>,
84 V::FinishError: Default,
85 V: Verifier<'a>,
86 V: Update,
87 A: Copy,
88{
89 type StartError = T::StartError;
90 type Verifier = Vec<V>;
91
92 fn verify(&'a self, val: A) -> Result<Self::Verifier, Self::StartError> {
93 let mut all = Vec::new();
94
95 for key in self {
96 all.extend(key.verify(val)?);
97 }
98
99 Ok(all)
100 }
101}
102
103impl<'a, T: VerifyingKey<'a, &'a Signature>> VerifyingKey<'a, &'a Flattened> for T
104where
105 <T::Verifier as Verifier<'a>>::FinishError: Default,
106{
107 type StartError = T::StartError;
108 type Verifier = Vec<T::Verifier>;
109
110 fn verify(&'a self, flattened: &'a Flattened) -> Result<Self::Verifier, Self::StartError> {
111 Ok(vec![self.verify(&flattened.signature)?])
112 }
113}
114
115impl<'a, T: VerifyingKey<'a, &'a Signature>> VerifyingKey<'a, &'a General> for T
116where
117 <T::Verifier as Verifier<'a>>::FinishError: Default,
118{
119 type StartError = T::StartError;
120 type Verifier = Vec<T::Verifier>;
121
122 fn verify(&'a self, general: &'a General) -> Result<Self::Verifier, Self::StartError> {
123 general
124 .signatures
125 .iter()
126 .map(|sig| self.verify(sig))
127 .collect()
128 }
129}
130
131impl<'a, T, V, E> VerifyingKey<'a, &'a Jws> for T
132where
133 T: VerifyingKey<'a, &'a Flattened, Verifier = V, StartError = E>,
134 T: VerifyingKey<'a, &'a General, Verifier = V, StartError = E>,
135 E: From<V::Error>,
136 V: Verifier<'a>,
137{
138 type StartError = E;
139 type Verifier = V;
140
141 fn verify(&'a self, jws: &'a Jws) -> Result<Self::Verifier, Self::StartError> {
142 match jws {
143 Jws::General(general) => self.verify(general),
144 Jws::Flattened(flattened) => self.verify(flattened),
145 }
146 }
147}