Skip to content

Commit 86363da

Browse files
Update blinded path util to take iterator instead of slice
Useful for blinded payment path construction.
1 parent 90ebfb3 commit 86363da

File tree

3 files changed

+63
-56
lines changed

3 files changed

+63
-56
lines changed

lightning/src/blinded_path/message.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,22 @@ pub(super) fn blinded_hops<T: secp256k1::Signing + secp256k1::Verification>(
6262
let mut blinded_hops = Vec::with_capacity(unblinded_path.len());
6363

6464
let mut prev_ss_and_blinded_node_id = None;
65-
utils::construct_keys_callback(secp_ctx, unblinded_path, None, session_priv, |blinded_node_id, _, _, encrypted_payload_ss, unblinded_pk, _| {
66-
if let Some((prev_ss, prev_blinded_node_id)) = prev_ss_and_blinded_node_id {
67-
if let Some(pk) = unblinded_pk {
68-
let payload = ForwardTlvs {
69-
next_node_id: pk,
70-
next_blinding_override: None,
71-
};
72-
blinded_hops.push(BlindedHop {
73-
blinded_node_id: prev_blinded_node_id,
74-
encrypted_payload: utils::encrypt_payload(payload, prev_ss),
75-
});
76-
} else { debug_assert!(false); }
77-
}
78-
prev_ss_and_blinded_node_id = Some((encrypted_payload_ss, blinded_node_id));
79-
})?;
65+
utils::construct_keys_callback(secp_ctx, unblinded_path.iter(), None, session_priv,
66+
|blinded_node_id, _, _, encrypted_payload_ss, unblinded_pk, _| {
67+
if let Some((prev_ss, prev_blinded_node_id)) = prev_ss_and_blinded_node_id {
68+
if let Some(pk) = unblinded_pk {
69+
let payload = ForwardTlvs {
70+
next_node_id: pk,
71+
next_blinding_override: None,
72+
};
73+
blinded_hops.push(BlindedHop {
74+
blinded_node_id: prev_blinded_node_id,
75+
encrypted_payload: utils::encrypt_payload(payload, prev_ss),
76+
});
77+
} else { debug_assert!(false); }
78+
}
79+
prev_ss_and_blinded_node_id = Some((encrypted_payload_ss, blinded_node_id));
80+
})?;
8081

8182
if let Some((final_ss, final_blinded_node_id)) = prev_ss_and_blinded_node_id {
8283
let final_payload = ReceiveTlvs { path_id: None };

lightning/src/blinded_path/utils.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,15 @@ use crate::prelude::*;
2727

2828
// TODO: DRY with onion_utils::construct_onion_keys_callback
2929
#[inline]
30-
pub(crate) fn construct_keys_callback<T: secp256k1::Signing + secp256k1::Verification,
31-
FType: FnMut(PublicKey, SharedSecret, PublicKey, [u8; 32], Option<PublicKey>, Option<Vec<u8>>)>(
32-
secp_ctx: &Secp256k1<T>, unblinded_path: &[PublicKey], destination: Option<Destination>,
30+
pub(crate) fn construct_keys_callback<'a, T, I, FType>(
31+
secp_ctx: &Secp256k1<T>, unblinded_path: I, destination: Option<Destination>,
3332
session_priv: &SecretKey, mut callback: FType
34-
) -> Result<(), secp256k1::Error> {
33+
) -> Result<(), secp256k1::Error>
34+
where
35+
T: secp256k1::Signing + secp256k1::Verification,
36+
I: Iterator<Item=&'a PublicKey>,
37+
FType: FnMut(PublicKey, SharedSecret, PublicKey, [u8; 32], Option<PublicKey>, Option<Vec<u8>>),
38+
{
3539
let mut msg_blinding_point_priv = session_priv.clone();
3640
let mut msg_blinding_point = PublicKey::from_secret_key(secp_ctx, &msg_blinding_point_priv);
3741
let mut onion_packet_pubkey_priv = msg_blinding_point_priv.clone();

lightning/src/onion_message/messenger.rs

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -655,46 +655,48 @@ fn packet_payloads_and_keys<T: CustomOnionMessageContents, S: secp256k1::Signing
655655
let mut blinded_path_idx = 0;
656656
let mut prev_control_tlvs_ss = None;
657657
let mut final_control_tlvs = None;
658-
utils::construct_keys_callback(secp_ctx, unblinded_path, Some(destination), session_priv, |_, onion_packet_ss, ephemeral_pubkey, control_tlvs_ss, unblinded_pk_opt, enc_payload_opt| {
659-
if num_unblinded_hops != 0 && unblinded_path_idx < num_unblinded_hops {
660-
if let Some(ss) = prev_control_tlvs_ss.take() {
661-
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(
662-
ForwardTlvs {
663-
next_node_id: unblinded_pk_opt.unwrap(),
664-
next_blinding_override: None,
665-
}
666-
)), ss));
658+
utils::construct_keys_callback( secp_ctx, unblinded_path.iter(), Some(destination), session_priv,
659+
|_, onion_packet_ss, ephemeral_pubkey, control_tlvs_ss, unblinded_pk_opt, enc_payload_opt| {
660+
if num_unblinded_hops != 0 && unblinded_path_idx < num_unblinded_hops {
661+
if let Some(ss) = prev_control_tlvs_ss.take() {
662+
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(
663+
ForwardTlvs {
664+
next_node_id: unblinded_pk_opt.unwrap(),
665+
next_blinding_override: None,
666+
}
667+
)), ss));
668+
}
669+
prev_control_tlvs_ss = Some(control_tlvs_ss);
670+
unblinded_path_idx += 1;
671+
} else if let Some((intro_node_id, blinding_pt)) = intro_node_id_blinding_pt.take() {
672+
if let Some(control_tlvs_ss) = prev_control_tlvs_ss.take() {
673+
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
674+
next_node_id: intro_node_id,
675+
next_blinding_override: Some(blinding_pt),
676+
})), control_tlvs_ss));
677+
}
667678
}
668-
prev_control_tlvs_ss = Some(control_tlvs_ss);
669-
unblinded_path_idx += 1;
670-
} else if let Some((intro_node_id, blinding_pt)) = intro_node_id_blinding_pt.take() {
671-
if let Some(control_tlvs_ss) = prev_control_tlvs_ss.take() {
672-
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
673-
next_node_id: intro_node_id,
674-
next_blinding_override: Some(blinding_pt),
675-
})), control_tlvs_ss));
679+
if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
680+
payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
681+
control_tlvs_ss));
682+
blinded_path_idx += 1;
683+
} else if let Some(encrypted_payload) = enc_payload_opt {
684+
final_control_tlvs = Some(ReceiveControlTlvs::Blinded(encrypted_payload));
685+
prev_control_tlvs_ss = Some(control_tlvs_ss);
676686
}
677-
}
678-
if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
679-
payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
680-
control_tlvs_ss));
681-
blinded_path_idx += 1;
682-
} else if let Some(encrypted_payload) = enc_payload_opt {
683-
final_control_tlvs = Some(ReceiveControlTlvs::Blinded(encrypted_payload));
684-
prev_control_tlvs_ss = Some(control_tlvs_ss);
685-
}
686687

687-
let (rho, mu) = onion_utils::gen_rho_mu_from_shared_secret(onion_packet_ss.as_ref());
688-
onion_packet_keys.push(onion_utils::OnionKeys {
689-
#[cfg(test)]
690-
shared_secret: onion_packet_ss,
691-
#[cfg(test)]
692-
blinding_factor: [0; 32],
693-
ephemeral_pubkey,
694-
rho,
695-
mu,
696-
});
697-
})?;
688+
let (rho, mu) = onion_utils::gen_rho_mu_from_shared_secret(onion_packet_ss.as_ref());
689+
onion_packet_keys.push(onion_utils::OnionKeys {
690+
#[cfg(test)]
691+
shared_secret: onion_packet_ss,
692+
#[cfg(test)]
693+
blinding_factor: [0; 32],
694+
ephemeral_pubkey,
695+
rho,
696+
mu,
697+
});
698+
}
699+
)?;
698700

699701
if let Some(control_tlvs) = final_control_tlvs {
700702
payloads.push((Payload::Receive {

0 commit comments

Comments
 (0)