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(())
    }
}