@@ -12,6 +12,11 @@ use bitcoin::secp256k1;
12
12
use util:: chacha20poly1305rfc:: ChaCha20Poly1305RFC ;
13
13
use util:: byte_utils;
14
14
15
+ /// Maximum Lightning message data length according to
16
+ /// [BOLT-8](https://github.com/lightningnetwork/lightning-rfc/blob/v1.0/08-transport.md#lightning-message-specification)
17
+ /// and [BOLT-1](https://github.com/lightningnetwork/lightning-rfc/blob/master/01-messaging.md#lightning-message-format):
18
+ pub const LN_MAX_MSG_LEN : usize = :: std:: u16:: MAX as usize ; // Must be equal to 65535
19
+
15
20
// Sha256("Noise_XK_secp256k1_ChaChaPoly_SHA256")
16
21
const NOISE_CK : [ u8 ; 32 ] = [ 0x26 , 0x40 , 0xf5 , 0x2e , 0xeb , 0xcd , 0x9e , 0x88 , 0x29 , 0x58 , 0x95 , 0x1c , 0x79 , 0x42 , 0x50 , 0xee , 0xdb , 0x28 , 0x00 , 0x2c , 0x05 , 0xd7 , 0xdc , 0x2e , 0xa0 , 0xf1 , 0x95 , 0x40 , 0x60 , 0x42 , 0xca , 0xf1 ] ;
17
22
// Sha256(NOISE_CK || "lightning")
@@ -373,7 +378,7 @@ impl PeerChannelEncryptor {
373
378
/// Encrypts the given message, returning the encrypted version
374
379
/// panics if msg.len() > 65535 or Noise handshake has not finished.
375
380
pub fn encrypt_message ( & mut self , msg : & [ u8 ] ) -> Vec < u8 > {
376
- if msg. len ( ) > 65535 {
381
+ if msg. len ( ) > LN_MAX_MSG_LEN {
377
382
panic ! ( "Attempted to encrypt message longer than 65535 bytes!" ) ;
378
383
}
379
384
@@ -420,15 +425,15 @@ impl PeerChannelEncryptor {
420
425
* rn += 1 ;
421
426
Ok ( byte_utils:: slice_to_be16 ( & res) )
422
427
} ,
423
- _ => panic ! ( "Tried to encrypt a message prior to noise handshake completion" ) ,
428
+ _ => panic ! ( "Tried to decrypt a message prior to noise handshake completion" ) ,
424
429
}
425
430
}
426
431
427
432
/// Decrypts the given message.
428
433
/// panics if msg.len() > 65535 + 16
429
434
pub fn decrypt_message ( & mut self , msg : & [ u8 ] ) -> Result < Vec < u8 > , LightningError > {
430
- if msg. len ( ) > 65535 + 16 {
431
- panic ! ( "Attempted to encrypt message longer than 65535 bytes!" ) ;
435
+ if msg. len ( ) > LN_MAX_MSG_LEN + 16 {
436
+ panic ! ( "Attempted to decrypt message longer than 65535 + 16 bytes!" ) ;
432
437
}
433
438
434
439
match self . noise_state {
@@ -440,7 +445,7 @@ impl PeerChannelEncryptor {
440
445
441
446
Ok ( res)
442
447
} ,
443
- _ => panic ! ( "Tried to encrypt a message prior to noise handshake completion" ) ,
448
+ _ => panic ! ( "Tried to decrypt a message prior to noise handshake completion" ) ,
444
449
}
445
450
}
446
451
@@ -467,6 +472,8 @@ impl PeerChannelEncryptor {
467
472
468
473
#[ cfg( test) ]
469
474
mod tests {
475
+ use super :: LN_MAX_MSG_LEN ;
476
+
470
477
use bitcoin:: secp256k1:: key:: { PublicKey , SecretKey } ;
471
478
472
479
use hex;
@@ -481,6 +488,36 @@ mod tests {
481
488
outbound_peer
482
489
}
483
490
491
+ fn get_inbound_peer_for_test_vectors ( ) -> PeerChannelEncryptor {
492
+ // transport-responder successful handshake
493
+ let our_node_id = SecretKey :: from_slice ( & hex:: decode ( "2121212121212121212121212121212121212121212121212121212121212121" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
494
+ let our_ephemeral = SecretKey :: from_slice ( & hex:: decode ( "2222222222222222222222222222222222222222222222222222222222222222" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
495
+
496
+ let mut inbound_peer = PeerChannelEncryptor :: new_inbound ( & our_node_id) ;
497
+
498
+ let act_one = hex:: decode ( "00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a" ) . unwrap ( ) . to_vec ( ) ;
499
+ assert_eq ! ( inbound_peer. process_act_one_with_keys( & act_one[ ..] , & our_node_id, our_ephemeral. clone( ) ) . unwrap( ) [ ..] , hex:: decode( "0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae" ) . unwrap( ) [ ..] ) ;
500
+
501
+ let act_three = hex:: decode ( "00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba" ) . unwrap ( ) . to_vec ( ) ;
502
+ // test vector doesn't specify the initiator static key, but it's the same as the one
503
+ // from transport-initiator successful handshake
504
+ assert_eq ! ( inbound_peer. process_act_three( & act_three[ ..] ) . unwrap( ) . serialize( ) [ ..] , hex:: decode( "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa" ) . unwrap( ) [ ..] ) ;
505
+
506
+ match inbound_peer. noise_state {
507
+ NoiseState :: Finished { sk, sn, sck, rk, rn, rck } => {
508
+ assert_eq ! ( sk, hex:: decode( "bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442" ) . unwrap( ) [ ..] ) ;
509
+ assert_eq ! ( sn, 0 ) ;
510
+ assert_eq ! ( sck, hex:: decode( "919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01" ) . unwrap( ) [ ..] ) ;
511
+ assert_eq ! ( rk, hex:: decode( "969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9" ) . unwrap( ) [ ..] ) ;
512
+ assert_eq ! ( rn, 0 ) ;
513
+ assert_eq ! ( rck, hex:: decode( "919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01" ) . unwrap( ) [ ..] ) ;
514
+ } ,
515
+ _ => panic ! ( )
516
+ }
517
+
518
+ inbound_peer
519
+ }
520
+
484
521
#[ test]
485
522
fn noise_initiator_test_vectors ( ) {
486
523
let our_node_id = SecretKey :: from_slice ( & hex:: decode ( "1111111111111111111111111111111111111111111111111111111111111111" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
@@ -539,28 +576,7 @@ mod tests {
539
576
let our_ephemeral = SecretKey :: from_slice ( & hex:: decode ( "2222222222222222222222222222222222222222222222222222222222222222" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
540
577
541
578
{
542
- // transport-responder successful handshake
543
- let mut inbound_peer = PeerChannelEncryptor :: new_inbound ( & our_node_id) ;
544
-
545
- let act_one = hex:: decode ( "00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a" ) . unwrap ( ) . to_vec ( ) ;
546
- assert_eq ! ( inbound_peer. process_act_one_with_keys( & act_one[ ..] , & our_node_id, our_ephemeral. clone( ) ) . unwrap( ) [ ..] , hex:: decode( "0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae" ) . unwrap( ) [ ..] ) ;
547
-
548
- let act_three = hex:: decode ( "00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba" ) . unwrap ( ) . to_vec ( ) ;
549
- // test vector doesn't specify the initiator static key, but it's the same as the one
550
- // from transport-initiator successful handshake
551
- assert_eq ! ( inbound_peer. process_act_three( & act_three[ ..] ) . unwrap( ) . serialize( ) [ ..] , hex:: decode( "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa" ) . unwrap( ) [ ..] ) ;
552
-
553
- match inbound_peer. noise_state {
554
- NoiseState :: Finished { sk, sn, sck, rk, rn, rck } => {
555
- assert_eq ! ( sk, hex:: decode( "bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442" ) . unwrap( ) [ ..] ) ;
556
- assert_eq ! ( sn, 0 ) ;
557
- assert_eq ! ( sck, hex:: decode( "919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01" ) . unwrap( ) [ ..] ) ;
558
- assert_eq ! ( rk, hex:: decode( "969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9" ) . unwrap( ) [ ..] ) ;
559
- assert_eq ! ( rn, 0 ) ;
560
- assert_eq ! ( rck, hex:: decode( "919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01" ) . unwrap( ) [ ..] ) ;
561
- } ,
562
- _ => panic ! ( )
563
- }
579
+ let _ = get_inbound_peer_for_test_vectors ( ) ;
564
580
}
565
581
{
566
582
// transport-responder act1 short read test
@@ -659,35 +675,7 @@ mod tests {
659
675
}
660
676
}
661
677
662
- let mut inbound_peer;
663
-
664
- {
665
- // transport-responder successful handshake
666
- let our_node_id = SecretKey :: from_slice ( & hex:: decode ( "2121212121212121212121212121212121212121212121212121212121212121" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
667
- let our_ephemeral = SecretKey :: from_slice ( & hex:: decode ( "2222222222222222222222222222222222222222222222222222222222222222" ) . unwrap ( ) [ ..] ) . unwrap ( ) ;
668
-
669
- inbound_peer = PeerChannelEncryptor :: new_inbound ( & our_node_id) ;
670
-
671
- let act_one = hex:: decode ( "00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a" ) . unwrap ( ) . to_vec ( ) ;
672
- assert_eq ! ( inbound_peer. process_act_one_with_keys( & act_one[ ..] , & our_node_id, our_ephemeral. clone( ) ) . unwrap( ) [ ..] , hex:: decode( "0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae" ) . unwrap( ) [ ..] ) ;
673
-
674
- let act_three = hex:: decode ( "00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba" ) . unwrap ( ) . to_vec ( ) ;
675
- // test vector doesn't specify the initiator static key, but it's the same as the one
676
- // from transport-initiator successful handshake
677
- assert_eq ! ( inbound_peer. process_act_three( & act_three[ ..] ) . unwrap( ) . serialize( ) [ ..] , hex:: decode( "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa" ) . unwrap( ) [ ..] ) ;
678
-
679
- match inbound_peer. noise_state {
680
- NoiseState :: Finished { sk, sn, sck, rk, rn, rck } => {
681
- assert_eq ! ( sk, hex:: decode( "bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442" ) . unwrap( ) [ ..] ) ;
682
- assert_eq ! ( sn, 0 ) ;
683
- assert_eq ! ( sck, hex:: decode( "919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01" ) . unwrap( ) [ ..] ) ;
684
- assert_eq ! ( rk, hex:: decode( "969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9" ) . unwrap( ) [ ..] ) ;
685
- assert_eq ! ( rn, 0 ) ;
686
- assert_eq ! ( rck, hex:: decode( "919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01" ) . unwrap( ) [ ..] ) ;
687
- } ,
688
- _ => panic ! ( )
689
- }
690
- }
678
+ let mut inbound_peer = get_inbound_peer_for_test_vectors ( ) ;
691
679
692
680
for i in 0 ..1005 {
693
681
let msg = [ 0x68 , 0x65 , 0x6c , 0x6c , 0x6f ] ;
@@ -713,4 +701,28 @@ mod tests {
713
701
}
714
702
}
715
703
}
704
+
705
+ #[ test]
706
+ fn max_msg_len_limit_value ( ) {
707
+ assert_eq ! ( LN_MAX_MSG_LEN , 65535 ) ;
708
+ assert_eq ! ( LN_MAX_MSG_LEN , :: std:: u16 :: MAX as usize ) ;
709
+ }
710
+
711
+ #[ test]
712
+ #[ should_panic( expected = "Attempted to encrypt message longer than 65535 bytes!" ) ]
713
+ fn max_message_len_encryption ( ) {
714
+ let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors ( ) ;
715
+ let msg = [ 4u8 ; LN_MAX_MSG_LEN + 1 ] ;
716
+ outbound_peer. encrypt_message ( & msg) ;
717
+ }
718
+
719
+ #[ test]
720
+ #[ should_panic( expected = "Attempted to decrypt message longer than 65535 + 16 bytes!" ) ]
721
+ fn max_message_len_decryption ( ) {
722
+ let mut inbound_peer = get_inbound_peer_for_test_vectors ( ) ;
723
+
724
+ // MSG should not exceed LN_MAX_MSG_LEN + 16
725
+ let msg = [ 4u8 ; LN_MAX_MSG_LEN + 17 ] ;
726
+ inbound_peer. decrypt_message ( & msg) . unwrap ( ) ;
727
+ }
716
728
}
0 commit comments