Skip to content

Commit 87e52e3

Browse files
authored
Merge pull request #3505 from tnull/2025-01-allow-upperase-hrp
Allow uppercase bech32 HRP
2 parents afa2f9c + 7272969 commit 87e52e3

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

lightning/src/offers/parse.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -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 {
233234
mod 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

Comments
 (0)