Skip to main content

fkm_proxy/utils/
ssh.rs

1#[derive(Debug)]
2pub struct SshPacketHeader {
3    pub packet_type: SshPacketType,
4    pub length: u32,
5}
6
7impl SshPacketHeader {
8    pub const HEADER_LENGTH: usize = 6;
9
10    pub fn to_buf(&self) -> [u8; Self::HEADER_LENGTH] {
11        let mut tmp = [0; Self::HEADER_LENGTH];
12        tmp[0] = self.packet_type.to_u8();
13        tmp[1..5].copy_from_slice(&self.length.to_be_bytes());
14        tmp
15    }
16
17    pub fn from_buf(buf: &[u8; Self::HEADER_LENGTH]) -> Self {
18        Self {
19            packet_type: SshPacketType::from_u8(buf[0]),
20            length: u32::from_be_bytes(buf[1..5].try_into().expect("Cannot fail")),
21        }
22    }
23}
24
25#[derive(Debug, PartialEq)]
26pub enum SshPacketType {
27    Invalid = 0,
28    PtyResize = 1,
29    Data = 2,
30    User = 3,
31}
32
33impl SshPacketType {
34    pub fn to_u8(&self) -> u8 {
35        match self {
36            SshPacketType::Invalid => 0,
37            SshPacketType::PtyResize => 1,
38            SshPacketType::Data => 2,
39            SshPacketType::User => 3,
40        }
41    }
42
43    pub fn from_u8(v: u8) -> Self {
44        match v {
45            1 => SshPacketType::PtyResize,
46            2 => SshPacketType::Data,
47            3 => SshPacketType::User,
48            _ => SshPacketType::Invalid,
49        }
50    }
51}