@@ -289,6 +289,14 @@ impl<W: AsyncWriteExt + Unpin> EncryptingWriter<W> {
289289 Ok ( ( ) )
290290 }
291291
292+ pub ( crate ) fn set_encryption_key (
293+ & mut self ,
294+ encryption_key : StreamingEncryptingKey ,
295+ integrity_key : hmac:: Key ,
296+ ) {
297+ self . encryption_key = Some ( ( encryption_key, integrity_key) ) ;
298+ }
299+
292300 /// Write a packet. Returns written [`Packet`].
293301 pub ( crate ) async fn write_packet (
294302 & mut self ,
@@ -301,11 +309,29 @@ impl<W: AsyncWriteExt + Unpin> EncryptingWriter<W> {
301309 let packet_number = self . packet_number ;
302310 self . packet_number = self . packet_number . wrapping_add ( 1 ) ;
303311
312+ let packet = Packet :: builder ( & mut self . buf ) . with_payload ( payload) ;
313+ update_exchange_hash ( packet. payload ( ) ?) ;
314+
304315 if let Some ( ( encryption_key, integrity_key) ) = & mut self . encryption_key {
305- todo ! ( )
316+ let block_len = encryption_key. algorithm ( ) . block_len ( ) ;
317+
318+ let data = packet. without_mac ( ) ?;
319+
320+ self . encrypted_buf . resize ( data. len ( ) + block_len, 0 ) ;
321+ let update = encryption_key
322+ . update ( data, & mut self . encrypted_buf )
323+ . unwrap ( ) ;
324+ assert_eq ! ( update. remainder( ) . len( ) , block_len) ;
325+ self . encrypted_buf . truncate ( data. len ( ) ) ;
326+
327+ let mut hmac_ctx = hmac:: Context :: with_key ( integrity_key) ;
328+ hmac_ctx. update ( & packet_number. to_be_bytes ( ) ) ;
329+ hmac_ctx. update ( data) ;
330+ let mac = hmac_ctx. sign ( ) ;
331+ self . encrypted_buf . extend_from_slice ( mac. as_ref ( ) ) ;
332+
333+ self . stream . write_all ( & self . encrypted_buf ) . await ?;
306334 } else {
307- let packet = Packet :: builder ( & mut self . buf ) . with_payload ( payload) ;
308- update_exchange_hash ( packet. payload ( ) ?) ;
309335 self . stream . write_all ( packet. without_mac ( ) ?) . await ?;
310336 } ;
311337
@@ -430,8 +456,6 @@ impl<'a> PacketBuilderWithPayload<'a> {
430456 }
431457 }
432458
433- buf. extend_from_slice ( & [ ] ) ; // mac
434-
435459 let packet_len = ( buf. len ( ) - start - 4 ) as u32 ;
436460 if let Some ( packet_length_dst) = buf. get_mut ( start..start + 4 ) {
437461 packet_length_dst. copy_from_slice ( & packet_len. to_be_bytes ( ) ) ;
0 commit comments