1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use std::{
sync::{Arc, Mutex},
time::Duration,
};
use crossbeam::channel::{Receiver, RecvTimeoutError, Sender};
use crate::{config::Config, encryption::AetherCipher, error::AetherError, packet::Packet};
pub struct DecryptionThread {
cipher: AetherCipher,
receiver: Receiver<Packet>,
sender: Sender<Packet>,
stop_flag: Arc<Mutex<bool>>,
config: Config,
}
impl DecryptionThread {
pub fn new(
cipher: AetherCipher,
receiver: Receiver<Packet>,
sender: Sender<Packet>,
stop_flag: Arc<Mutex<bool>>,
config: Config,
) -> DecryptionThread {
DecryptionThread {
cipher,
receiver,
sender,
stop_flag,
config,
}
}
pub fn start(&self) -> Result<(), AetherError> {
loop {
match self
.receiver
.recv_timeout(Duration::from_micros(self.config.link.poll_time_us))
{
Ok(mut packet) => {
let encrypted = packet.payload;
let decrypted = self.cipher.decrypt_bytes(encrypted.into())?;
packet.payload = decrypted;
packet.set_enc(false);
self.sender.send(packet)?;
}
Err(RecvTimeoutError::Timeout) => {}
Err(err) => {
return Err(AetherError::from(err));
}
};
let flag_lock = self.stop_flag.lock().expect("Error locking stop flag");
if *flag_lock {
break;
}
}
Ok(())
}
}