Skip to content

Commit ee1fa5e

Browse files
committed
Deserialize payment metadata fields in the onion final hop data
1 parent 9fed1d0 commit ee1fa5e

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
@@ -2158,7 +2158,7 @@ where
21582158
msg: "Got non final data with an HMAC of 0",
21592159
});
21602160
},
2161-
msgs::OnionHopDataFormat::FinalNode { payment_data, keysend_preimage } => {
2161+
msgs::OnionHopDataFormat::FinalNode { payment_data, keysend_preimage, .. } => { // TODO: expose the payment_metadata to the user
21622162
if payment_data.is_some() && keysend_preimage.is_some() {
21632163
return Err(ReceiveError {
21642164
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::util::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

@@ -1145,6 +1145,7 @@ mod fuzzy_internal_msgs {
11451145
},
11461146
FinalNode {
11471147
payment_data: Option<FinalOnionHopData>,
1148+
payment_metadata: Option<Vec<u8>>,
11481149
keysend_preimage: Option<PaymentPreimage>,
11491150
},
11501151
}
@@ -1576,11 +1577,12 @@ impl Writeable for OnionHopData {
15761577
(6, short_channel_id, required)
15771578
});
15781579
},
1579-
OnionHopDataFormat::FinalNode { ref payment_data, ref keysend_preimage } => {
1580+
OnionHopDataFormat::FinalNode { ref payment_data, ref payment_metadata, ref keysend_preimage } => {
15801581
_encode_varint_length_prefixed_tlv!(w, {
15811582
(2, HighZeroBytesDroppedBigSize(self.amt_to_forward), required),
15821583
(4, HighZeroBytesDroppedBigSize(self.outgoing_cltv_value), required),
15831584
(8, payment_data, option),
1585+
(16, payment_metadata.as_ref().map(|m| WithoutLength(m)), option),
15841586
(5482373484, keysend_preimage, option)
15851587
});
15861588
},
@@ -1595,29 +1597,33 @@ impl Readable for OnionHopData {
15951597
let mut cltv_value = HighZeroBytesDroppedBigSize(0u32);
15961598
let mut short_id: Option<u64> = None;
15971599
let mut payment_data: Option<FinalOnionHopData> = None;
1600+
let mut payment_metadata: Option<WithoutLength<Vec<u8>>> = None;
15981601
let mut keysend_preimage: Option<PaymentPreimage> = None;
15991602
read_tlv_fields!(r, {
16001603
(2, amt, required),
16011604
(4, cltv_value, required),
16021605
(6, short_id, option),
16031606
(8, payment_data, option),
1607+
(16, payment_metadata, option),
16041608
// See https://github.com/lightning/blips/blob/master/blip-0003.md
16051609
(5482373484, keysend_preimage, option)
16061610
});
16071611

16081612
let format = if let Some(short_channel_id) = short_id {
16091613
if payment_data.is_some() { return Err(DecodeError::InvalidValue); }
1614+
if payment_metadata.is_some() { return Err(DecodeError::InvalidValue); }
16101615
OnionHopDataFormat::NonFinalNode {
16111616
short_channel_id,
16121617
}
16131618
} else {
1614-
if let &Some(ref data) = &payment_data {
1619+
if let Some(data) = &mut payment_data {
16151620
if data.total_msat > MAX_VALUE_MSAT {
16161621
return Err(DecodeError::InvalidValue);
16171622
}
16181623
}
16191624
OnionHopDataFormat::FinalNode {
16201625
payment_data,
1626+
payment_metadata: payment_metadata.map(|w| w.0),
16211627
keysend_preimage,
16221628
}
16231629
};
@@ -2783,6 +2789,7 @@ mod tests {
27832789
let mut msg = msgs::OnionHopData {
27842790
format: OnionHopDataFormat::FinalNode {
27852791
payment_data: None,
2792+
payment_metadata: None,
27862793
keysend_preimage: None,
27872794
},
27882795
amt_to_forward: 0x0badf00d01020304,
@@ -2806,6 +2813,7 @@ mod tests {
28062813
payment_secret: expected_payment_secret,
28072814
total_msat: 0x1badca1f
28082815
}),
2816+
payment_metadata: None,
28092817
keysend_preimage: None,
28102818
},
28112819
amt_to_forward: 0x0badf00d01020304,
@@ -2820,6 +2828,7 @@ mod tests {
28202828
payment_secret,
28212829
total_msat: 0x1badca1f
28222830
}),
2831+
payment_metadata: None,
28232832
keysend_preimage: None,
28242833
} = msg.format {
28252834
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, paymen
170170
total_msat,
171171
})
172172
} else { None },
173+
payment_metadata: None,
173174
keysend_preimage: *keysend_preimage,
174175
}
175176
} else {

0 commit comments

Comments
 (0)