1use serde::{ser::SerializeTuple as _, Deserialize, Serialize, Serializer};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct CipherInfo {
6 pub adata: AData,
8 pub ct: String,
10}
11
12#[derive(Debug, Clone, Deserialize)]
14pub struct AData {
15 pub cipher: Cipher,
17 pub formatter: String,
19 pub open_discussion: u8,
21 pub burn_after_reading: u8,
23}
24
25impl AsRef<CipherInfo> for CipherInfo {
26 fn as_ref(&self) -> &CipherInfo {
27 &self
28 }
29}
30
31#[derive(Deserialize, Debug, Clone)]
36pub struct Cipher {
37 pub cipher_iv: String,
39 pub kdf_salt: String,
41 pub kdf_iterations: u32,
43 pub kdf_keysize: u32,
45 pub cipher_tag_size: u32,
47 pub cipher_algo: String,
49 pub cipher_mode: String,
51 pub compression_type: CompressionType,
53}
54
55#[derive(Default, Deserialize, Debug, Serialize, Clone)]
57#[serde(rename_all = "lowercase")]
58pub enum CompressionType {
59 None,
61 #[default]
63 Zlib,
64}
65
66impl Serialize for AData {
67 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
68 where
69 S: Serializer,
70 {
71 let mut s = serializer.serialize_tuple(4)?;
72 s.serialize_element(&self.cipher)?;
73 s.serialize_element(&self.formatter)?;
74 s.serialize_element(&self.open_discussion)?;
75 s.serialize_element(&self.burn_after_reading)?;
76 s.end()
77 }
78}
79
80impl Serialize for Cipher {
81 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
82 where
83 S: Serializer,
84 {
85 let mut s = serializer.serialize_tuple(8)?;
86 s.serialize_element(&self.cipher_iv)?;
87 s.serialize_element(&self.kdf_salt)?;
88 s.serialize_element(&self.kdf_iterations)?;
89 s.serialize_element(&self.kdf_keysize)?;
90 s.serialize_element(&self.cipher_tag_size)?;
91 s.serialize_element(&self.cipher_algo)?;
92 s.serialize_element(&self.cipher_mode)?;
93 s.serialize_element(&self.compression_type)?;
94 s.end()
95 }
96}
97
98#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
100pub struct Attachment {
101 pub attachment: String,
103 pub attachment_name: String,
105}