handle disconnected clients, use psocipher.header_size

This commit is contained in:
Jake Probst 2019-07-14 00:51:43 -07:00
parent 3230954a50
commit 0e04968fd3

View File

@ -1,3 +1,5 @@
pub mod cipherkeys;
use std::net::TcpStream; use std::net::TcpStream;
use std::io::{Read, Write}; use std::io::{Read, Write};
use libpso::crypto::{PSOCipher, CipherError}; use libpso::crypto::{PSOCipher, CipherError};
@ -10,6 +12,7 @@ pub enum PacketNetworkError {
PacketParseError(PacketParseError), PacketParseError(PacketParseError),
IOError(std::io::Error), IOError(std::io::Error),
DataNotReady, DataNotReady,
ClientDisconnected,
} }
impl From<CipherError> for PacketNetworkError { impl From<CipherError> for PacketNetworkError {
@ -30,43 +33,54 @@ impl From<PacketParseError> for PacketNetworkError {
} }
} }
pub fn recv_packet<T: Read>(socket: &mut T, cipher: &mut dyn PSOCipher) -> Result<Vec<u8>, PacketNetworkError> { pub fn recv_packet<T: Read>(socket: &mut T, cipher: &mut dyn PSOCipher) -> Result<Vec<u8>, PacketNetworkError> {
let mut size_buf = [0u8; 4]; let mut size_buf = vec![0u8; cipher.header_size()];
//socket.read_exact(&mut size_buf)?; let mut offset = 0;
/*let mut offset = 0; while offset < cipher.header_size() {
while offset < 4 { let diff = socket.read(&mut size_buf[offset..])?;
offset += socket.read(&mut size_buf[offset..])?; println!("! {} {:?}", diff, size_buf);
}*/ if diff == 0 {
let len = socket.read(&mut size_buf)?; return Err(PacketNetworkError::ClientDisconnected);
if len != 4 { }
return Err(PacketNetworkError::DataNotReady) offset += diff;
} }
let mut dec_size_buf = cipher.decrypt(&size_buf.to_vec())?; let mut dec_size_buf = cipher.decrypt(&size_buf)?;
let size = u16::from_le_bytes([dec_size_buf[0], dec_size_buf[1]]); let size = u16::from_le_bytes([dec_size_buf[0], dec_size_buf[1]]) as usize;
let mut data_buf = vec![0u8; (size - 4) as usize]; let mut data_buf = vec![0u8; size - cipher.header_size()];
//socket.read_exact(&mut data_buf)?;
let mut offset = 0; let mut offset = 0;
while offset < size as usize - 4{ while offset < size - cipher.header_size() {
offset += socket.read(&mut data_buf[offset..])?; let diff = socket.read(&mut data_buf[offset..])?;
if diff == 0 {
return Err(PacketNetworkError::ClientDisconnected);
}
offset += diff;
}
let mut null_data_count = 0;
while data_buf.len() % cipher.header_size() != 0 {
data_buf.push(0);
null_data_count += 1;
} }
let mut dec_data_buf = cipher.decrypt(&data_buf.to_vec())?; let mut dec_data_buf = cipher.decrypt(&data_buf.to_vec())?;
for _ in 0..null_data_count {
dec_data_buf.pop();
}
let mut full_buf = Vec::new(); let mut full_buf = Vec::new();
full_buf.append(&mut dec_size_buf); full_buf.append(&mut dec_size_buf);
full_buf.append(&mut dec_data_buf); full_buf.append(&mut dec_data_buf);
println!("[recv]: {:X?}", full_buf); //println!("[recv]: {:X?}", full_buf);
Ok(full_buf) Ok(full_buf)
} }
pub fn send_packet<T: Write>(socket: &mut T, cipher: &mut dyn PSOCipher, pkt: &dyn PSOPacket) -> Result<(), PacketNetworkError> { pub fn send_packet<T: Write>(socket: &mut T, cipher: &mut dyn PSOCipher, pkt: &dyn PSOPacket) -> Result<(), PacketNetworkError> {
let buf = pkt.as_bytes(); let buf = pkt.as_bytes();
println!("[send]: {:X?}", buf); //println!("[send]: {:X?}", buf);
let cbuf = cipher.encrypt(&buf)?; let cbuf = cipher.encrypt(&buf)?;
Ok(socket.write_all(&cbuf)?) Ok(socket.write_all(&cbuf)?)
} }