Skip to content

Commit 7c1726b

Browse files
Update blinded path util to take iterator instead of slice
Useful for blinded payment path construction.
1 parent 1b35661 commit 7c1726b

File tree

3 files changed

+64
-57
lines changed

3 files changed

+64
-57
lines changed

lightning/src/blinded_path/message.rs

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

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

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

lightning/src/blinded_path/utils.rs

Lines changed: 9 additions & 5 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>,
33-
session_priv: &SecretKey, mut callback: FType
34-
) -> Result<(), secp256k1::Error> {
30+
pub(crate) fn construct_keys_callback<'a, T, I, F>(
31+
secp_ctx: &Secp256k1<T>, unblinded_path: I, destination: Option<Destination>,
32+
session_priv: &SecretKey, mut callback: F
33+
) -> Result<(), secp256k1::Error>
34+
where
35+
T: secp256k1::Signing + secp256k1::Verification,
36+
I: Iterator<Item=&'a PublicKey>,
37+
F: 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
@@ -650,46 +650,48 @@ fn packet_payloads_and_keys<T: CustomOnionMessageContents, S: secp256k1::Signing
650650
let mut blinded_path_idx = 0;
651651
let mut prev_control_tlvs_ss = None;
652652
let mut final_control_tlvs = None;
653-
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| {
654-
if num_unblinded_hops != 0 && unblinded_path_idx < num_unblinded_hops {
655-
if let Some(ss) = prev_control_tlvs_ss.take() {
656-
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(
657-
ForwardTlvs {
658-
next_node_id: unblinded_pk_opt.unwrap(),
659-
next_blinding_override: None,
660-
}
661-
)), ss));
653+
utils::construct_keys_callback(secp_ctx, unblinded_path.iter(), Some(destination), session_priv,
654+
|_, onion_packet_ss, ephemeral_pubkey, control_tlvs_ss, unblinded_pk_opt, enc_payload_opt| {
655+
if num_unblinded_hops != 0 && unblinded_path_idx < num_unblinded_hops {
656+
if let Some(ss) = prev_control_tlvs_ss.take() {
657+
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(
658+
ForwardTlvs {
659+
next_node_id: unblinded_pk_opt.unwrap(),
660+
next_blinding_override: None,
661+
}
662+
)), ss));
663+
}
664+
prev_control_tlvs_ss = Some(control_tlvs_ss);
665+
unblinded_path_idx += 1;
666+
} else if let Some((intro_node_id, blinding_pt)) = intro_node_id_blinding_pt.take() {
667+
if let Some(control_tlvs_ss) = prev_control_tlvs_ss.take() {
668+
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
669+
next_node_id: intro_node_id,
670+
next_blinding_override: Some(blinding_pt),
671+
})), control_tlvs_ss));
672+
}
662673
}
663-
prev_control_tlvs_ss = Some(control_tlvs_ss);
664-
unblinded_path_idx += 1;
665-
} else if let Some((intro_node_id, blinding_pt)) = intro_node_id_blinding_pt.take() {
666-
if let Some(control_tlvs_ss) = prev_control_tlvs_ss.take() {
667-
payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
668-
next_node_id: intro_node_id,
669-
next_blinding_override: Some(blinding_pt),
670-
})), control_tlvs_ss));
674+
if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
675+
payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
676+
control_tlvs_ss));
677+
blinded_path_idx += 1;
678+
} else if let Some(encrypted_payload) = enc_payload_opt {
679+
final_control_tlvs = Some(ReceiveControlTlvs::Blinded(encrypted_payload));
680+
prev_control_tlvs_ss = Some(control_tlvs_ss);
671681
}
672-
}
673-
if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
674-
payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
675-
control_tlvs_ss));
676-
blinded_path_idx += 1;
677-
} else if let Some(encrypted_payload) = enc_payload_opt {
678-
final_control_tlvs = Some(ReceiveControlTlvs::Blinded(encrypted_payload));
679-
prev_control_tlvs_ss = Some(control_tlvs_ss);
680-
}
681682

682-
let (rho, mu) = onion_utils::gen_rho_mu_from_shared_secret(onion_packet_ss.as_ref());
683-
onion_packet_keys.push(onion_utils::OnionKeys {
684-
#[cfg(test)]
685-
shared_secret: onion_packet_ss,
686-
#[cfg(test)]
687-
blinding_factor: [0; 32],
688-
ephemeral_pubkey,
689-
rho,
690-
mu,
691-
});
692-
})?;
683+
let (rho, mu) = onion_utils::gen_rho_mu_from_shared_secret(onion_packet_ss.as_ref());
684+
onion_packet_keys.push(onion_utils::OnionKeys {
685+
#[cfg(test)]
686+
shared_secret: onion_packet_ss,
687+
#[cfg(test)]
688+
blinding_factor: [0; 32],
689+
ephemeral_pubkey,
690+
rho,
691+
mu,
692+
});
693+
}
694+
)?;
693695

694696
if let Some(control_tlvs) = final_control_tlvs {
695697
payloads.push((Payload::Receive {

0 commit comments

Comments
 (0)