@@ -17,7 +17,10 @@ use lightning_0_2::ln::channelmanager::PaymentId as PaymentId_0_2;
1717use lightning_0_2:: ln:: channelmanager:: RecipientOnionFields as RecipientOnionFields_0_2 ;
1818use lightning_0_2:: ln:: functional_test_utils as lightning_0_2_utils;
1919use lightning_0_2:: ln:: msgs:: ChannelMessageHandler as _;
20+ use lightning_0_2:: ln:: msgs:: OnionMessage as OnionMessage_0_2 ;
21+ use lightning_0_2:: onion_message:: packet:: Packet as Packet_0_2 ;
2022use lightning_0_2:: routing:: router as router_0_2;
23+ use lightning_0_2:: util:: ser:: MaybeReadable as MaybeReadable_0_2 ;
2124use lightning_0_2:: util:: ser:: Writeable as _;
2225
2326use lightning_0_1:: commitment_signed_dance as commitment_signed_dance_0_1;
@@ -45,23 +48,29 @@ use lightning_0_0_125::ln::msgs::ChannelMessageHandler as _;
4548use lightning_0_0_125:: routing:: router as router_0_0_125;
4649use lightning_0_0_125:: util:: ser:: Writeable as _;
4750
51+ use lightning:: blinded_path:: message:: NextMessageHop ;
4852use lightning:: chain:: channelmonitor:: { ANTI_REORG_DELAY , HTLC_FAIL_BACK_BUFFER } ;
4953use lightning:: events:: { ClosureReason , Event , HTLCHandlingFailureType } ;
5054use lightning:: ln:: functional_test_utils:: * ;
55+ use lightning:: ln:: msgs;
5156use lightning:: ln:: msgs:: BaseMessageHandler as _;
5257use lightning:: ln:: msgs:: ChannelMessageHandler as _;
5358use lightning:: ln:: msgs:: MessageSendEvent ;
5459use lightning:: ln:: splicing_tests:: * ;
5560use lightning:: ln:: types:: ChannelId ;
61+ use lightning:: onion_message:: packet:: Packet ;
5662use lightning:: sign:: OutputSpender ;
63+ use lightning:: util:: ser:: { MaybeReadable , Writeable } ;
5764use lightning:: util:: wallet_utils:: WalletSourceSync ;
5865
5966use lightning_types:: payment:: { PaymentHash , PaymentPreimage , PaymentSecret } ;
6067
6168use bitcoin:: script:: Builder ;
62- use bitcoin:: secp256k1:: Secp256k1 ;
69+ use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
6370use bitcoin:: { opcodes, Amount , TxOut } ;
6471
72+ use lightning:: io:: Cursor ;
73+
6574use std:: sync:: Arc ;
6675
6776#[ test]
@@ -700,3 +709,107 @@ fn do_upgrade_mid_htlc_forward(test: MidHtlcForwardCase) {
700709 expect_payment_claimable ! ( nodes[ 2 ] , pay_hash, pay_secret, 1_000_000 ) ;
701710 claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , pay_preimage) ;
702711}
712+
713+ /// Constructs a dummy `OnionMessage` (current version) for use in serialization tests.
714+ fn dummy_onion_message ( ) -> msgs:: OnionMessage {
715+ let pubkey =
716+ PublicKey :: from_secret_key ( & Secp256k1 :: new ( ) , & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
717+ msgs:: OnionMessage {
718+ blinding_point : pubkey,
719+ onion_routing_packet : Packet {
720+ version : 0 ,
721+ public_key : pubkey,
722+ hop_data : vec ! [ 1 ; 64 ] ,
723+ hmac : [ 2 ; 32 ] ,
724+ } ,
725+ }
726+ }
727+
728+ /// Constructs a dummy `OnionMessage` (0.2 version) for use in serialization tests.
729+ fn dummy_onion_message_0_2 ( ) -> OnionMessage_0_2 {
730+ let pubkey = bitcoin:: secp256k1:: PublicKey :: from_secret_key (
731+ & Secp256k1 :: new ( ) ,
732+ & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ,
733+ ) ;
734+ OnionMessage_0_2 {
735+ blinding_point : pubkey,
736+ onion_routing_packet : Packet_0_2 {
737+ version : 0 ,
738+ public_key : pubkey,
739+ hop_data : vec ! [ 1 ; 64 ] ,
740+ hmac : [ 2 ; 32 ] ,
741+ } ,
742+ }
743+ }
744+
745+ #[ test]
746+ fn test_onion_message_intercepted_upgrade_from_0_2 ( ) {
747+ // Ensure that an `Event::OnionMessageIntercepted` serialized by LDK 0.2 (which uses
748+ // `peer_node_id: PublicKey` in TLV field 0) can be deserialized by the current version,
749+ // producing `NextMessageHop::NodeId`.
750+ let pubkey =
751+ PublicKey :: from_secret_key ( & Secp256k1 :: new ( ) , & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
752+
753+ let event_0_2 = Event_0_2 :: OnionMessageIntercepted {
754+ peer_node_id : pubkey,
755+ message : dummy_onion_message_0_2 ( ) ,
756+ } ;
757+
758+ let serialized = lightning_0_2:: util:: ser:: Writeable :: encode ( & event_0_2) ;
759+
760+ let mut reader = Cursor :: new ( & serialized) ;
761+ let deserialized = <Event as MaybeReadable >:: read ( & mut reader) . unwrap ( ) . unwrap ( ) ;
762+
763+ match deserialized {
764+ Event :: OnionMessageIntercepted { next_hop, message } => {
765+ assert_eq ! ( next_hop, NextMessageHop :: NodeId ( pubkey) ) ;
766+ assert_eq ! ( message, dummy_onion_message( ) ) ;
767+ } ,
768+ _ => panic ! ( "Expected OnionMessageIntercepted event" ) ,
769+ }
770+ }
771+
772+ #[ test]
773+ fn test_onion_message_intercepted_node_id_downgrade_to_0_2 ( ) {
774+ // Ensure that an `Event::OnionMessageIntercepted` with a `NodeId` next hop serialized by
775+ // the current version can be deserialized by LDK 0.2 (which expects `peer_node_id` in TLV
776+ // field 0).
777+ let pubkey =
778+ PublicKey :: from_secret_key ( & Secp256k1 :: new ( ) , & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
779+
780+ let event = Event :: OnionMessageIntercepted {
781+ next_hop : NextMessageHop :: NodeId ( pubkey) ,
782+ message : dummy_onion_message ( ) ,
783+ } ;
784+
785+ let serialized = event. encode ( ) ;
786+
787+ let mut reader = Cursor :: new ( & serialized) ;
788+ let deserialized = <Event_0_2 as MaybeReadable_0_2 >:: read ( & mut reader) . unwrap ( ) . unwrap ( ) ;
789+
790+ match deserialized {
791+ Event_0_2 :: OnionMessageIntercepted { peer_node_id, message } => {
792+ assert_eq ! ( peer_node_id, pubkey) ;
793+ assert_eq ! ( message, dummy_onion_message_0_2( ) ) ;
794+ } ,
795+ _ => panic ! ( "Expected OnionMessageIntercepted event" ) ,
796+ }
797+ }
798+
799+ #[ test]
800+ fn test_onion_message_intercepted_scid_downgrade_to_0_2 ( ) {
801+ // Ensure that an `Event::OnionMessageIntercepted` with a `ShortChannelId` next hop
802+ // serialized by the current version cannot be deserialized by LDK 0.2, since the
803+ // `peer_node_id` field (0) is not written for SCID variants and LDK 0.2 requires it.
804+ let event = Event :: OnionMessageIntercepted {
805+ next_hop : NextMessageHop :: ShortChannelId ( 42 ) ,
806+ message : dummy_onion_message ( ) ,
807+ } ;
808+
809+ let serialized = event. encode ( ) ;
810+
811+ // LDK 0.2 will try to read field 0 as required. Since it's absent, the read will fail.
812+ let mut reader = Cursor :: new ( & serialized) ;
813+ let result = <Event_0_2 as MaybeReadable_0_2 >:: read ( & mut reader) ;
814+ assert ! ( result. is_err( ) , "LDK 0.2 should fail to decode a ShortChannelId variant" ) ;
815+ }
0 commit comments