1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct JWEHeader {
9 #[serde(rename = "alg")]
11 pub algorithm: String,
12
13 #[serde(rename = "enc")]
15 pub encryption: String,
16
17 #[serde(rename = "kid", default, skip_serializing_if = "Option::is_none")]
19 pub key_id: Option<String>,
20
21 #[serde(rename = "typ", default, skip_serializing_if = "Option::is_none")]
23 pub token_type: Option<String>,
24
25 #[serde(rename = "cty", default, skip_serializing_if = "Option::is_none")]
27 pub content_type: Option<String>,
28
29 #[serde(rename = "epk", default, skip_serializing_if = "Option::is_none")]
31 pub ephemeral_public_key: Option<serde_json::Value>,
32
33 #[serde(rename = "apu", default, skip_serializing_if = "Option::is_none")]
35 pub apu: Option<String>,
36
37 #[serde(rename = "apv", default, skip_serializing_if = "Option::is_none")]
39 pub apv: Option<String>,
40
41 #[serde(rename = "iv", default, skip_serializing_if = "Option::is_none")]
43 pub iv: Option<String>,
44
45 #[serde(rename = "tag", default, skip_serializing_if = "Option::is_none")]
47 pub tag: Option<String>,
48
49 #[serde(rename = "p2s", default, skip_serializing_if = "Option::is_none")]
51 pub p2s: Option<String>,
52
53 #[serde(rename = "p2c", default, skip_serializing_if = "Option::is_none")]
55 pub p2c: Option<u32>,
56
57 #[serde(rename = "crit", default, skip_serializing_if = "Option::is_none")]
59 pub critical: Option<Vec<String>>,
60
61 #[serde(rename = "x5c", default, skip_serializing_if = "Option::is_none")]
63 pub certificate_chain: Option<Vec<String>>,
64
65 #[serde(rename = "x5u", default, skip_serializing_if = "Option::is_none")]
67 pub certificate_url: Option<String>,
68
69 #[serde(rename = "x5t", default, skip_serializing_if = "Option::is_none")]
71 pub certificate_sha1_thumbprint: Option<String>,
72
73 #[serde(rename = "x5t#S256", default, skip_serializing_if = "Option::is_none")]
75 pub certificate_sha256_thumbprint: Option<String>,
76
77 #[serde(rename = "jku", default, skip_serializing_if = "Option::is_none")]
79 pub key_set_url: Option<String>,
80
81 #[serde(rename = "jwk", default, skip_serializing_if = "Option::is_none")]
83 pub public_key: Option<serde_json::Value>,
84}
85
86impl JWEHeader {
87 pub fn new(algorithm: impl Into<String>, encryption: impl Into<String>) -> Self {
89 JWEHeader {
90 algorithm: algorithm.into(),
91 encryption: encryption.into(),
92 key_id: None,
93 token_type: None,
94 content_type: None,
95 ephemeral_public_key: None,
96 apu: None,
97 apv: None,
98 iv: None,
99 tag: None,
100 p2s: None,
101 p2c: None,
102 critical: None,
103 certificate_chain: None,
104 certificate_url: None,
105 certificate_sha1_thumbprint: None,
106 certificate_sha256_thumbprint: None,
107 key_set_url: None,
108 public_key: None,
109 }
110 }
111
112 pub fn with_key_id(mut self, key_id: impl Into<String>) -> Self {
114 self.key_id = Some(key_id.into());
115 self
116 }
117
118 pub fn with_content_type(mut self, content_type: impl Into<String>) -> Self {
120 self.content_type = Some(content_type.into());
121 self
122 }
123
124 pub fn with_ephemeral_public_key(mut self, epk: serde_json::Value) -> Self {
126 self.ephemeral_public_key = Some(epk);
127 self
128 }
129}
130
131impl Default for JWEHeader {
132 fn default() -> Self {
133 JWEHeader::new("RSA-OAEP", "A256GCM")
134 }
135}