1use serde::Serialize;
2use sha1::Sha1;
3use sha2::Sha256;
4
5use crate::algorithms::AlgorithmIdentifier;
6
7use crate::key::{JsonWebKey, Thumbprint};
8
9use super::HeaderState;
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
14pub struct SignedHeader {
15 #[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/docs/jose/algorithm.md"))]
16 #[serde(rename = "alg")]
17 pub(super) algorithm: AlgorithmIdentifier,
18
19 #[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/docs/jose/json_web_key.md"))]
20 #[serde(rename = "jwk", skip_serializing_if = "Option::is_none")]
21 pub(super) json_web_key: Option<JsonWebKey>,
22
23 #[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/docs/jose/thumbprint.md"))]
24 #[serde(rename = "x5t", skip_serializing_if = "Option::is_none")]
25 pub(super) thumbprint: Option<Thumbprint<Sha1>>,
26
27 #[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/docs/jose/thumbprint_sha256.md"))]
28 #[serde(rename = "x5t#S256", skip_serializing_if = "Option::is_none")]
29 pub(super) thumbprint_sha256: Option<Thumbprint<Sha256>>,
30}
31
32impl HeaderState for SignedHeader {
33 fn parameters(
34 &self,
35 ) -> Result<std::collections::BTreeMap<String, serde_json::Value>, serde_json::Error> {
36 let mut data = std::collections::BTreeMap::new();
37
38 data.insert("alg".to_owned(), serde_json::to_value(self.algorithm)?);
39
40 if let Some(value) = self.json_web_key.as_ref() {
41 data.insert("jwk".to_owned(), serde_json::to_value(value)?);
42 }
43
44 if let Some(value) = self.thumbprint.as_ref() {
45 data.insert("x5t".to_owned(), serde_json::to_value(value)?);
46 }
47
48 if let Some(value) = self.thumbprint_sha256.as_ref() {
49 data.insert("x5t#S256".to_owned(), serde_json::to_value(value)?);
50 }
51
52 Ok(data)
53 }
54}