memberlist_proto/
serde_impl.rs

1#[cfg(feature = "encryption")]
2const _: () = {
3  use super::SecretKey;
4  use base64::Engine;
5  use serde::{Deserialize, Serialize};
6
7  impl Serialize for SecretKey {
8    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9    where
10      S: serde::Serializer,
11    {
12      enum Buf {
13        Aes128([u8; 24]),
14        Aes192([u8; 32]),
15        Aes256([u8; 44]),
16      }
17
18      impl AsMut<[u8]> for Buf {
19        fn as_mut(&mut self) -> &mut [u8] {
20          match self {
21            Buf::Aes128(buf) => buf,
22            Buf::Aes192(buf) => buf,
23            Buf::Aes256(buf) => buf,
24          }
25        }
26      }
27
28      if serializer.is_human_readable() {
29        let mut buf = match self {
30          Self::Aes128(_) => Buf::Aes128([0; 24]),
31          Self::Aes192(_) => Buf::Aes192([0; 32]),
32          Self::Aes256(_) => Buf::Aes256([0; 44]),
33        };
34
35        base64::engine::general_purpose::STANDARD
36          .encode_slice(self.as_ref(), buf.as_mut())
37          .map_err(serde::ser::Error::custom)?;
38
39        serializer.serialize_str(core::str::from_utf8(buf.as_mut()).unwrap())
40      } else {
41        serializer.serialize_bytes(self)
42      }
43    }
44  }
45
46  impl<'de> Deserialize<'de> for SecretKey {
47    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48    where
49      D: serde::Deserializer<'de>,
50    {
51      if deserializer.is_human_readable() {
52        <&str as Deserialize<'de>>::deserialize(deserializer)
53          .and_then(|val| Self::try_from(val).map_err(<D::Error as serde::de::Error>::custom))
54      } else {
55        <&[u8] as Deserialize<'de>>::deserialize(deserializer)
56          .and_then(|e| Self::try_from(e).map_err(<D::Error as serde::de::Error>::custom))
57      }
58    }
59  }
60};