jaws/jose/
signed.rs

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/// The registered fields of a JOSE header, which are interdependent
12/// with the signing key.
13#[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}