jwt_rustcrypto/
header.rs

1use base64::Engine;
2use serde::{Deserialize, Serialize};
3
4use crate::Algorithm;
5use crate::Error;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Header {
9    pub alg: Algorithm,
10
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub jku: Option<String>,
13
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub jwk: Option<Jwk>,
16
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub kid: Option<String>,
19
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub x5u: Option<String>,
22
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub x5c: Option<Vec<String>>,
25
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub x5t: Option<String>,
28
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub x5t_s256: Option<String>,
31
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub typ: Option<String>,
34
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub cty: Option<String>,
37
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub crit: Option<Vec<String>>,
40}
41
42impl Header {
43    pub fn new(alg: Algorithm) -> Self {
44        Self {
45            alg,
46            jku: None,
47            jwk: None,
48            kid: None,
49            x5u: None,
50            x5c: None,
51            x5t: None,
52            x5t_s256: None,
53            typ: Some("JWT".to_string()),
54            cty: None,
55            crit: None,
56        }
57    }
58
59    pub fn from_encoded(encoded: &[u8]) -> Result<Self, Error> {
60        let decoded_from_b64 = base64::engine::general_purpose::URL_SAFE_NO_PAD.decode(encoded)?;
61        serde_json::from_slice(decoded_from_b64.as_slice()).map_err(Error::from)
62    }
63}
64
65impl Default for Header {
66    fn default() -> Self {
67        Self::new(Algorithm::HS256)
68    }
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct Jwk {
73    pub kty: String,
74
75    #[serde(rename = "use", skip_serializing_if = "Option::is_none")]
76    pub key_use: Option<String>,
77
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub key_ops: Option<Vec<String>>,
80
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub alg: Option<String>,
83
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub kid: Option<String>,
86
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub x5u: Option<String>,
89
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub x5c: Option<Vec<String>>,
92
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub x5t: Option<String>,
95
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub x5t_s256: Option<String>,
98
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub crv: Option<String>,
101
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub x: Option<String>,
104
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub y: Option<String>,
107
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub d: Option<String>,
110
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub n: Option<String>,
113
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub e: Option<String>,
116
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub p: Option<String>,
119
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub q: Option<String>,
122
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub dp: Option<String>,
125
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub dq: Option<String>,
128
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub qi: Option<String>,
131
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub k: Option<String>,
134}