Skip to main content

josekit/jwt/alg/
unsecured.rs

1use std::ops::Deref;
2
3use anyhow::bail;
4
5use crate::jws::{JwsAlgorithm, JwsSigner, JwsVerifier};
6use crate::JoseError;
7
8#[derive(Debug, Eq, PartialEq, Copy, Clone)]
9pub enum UnsecuredJwsAlgorithm {
10    None,
11}
12
13impl UnsecuredJwsAlgorithm {
14    pub fn signer(&self) -> UnsecuredJwsSigner {
15        UnsecuredJwsSigner {
16            algorithm: self.clone(),
17        }
18    }
19
20    pub fn verifier(&self) -> UnsecuredJwsVerifier {
21        UnsecuredJwsVerifier {
22            algorithm: self.clone(),
23        }
24    }
25}
26
27impl JwsAlgorithm for UnsecuredJwsAlgorithm {
28    fn name(&self) -> &str {
29        "none"
30    }
31
32    fn box_clone(&self) -> Box<dyn JwsAlgorithm> {
33        Box::new(self.clone())
34    }
35}
36
37impl Deref for UnsecuredJwsAlgorithm {
38    type Target = dyn JwsAlgorithm;
39
40    fn deref(&self) -> &Self::Target {
41        self
42    }
43}
44
45#[derive(Debug, Clone)]
46pub struct UnsecuredJwsSigner {
47    algorithm: UnsecuredJwsAlgorithm,
48}
49
50impl JwsSigner for UnsecuredJwsSigner {
51    fn algorithm(&self) -> &dyn JwsAlgorithm {
52        &self.algorithm
53    }
54
55    fn key_id(&self) -> Option<&str> {
56        None
57    }
58
59    fn signature_len(&self) -> usize {
60        0
61    }
62
63    fn sign(&self, _message: &[u8]) -> Result<Vec<u8>, JoseError> {
64        Ok(vec![])
65    }
66
67    fn box_clone(&self) -> Box<dyn JwsSigner> {
68        Box::new(self.clone())
69    }
70}
71
72impl Deref for UnsecuredJwsSigner {
73    type Target = dyn JwsSigner;
74
75    fn deref(&self) -> &Self::Target {
76        self
77    }
78}
79
80#[derive(Debug, Clone)]
81pub struct UnsecuredJwsVerifier {
82    algorithm: UnsecuredJwsAlgorithm,
83}
84
85impl JwsVerifier for UnsecuredJwsVerifier {
86    fn algorithm(&self) -> &dyn JwsAlgorithm {
87        &self.algorithm
88    }
89
90    fn key_id(&self) -> Option<&str> {
91        None
92    }
93
94    fn verify(&self, _message: &[u8], signature: &[u8]) -> Result<(), JoseError> {
95        (|| -> anyhow::Result<()> {
96            if signature.len() != 0 {
97                bail!(
98                    "The length of none algorithm signature must be 0: {}",
99                    signature.len()
100                );
101            }
102
103            Ok(())
104        })()
105        .map_err(|err| JoseError::InvalidSignature(err))
106    }
107
108    fn box_clone(&self) -> Box<dyn JwsVerifier> {
109        Box::new(self.clone())
110    }
111}
112
113impl Deref for UnsecuredJwsVerifier {
114    type Target = dyn JwsVerifier;
115
116    fn deref(&self) -> &Self::Target {
117        self
118    }
119}