@@ -353,11 +353,108 @@ int main(void)
353
353
354
354
test_b11 ("lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q5sqqqqqqqqqqqqqqqpqsq67gye39hfg3zd8rgc80k32tvy9xk2xunwm5lzexnvpx6fd77en8qaq424dxgt56cag2dpt359k3ssyhetktkpqh24jqnjyw6uqd08sgptq44qu" , b11 , NULL );
355
355
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
+
356
451
/* BOLT #11:
357
452
*
358
453
* > # Same, but adding invalid unknown feature 100
359
454
* > lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdeessp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygs9q4psqqqqqqqqqqqqqqqpqsqq40wa3khl49yue3zsgm26jrepqr2eghqlx86rttutve3ugd05em86nsefzh4pfurpd9ek9w2vp95zxqnfe2u7ckudyahsa52q66tgzcp6t2dyk
360
455
*/
456
+ /* Clear extra fields from previous */
457
+ list_head_init (& b11 -> extra_fields );
361
458
/* This one can be encoded, but not decoded */
362
459
set_feature_bit (& b11 -> features , 100 );
363
460
badstr = bolt11_encode (tmpctx , b11 , false, test_sign , NULL );
@@ -423,6 +520,48 @@ int main(void)
423
520
b11 -> routes [0 ]-> cltv_expiry_delta = 40 ;
424
521
test_b11 ("lnbc9678785340p1pwmna7lpp5gc3xfm08u9qy06djf8dfflhugl6p7lgza6dsjxq454gxhj9t7a0sd8dgfkx7cmtwd68yetpd5s9xar0wfjn5gpc8qhrsdfq24f5ggrxdaezqsnvda3kkum5wfjkzmfqf3jkgem9wgsyuctwdus9xgrcyqcjcgpzgfskx6eqf9hzqnteypzxz7fzypfhg6trddjhygrcyqezcgpzfysywmm5ypxxjemgw3hxjmn8yptk7untd9hxwg3q2d6xjcmtv4ezq7pqxgsxzmnyyqcjqmt0wfjjq6t5v4khxxqyjw5qcqp2rzjq0gxwkzc8w6323m55m4jyxcjwmy7stt9hwkwe2qxmy8zpsgg7jcuwz87fcqqeuqqqyqqqqlgqqqqn3qq9qn07ytgrxxzad9hc4xt3mawjjt8znfv8xzscs7007v9gh9j569lencxa8xeujzkxs0uamak9aln6ez02uunw6rd2ht2sqe4hz8thcdagpleym0j" , b11 , NULL );
425
522
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
+
426
565
/* FIXME: Test the others! */
427
566
wally_cleanup (0 );
428
567
tal_free (tmpctx );
0 commit comments