1
0
Fork 0
mirror of https://gitlab.redox-os.org/CoffeeCode/redox-ssh.git synced 2025-12-29 00:22:19 +01:00

Implement Write for Packet

This commit is contained in:
Thomas Gatzweiler 2017-07-21 21:26:34 +02:00
parent 44a24eb38f
commit 46e4bfab79
3 changed files with 43 additions and 55 deletions

View file

@ -1,6 +1,5 @@
use std::collections::{BTreeMap, VecDeque}; use std::collections::{BTreeMap, VecDeque};
use std::io::{self, BufReader, Read, Write}; use std::io::{self, BufReader, Read, Write};
use std::net::TcpStream;
use std::sync::Arc; use std::sync::Arc;
use channel::{Channel, ChannelId, ChannelRequest}; use channel::{Channel, ChannelId, ChannelRequest};
@ -249,10 +248,7 @@ impl<'a> Connection {
); );
let mut res = Packet::new(MessageType::ServiceAccept); let mut res = Packet::new(MessageType::ServiceAccept);
res.with_writer(&|w| { res.write_bytes(name.as_slice())?;
w.write_bytes(name.as_slice())?;
Ok(())
})?;
Ok(Some(res)) Ok(Some(res))
} }
@ -279,11 +275,9 @@ impl<'a> Connection {
} }
else { else {
let mut res = Packet::new(MessageType::UserAuthFailure); let mut res = Packet::new(MessageType::UserAuthFailure);
res.with_writer(&|w| { res.write_string("password")?;
w.write_string("password")?; res.write_bool(false)?;
w.write_bool(false)?;
Ok(())
})?;
Ok(Some(res)) Ok(Some(res))
} }
} }
@ -305,13 +299,10 @@ impl<'a> Connection {
let channel = Channel::new(id, peer_id, window_size, max_packet_size); let channel = Channel::new(id, peer_id, window_size, max_packet_size);
let mut res = Packet::new(MessageType::ChannelOpenConfirmation); let mut res = Packet::new(MessageType::ChannelOpenConfirmation);
res.with_writer(&|w| { res.write_uint32(peer_id)?;
w.write_uint32(peer_id)?; res.write_uint32(channel.id())?;
w.write_uint32(channel.id())?; res.write_uint32(channel.window_size())?;
w.write_uint32(channel.window_size())?; res.write_uint32(channel.max_packet_size())?;
w.write_uint32(channel.max_packet_size())?;
Ok(())
})?;
debug!("Open {:?}", channel); debug!("Open {:?}", channel);
@ -352,7 +343,7 @@ impl<'a> Connection {
if want_reply { if want_reply {
let mut res = Packet::new(MessageType::ChannelSuccess); let mut res = Packet::new(MessageType::ChannelSuccess);
res.with_writer(&|w| w.write_uint32(0))?; res.write_uint32(0)?;
Ok(Some(res)) Ok(Some(res))
} }
else { else {
@ -417,22 +408,19 @@ impl<'a> Connection {
let cookie: Vec<u8> = rng.gen_iter::<u8>().take(16).collect(); let cookie: Vec<u8> = rng.gen_iter::<u8>().take(16).collect();
let mut packet = Packet::new(MessageType::KexInit); let mut packet = Packet::new(MessageType::KexInit);
packet.with_writer(&|w| { packet.write_raw_bytes(cookie.as_slice())?;
w.write_raw_bytes(cookie.as_slice())?; packet.write_list(KEY_EXCHANGE)?;
w.write_list(KEY_EXCHANGE)?; packet.write_list(HOST_KEY)?;
w.write_list(HOST_KEY)?; packet.write_list(ENCRYPTION)?;
w.write_list(ENCRYPTION)?; packet.write_list(ENCRYPTION)?;
w.write_list(ENCRYPTION)?; packet.write_list(MAC)?;
w.write_list(MAC)?; packet.write_list(MAC)?;
w.write_list(MAC)?; packet.write_list(COMPRESSION)?;
w.write_list(COMPRESSION)?; packet.write_list(COMPRESSION)?;
w.write_list(COMPRESSION)?; packet.write_string("")?;
w.write_string("")?; packet.write_string("")?;
w.write_string("")?; packet.write_bool(false)?;
w.write_bool(false)?; packet.write_uint32(0)?;
w.write_uint32(0)?;
Ok(())
})?;
self.state = ConnectionState::KeyExchange; self.state = ConnectionState::KeyExchange;
self.key_exchange = kex_algo.instance(); self.key_exchange = kex_algo.instance();

View file

@ -118,14 +118,9 @@ impl KeyExchange for Curve25519 {
let hash = self.hash(&[hash_data.as_slice()]); let hash = self.hash(&[hash_data.as_slice()]);
let signature = config.as_ref().key.sign(&hash).unwrap(); let signature = config.as_ref().key.sign(&hash).unwrap();
packet packet.write_bytes(public_key.as_slice()).unwrap();
.with_writer(&|w| { packet.write_bytes(&server_public).unwrap();
w.write_bytes(public_key.as_slice())?; packet.write_bytes(signature.as_slice()).unwrap(); // Signature
w.write_bytes(&server_public)?;
w.write_bytes(signature.as_slice())?; // Signature
Ok(())
})
.unwrap();
self.exchange_hash = Some(hash); self.exchange_hash = Some(hash);
self.shared_secret = Some(shared_secret); self.shared_secret = Some(shared_secret);

View file

@ -97,19 +97,6 @@ impl Packet {
} }
} }
pub fn writer<'a>(&'a mut self) -> &'a mut Write {
match self
{
&mut Packet::Raw(ref mut data, _) => data,
&mut Packet::Payload(ref mut payload) => payload,
}
}
pub fn with_writer(&mut self, f: &Fn(&mut Write) -> Result<()>)
-> Result<()> {
f(self.writer())
}
pub fn reader<'a>(&'a self) -> BufReader<&'a [u8]> { pub fn reader<'a>(&'a self) -> BufReader<&'a [u8]> {
match self match self
{ {
@ -146,6 +133,24 @@ impl Packet {
} }
} }
impl Write for Packet {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
match self
{
&mut Packet::Payload(ref mut payload) => payload.write(buf),
&mut Packet::Raw(ref mut data, ref mut payload_len) => {
let count = data.write(buf)?;
*payload_len += count;
Ok(count)
}
}
}
fn flush(&mut self) -> Result<()> {
Ok(())
}
}
pub trait ReadPacketExt: ReadBytesExt { pub trait ReadPacketExt: ReadBytesExt {
fn read_string(&mut self) -> Result<Vec<u8>> { fn read_string(&mut self) -> Result<Vec<u8>> {
let len = self.read_u32::<BigEndian>()?; let len = self.read_u32::<BigEndian>()?;