@@ -58,7 +58,8 @@ mod sealed {
58
58
59
59
let parsed = CheckedHrpstring :: new :: < NoChecksum > ( encoded. as_ref ( ) ) ?;
60
60
let hrp = parsed. hrp ( ) ;
61
- if hrp. as_str ( ) != Self :: BECH32_HRP {
61
+ // Compare the lowercase'd iter to allow for all-uppercase HRPs
62
+ if hrp. lowercase_char_iter ( ) . ne ( Self :: BECH32_HRP . chars ( ) ) {
62
63
return Err ( Bolt12ParseError :: InvalidBech32Hrp ) ;
63
64
}
64
65
@@ -233,6 +234,7 @@ impl From<secp256k1::Error> for Bolt12ParseError {
233
234
mod bolt12_tests {
234
235
use super :: Bolt12ParseError ;
235
236
use crate :: offers:: offer:: Offer ;
237
+ use bech32:: primitives:: decode:: { CheckedHrpstringError , UncheckedHrpstringError , CharError } ;
236
238
237
239
#[ test]
238
240
fn encodes_offer_as_bech32_without_checksum ( ) {
@@ -249,6 +251,9 @@ mod bolt12_tests {
249
251
// A complete string is valid
250
252
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg" ,
251
253
254
+ // Uppercase is valid
255
+ "LNO1PQPS7SJQPGTYZM3QV4UXZMTSD3JJQER9WD3HY6TSW35K7MSJZFPY7NZ5YQCNYGRFDEJ82UM5WF5K2UCKYYPWA3EYT44H6TXTXQUQH7LZ5DJGE4AFGFJN7K4RGRKUAG0JSD5XVXG" ,
256
+
252
257
// + can join anywhere
253
258
"l+no1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg" ,
254
259
@@ -282,6 +287,16 @@ mod bolt12_tests {
282
287
}
283
288
}
284
289
}
290
+
291
+ #[ test]
292
+ fn fails_parsing_bech32_encoded_offers_with_mixed_casing ( ) {
293
+ // We assert that mixed-case encoding fails to parse.
294
+ let mixed_case_offer = "LnO1PqPs7sJqPgTyZm3qV4UxZmTsD3JjQeR9Wd3hY6TsW35k7mSjZfPy7nZ5YqCnYgRfDeJ82uM5Wf5k2uCkYyPwA3EyT44h6tXtXqUqH7Lz5dJgE4AfGfJn7k4rGrKuAg0jSd5xVxG" ;
295
+ match mixed_case_offer. parse :: < Offer > ( ) {
296
+ Ok ( _) => panic ! ( "Valid offer: {}" , mixed_case_offer) ,
297
+ Err ( e) => assert_eq ! ( e, Bolt12ParseError :: Bech32 ( CheckedHrpstringError :: Parse ( UncheckedHrpstringError :: Char ( CharError :: MixedCase ) ) ) ) ,
298
+ }
299
+ }
285
300
}
286
301
287
302
#[ cfg( test) ]
0 commit comments