11use std:: result;
22
33use base64:: { engine:: general_purpose:: STANDARD , Engine } ;
4- use serde:: { Deserialize , Serialize } ;
4+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
55
66use crate :: algorithms:: Algorithm ;
77use crate :: errors:: Result ;
88use crate :: jwk:: Jwk ;
99use crate :: serialization:: b64_decode;
1010
11+ const ZIP_SERIAL_DEFLATE : & str = "DEF" ;
12+ const ENC_A128CBC_HS256 : & str = "A128CBC-HS256" ;
13+ const ENC_A192CBC_HS384 : & str = "A192CBC-HS384" ;
14+ const ENC_A256CBC_HS512 : & str = "A256CBC-HS512" ;
15+ const ENC_A128GCM : & str = "A128GCM" ;
16+ const ENC_A192GCM : & str = "A192GCM" ;
17+ const ENC_A256GCM : & 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, non_camel_case_types) ]
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 => Ok ( Zip :: Deflate ) ,
102+ _ => Ok ( Zip :: Other ( s) ) ,
103+ }
104+ }
105+ }
106+
11107/// A basic JWT header, the alg defaults to HS256 and typ is automatically
12108/// set to `JWT`. All the other fields are optional.
13109#[ derive( Debug , Clone , PartialEq , Eq , Serialize , Deserialize , Hash ) ]
@@ -64,6 +160,27 @@ pub struct Header {
64160 #[ serde( skip_serializing_if = "Option::is_none" ) ]
65161 #[ serde( rename = "x5t#S256" ) ]
66162 pub x5t_s256 : Option < String > ,
163+ /// Critical - indicates header fields that must be understood by the receiver.
164+ ///
165+ /// Defined in [RFC7515#4.1.6](https://tools.ietf.org/html/rfc7515#section-4.1.6).
166+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
167+ pub crit : Option < Vec < String > > ,
168+ /// See `Enc` for description.
169+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
170+ pub enc : Option < Enc > ,
171+ /// See `Zip` for description.
172+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
173+ pub zip : Option < Zip > ,
174+ /// ACME: The URL to which this JWS object is directed
175+ ///
176+ /// Defined in [RFC8555#6.4](https://datatracker.ietf.org/doc/html/rfc8555#section-6.4).
177+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
178+ pub url : Option < String > ,
179+ /// ACME: Random data for preventing replay attacks.
180+ ///
181+ /// Defined in [RFC8555#6.5.2](https://datatracker.ietf.org/doc/html/rfc8555#section-6.5.2).
182+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
183+ pub nonce : Option < String > ,
67184}
68185
69186impl Header {
@@ -80,6 +197,11 @@ impl Header {
80197 x5c : None ,
81198 x5t : None ,
82199 x5t_s256 : None ,
200+ crit : None ,
201+ enc : None ,
202+ zip : None ,
203+ url : None ,
204+ nonce : None ,
83205 }
84206 }
85207
0 commit comments