@@ -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