Skip to content

Commit 3e9d4de

Browse files
rustyrussellcdecker
authored andcommitted
common: add testing for proposed bolt11 additional tests.
See-also: lightning/bolts#736 Signed-off-by: Rusty Russell <[email protected]>
1 parent 77c867d commit 3e9d4de

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

common/test/run-bolt11.c

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,11 +353,108 @@ int main(void)
353353

354354
test_b11("lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q5sqqqqqqqqqqqqqqqpqsq67gye39hfg3zd8rgc80k32tvy9xk2xunwm5lzexnvpx6fd77en8qaq424dxgt56cag2dpt359k3ssyhetktkpqh24jqnjyw6uqd08sgptq44qu", b11, NULL);
355355

356+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11
357+
*
358+
* > ### Same, but including fields which must be ignored.
359+
* > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q5sqqqqqqqqqqqqqqqpqsq2qrqqqfppnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqhpnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqhp4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqspnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsp4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnp5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnpkqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq2jxxfsnucm4jf4zwtznpaxphce606fvhvje5x7d4gw7n73994hgs7nteqvenq8a4ml8aqtchv5d9pf7l558889hp4yyrqv6a7zpq9fgpskqhza
360+
*
361+
* Breakdown:
362+
*
363+
* * `lnbc`: prefix, Lightning on Bitcoin mainnet
364+
* * `25m`: amount (25 milli-bitcoin)
365+
* * `1`: Bech32 separator
366+
* * `pvjluez`: timestamp (1496314658)
367+
* * `p`: payment hash...
368+
* * `d`: short description
369+
* * `q5`: `data_length` (`q` = 0, `5` = 20; 0 * 32 + 20 == 20)
370+
* * `vdhkven9v5sxyetpdees`: 'coffee beans'
371+
* * `s`: payment secret
372+
* * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52)
373+
* * `zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs`: 0x1111111111111111111111111111111111111111111111111111111111111111
374+
* * `9`: features
375+
* * `q5`: `data_length` (`q` = 0, `5` = 20; 0 * 32 + 20 == 20)
376+
* * `sqqqqqqqqqqqqqqqpqsq`: b1000....00001000001000000000
377+
* * `2`: unknown field
378+
* * `qr`: `data_length` (`q` = 0, `r` = 3; 0 * 32 + 3 == 3)
379+
* * `qqq`: zeroes
380+
* * `f`: tagged field: fallback address
381+
* * `pp`: `data_length` (`p` = 1, `p` = 1; 1 * 32 + 1 == 33)
382+
* * `nqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`: fallback address type 19 (ignored)
383+
* * `p`: payment hash
384+
* * `pn`: `data_length` (`p` = 1, `n` = 19; 1 * 32 + 19 == 51) (ignored)
385+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
386+
* * `p`: payment hash
387+
* * `p4`: `data_length` (`p` = 1, `4` = 21; 1 * 32 + 21 == 53) (ignored)
388+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
389+
* * `h`: hash of description
390+
* * `pn`: `data_length` (`p` = 1, `n` = 19; 1 * 32 + 19 == 51) (ignored)
391+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
392+
* * `h`: hash of description
393+
* * `p4`: `data_length` (`p` = 1, `4` = 21; 1 * 32 + 21 == 53) (ignored)
394+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
395+
* * `s`: payment secret
396+
* * `pn`: `data_length` (`p` = 1, `n` = 19; 1 * 32 + 19 == 51) (ignored)
397+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
398+
* * `s`: payment secret
399+
* * `p4`: `data_length` (`p` = 1, `4` = 21; 1 * 32 + 21 == 53) (ignored)
400+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
401+
* * `n`: node id
402+
* * `p5`: `data_length` (`p` = 1, `5` = 20; 1 * 32 + 20 == 52) (ignored)
403+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
404+
* * `n`: node id
405+
* * `pk`: `data_length` (`p` = 1, `k` = 22; 1 * 32 + 22 == 54) (ignored)
406+
* * `qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`
407+
* * `2jxxfsnucm4jf4zwtznpaxphce606fvhvje5x7d4gw7n73994hgs7nteqvenq8a4ml8aqtchv5d9pf7l558889hp4yyrqv6a7zpq9fgp`: signature
408+
* * `skqhza`: Bech32 checksum
409+
*/
410+
extra = tal_arr(b11, struct bolt11_field, 10);
411+
/* Unknown field */
412+
extra[0].tag = '2';
413+
extra[0].data = tal_arrz(extra, u8, 3);
414+
list_add_tail(&b11->extra_fields, &extra[0].list);
415+
/* f with unknown version */
416+
extra[1].tag = 'f';
417+
extra[1].data = tal_arrz(extra, u8, 33);
418+
list_add_tail(&b11->extra_fields, &extra[1].list);
419+
extra[1].data[0] = 19;
420+
/* p field too short & long */
421+
extra[2].tag = 'p';
422+
extra[2].data = tal_arrz(extra, u8, 51);
423+
list_add_tail(&b11->extra_fields, &extra[2].list);
424+
extra[3].tag = 'p';
425+
extra[3].data = tal_arrz(extra, u8, 53);
426+
list_add_tail(&b11->extra_fields, &extra[3].list);
427+
/* h field too short & long */
428+
extra[4].tag = 'h';
429+
extra[4].data = tal_arrz(extra, u8, 51);
430+
list_add_tail(&b11->extra_fields, &extra[4].list);
431+
extra[5].tag = 'h';
432+
extra[5].data = tal_arrz(extra, u8, 53);
433+
list_add_tail(&b11->extra_fields, &extra[5].list);
434+
/* s field too short & long */
435+
extra[6].tag = 's';
436+
extra[6].data = tal_arrz(extra, u8, 51);
437+
list_add_tail(&b11->extra_fields, &extra[6].list);
438+
extra[7].tag = 's';
439+
extra[7].data = tal_arrz(extra, u8, 53);
440+
list_add_tail(&b11->extra_fields, &extra[7].list);
441+
/* n field too short & long */
442+
extra[8].tag = 'n';
443+
extra[8].data = tal_arrz(extra, u8, 52);
444+
list_add_tail(&b11->extra_fields, &extra[8].list);
445+
extra[9].tag = 'n';
446+
extra[9].data = tal_arrz(extra, u8, 54);
447+
list_add_tail(&b11->extra_fields, &extra[9].list);
448+
449+
test_b11("lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q5sqqqqqqqqqqqqqqqpqsq2qrqqqfppnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpp4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqhpnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqhp4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqspnqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqsp4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnp5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnpkqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq2jxxfsnucm4jf4zwtznpaxphce606fvhvje5x7d4gw7n73994hgs7nteqvenq8a4ml8aqtchv5d9pf7l558889hp4yyrqv6a7zpq9fgpskqhza", b11, NULL);
450+
356451
/* BOLT #11:
357452
*
358453
* > # Same, but adding invalid unknown feature 100
359454
* > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q4psqqqqqqqqqqqqqqqpqsqq40wa3khl49yue3zsgm26jrepqr2eghqlx86rttutve3ugd05em86nsefzh4pfurpd9ek9w2vp95zxqnfe2u7ckudyahsa52q66tgzcp6t2dyk
360455
*/
456+
/* Clear extra fields from previous */
457+
list_head_init(&b11->extra_fields);
361458
/* This one can be encoded, but not decoded */
362459
set_feature_bit(&b11->features, 100);
363460
badstr = bolt11_encode(tmpctx, b11, false, test_sign, NULL);
@@ -423,6 +520,48 @@ int main(void)
423520
b11->routes[0]->cltv_expiry_delta = 40;
424521
test_b11("lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j", b11, NULL);
425522

523+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11:
524+
*
525+
* > ### Bech32 checksum is invalid.
526+
* > lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpuyk0sg5g70me25alkluzd2x62aysf2pyy8edtjeevuv4p2d5p76r4zkmneet7uvyakky2zr4cusd45tftc9c5fh0nnqpnl2jfll544esqchsrnt
527+
*/
528+
assert(!bolt11_decode(tmpctx, "lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpuyk0sg5g70me25alkluzd2x62aysf2pyy8edtjeevuv4p2d5p76r4zkmneet7uvyakky2zr4cusd45tftc9c5fh0nnqpnl2jfll544esqchsrnt", NULL, &fail));
529+
assert(streq(fail, "Bad bech32 string"));
530+
531+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11:
532+
* > ### Malformed bech32 string (no 1)
533+
* > pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpuyk0sg5g70me25alkluzd2x62aysf2pyy8edtjeevuv4p2d5p76r4zkmneet7uvyakky2zr4cusd45tftc9c5fh0nnqpnl2jfll544esqchsrny
534+
*/
535+
assert(!bolt11_decode(tmpctx, "pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpuyk0sg5g70me25alkluzd2x62aysf2pyy8edtjeevuv4p2d5p76r4zkmneet7uvyakky2zr4cusd45tftc9c5fh0nnqpnl2jfll544esqchsrny", NULL, &fail));
536+
assert(streq(fail, "Bad bech32 string"));
537+
538+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11:
539+
* > ### Malformed bech32 string (mixed case)
540+
* > LNBC2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpuyk0sg5g70me25alkluzd2x62aysf2pyy8edtjeevuv4p2d5p76r4zkmneet7uvyakky2zr4cusd45tftc9c5fh0nnqpnl2jfll544esqchsrny
541+
*/
542+
assert(!bolt11_decode(tmpctx, "LNBC2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpquwpc4curk03c9wlrswe78q4eyqc7d8d0xqzpuyk0sg5g70me25alkluzd2x62aysf2pyy8edtjeevuv4p2d5p76r4zkmneet7uvyakky2zr4cusd45tftc9c5fh0nnqpnl2jfll544esqchsrny", NULL, &fail));
543+
assert(streq(fail, "Bad bech32 string"));
544+
545+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11:
546+
* > ### Signature is not recoverable.
547+
* > lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaxtrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rspk28uwq
548+
*/
549+
assert(!bolt11_decode(tmpctx, "lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaxtrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2awhz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rspk28uwq", NULL, &fail));
550+
assert(streq(fail, "signature recovery failed"));
551+
552+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11:
553+
* > ### String is too short.
554+
* > lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6na6hlh
555+
*/
556+
assert(!bolt11_decode(tmpctx, "lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6na6hlh", NULL, &fail));
557+
558+
/* BOLT-4e228a7fb4ea78af914d1ce82a63cbce8026279e #11:
559+
* > ### Invalid multiplier
560+
* > lnbc2500x1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpujr6jxr9gq9pv6g46y7d20jfkegkg4gljz2ea2a3m9lmvvr95tq2s0kvu70u3axgelz3kyvtp2ywwt0y8hkx2869zq5dll9nelr83zzqqpgl2zg
561+
*/
562+
assert(!bolt11_decode(tmpctx, "lnbc2500x1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpujr6jxr9gq9pv6g46y7d20jfkegkg4gljz2ea2a3m9lmvvr95tq2s0kvu70u3axgelz3kyvtp2ywwt0y8hkx2869zq5dll9nelr83zzqqpgl2zg", NULL, &fail));
563+
assert(streq(fail, "Invalid amount postfix 'x'"));
564+
426565
/* FIXME: Test the others! */
427566
wally_cleanup(0);
428567
tal_free(tmpctx);

0 commit comments

Comments
 (0)