1use std::{
5 error::Error,
6 fmt::{self, Display},
7 marker::PhantomData,
8};
9
10use crate::serializer::MutableSerializer;
11use serde::{Deserialize, Serialize};
12
13#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
15pub enum CustomCryptClientPacket {
16 String(String),
17}
18
19impl Default for CustomCryptClientPacket {
20 fn default() -> Self {
21 CustomCryptClientPacket::String(String::new())
22 }
23}
24
25#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
27pub enum CustomCryptServerPacket {
28 String(String),
29}
30
31impl Default for CustomCryptServerPacket {
32 fn default() -> Self {
33 CustomCryptServerPacket::String(String::new())
34 }
35}
36
37#[derive(Debug)]
39pub struct CustomSerializationError;
40impl Display for CustomSerializationError {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 write!(f, "SerializationFailed")
43 }
44}
45
46impl Error for CustomSerializationError {}
47
48pub trait CryptEngine<ReceivingPacket, SendingPacket>: Default {
50 fn encrypt(&mut self, packet: SendingPacket) -> Result<Vec<u8>, CustomSerializationError>;
51 fn decrypt(&mut self, packet: &[u8]) -> Result<ReceivingPacket, CustomSerializationError>;
52}
53
54#[derive(Debug, Default, Clone)]
56pub struct ExampleKeyPair(u64, u64);
57
58#[derive(Debug, Default, Clone)]
60pub struct CustomCryptEngine {
61 key_pair: ExampleKeyPair,
62}
63
64impl CustomCryptEngine {
65 fn xor_encrypt(&mut self, data: Vec<u8>) -> Vec<u8> {
67 let mut key = self.key_pair.0;
68 let encrypted: Vec<u8> = data
69 .into_iter()
70 .map(|byte| {
71 let result = byte ^ (key as u8);
72 key = key.wrapping_add(1);
73 result
74 })
75 .collect();
76 self.key_pair.0 = key;
77 encrypted
78 }
79
80 fn xor_decrypt(&mut self, data: Vec<u8>) -> Vec<u8> {
82 let mut key = self.key_pair.1;
83 let decrypted: Vec<u8> = data
84 .into_iter()
85 .map(|byte| {
86 let result = byte ^ (key as u8);
87 key = key.wrapping_add(1);
88 result
89 })
90 .collect();
91 self.key_pair.1 = key;
92 decrypted
93 }
94}
95
96impl CryptEngine<CustomCryptClientPacket, CustomCryptServerPacket> for CustomCryptEngine {
99 fn encrypt(
100 &mut self,
101 packet: CustomCryptServerPacket,
102 ) -> Result<Vec<u8>, CustomSerializationError> {
103 let packet_data = bincode::serialize(&packet).unwrap();
104 let encrypted_data = self.xor_encrypt(packet_data);
105 Ok(encrypted_data)
106 }
107
108 fn decrypt(
109 &mut self,
110 packet: &[u8],
111 ) -> Result<CustomCryptClientPacket, CustomSerializationError> {
112 let decrypted_data = self.xor_decrypt(packet.to_vec());
113 let packet = bincode::deserialize(&decrypted_data).unwrap();
114 Ok(packet)
115 }
116}
117impl CryptEngine<CustomCryptServerPacket, CustomCryptClientPacket> for CustomCryptEngine {
119 fn encrypt(
120 &mut self,
121 packet: CustomCryptClientPacket,
122 ) -> Result<Vec<u8>, CustomSerializationError> {
123 let packet_data = bincode::serialize(&packet).unwrap();
124 let encrypted_data = self.xor_encrypt(packet_data);
125 Ok(encrypted_data)
126 }
127
128 fn decrypt(
129 &mut self,
130 packet: &[u8],
131 ) -> Result<CustomCryptServerPacket, CustomSerializationError> {
132 let decrypted_data = self.xor_decrypt(packet.to_vec());
133 let packet = bincode::deserialize(&decrypted_data).unwrap();
134 Ok(packet)
135 }
136}
137
138#[derive(Default, Clone)]
140pub struct CustomCryptSerializer<C, ReceivingPacket, SendingPacket>
141where
142 C: Send + Sync + 'static + CryptEngine<ReceivingPacket, SendingPacket>,
143{
144 crypt_engine: C,
145 _client: PhantomData<ReceivingPacket>,
146 _server: PhantomData<SendingPacket>,
147}
148impl<
149 C: Send + Sync + 'static + CryptEngine<ReceivingPacket, SendingPacket>,
150 SendingPacket,
151 ReceivingPacket,
152 > CustomCryptSerializer<C, ReceivingPacket, SendingPacket>
153where
154 C: Send + Sync + 'static + CryptEngine<ReceivingPacket, SendingPacket>,
155{
156 pub fn new(crypt_engine: C) -> Self {
157 Self {
158 crypt_engine,
159 _client: PhantomData,
160 _server: PhantomData,
161 }
162 }
163}
164impl<ReceivingPacket, SendingPacket, C> MutableSerializer<ReceivingPacket, SendingPacket>
165 for CustomCryptSerializer<C, ReceivingPacket, SendingPacket>
166where
167 C: Send + Sync + 'static + CryptEngine<ReceivingPacket, SendingPacket>,
168 ReceivingPacket: Send + Sync + 'static,
169 SendingPacket: Send + Sync + 'static,
170{
171 type Error = CustomSerializationError;
172
173 fn serialize(&mut self, packet: SendingPacket) -> Result<Vec<u8>, Self::Error> {
175 Ok(self.crypt_engine.encrypt(packet).unwrap())
176 }
177
178 fn deserialize(&mut self, buffer: &[u8]) -> Result<ReceivingPacket, Self::Error> {
180 match self.crypt_engine.decrypt(buffer) {
181 Ok(encrypted) => Ok(encrypted),
182 Err(e) => {
183 log::error!("{}", e);
184 Err(e)
185 }
186 }
187 }
188}
189
190#[cfg(test)]
191mod tests {
192 use super::*;
193
194 #[test]
195 fn test_xor_encrypt_decrypt() {
196 let mut engine = CustomCryptEngine::default();
197 let data = vec![1, 2, 3, 4, 5];
198
199 let encrypted = engine.xor_encrypt(data.clone());
200 assert_ne!(
201 encrypted, data,
202 "Encrypted data should not be equal to original data"
203 );
204
205 let decrypted = engine.xor_decrypt(encrypted);
206 assert_eq!(
207 decrypted, data,
208 "Decrypted data should be equal to original data"
209 );
210 }
211
212 #[test]
213 fn test_crypt_engine_encrypt_decrypt() {
214 let mut engine = CustomCryptEngine::default();
215 let client_packet = CustomCryptClientPacket::String("Hello, Server!".to_string());
216 let server_packet = CustomCryptServerPacket::String("Hello, Client!".to_string());
217
218 let encrypted = engine.encrypt(client_packet.clone()).unwrap();
220 let decrypted: CustomCryptClientPacket = engine.decrypt(&encrypted).unwrap();
221 assert_eq!(
222 decrypted, client_packet,
223 "Decrypted client packet should be equal to original packet"
224 );
225
226 let encrypted = engine.encrypt(server_packet.clone()).unwrap();
228 let decrypted: CustomCryptServerPacket = engine.decrypt(&encrypted).unwrap();
229 assert_eq!(
230 decrypted, server_packet,
231 "Decrypted server packet should be equal to original packet"
232 );
233 }
234}