@@ -1323,7 +1323,7 @@ impl Readable for InvoiceRequestFields {
1323
1323
1324
1324
#[ cfg( test) ]
1325
1325
mod tests {
1326
- use super :: { ExperimentalInvoiceRequestTlvStreamRef , INVOICE_REQUEST_TYPES , InvoiceRequest , InvoiceRequestFields , InvoiceRequestTlvStreamRef , PAYER_NOTE_LIMIT , SIGNATURE_TAG , UnsignedInvoiceRequest } ;
1326
+ use super :: { EXPERIMENTAL_INVOICE_REQUEST_TYPES , ExperimentalInvoiceRequestTlvStreamRef , INVOICE_REQUEST_TYPES , InvoiceRequest , InvoiceRequestFields , InvoiceRequestTlvStreamRef , PAYER_NOTE_LIMIT , SIGNATURE_TAG , UnsignedInvoiceRequest } ;
1327
1327
1328
1328
use bitcoin:: blockdata:: constants:: ChainHash ;
1329
1329
use bitcoin:: network:: Network ;
@@ -1337,7 +1337,7 @@ mod tests {
1337
1337
use crate :: ln:: inbound_payment:: ExpandedKey ;
1338
1338
use crate :: ln:: msgs:: { DecodeError , MAX_VALUE_MSAT } ;
1339
1339
use crate :: offers:: invoice:: { Bolt12Invoice , SIGNATURE_TAG as INVOICE_SIGNATURE_TAG } ;
1340
- use crate :: offers:: merkle:: { SignError , SignatureTlvStreamRef , TaggedHash , self } ;
1340
+ use crate :: offers:: merkle:: { SignError , SignatureTlvStreamRef , TaggedHash , TlvStream , self } ;
1341
1341
use crate :: offers:: nonce:: Nonce ;
1342
1342
use crate :: offers:: offer:: { Amount , ExperimentalOfferTlvStreamRef , OfferTlvStreamRef , Quantity } ;
1343
1343
#[ cfg( not( c_bindings) ) ]
@@ -2472,10 +2472,79 @@ mod tests {
2472
2472
}
2473
2473
}
2474
2474
2475
+ #[ test]
2476
+ fn parses_invoice_request_with_experimental_tlv_records ( ) {
2477
+ const UNKNOWN_ODD_TYPE : u64 = EXPERIMENTAL_INVOICE_REQUEST_TYPES . start + 1 ;
2478
+ assert ! ( UNKNOWN_ODD_TYPE % 2 == 1 ) ;
2479
+
2480
+ let secp_ctx = Secp256k1 :: new ( ) ;
2481
+ let keys = Keypair :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
2482
+ let mut unsigned_invoice_request = OfferBuilder :: new ( keys. public_key ( ) )
2483
+ . amount_msats ( 1000 )
2484
+ . build ( ) . unwrap ( )
2485
+ . request_invoice ( vec ! [ 1 ; 32 ] , keys. public_key ( ) ) . unwrap ( )
2486
+ . build ( ) . unwrap ( ) ;
2487
+
2488
+ BigSize ( UNKNOWN_ODD_TYPE ) . write ( & mut unsigned_invoice_request. experimental_bytes ) . unwrap ( ) ;
2489
+ BigSize ( 32 ) . write ( & mut unsigned_invoice_request. experimental_bytes ) . unwrap ( ) ;
2490
+ [ 42u8 ; 32 ] . write ( & mut unsigned_invoice_request. experimental_bytes ) . unwrap ( ) ;
2491
+
2492
+ let tlv_stream = TlvStream :: new ( & unsigned_invoice_request. bytes )
2493
+ . chain ( TlvStream :: new ( & unsigned_invoice_request. experimental_bytes ) ) ;
2494
+ unsigned_invoice_request. tagged_hash =
2495
+ TaggedHash :: from_tlv_stream ( SIGNATURE_TAG , tlv_stream) ;
2496
+
2497
+ let invoice_request = unsigned_invoice_request
2498
+ . sign ( |message : & UnsignedInvoiceRequest |
2499
+ Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & keys) )
2500
+ )
2501
+ . unwrap ( ) ;
2502
+
2503
+ let mut encoded_invoice_request = Vec :: new ( ) ;
2504
+ invoice_request. write ( & mut encoded_invoice_request) . unwrap ( ) ;
2505
+
2506
+ if let Err ( e) = InvoiceRequest :: try_from ( encoded_invoice_request) {
2507
+ panic ! ( "error parsing invoice_request: {:?}" , e) ;
2508
+ }
2509
+
2510
+ const UNKNOWN_EVEN_TYPE : u64 = EXPERIMENTAL_INVOICE_REQUEST_TYPES . start ;
2511
+ assert ! ( UNKNOWN_EVEN_TYPE % 2 == 0 ) ;
2512
+
2513
+ let mut unsigned_invoice_request = OfferBuilder :: new ( keys. public_key ( ) )
2514
+ . amount_msats ( 1000 )
2515
+ . build ( ) . unwrap ( )
2516
+ . request_invoice ( vec ! [ 1 ; 32 ] , keys. public_key ( ) ) . unwrap ( )
2517
+ . build ( ) . unwrap ( ) ;
2518
+
2519
+ BigSize ( UNKNOWN_EVEN_TYPE ) . write ( & mut unsigned_invoice_request. experimental_bytes ) . unwrap ( ) ;
2520
+ BigSize ( 32 ) . write ( & mut unsigned_invoice_request. experimental_bytes ) . unwrap ( ) ;
2521
+ [ 42u8 ; 32 ] . write ( & mut unsigned_invoice_request. experimental_bytes ) . unwrap ( ) ;
2522
+
2523
+ let tlv_stream = TlvStream :: new ( & unsigned_invoice_request. bytes )
2524
+ . chain ( TlvStream :: new ( & unsigned_invoice_request. experimental_bytes ) ) ;
2525
+ unsigned_invoice_request. tagged_hash =
2526
+ TaggedHash :: from_tlv_stream ( SIGNATURE_TAG , tlv_stream) ;
2527
+
2528
+ let invoice_request = unsigned_invoice_request
2529
+ . sign ( |message : & UnsignedInvoiceRequest |
2530
+ Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & keys) )
2531
+ )
2532
+ . unwrap ( ) ;
2533
+
2534
+ let mut encoded_invoice_request = Vec :: new ( ) ;
2535
+ invoice_request. write ( & mut encoded_invoice_request) . unwrap ( ) ;
2536
+
2537
+ match InvoiceRequest :: try_from ( encoded_invoice_request) {
2538
+ Ok ( _) => panic ! ( "expected error" ) ,
2539
+ Err ( e) => assert_eq ! ( e, Bolt12ParseError :: Decode ( DecodeError :: UnknownRequiredFeature ) ) ,
2540
+ }
2541
+ }
2542
+
2475
2543
#[ test]
2476
2544
fn fails_parsing_invoice_request_with_out_of_range_tlv_records ( ) {
2477
2545
let secp_ctx = Secp256k1 :: new ( ) ;
2478
2546
let keys = Keypair :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) ) ;
2547
+
2479
2548
let invoice_request = OfferBuilder :: new ( keys. public_key ( ) )
2480
2549
. amount_msats ( 1000 )
2481
2550
. build ( ) . unwrap ( )
@@ -2496,6 +2565,17 @@ mod tests {
2496
2565
Ok ( _) => panic ! ( "expected error" ) ,
2497
2566
Err ( e) => assert_eq ! ( e, Bolt12ParseError :: Decode ( DecodeError :: InvalidValue ) ) ,
2498
2567
}
2568
+
2569
+ let mut encoded_invoice_request = Vec :: new ( ) ;
2570
+ invoice_request. write ( & mut encoded_invoice_request) . unwrap ( ) ;
2571
+ BigSize ( EXPERIMENTAL_INVOICE_REQUEST_TYPES . end ) . write ( & mut encoded_invoice_request) . unwrap ( ) ;
2572
+ BigSize ( 32 ) . write ( & mut encoded_invoice_request) . unwrap ( ) ;
2573
+ [ 42u8 ; 32 ] . write ( & mut encoded_invoice_request) . unwrap ( ) ;
2574
+
2575
+ match InvoiceRequest :: try_from ( encoded_invoice_request) {
2576
+ Ok ( _) => panic ! ( "expected error" ) ,
2577
+ Err ( e) => assert_eq ! ( e, Bolt12ParseError :: Decode ( DecodeError :: InvalidValue ) ) ,
2578
+ }
2499
2579
}
2500
2580
2501
2581
#[ test]
0 commit comments