1
1
use std:: result;
2
2
3
3
use base64:: { engine:: general_purpose:: STANDARD , Engine } ;
4
- use serde:: { Deserialize , Serialize } ;
4
+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
5
5
6
6
use crate :: algorithms:: Algorithm ;
7
7
use crate :: errors:: Result ;
8
8
use crate :: jwk:: Jwk ;
9
9
use crate :: serialization:: b64_decode;
10
10
11
+ const ZIP_SERIAL_DEFLATE : & ' static str = "DEF" ;
12
+ const ENC_A128CBC_HS256 : & ' static str = "A128CBC-HS256" ;
13
+ const ENC_A192CBC_HS384 : & ' static str = "A192CBC-HS384" ;
14
+ const ENC_A256CBC_HS512 : & ' static str = "A256CBC-HS512" ;
15
+ const ENC_A128GCM : & ' static str = "A128GCM" ;
16
+ const ENC_A192GCM : & ' static str = "A192GCM" ;
17
+ const ENC_A256GCM : & ' static str = "A256GCM" ;
18
+
19
+ /// Encryption algorithm for encrypted payloads.
20
+ ///
21
+ /// Defined in [RFC7516#4.1.2](https://datatracker.ietf.org/doc/html/rfc7516#section-4.1.2).
22
+ ///
23
+ /// Values defined in [RFC7518#5.1](https://datatracker.ietf.org/doc/html/rfc7518#section-5.1).
24
+ #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
25
+ #[ allow( clippy:: upper_case_acronyms) ]
26
+ pub enum Enc {
27
+ A128CBC_HS256 ,
28
+ A192CBC_HS384 ,
29
+ A256CBC_HS512 ,
30
+ A128GCM ,
31
+ A192GCM ,
32
+ A256GCM ,
33
+ Other ( String ) ,
34
+ }
35
+
36
+ impl Serialize for Enc {
37
+ fn serialize < S > ( & self , serializer : S ) -> std:: result:: Result < S :: Ok , S :: Error >
38
+ where
39
+ S : Serializer ,
40
+ {
41
+ match self {
42
+ Enc :: A128CBC_HS256 => ENC_A128CBC_HS256 ,
43
+ Enc :: A192CBC_HS384 => ENC_A192CBC_HS384 ,
44
+ Enc :: A256CBC_HS512 => ENC_A256CBC_HS512 ,
45
+ Enc :: A128GCM => ENC_A128GCM ,
46
+ Enc :: A192GCM => ENC_A192GCM ,
47
+ Enc :: A256GCM => ENC_A256GCM ,
48
+ Enc :: Other ( v) => v,
49
+ }
50
+ . serialize ( serializer)
51
+ }
52
+ }
53
+
54
+ impl < ' de > Deserialize < ' de > for Enc {
55
+ fn deserialize < D > ( deserializer : D ) -> std:: result:: Result < Self , D :: Error >
56
+ where
57
+ D : Deserializer < ' de > ,
58
+ {
59
+ let s = String :: deserialize ( deserializer) ?;
60
+ match s. as_str ( ) {
61
+ ENC_A128CBC_HS256 => return Ok ( Enc :: A128CBC_HS256 ) ,
62
+ ENC_A192CBC_HS384 => return Ok ( Enc :: A192CBC_HS384 ) ,
63
+ ENC_A256CBC_HS512 => return Ok ( Enc :: A256CBC_HS512 ) ,
64
+ ENC_A128GCM => return Ok ( Enc :: A128GCM ) ,
65
+ ENC_A192GCM => return Ok ( Enc :: A192GCM ) ,
66
+ ENC_A256GCM => return Ok ( Enc :: A256GCM ) ,
67
+ _ => ( ) ,
68
+ }
69
+ Ok ( Enc :: Other ( s) )
70
+ }
71
+ }
72
+ /// Compression applied to plaintext.
73
+ ///
74
+ /// Defined in [RFC7516#4.1.3](https://datatracker.ietf.org/doc/html/rfc7516#section-4.1.3).
75
+ #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
76
+ pub enum Zip {
77
+ Deflate ,
78
+ Other ( String ) ,
79
+ }
80
+
81
+ impl Serialize for Zip {
82
+ fn serialize < S > ( & self , serializer : S ) -> std:: result:: Result < S :: Ok , S :: Error >
83
+ where
84
+ S : Serializer ,
85
+ {
86
+ match self {
87
+ Zip :: Deflate => ZIP_SERIAL_DEFLATE ,
88
+ Zip :: Other ( v) => v,
89
+ }
90
+ . serialize ( serializer)
91
+ }
92
+ }
93
+
94
+ impl < ' de > Deserialize < ' de > for Zip {
95
+ fn deserialize < D > ( deserializer : D ) -> std:: result:: Result < Self , D :: Error >
96
+ where
97
+ D : Deserializer < ' de > ,
98
+ {
99
+ let s = String :: deserialize ( deserializer) ?;
100
+ match s. as_str ( ) {
101
+ ZIP_SERIAL_DEFLATE => return Ok ( Zip :: Deflate ) ,
102
+ _ => ( ) ,
103
+ }
104
+ Ok ( Zip :: Other ( s) )
105
+ }
106
+ }
107
+
11
108
/// A basic JWT header, the alg defaults to HS256 and typ is automatically
12
109
/// set to `JWT`. All the other fields are optional.
13
110
#[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize , Hash ) ]
@@ -64,6 +161,17 @@ pub struct Header {
64
161
#[ serde( skip_serializing_if = "Option::is_none" ) ]
65
162
#[ serde( rename = "x5t#S256" ) ]
66
163
pub x5t_s256 : Option < String > ,
164
+ /// Critical - indicates header fields that must be understood by the receiver.
165
+ ///
166
+ /// Defined in [RFC7515#4.1.6](https://tools.ietf.org/html/rfc7515#section-4.1.6).
167
+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
168
+ pub crit : Option < Vec < String > > ,
169
+ /// See `Enc` for description.
170
+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
171
+ pub enc : Option < Enc > ,
172
+ /// See `Zip` for description.
173
+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
174
+ pub zip : Option < Zip > ,
67
175
/// ACME: The URL to which this JWS object is directed
68
176
///
69
177
/// Defined in [RFC8555#6.4](https://datatracker.ietf.org/doc/html/rfc8555#section-6.4).
@@ -90,6 +198,9 @@ impl Header {
90
198
x5c : None ,
91
199
x5t : None ,
92
200
x5t_s256 : None ,
201
+ crit : None ,
202
+ enc : None ,
203
+ zip : None ,
93
204
url : None ,
94
205
nonce : None ,
95
206
}
0 commit comments