1use crate::errors::Errors;
2use crate::fields::{encode_var_int, read_var_int_from_stream};
3use crate::{Packet, PacketReader};
4use flate2::read::{ZlibDecoder, ZlibEncoder};
5use flate2::Compression;
6use openssl::symm::{Cipher, Crypter, Mode};
7use std::io::{Read, Write};
8use std::net::TcpStream;
9
10
11pub struct EncryptedTcp {
12 stream: TcpStream,
13 encryptor: Crypter,
14 decryptor: Crypter,
15}
16impl EncryptedTcp {
17 pub fn new(stream: TcpStream, secret: Vec<u8>) -> Result<Self, Errors> {
18 Ok(Self {
19 stream,
20 encryptor: Crypter::new(Cipher::aes_128_cfb8(), Mode::Encrypt, &*secret, Some(&*secret)).map_err(|e| Errors::EncryptionError(e))?,
21 decryptor: Crypter::new(Cipher::aes_128_cfb8(), Mode::Decrypt, &*secret, Some(&*secret)).map_err(|e| Errors::EncryptionError(e))?,
22 })
23 }
24}
25impl Read for EncryptedTcp {
26 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
27 let mut read_buff = vec![0; buf.len()];
28 self.stream.read(&mut *read_buff)?;
29 Ok(self.decryptor.update(&*read_buff, buf)?)
30 }
31}
32impl Write for EncryptedTcp {
33 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
34 let mut encrypted_buff = vec![0; buf.len()];
35 self.encryptor.update(buf, &mut *encrypted_buff)?;
36 self.stream.write(&*encrypted_buff)
37 }
38
39 fn flush(&mut self) -> std::io::Result<()> {
40 self.stream.flush()
41 }
42}
43
44pub struct UnknownPacket {
45 pub id: i32,
46 pub reader: PacketReader,
47}
48
49pub fn send_packet<T: Packet>(packet: T, mut stream: impl Write, compression_threshold: Option<usize>) -> Result<(), Errors> {
50 let mut data = encode_var_int(T::ID);
51 data.append(&mut packet.to_bytes());
52 let res = compress_packet_data(data, compression_threshold)?;
53 stream.write_all(&*res).map_err(|e| Errors::IOError(e))
54}
55
56fn compress_packet_data(mut data: Vec<u8>, threshold: Option<usize>) -> Result<Vec<u8>, Errors> {
57 #[cfg(not(debug_assertions))]
58 let _data = data.clone();
59 if threshold.is_none() {
60 let mut res = encode_var_int(data.len() as i32);
61 res.append(&mut data);
62 return Ok(res);
63 }
64
65 if data.len() < threshold.unwrap() {
66 let mut res = encode_var_int((data.len() + 1) as i32);
67 res.append(&mut encode_var_int(0));
68 res.append(&mut data);
69 return Ok(res);
70 }
71
72 let mut data_length = encode_var_int(data.len() as i32);
73 let mut encoder = ZlibEncoder::new(&*data, Compression::default());
74 let mut compressed = Vec::new();
75 if let Err(_e) = encoder.read_to_end(&mut compressed) {
76 return Err(Errors::InvalidPacket("Invalid compression".to_string()));
77 }
78 let mut res = encode_var_int((compressed.len() + data_length.len()) as i32);
79 res.append(&mut data_length);
80 res.append(&mut compressed);
81 Ok(res)
82}
83
84pub fn receive_packet<T: Packet>(mut stream: impl Read, with_compression: bool) -> Result<T, Errors> {
85 let len = read_var_int_from_stream(&mut stream)? as usize;
86 let mut data = vec![0;len];
87 stream.read_exact(&mut *data).map_err(|e| Errors::IOError(e))?;
88 let mut reader = decompress_packet_data(data, with_compression)?;
89 let _id = reader.read_var_int()?;
90 let packet = T::from_reader(&mut reader)?;
91 if reader.len() != 0 {
92 return Err(Errors::InvalidPacket("Packet not read to end. Invalid length".into()))
93 }
94 Ok(packet)
95}
96pub fn receive_unknown_packet(mut stream: impl Read, with_compression: bool) -> Result<UnknownPacket, Errors> {
97 let len = read_var_int_from_stream(&mut stream)? as usize;
98 let mut data = vec![0;len];
99 stream.read(&mut *data).map_err(|e| Errors::IOError(e))?;
100 let mut reader = decompress_packet_data(data, with_compression)?;
101 let id = reader.read_var_int()?;
102 if id == 0 {
103 print!("");
104 }
105 Ok(UnknownPacket { id, reader })
106}
107fn decompress_packet_data(data: Vec<u8>, with_compression: bool) -> Result<PacketReader, Errors> {
108 if data.len() == 0 {
109 return Err(Errors::InvalidPacket("received packet with length 0".into()));
110 }
111 let mut reader = PacketReader::new(data);
112 if !with_compression {
113 return Ok(reader)
114 }
115
116 let uncompressed_length = reader.read_var_int()?;
117
118 if uncompressed_length == 0 {
119 return Ok(reader)
120 }
121
122 let remaining = reader.read_rest();
123
124 let mut decoder = ZlibDecoder::new(&*remaining);
125 let mut decompressed = Vec::new();
126 match decoder.read_to_end(&mut decompressed) {
127 Err(e) => Err(Errors::CompressionError(e)),
128 Ok(count) => if count == uncompressed_length as usize {
129 Ok(())
130 } else {
131 Err(Errors::InvalidPacket("decompressed size not equal to asserted size.".into()))
132 }
133 }?;
134 Ok(PacketReader::new(decompressed))
135}