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}