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}