Skip to content

Commit a90a35b

Browse files
committed
Deserialize payment metadata fields in the onion final hop data
1 parent 8ed6e64 commit a90a35b

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2163,7 +2163,7 @@ where
21632163
msg: "Got non final data with an HMAC of 0",
21642164
});
21652165
},
2166-
msgs::OnionHopDataFormat::FinalNode { payment_data, keysend_preimage } => {
2166+
msgs::OnionHopDataFormat::FinalNode { payment_data, keysend_preimage, .. } => { // TODO: expose the payment_metadata to the user
21672167
if payment_data.is_some() && keysend_preimage.is_some() {
21682168
return Err(ReceiveError {
21692169
err_code: 0x4000|22,

lightning/src/ln/msgs.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use crate::io_extras::read_to_end;
4242

4343
use crate::events::{MessageSendEventsProvider, OnionMessageProvider};
4444
use crate::util::logger;
45-
use crate::util::ser::{LengthReadable, Readable, ReadableArgs, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname};
45+
use crate::util::ser::{LengthReadable, Readable, ReadableArgs, Writeable, Writer, WithoutLength, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname};
4646

4747
use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret};
4848

@@ -1168,6 +1168,7 @@ mod fuzzy_internal_msgs {
11681168
},
11691169
FinalNode {
11701170
payment_data: Option<FinalOnionHopData>,
1171+
payment_metadata: Option<Vec<u8>>,
11711172
keysend_preimage: Option<PaymentPreimage>,
11721173
},
11731174
}
@@ -1661,11 +1662,12 @@ impl Writeable for OnionHopData {
16611662
(6, short_channel_id, required)
16621663
});
16631664
},
1664-
OnionHopDataFormat::FinalNode { ref payment_data, ref keysend_preimage } => {
1665+
OnionHopDataFormat::FinalNode { ref payment_data, ref payment_metadata, ref keysend_preimage } => {
16651666
_encode_varint_length_prefixed_tlv!(w, {
16661667
(2, HighZeroBytesDroppedBigSize(self.amt_to_forward), required),
16671668
(4, HighZeroBytesDroppedBigSize(self.outgoing_cltv_value), required),
16681669
(8, payment_data, option),
1670+
(16, payment_metadata.as_ref().map(|m| WithoutLength(m)), option),
16691671
(5482373484, keysend_preimage, option)
16701672
});
16711673
},
@@ -1680,29 +1682,33 @@ impl Readable for OnionHopData {
16801682
let mut cltv_value = HighZeroBytesDroppedBigSize(0u32);
16811683
let mut short_id: Option<u64> = None;
16821684
let mut payment_data: Option<FinalOnionHopData> = None;
1685+
let mut payment_metadata: Option<WithoutLength<Vec<u8>>> = None;
16831686
let mut keysend_preimage: Option<PaymentPreimage> = None;
16841687
read_tlv_fields!(r, {
16851688
(2, amt, required),
16861689
(4, cltv_value, required),
16871690
(6, short_id, option),
16881691
(8, payment_data, option),
1692+
(16, payment_metadata, option),
16891693
// See https://github.com/lightning/blips/blob/master/blip-0003.md
16901694
(5482373484, keysend_preimage, option)
16911695
});
16921696

16931697
let format = if let Some(short_channel_id) = short_id {
16941698
if payment_data.is_some() { return Err(DecodeError::InvalidValue); }
1699+
if payment_metadata.is_some() { return Err(DecodeError::InvalidValue); }
16951700
OnionHopDataFormat::NonFinalNode {
16961701
short_channel_id,
16971702
}
16981703
} else {
1699-
if let &Some(ref data) = &payment_data {
1704+
if let Some(data) = &payment_data {
17001705
if data.total_msat > MAX_VALUE_MSAT {
17011706
return Err(DecodeError::InvalidValue);
17021707
}
17031708
}
17041709
OnionHopDataFormat::FinalNode {
17051710
payment_data,
1711+
payment_metadata: payment_metadata.map(|w| w.0),
17061712
keysend_preimage,
17071713
}
17081714
};
@@ -2880,6 +2886,7 @@ mod tests {
28802886
let mut msg = msgs::OnionHopData {
28812887
format: OnionHopDataFormat::FinalNode {
28822888
payment_data: None,
2889+
payment_metadata: None,
28832890
keysend_preimage: None,
28842891
},
28852892
amt_to_forward: 0x0badf00d01020304,
@@ -2903,6 +2910,7 @@ mod tests {
29032910
payment_secret: expected_payment_secret,
29042911
total_msat: 0x1badca1f
29052912
}),
2913+
payment_metadata: None,
29062914
keysend_preimage: None,
29072915
},
29082916
amt_to_forward: 0x0badf00d01020304,
@@ -2917,6 +2925,7 @@ mod tests {
29172925
payment_secret,
29182926
total_msat: 0x1badca1f
29192927
}),
2928+
payment_metadata: None,
29202929
keysend_preimage: None,
29212930
} = msg.format {
29222931
assert_eq!(payment_secret, expected_payment_secret);

lightning/src/ln/onion_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ pub(super) fn build_onion_payloads(path: &Vec<RouteHop>, total_msat: u64, mut re
170170
total_msat,
171171
})
172172
} else { None },
173+
payment_metadata: None,
173174
keysend_preimage: *keysend_preimage,
174175
}
175176
} else {

0 commit comments

Comments
 (0)