jose_jws/crypto/
mod.rs

1// SPDX-FileCopyrightText: 2022 Profian Inc. <opensource@profian.com>
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3
4//! JWS Cryptographic Implementation
5
6mod 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
15/// Signature creation state
16pub trait Signer: Update {
17    #[allow(missing_docs)]
18    type FinishError: From<Self::Error>;
19
20    /// Finish processing payload and create the signature.
21    fn finish(self, rng: impl 'static + RngCore) -> Result<Signature, Self::FinishError>;
22}
23
24/// A signature creation key
25pub trait SigningKey<'a> {
26    #[allow(missing_docs)]
27    type StartError: From<<Self::Signer as Update>::Error>;
28
29    /// The state object used during signing.
30    type Signer: Signer;
31
32    /// Begin the signature creation process.
33    fn sign(
34        &'a self,
35        prot: Option<Protected>,
36        head: Option<Unprotected>,
37    ) -> Result<Self::Signer, Self::StartError>;
38}
39
40/// Signature verification state
41pub trait Verifier<'a>: Update {
42    #[allow(missing_docs)]
43    type FinishError: From<Self::Error>;
44
45    /// Finish processing payload and verify the signature.
46    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
69/// A signature verification key
70pub trait VerifyingKey<'a, T> {
71    #[allow(missing_docs)]
72    type StartError: From<<Self::Verifier as Update>::Error>;
73
74    /// The state object used during signing.
75    type Verifier: Verifier<'a>;
76
77    /// Begin the signature verification process.
78    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}