Skip to main content

ruma_events/secret_storage/key/
secret_encryption_algorithm_serde.rs

1use ruma_common::serde::JsonObject;
2use serde::{Deserialize, Serialize, de};
3
4use super::{
5    CustomSecretEncryptionAlgorithm, SecretStorageEncryptionAlgorithm,
6    SecretStorageV1AesHmacSha2Properties,
7};
8
9#[derive(Deserialize)]
10#[serde(untagged)]
11enum SecretStorageEncryptionAlgorithmDeHelper {
12    Known(KnownSecretStorageEncryptionAlgorithmDeHelper),
13    Unknown(UnknownSecretStorageEncryptionAlgorithmDeHelper),
14}
15
16#[derive(Deserialize)]
17#[serde(tag = "algorithm")]
18enum KnownSecretStorageEncryptionAlgorithmDeHelper {
19    #[serde(rename = "m.secret_storage.v1.aes-hmac-sha2")]
20    V1AesHmacSha2(SecretStorageV1AesHmacSha2Properties),
21}
22
23#[derive(Deserialize)]
24struct UnknownSecretStorageEncryptionAlgorithmDeHelper {
25    /// The encryption algorithm to be used for the key.
26    algorithm: String,
27
28    /// Algorithm-specific properties.
29    #[serde(flatten)]
30    properties: JsonObject,
31}
32
33impl<'de> Deserialize<'de> for SecretStorageEncryptionAlgorithm {
34    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
35    where
36        D: de::Deserializer<'de>,
37    {
38        let helper = SecretStorageEncryptionAlgorithmDeHelper::deserialize(deserializer)?;
39
40        Ok(match helper {
41            SecretStorageEncryptionAlgorithmDeHelper::Known(k) => match k {
42                KnownSecretStorageEncryptionAlgorithmDeHelper::V1AesHmacSha2(p) => {
43                    Self::V1AesHmacSha2(p)
44                }
45            },
46            SecretStorageEncryptionAlgorithmDeHelper::Unknown(
47                UnknownSecretStorageEncryptionAlgorithmDeHelper { algorithm, properties },
48            ) => Self::_Custom(CustomSecretEncryptionAlgorithm { algorithm, properties }),
49        })
50    }
51}
52
53#[derive(Debug, Serialize)]
54struct SecretStorageEncryptionAlgorithmSerHelper<'a, T: Serialize> {
55    algorithm: &'a str,
56    #[serde(flatten)]
57    properties: T,
58}
59
60impl Serialize for SecretStorageEncryptionAlgorithm {
61    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62    where
63        S: serde::Serializer,
64    {
65        match self {
66            Self::V1AesHmacSha2(properties) => {
67                let algorithm = self.algorithm();
68                SecretStorageEncryptionAlgorithmSerHelper { algorithm, properties }
69                    .serialize(serializer)
70            }
71            Self::_Custom(CustomSecretEncryptionAlgorithm { algorithm, properties }) => {
72                SecretStorageEncryptionAlgorithmSerHelper { algorithm, properties }
73                    .serialize(serializer)
74            }
75        }
76    }
77}