Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pgqzzgrvgphnzutnw9chzut3w9chrem3w9chrruw3ekkuemhn7ff0xy2llllllllllll8llllakhgwtnwajxsdt3vachwctwdq6nvur2wa5xk6ejxeersam9dd4h8lllpyq0llllqqq8zut3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zprqzqqqqfenwm35qgpqysszqgpqvqszqgpqyqszqgpqyqszqgqqyqszqgpqyqszdq3nswfnpgzxjuehwamhgqnrpnqgpp0dlafgq5jj2ff99jwfe56xs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zppsyk6tqqqqq6r8weksyqhlllllllllqgpqyqszqt79uqszqgpqyqszqgpqyqszqgp2tfgz5kj6tfd95kjnywt8x3artfd95kj6tf095kjsqqq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pqqhz9zmtgcxvdngvamx6qszqgpqyqszqgpqyqszqgfqyqszqgpqyqszqgpqyqszqgpqyq3nxuuxxmrjw5crxdmcqyqszqgpqyqssqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszpc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1qgqqsqq2qq8qqyrqqfd45vrxxcqqqqrrqgpqyqszqgpqyqhuqqqqqqqqqqqqyqszqgpqyqszlmlqqqgzqgpxsdmwx3mnwwpkd9ea4lqqqqqqqqqqqrdd4kk6mtdd4kk6mtyujvxfe8yunjwfxufqqxsuq5qqqqq7qqsqyqnsw5
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pqq0aljpq38sq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zz9s9lll8lllllllluvqqqqqllllllgfllllllllllll7qqqqqqqqqqqqtllllllllllllllllllll6pqqpqqqqqqqqqqqqq95qqqqqqdehnqqqqqqqqqqqqqqq05qsqqqqqqqqqqqqqqqqqqqqqjqqqqqqr6qqqqqq8jqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqpaqpkkcvrnw9ukkmrvd3kq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zr8s9lll8lllllllluvqqqqqllllllcfllllllllllll7qqqqqqqqqqqqtllllllllllllllllllll6pqq4syqqqqqqqqqqqqyqqqqqqqqqqzqqqqqqqqqqqqqq05q4u878sqsz3qqqqqqqqqqyqz7swq943gq0eyqp0jqqq85qqqqqq0yqqqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqq85qqqqgqqqqqqqqqqyqqq7gqqqqqqqqqqqqqqqqzqqqqqqqqqqqxsvnvd5nsqqqqqqqqq7gqqqqqqqqqqqqqqqqzqqqqqqrjw5crxmrwduch5urnw9ukkmrvd3kq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1lll7llllllll6ecy9v4jk2et9v4jk2et9v4jk2etqs4jk2etgy4jk2lll0ll72et9v4jk2et9v4jksft9v4ll7llllllllll9v4jk2et9v4llllllaq5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9q5zs2pg9qllllllllllllllllllllll7tl7ecylllkcmn0wyu85ut3wyqqqqqqllllllllllllllllllll7u0lllllllcqqqqqpllllllsqqqq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zq7sz6qz8qunx6mnxu9rffdv5kjaeff85kj6tf0llllnwm35wu38xetgwlyuj6gy7c98xdnwxg9qz7swqy68wum9y5qzhjwfe56xs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pqq0usgqae8splh7lczy7qq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zpzq9lll8lllllllllllllll5mll7psqllllllllllll7qqqqqqqqqqqqg9llllllugygqhllullllllllllllllqgpqyqszqgpqyqszqgp0lfhl4z52329frg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1qgqqsqq2qq8qqysqrgqsq8q9qqqqq8sqyqpqyur4
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zppsyk6tqqqqq6r8weksyq30qgpqyqszqgpqyqszqgpqyqszqgp2tfgzqgpqyqk8clrs9fd95kj6tfd95kjsqqhllllllfd9tdd942a290j6hts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zr8s9lll8lllllllluvqqqqqllllllcfllllllllllll7qqqqqqqqqqqqtllllllllllllllllllll6pqq4syqqqqqqqqqqqqyqqqqqqqqqqzqqqqqqqqqqqqqq05q4u878sqsz3qqqqqqqqqqyqz7swq943gq0eyqp0jqqq85qqqqqq0yqqqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqq85qqqqqq0yqqqqqqqqqqqqqqqqpqqqqqqqqqqqrgxfkx6fcqqqqqqqqqzs7sqqqqqpusqqqqqqqqqqqqqqqqyqqqqqq8yafsxdkxume30fc8xuteddkxcmrv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1lekxuqn0pgp9k2e3wqp9kwttxg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqngxs6rv6e5wv4nwumhv458wam5wfj8qctc0qm0ajv2xspqyqszqf5rgdpkdv68x2ehwdmk26rhwa68yersv9u8sdh7qq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1lekrz26mqfh9k
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zppsrlcztddrqe3kdqpqqqqqqgpq9llllllllllllachrlcdp5xs6rgdqgpqzqqqqqqqqqqqqyqqsqqqdceqqqqzqqrxcmsvduchrl79qqqrzrg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1qcqqsqqjqqsqdl07prllllllllllllllllllllllllllllllllllllllllllmlllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll7q86llllllllllllllllt4kxume3pgqsq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1qcqpqscztd9sqqqqdpnhvmgzqgpq9lgzqgpqyqj7qgpq9lt8qgpqyqszqgpqyqszqgpqyqsz5kj6tfd95kj6tfd95kj6tfd95kj62k66tgd95kj6lvyqqrsql87nj
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zzcq9lll8lllllllluvqqqqqllllllcfllllllllllll7qqqqqqqqqqqqtllllllllllllllllllllmgduexqqqqqqqqqsgqqgqqqqqqqqqqqqqqqqqqqqqqqqq05qsqqqqqqqqqqqqqqqqqqqqqqqqqqqqr6qqqqqq8jqqqqqqqqqqqqqqqqqsqqqqqqqqzqgpqyqszqgpqr7szqgpqy6ryqgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqyqkyxvurxqm3v4uqqqqqqqq8jutn0fchzut3d4ehz6mvd3k0jmq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zppsrlcztddrqe3kdqpqqqqqqgpqyqszqgpqyqhlllllllcdp5xs6rgdqgpqypcqqqqqqqqqqphryqqqqgqq9lc2pq9q5zq2pg9p5zs2rg9p5zs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1qcqqsqqjqqsxkvgqsyq0lllll7424252lllsqqqp4gqqp24242qrg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zqssyc3svcmzg6r8wmllllllllllllcflllllllllllsqqqqqqqqqqqqqrllllllllllllcqqqqqqqqqqqp0lllllas0llllllllllllgyqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaqqqqqqqqqqqqqqqqqqqqqqqzqqqqplcqqqpqqqqqqqqqqqqqqqqqqqqqqrll7z0llllllllllllsqqqqqqqqqqqzllllllmqllllllllllll7sgqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqr6qqqqqqqqqqqqqqqqqqqgqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqq84jxcmtvxpskc6phqq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pqq0usgqae8splnwdll57qq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pfkxu6pew46rx7n4wnzc335ud3hx76r6dp6hgvmgdf6hf3vgc6wvtzxxn3kxummrdquh2apndpa82ax93rrfcmrwda585at5xdmnjmng0f6hf3vgc6wxcmn0dparjat5xd5zv7n4wnzc335uckyrx6r6w46vtzxxnnzc33nrdp585at5
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1qyqqvqqgqq8qqysqy5qzkqp3qq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1zpzsyk66xpnrv6r8weksyqszqfjqqqszqgpqyqszzgpqyqszqgpqyqszqgpqyqszqgpqyveh8p3kcun4xqenwwem8vankw6329g4r2z329g4z5232y
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1lc7h5qpaqq
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lno1pq9qfudt42whplenwdcs
159 changes: 156 additions & 3 deletions tests/fuzz/fuzz-bolt12-offer-decode.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include "config.h"
#include <assert.h>
#include <ccan/mem/mem.h>
#include <common/bolt12.h>
#include <common/utils.h>
#include <stddef.h>
Expand All @@ -7,12 +9,163 @@

const char *bech32_hrp = "lno";

static bool sciddir_or_pubkey_eq(const struct sciddir_or_pubkey *a,
const struct sciddir_or_pubkey *b)
{
if (a->is_pubkey != b->is_pubkey)
return false;
if (a->is_pubkey)
return pubkey_eq(&a->pubkey, &b->pubkey);
else
return short_channel_id_dir_eq(&a->scidd, &b->scidd);
}

static bool recurrence_eq(const struct recurrence *a, const struct recurrence *b)
{
return a->time_unit == b->time_unit && a->period == b->period;
}

static bool recurrence_paywindow_eq(const struct recurrence_paywindow *a,
const struct recurrence_paywindow *b)
{
return a->seconds_before == b->seconds_before && a->seconds_after == b->seconds_after;
}

static bool recurrence_base_eq(const struct recurrence_base *a,
const struct recurrence_base *b)
{
return a->basetime == b->basetime && a->proportional_amount == b->proportional_amount;
}

static bool blinded_path_eq(const struct blinded_path *a,
const struct blinded_path *b)
{
if (!sciddir_or_pubkey_eq(&a->first_node_id, &b->first_node_id))
return false;
if (!pubkey_eq(&a->first_path_key, &b->first_path_key))
return false;
if (tal_count(a->path) != tal_count(b->path))
return false;
for (size_t i = 0; i < tal_count(a->path); i++) {
const struct blinded_path_hop *h1 = a->path[i];
const struct blinded_path_hop *h2 = b->path[i];
if (h1 == h2)
continue;
if (!h1 || !h2)
return false;
if (!pubkey_eq(&h1->blinded_node_id, &h2->blinded_node_id))
return false;
if (tal_bytelen(h1->encrypted_recipient_data) !=
tal_bytelen(h2->encrypted_recipient_data))
return false;
if (memcmp(h1->encrypted_recipient_data, h2->encrypted_recipient_data,
tal_bytelen(h1->encrypted_recipient_data)) != 0)
return false;
}
return true;
}

static bool tlv_offer_eq(const struct tlv_offer *a, const struct tlv_offer *b)
{

#define PTR_EQ(field, eqfn) \
do { \
if (a->field != b->field) { \
if (!a->field || !b->field) \
return false; \
if (!eqfn(a->field, b->field)) \
return false; \
} \
} while (0)

#define MEM_EQ(field) \
do { \
if (a->field != b->field) { \
if (!a->field || !b->field) \
return false; \
if (tal_bytelen(a->field) != tal_bytelen(b->field)) \
return false; \
if (memcmp(a->field, b->field, tal_bytelen(a->field)) != 0) \
return false; \
} \
} while (0)

#define VAL_EQ(field) \
do { \
if (a->field != b->field) { \
if (!a->field || !b->field) \
return false; \
if (*a->field != *b->field) \
return false; \
} \
} while (0)

#define ARR_EQ(field, eqfn) \
do { \
if (a->field != b->field) { \
if (!a->field || !b->field) \
return false; \
if (tal_count(a->field) != tal_count(b->field)) \
return false; \
for (size_t i = 0; i < tal_count(a->field); i++) { \
if (!eqfn(&a->field[i], &b->field[i])) \
return false; \
} \
} \
} while (0)

#define PTR_ARR_EQ(field, eqfn) \
do { \
if (a->field != b->field) { \
if (!a->field || !b->field) \
return false; \
if (tal_count(a->field) != tal_count(b->field)) \
return false; \
for (size_t i = 0; i < tal_count(a->field); i++) { \
if (!eqfn(a->field[i], b->field[i])) \
return false; \
} \
} \
} while (0)

ARR_EQ(offer_chains, bitcoin_blkid_eq);
MEM_EQ(offer_metadata);
MEM_EQ(offer_currency);
VAL_EQ(offer_amount);
MEM_EQ(offer_description);
MEM_EQ(offer_features);
VAL_EQ(offer_absolute_expiry);
PTR_ARR_EQ(offer_paths, blinded_path_eq);
MEM_EQ(offer_issuer);
VAL_EQ(offer_quantity_max);
PTR_EQ(offer_issuer_id, pubkey_eq);
PTR_EQ(offer_recurrence_compulsory, recurrence_eq);
PTR_EQ(offer_recurrence_optional, recurrence_eq);
PTR_EQ(offer_recurrence_base, recurrence_base_eq);
PTR_EQ(offer_recurrence_paywindow, recurrence_paywindow_eq);
VAL_EQ(offer_recurrence_limit);

return true;
}

void run(const u8 *data, size_t size)
{
char *fail;
struct tlv_offer *offer, *decoded_offer;
char *fail = NULL, *encoded_offer;

offer = offer_decode(tmpctx, (const char *)data, size,
/*feature_set=*/NULL, /*must_be_chain=*/NULL, &fail);
if (!offer)
goto cleanup;

encoded_offer = offer_encode(tmpctx, offer);

offer_decode(tmpctx, (const char *)data, size, /*feature_set=*/NULL,
/*must_be_chain=*/NULL, &fail);
decoded_offer = offer_decode(tmpctx, encoded_offer, strlen(encoded_offer),
NULL, NULL, &fail);
assert(!fail);
assert(decoded_offer);
assert(tlv_offer_eq(offer, decoded_offer));

cleanup:
clean_tmpctx();
}
Loading