@@ -34,7 +34,7 @@ use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
3434
3535use crate :: io:: { Cursor , Read } ;
3636use core:: ops:: Deref ;
37-
37+ use crate :: ln :: msgs :: InboundOnionPayload ;
3838#[ allow( unused_imports) ]
3939use crate :: prelude:: * ;
4040
@@ -1426,6 +1426,16 @@ pub(crate) enum Hop {
14261426 /// Bytes of the onion packet we're forwarding.
14271427 new_packet_bytes : [ u8 ; ONION_DATA_LEN ] ,
14281428 } ,
1429+ /// This onion was received via Trampoline, and needs to be forwarded to a subsequent Trampoline
1430+ /// node.
1431+ TrampolineForward {
1432+ outer_hop_data : msgs:: InboundTrampolineEntrypointPayload ,
1433+ outer_shared_secret : SharedSecret ,
1434+ next_trampoline_hop_data : msgs:: InboundTrampolineForwardPayload ,
1435+ trampoline_shared_secret : SharedSecret ,
1436+ next_trampoline_hop_hmac : [ u8 ; 32 ] ,
1437+ new_trampoline_packet_bytes : Vec < u8 >
1438+ } ,
14291439 /// This onion payload needs to be forwarded to a next-hop.
14301440 BlindedForward {
14311441 /// Onion payload data used in forwarding the payment.
@@ -1473,6 +1483,7 @@ impl Hop {
14731483 match self {
14741484 Hop :: Forward { shared_secret, .. } => shared_secret,
14751485 Hop :: BlindedForward { shared_secret, .. } => shared_secret,
1486+ Hop :: TrampolineForward { outer_shared_secret, .. } => outer_shared_secret,
14761487 Hop :: Receive { shared_secret, .. } => shared_secret,
14771488 Hop :: BlindedReceive { shared_secret, .. } => shared_secret,
14781489 }
@@ -1509,7 +1520,7 @@ where
15091520 hop_data,
15101521 hmac_bytes,
15111522 Some ( payment_hash) ,
1512- ( blinding_point, node_signer) ,
1523+ ( blinding_point, & ( * node_signer) ) ,
15131524 ) ;
15141525 match decoded_hop {
15151526 Ok ( ( next_hop_data, Some ( ( next_hop_hmac, FixedSizeOnionPacket ( new_packet_bytes) ) ) ) ) => {
@@ -1551,6 +1562,46 @@ where
15511562 msgs:: InboundOnionPayload :: BlindedReceive ( hop_data) => {
15521563 Ok ( Hop :: BlindedReceive { shared_secret, hop_data } )
15531564 } ,
1565+ msgs:: InboundOnionPayload :: TrampolineEntrypoint ( hop_data) => {
1566+ let trampoline_shared_secret = node_signer. ecdh (
1567+ recipient, & hop_data. trampoline_packet . public_key , blinded_node_id_tweak. as_ref ( ) ,
1568+ ) . unwrap ( ) . secret_bytes ( ) ;
1569+ let decoded_trampoline_hop: Result < ( msgs:: InboundOnionPayload , Option < ( [ u8 ; 32 ] , Vec < u8 > ) > ) , _ > = decode_next_hop (
1570+ trampoline_shared_secret,
1571+ & hop_data. trampoline_packet . hop_data ,
1572+ hop_data. trampoline_packet . hmac ,
1573+ Some ( payment_hash) ,
1574+ ( blinding_point, node_signer) ,
1575+ ) ;
1576+ match decoded_trampoline_hop {
1577+ Ok ( ( next_trampoline_hop_data, Some ( ( next_trampoline_hop_hmac, new_trampoline_packet_bytes) ) ) ) => {
1578+ match next_trampoline_hop_data {
1579+ InboundOnionPayload :: TrampolineForward ( trampoline_hop_data) => {
1580+ Ok ( Hop :: TrampolineForward {
1581+ outer_hop_data : hop_data,
1582+ outer_shared_secret : shared_secret,
1583+ next_trampoline_hop_data : trampoline_hop_data,
1584+ trampoline_shared_secret : SharedSecret :: from_bytes ( trampoline_shared_secret) ,
1585+ next_trampoline_hop_hmac,
1586+ new_trampoline_packet_bytes,
1587+ } )
1588+ }
1589+ _ => Err ( OnionDecodeErr :: Malformed {
1590+ err_msg : "Non-Trampoline onion data provided to us as inner onion" ,
1591+ // todo: find more suitable error code
1592+ err_code : 0x4000 | 22 ,
1593+ } )
1594+ }
1595+ }
1596+ Ok ( ( _next_trampoline_hop_data, None ) ) => {
1597+ // this is a trampoline receive
1598+ todo ! ( )
1599+ } ,
1600+ Err ( e) => {
1601+ Err ( e)
1602+ }
1603+ }
1604+ } ,
15541605 _ => {
15551606 if blinding_point. is_some ( ) {
15561607 return Err ( OnionDecodeErr :: Malformed {
0 commit comments