@@ -427,16 +427,12 @@ impl PeerChannelEncryptor {
427427 Ok ( self . their_node_id . unwrap ( ) . clone ( ) )
428428 }
429429
430- /// Encrypts the given pre-serialized message, returning the encrypted version.
431- /// panics if msg.len() > 65535 or Noise handshake has not finished.
432- pub fn encrypt_buffer ( & mut self , msg : & [ u8 ] ) -> Vec < u8 > {
433- if msg. len ( ) > LN_MAX_MSG_LEN {
430+ fn encrypt_message_with_header_0s ( & mut self , msgbuf : & mut Vec < u8 > ) {
431+ let msg_len = msgbuf. len ( ) - 16 - 2 ;
432+ if msg_len > LN_MAX_MSG_LEN {
434433 panic ! ( "Attempted to encrypt message longer than 65535 bytes!" ) ;
435434 }
436435
437- let mut res = Vec :: with_capacity ( msg. len ( ) + 16 * 2 + 2 ) ;
438- res. resize ( msg. len ( ) + 16 * 2 + 2 , 0 ) ;
439-
440436 match self . noise_state {
441437 NoiseState :: Finished { ref mut sk, ref mut sn, ref mut sck, rk : _, rn : _, rck : _ } => {
442438 if * sn >= 1000 {
@@ -446,16 +442,21 @@ impl PeerChannelEncryptor {
446442 * sn = 0 ;
447443 }
448444
449- Self :: encrypt_with_ad ( & mut res [ 0 ..16 +2 ] , * sn, sk, & [ 0 ; 0 ] , & ( msg . len ( ) as u16 ) . to_be_bytes ( ) ) ;
445+ Self :: encrypt_with_ad ( & mut msgbuf [ 0 ..16 +2 ] , * sn, sk, & [ 0 ; 0 ] , & ( msg_len as u16 ) . to_be_bytes ( ) ) ;
450446 * sn += 1 ;
451447
452- Self :: encrypt_with_ad ( & mut res [ 16 +2 .. ] , * sn, sk, & [ 0 ; 0 ] , msg ) ;
448+ Self :: encrypt_in_place_with_ad ( msgbuf , 16 +2 , * sn, sk, & [ 0 ; 0 ] ) ;
453449 * sn += 1 ;
454450 } ,
455451 _ => panic ! ( "Tried to encrypt a message prior to noise handshake completion" ) ,
456452 }
453+ }
457454
458- res
455+ /// Encrypts the given pre-serialized message, returning the encrypted version.
456+ /// panics if msg.len() > 65535 or Noise handshake has not finished.
457+ pub fn encrypt_buffer ( & mut self , mut msg : MessageBuf ) -> Vec < u8 > {
458+ self . encrypt_message_with_header_0s ( & mut msg. 0 ) ;
459+ msg. 0
459460 }
460461
461462 /// Encrypts the given message, returning the encrypted version.
@@ -468,29 +469,7 @@ impl PeerChannelEncryptor {
468469 res. 0 . resize ( 16 + 2 , 0 ) ;
469470 wire:: write ( message, & mut res) . expect ( "In-memory messages must never fail to serialize" ) ;
470471
471- let msg_len = res. 0 . len ( ) - 16 - 2 ;
472- if msg_len > LN_MAX_MSG_LEN {
473- panic ! ( "Attempted to encrypt message longer than 65535 bytes!" ) ;
474- }
475-
476- match self . noise_state {
477- NoiseState :: Finished { ref mut sk, ref mut sn, ref mut sck, rk : _, rn : _, rck : _ } => {
478- if * sn >= 1000 {
479- let ( new_sck, new_sk) = hkdf_extract_expand_twice ( sck, sk) ;
480- * sck = new_sck;
481- * sk = new_sk;
482- * sn = 0 ;
483- }
484-
485- Self :: encrypt_with_ad ( & mut res. 0 [ 0 ..16 +2 ] , * sn, sk, & [ 0 ; 0 ] , & ( msg_len as u16 ) . to_be_bytes ( ) ) ;
486- * sn += 1 ;
487-
488- Self :: encrypt_in_place_with_ad ( & mut res. 0 , 16 +2 , * sn, sk, & [ 0 ; 0 ] ) ;
489- * sn += 1 ;
490- } ,
491- _ => panic ! ( "Tried to encrypt a message prior to noise handshake completion" ) ,
492- }
493-
472+ self . encrypt_message_with_header_0s ( & mut res. 0 ) ;
494473 res. 0
495474 }
496475
@@ -557,9 +536,28 @@ impl PeerChannelEncryptor {
557536 }
558537}
559538
539+ /// A buffer which stores an encoded message with some padding to allow for future
540+ /// encryption/MACing
541+ pub struct MessageBuf ( Vec < u8 > ) ;
542+ impl MessageBuf {
543+ /// Creates a new buffer from an encoded message (i.e. the two message-type bytes followed by
544+ /// the message contents).
545+ ///
546+ /// Panics if the message is longer than 2^16.
547+ pub fn from_encoded ( encoded_msg : & [ u8 ] ) -> Self {
548+ if encoded_msg. len ( ) > LN_MAX_MSG_LEN {
549+ panic ! ( "Attempted to encrypt message longer than 65535 bytes!" ) ;
550+ }
551+ let mut res = Vec :: with_capacity ( encoded_msg. len ( ) + 16 * 2 + 2 ) ;
552+ res. resize ( encoded_msg. len ( ) + 16 + 2 , 0 ) ;
553+ res[ 16 + 2 ..] . copy_from_slice ( & encoded_msg) ;
554+ Self ( res)
555+ }
556+ }
557+
560558#[ cfg( test) ]
561559mod tests {
562- use super :: LN_MAX_MSG_LEN ;
560+ use super :: { MessageBuf , LN_MAX_MSG_LEN } ;
563561
564562 use bitcoin:: secp256k1:: { PublicKey , SecretKey } ;
565563 use bitcoin:: secp256k1:: Secp256k1 ;
@@ -775,7 +773,7 @@ mod tests {
775773
776774 for i in 0 ..1005 {
777775 let msg = [ 0x68 , 0x65 , 0x6c , 0x6c , 0x6f ] ;
778- let mut res = outbound_peer. encrypt_buffer ( & msg) ;
776+ let mut res = outbound_peer. encrypt_buffer ( MessageBuf :: from_encoded ( & msg) ) ;
779777 assert_eq ! ( res. len( ) , 5 + 2 * 16 + 2 ) ;
780778
781779 let len_header = res[ 0 ..2 +16 ] . to_vec ( ) ;
@@ -811,7 +809,7 @@ mod tests {
811809 fn max_message_len_encryption ( ) {
812810 let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors ( ) ;
813811 let msg = [ 4u8 ; LN_MAX_MSG_LEN + 1 ] ;
814- outbound_peer. encrypt_buffer ( & msg) ;
812+ outbound_peer. encrypt_buffer ( MessageBuf :: from_encoded ( & msg) ) ;
815813 }
816814
817815 #[ test]
0 commit comments