From 4718ee076c1ae001d2cb511c86341ae1a4025d3d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 31 Mar 2022 19:40:50 +1030 Subject: [PATCH] lightningd: metadata received support (log and decline). Signed-off-by: Rusty Russell --- common/onion.c | 7 +++++++ common/onion.h | 1 + lightningd/peer_htlcs.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/common/onion.c b/common/onion.c index 5fdcf7579..5f3f71bc4 100644 --- a/common/onion.c +++ b/common/onion.c @@ -241,6 +241,7 @@ struct onion_payload *onion_decode(const tal_t *ctx, p->amt_to_forward = fromwire_amount_msat(&cursor, &max); p->outgoing_cltv = fromwire_u32(&cursor, &max); p->payment_secret = NULL; + p->payment_metadata = NULL; p->blinding = NULL; /* We can't handle blinding with a legacy payload */ if (blinding) @@ -365,6 +366,12 @@ struct onion_payload *onion_decode(const tal_t *ctx, *p->total_msat = amount_msat(tlv->payment_data->total_msat); } + if (tlv->payment_metadata) + p->payment_metadata + = tal_dup_talarr(p, u8, tlv->payment_metadata); + else + p->payment_metadata = NULL; + p->tlv = tal_steal(p, tlv); return p; diff --git a/common/onion.h b/common/onion.h index 6f3045faf..828a6735d 100644 --- a/common/onion.h +++ b/common/onion.h @@ -19,6 +19,7 @@ struct onion_payload { struct amount_msat *total_msat; struct short_channel_id *forward_channel; struct secret *payment_secret; + u8 *payment_metadata; /* If blinding is set, blinding_ss is the shared secret.*/ struct pubkey *blinding; diff --git a/lightningd/peer_htlcs.c b/lightningd/peer_htlcs.c index 0f506c3b9..763ce23a4 100644 --- a/lightningd/peer_htlcs.c +++ b/lightningd/peer_htlcs.c @@ -363,7 +363,8 @@ static void handle_localpay(struct htlc_in *hin, struct amount_msat amt_to_forward, u32 outgoing_cltv_value, struct amount_msat total_msat, - const struct secret *payment_secret) + const struct secret *payment_secret, + const u8 *payment_metadata) { const u8 *failmsg; struct lightningd *ld = hin->key.channel->peer->ld; @@ -424,6 +425,27 @@ static void handle_localpay(struct htlc_in *hin, goto fail; } + /* We don't expect payment_metadata; reject here */ + if (payment_metadata) { + log_debug(hin->key.channel->log, + "Unexpected payment_metadata %s", + tal_hex(tmpctx, payment_metadata)); + /* BOLT #4: + * 1. type: PERM|22 (`invalid_onion_payload`) + * 2. data: + * * [`bigsize`:`type`] + * * [`u16`:`offset`] + * + * The decrypted onion per-hop payload was not understood by the processing node + * or is incomplete. If the failure can be narrowed down to a specific tlv type in + * the payload, the erring node may include that `type` and its byte `offset` in + * the decrypted byte stream. + */ + failmsg = towire_invalid_onion_payload(NULL, TLV_TLV_PAYLOAD_PAYMENT_METADATA, + /* FIXME: offset? */ 0); + goto fail; + } + htlc_set_add(ld, hin, total_msat, payment_secret); return; @@ -1033,6 +1055,10 @@ static void htlc_accepted_hook_serialize(struct htlc_accepted_hook_payload *p, json_add_secret(s, "payment_secret", p->payload->payment_secret); } + if (p->payload->payment_metadata) { + json_add_hex_talarr(s, "payment_metadata", + p->payload->payment_metadata); + } } json_add_hex_talarr(s, "next_onion", p->next_onion); json_add_secret(s, "shared_secret", hin->shared_secret); @@ -1082,7 +1108,8 @@ htlc_accepted_hook_final(struct htlc_accepted_hook_payload *request STEALS) request->payload->amt_to_forward, request->payload->outgoing_cltv, *request->payload->total_msat, - request->payload->payment_secret); + request->payload->payment_secret, + request->payload->payment_metadata); tal_free(request); }