14
14
use bitcoin:: secp256k1:: { self , PublicKey , Secp256k1 , SecretKey } ;
15
15
16
16
use crate :: blinded_path:: { BlindedHop , BlindedPath , IntroductionNode , NodeIdLookUp } ;
17
- use crate :: blinded_path:: utils;
17
+ use crate :: blinded_path:: utils:: { self , Padding } ;
18
18
use crate :: crypto:: streams:: ChaChaPolyReadAdapter ;
19
19
use crate :: io;
20
20
use crate :: io:: Cursor ;
@@ -50,6 +50,8 @@ pub struct ForwardNode {
50
50
/// Data to construct a [`BlindedHop`] for forwarding a payment.
51
51
#[ derive( Clone , Debug ) ]
52
52
pub struct ForwardTlvs {
53
+ /// The padding data used to make all packets of a Blinded Path of same size
54
+ pub padding : Option < Padding > ,
53
55
/// The short channel id this payment should be forwarded out over.
54
56
pub short_channel_id : u64 ,
55
57
/// Payment parameters for relaying over [`Self::short_channel_id`].
@@ -67,6 +69,8 @@ pub struct ForwardTlvs {
67
69
/// may not be valid if received by another lightning implementation.
68
70
#[ derive( Clone , Debug ) ]
69
71
pub struct ReceiveTlvs {
72
+ /// The padding data used to make all packets of a Blinded Path of same size
73
+ pub padding : Option < Padding > ,
70
74
/// Used to authenticate the sender of a payment to the receiver and tie MPP HTLCs together.
71
75
pub payment_secret : PaymentSecret ,
72
76
/// Constraints for the receiver of this payment.
@@ -78,13 +82,29 @@ pub struct ReceiveTlvs {
78
82
/// Data to construct a [`BlindedHop`] for sending a payment over.
79
83
///
80
84
/// [`BlindedHop`]: crate::blinded_path::BlindedHop
85
+ #[ derive( Clone ) ]
81
86
pub ( crate ) enum BlindedPaymentTlvs {
82
87
/// This blinded payment data is for a forwarding node.
83
88
Forward ( ForwardTlvs ) ,
84
89
/// This blinded payment data is for the receiving node.
85
90
Receive ( ReceiveTlvs ) ,
86
91
}
87
92
93
+ impl BlindedPaymentTlvs {
94
+ pub ( crate ) fn pad_tlvs ( mut self , max_length : usize ) -> Self {
95
+ let length = max_length. checked_sub ( self . serialized_length ( ) ) ;
96
+ debug_assert ! ( length. is_some( ) , "Size of this packet should not be larger than the size of largest packet." ) ;
97
+ let padding = Some ( Padding :: new ( length. unwrap ( ) ) ) ;
98
+
99
+ match & mut self {
100
+ BlindedPaymentTlvs :: Forward ( tlvs) => tlvs. padding = padding,
101
+ BlindedPaymentTlvs :: Receive ( tlvs) => tlvs. padding = padding,
102
+ }
103
+
104
+ self
105
+ }
106
+ }
107
+
88
108
/// Parameters for relaying over a given [`BlindedHop`].
89
109
///
90
110
/// [`BlindedHop`]: crate::blinded_path::BlindedHop
@@ -198,6 +218,7 @@ impl Writeable for ForwardTlvs {
198
218
if self . features == BlindedHopFeatures :: empty ( ) { None }
199
219
else { Some ( & self . features ) } ;
200
220
encode_tlv_stream ! ( w, {
221
+ ( 1 , self . padding, option) ,
201
222
( 2 , self . short_channel_id, required) ,
202
223
( 10 , self . payment_relay, required) ,
203
224
( 12 , self . payment_constraints, required) ,
@@ -210,6 +231,7 @@ impl Writeable for ForwardTlvs {
210
231
impl Writeable for ReceiveTlvs {
211
232
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
212
233
encode_tlv_stream ! ( w, {
234
+ ( 1 , self . padding, option) ,
213
235
( 12 , self . payment_constraints, required) ,
214
236
( 65536 , self . payment_secret, required) ,
215
237
( 65537 , self . payment_context, required)
@@ -246,6 +268,7 @@ impl Readable for BlindedPaymentTlvs {
246
268
return Err ( DecodeError :: InvalidValue )
247
269
}
248
270
Ok ( BlindedPaymentTlvs :: Forward ( ForwardTlvs {
271
+ padding : None ,
249
272
short_channel_id,
250
273
payment_relay : payment_relay. ok_or ( DecodeError :: InvalidValue ) ?,
251
274
payment_constraints : payment_constraints. 0 . unwrap ( ) ,
@@ -254,6 +277,7 @@ impl Readable for BlindedPaymentTlvs {
254
277
} else {
255
278
if payment_relay. is_some ( ) || features. is_some ( ) { return Err ( DecodeError :: InvalidValue ) }
256
279
Ok ( BlindedPaymentTlvs :: Receive ( ReceiveTlvs {
280
+ padding : None ,
257
281
payment_secret : payment_secret. ok_or ( DecodeError :: InvalidValue ) ?,
258
282
payment_constraints : payment_constraints. 0 . unwrap ( ) ,
259
283
payment_context : payment_context. 0 . unwrap ( ) ,
@@ -272,7 +296,14 @@ pub(super) fn blinded_hops<T: secp256k1::Signing + secp256k1::Verification>(
272
296
let tlvs = intermediate_nodes. iter ( ) . map ( |node| BlindedPaymentTlvs :: Forward ( node. tlvs . clone ( ) ) )
273
297
. chain ( core:: iter:: once ( BlindedPaymentTlvs :: Receive ( payee_tlvs) ) ) ;
274
298
275
- utils:: construct_blinded_hops ( secp_ctx, pks, tlvs, session_priv)
299
+ let max_length = tlvs. clone ( )
300
+ . map ( |tlv| tlv. serialized_length ( ) )
301
+ . max ( )
302
+ . unwrap_or ( 0 ) ;
303
+
304
+ let length_tlvs = tlvs. map ( |tlv| tlv. pad_tlvs ( max_length) ) ;
305
+
306
+ utils:: construct_blinded_hops ( secp_ctx, pks, length_tlvs, session_priv)
276
307
}
277
308
278
309
// Advance the blinded onion payment path by one hop, so make the second hop into the new
@@ -484,6 +515,7 @@ mod tests {
484
515
let intermediate_nodes = vec ! [ ForwardNode {
485
516
node_id: dummy_pk,
486
517
tlvs: ForwardTlvs {
518
+ padding: None ,
487
519
short_channel_id: 0 ,
488
520
payment_relay: PaymentRelay {
489
521
cltv_expiry_delta: 144 ,
@@ -500,6 +532,7 @@ mod tests {
500
532
} , ForwardNode {
501
533
node_id: dummy_pk,
502
534
tlvs: ForwardTlvs {
535
+ padding: None ,
503
536
short_channel_id: 0 ,
504
537
payment_relay: PaymentRelay {
505
538
cltv_expiry_delta: 144 ,
@@ -515,6 +548,7 @@ mod tests {
515
548
htlc_maximum_msat: u64 :: max_value( ) ,
516
549
} ] ;
517
550
let recv_tlvs = ReceiveTlvs {
551
+ padding : None ,
518
552
payment_secret : PaymentSecret ( [ 0 ; 32 ] ) ,
519
553
payment_constraints : PaymentConstraints {
520
554
max_cltv_expiry : 0 ,
@@ -534,6 +568,7 @@ mod tests {
534
568
#[ test]
535
569
fn compute_payinfo_1_hop ( ) {
536
570
let recv_tlvs = ReceiveTlvs {
571
+ padding : None ,
537
572
payment_secret : PaymentSecret ( [ 0 ; 32 ] ) ,
538
573
payment_constraints : PaymentConstraints {
539
574
max_cltv_expiry : 0 ,
@@ -557,6 +592,7 @@ mod tests {
557
592
let intermediate_nodes = vec ! [ ForwardNode {
558
593
node_id: dummy_pk,
559
594
tlvs: ForwardTlvs {
595
+ padding: None ,
560
596
short_channel_id: 0 ,
561
597
payment_relay: PaymentRelay {
562
598
cltv_expiry_delta: 0 ,
@@ -573,6 +609,7 @@ mod tests {
573
609
} , ForwardNode {
574
610
node_id: dummy_pk,
575
611
tlvs: ForwardTlvs {
612
+ padding: None ,
576
613
short_channel_id: 0 ,
577
614
payment_relay: PaymentRelay {
578
615
cltv_expiry_delta: 0 ,
@@ -588,6 +625,7 @@ mod tests {
588
625
htlc_maximum_msat: u64 :: max_value( )
589
626
} ] ;
590
627
let recv_tlvs = ReceiveTlvs {
628
+ padding : None ,
591
629
payment_secret : PaymentSecret ( [ 0 ; 32 ] ) ,
592
630
payment_constraints : PaymentConstraints {
593
631
max_cltv_expiry : 0 ,
@@ -608,6 +646,7 @@ mod tests {
608
646
let intermediate_nodes = vec ! [ ForwardNode {
609
647
node_id: dummy_pk,
610
648
tlvs: ForwardTlvs {
649
+ padding: None ,
611
650
short_channel_id: 0 ,
612
651
payment_relay: PaymentRelay {
613
652
cltv_expiry_delta: 0 ,
@@ -624,6 +663,7 @@ mod tests {
624
663
} , ForwardNode {
625
664
node_id: dummy_pk,
626
665
tlvs: ForwardTlvs {
666
+ padding: None ,
627
667
short_channel_id: 0 ,
628
668
payment_relay: PaymentRelay {
629
669
cltv_expiry_delta: 0 ,
@@ -639,6 +679,7 @@ mod tests {
639
679
htlc_maximum_msat: u64 :: max_value( )
640
680
} ] ;
641
681
let recv_tlvs = ReceiveTlvs {
682
+ padding : None ,
642
683
payment_secret : PaymentSecret ( [ 0 ; 32 ] ) ,
643
684
payment_constraints : PaymentConstraints {
644
685
max_cltv_expiry : 0 ,
@@ -663,6 +704,7 @@ mod tests {
663
704
let intermediate_nodes = vec ! [ ForwardNode {
664
705
node_id: dummy_pk,
665
706
tlvs: ForwardTlvs {
707
+ padding: None ,
666
708
short_channel_id: 0 ,
667
709
payment_relay: PaymentRelay {
668
710
cltv_expiry_delta: 0 ,
@@ -679,6 +721,7 @@ mod tests {
679
721
} , ForwardNode {
680
722
node_id: dummy_pk,
681
723
tlvs: ForwardTlvs {
724
+ padding: None ,
682
725
short_channel_id: 0 ,
683
726
payment_relay: PaymentRelay {
684
727
cltv_expiry_delta: 0 ,
@@ -694,6 +737,7 @@ mod tests {
694
737
htlc_maximum_msat: 10_000
695
738
} ] ;
696
739
let recv_tlvs = ReceiveTlvs {
740
+ padding : None ,
697
741
payment_secret : PaymentSecret ( [ 0 ; 32 ] ) ,
698
742
payment_constraints : PaymentConstraints {
699
743
max_cltv_expiry : 0 ,
0 commit comments