@@ -14,7 +14,7 @@ use bitcoin::secp256k1::{self, PublicKey, Secp256k1, SecretKey};
14
14
#[ allow( unused_imports) ]
15
15
use crate :: prelude:: * ;
16
16
17
- use crate :: blinded_path:: utils;
17
+ use crate :: blinded_path:: utils:: { self , BlindedPathWithPadding } ;
18
18
use crate :: blinded_path:: { BlindedHop , BlindedPath , Direction , IntroductionNode , NodeIdLookUp } ;
19
19
use crate :: crypto:: streams:: ChaChaPolyReadAdapter ;
20
20
use crate :: io;
@@ -265,7 +265,6 @@ impl Writeable for ForwardTlvs {
265
265
NextMessageHop :: NodeId ( pubkey) => ( Some ( pubkey) , None ) ,
266
266
NextMessageHop :: ShortChannelId ( scid) => ( None , Some ( scid) ) ,
267
267
} ;
268
- // TODO: write padding
269
268
encode_tlv_stream ! ( writer, {
270
269
( 2 , short_channel_id, option) ,
271
270
( 4 , next_node_id, option) ,
@@ -277,7 +276,6 @@ impl Writeable for ForwardTlvs {
277
276
278
277
impl Writeable for ReceiveTlvs {
279
278
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , io:: Error > {
280
- // TODO: write padding
281
279
encode_tlv_stream ! ( writer, {
282
280
( 65537 , self . context, option) ,
283
281
} ) ;
@@ -490,6 +488,10 @@ impl_writeable_tlv_based!(DNSResolverContext, {
490
488
( 0 , nonce, required) ,
491
489
} ) ;
492
490
491
+ /// Represents the padding round off size (in bytes) that is used
492
+ /// to pad message blinded path's [`BlindedHop`]
493
+ pub ( crate ) const MESSAGE_PADDING_ROUND_OFF : usize = 100 ;
494
+
493
495
/// Construct blinded onion message hops for the given `intermediate_nodes` and `recipient_node_id`.
494
496
pub ( super ) fn blinded_hops < T : secp256k1:: Signing + secp256k1:: Verification > (
495
497
secp_ctx : & Secp256k1 < T > , intermediate_nodes : & [ MessageForwardNode ] ,
@@ -499,6 +501,8 @@ pub(super) fn blinded_hops<T: secp256k1::Signing + secp256k1::Verification>(
499
501
. iter ( )
500
502
. map ( |node| node. node_id )
501
503
. chain ( core:: iter:: once ( recipient_node_id) ) ;
504
+ let is_compact = intermediate_nodes. iter ( ) . any ( |node| node. short_channel_id . is_some ( ) ) ;
505
+
502
506
let tlvs = pks
503
507
. clone ( )
504
508
. skip ( 1 ) // The first node's TLVs contains the next node's pubkey
@@ -512,7 +516,15 @@ pub(super) fn blinded_hops<T: secp256k1::Signing + secp256k1::Verification>(
512
516
} )
513
517
. chain ( core:: iter:: once ( ControlTlvs :: Receive ( ReceiveTlvs { context : Some ( context) } ) ) ) ;
514
518
515
- let path = pks. zip ( tlvs) ;
516
-
517
- utils:: construct_blinded_hops ( secp_ctx, path, session_priv)
519
+ if is_compact {
520
+ let path = pks. zip ( tlvs) ;
521
+ utils:: construct_blinded_hops ( secp_ctx, path, session_priv)
522
+ } else {
523
+ let path =
524
+ pks. zip ( tlvs. map ( |tlv| BlindedPathWithPadding {
525
+ tlvs : tlv,
526
+ round_off : MESSAGE_PADDING_ROUND_OFF ,
527
+ } ) ) ;
528
+ utils:: construct_blinded_hops ( secp_ctx, path, session_priv)
529
+ }
518
530
}
0 commit comments