@@ -58,7 +58,8 @@ mod sealed {
5858
5959 let parsed = CheckedHrpstring :: new :: < NoChecksum > ( encoded. as_ref ( ) ) ?;
6060 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 ( ) ) {
6263 return Err ( Bolt12ParseError :: InvalidBech32Hrp ) ;
6364 }
6465
@@ -233,6 +234,7 @@ impl From<secp256k1::Error> for Bolt12ParseError {
233234mod bolt12_tests {
234235 use super :: Bolt12ParseError ;
235236 use crate :: offers:: offer:: Offer ;
237+ use bech32:: primitives:: decode:: { CheckedHrpstringError , UncheckedHrpstringError , CharError } ;
236238
237239 #[ test]
238240 fn encodes_offer_as_bech32_without_checksum ( ) {
@@ -249,6 +251,9 @@ mod bolt12_tests {
249251 // A complete string is valid
250252 "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg" ,
251253
254+ // Uppercase is valid
255+ "LNO1PQPS7SJQPGTYZM3QV4UXZMTSD3JJQER9WD3HY6TSW35K7MSJZFPY7NZ5YQCNYGRFDEJ82UM5WF5K2UCKYYPWA3EYT44H6TXTXQUQH7LZ5DJGE4AFGFJN7K4RGRKUAG0JSD5XVXG" ,
256+
252257 // + can join anywhere
253258 "l+no1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg" ,
254259
@@ -282,6 +287,16 @@ mod bolt12_tests {
282287 }
283288 }
284289 }
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+ }
285300}
286301
287302#[ cfg( test) ]
0 commit comments