@@ -4,25 +4,22 @@ use std::{io, str, sync::Arc};
44use aws_lc_rs:: { digest, signature:: Ed25519KeyPair } ;
55use thiserror:: Error ;
66use tokio:: {
7- io:: { AsyncReadExt , AsyncWriteExt } ,
7+ io:: AsyncReadExt ,
88 net:: { tcp, TcpStream } ,
99} ;
1010use tracing:: { debug, warn} ;
1111
1212mod key_exchange;
1313use key_exchange:: KeyExchange ;
1414mod proto;
15- use proto:: { DecryptingReader , Encode } ;
16-
17- use crate :: proto:: Packet ;
15+ use proto:: { DecryptingReader , Encode , EncryptingWriter , Packet } ;
1816
1917/// A single SSH connection
2018pub struct Connection {
2119 stream_read : DecryptingReader < tcp:: OwnedReadHalf > ,
22- stream_write : tcp:: OwnedWriteHalf ,
20+ stream_write : EncryptingWriter < tcp:: OwnedWriteHalf > ,
2321 addr : SocketAddr ,
2422 host_key : Arc < Ed25519KeyPair > ,
25- write_buf : Vec < u8 > ,
2623}
2724
2825impl Connection {
@@ -38,10 +35,9 @@ impl Connection {
3835
3936 Ok ( Self {
4037 stream_read : DecryptingReader :: new ( stream_read) ,
41- stream_write,
38+ stream_write : EncryptingWriter :: new ( stream_write ) ,
4239 addr,
4340 host_key,
44- write_buf : Vec :: with_capacity ( 16_384 ) ,
4541 } )
4642 }
4743
@@ -119,14 +115,18 @@ impl VersionExchange {
119115 exchange. update ( v_c) ;
120116
121117 let ident = Identification :: outgoing ( ) ;
122- ident. encode ( & mut conn. write_buf ) ;
123- if let Err ( error) = conn. stream_write . write_all ( & conn. write_buf ) . await {
118+ let server_ident_bytes = ident. encode ( ) ;
119+ if let Err ( error) = conn
120+ . stream_write
121+ . write_raw_cleartext ( & server_ident_bytes)
122+ . await
123+ {
124124 warn ! ( addr = %conn. addr, %error, "failed to send version exchange" ) ;
125125 return Err ( ( ) ) ;
126126 }
127127
128- let v_s_len = conn . write_buf . len ( ) - 2 ;
129- if let Some ( v_s) = conn . write_buf . get ( ..v_s_len) {
128+ let v_s_len = server_ident_bytes . len ( ) - 2 ;
129+ if let Some ( v_s) = server_ident_bytes . get ( ..v_s_len) {
130130 exchange. update ( & ( v_s. len ( ) as u32 ) . to_be_bytes ( ) ) ;
131131 exchange. update ( v_s) ;
132132 }
@@ -197,10 +197,9 @@ impl<'a> Identification<'a> {
197197 comments,
198198 } )
199199 }
200- }
201200
202- impl Encode for Identification < ' _ > {
203- fn encode ( & self , buf : & mut Vec < u8 > ) {
201+ fn encode ( & self ) -> Vec < u8 > {
202+ let mut buf = vec ! [ ] ;
204203 buf. extend_from_slice ( b"SSH-" ) ;
205204 buf. extend_from_slice ( self . protocol . as_bytes ( ) ) ;
206205 buf. push ( b'-' ) ;
@@ -210,6 +209,7 @@ impl Encode for Identification<'_> {
210209 buf. extend_from_slice ( self . comments . as_bytes ( ) ) ;
211210 }
212211 buf. extend_from_slice ( b"\r \n " ) ;
212+ buf
213213 }
214214}
215215
0 commit comments