Skip to content

Commit 7232027

Browse files
committed
fix(bolt12): Add UTF-8 validation for offer currency field
Validate that offer_currency contains valid UTF-8 bytes as required by BOLT12 specification. ISO 4217 currency codes must be valid 3-letter ASCII strings, which are a subset of UTF-8.
1 parent 78fee88 commit 7232027

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

lightning/src/offers/offer.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,11 @@ impl TryFrom<FullOfferTlvStream> for OfferContents {
12161216
return Err(Bolt12SemanticError::MissingDescription);
12171217
}
12181218

1219+
if let Some(currency_bytes) = currency {
1220+
std::str::from_utf8(&currency_bytes)
1221+
.map_err(|_| Bolt12SemanticError::InvalidCurrencyCode)?;
1222+
}
1223+
12191224
let features = features.unwrap_or_else(OfferFeatures::empty);
12201225

12211226
let absolute_expiry =
@@ -2199,9 +2204,10 @@ mod bolt12_tests {
21992204

22002205
// Malformed: invalid currency UTF-8
22012206
assert_eq!(
2202-
"lno1qcpgqsg2q4q5cj2rg5tzzqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqg"
2203-
.parse::<Offer>(),
2204-
Err(Bolt12ParseError::Decode(DecodeError::ShortRead)),
2207+
"lno1qcp5624ypqpzwyq2p32x2um5ypmx2cm5dae8x93pqthvwfzadd7jejes8q9lhc4rvjxd022zv5l44g6qah82ru5rdpnpj".parse::<Offer>(),
2208+
Err(Bolt12ParseError::InvalidSemantics(
2209+
Bolt12SemanticError::InvalidCurrencyCode
2210+
)),
22052211
);
22062212

22072213
// Malformed: truncated description UTF-8

lightning/src/offers/parse.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ pub enum Bolt12SemanticError {
149149
MissingAmount,
150150
/// The amount exceeded the total bitcoin supply or didn't match an expected amount.
151151
InvalidAmount,
152+
/// The currency code was not valid UTF-8.
153+
InvalidCurrencyCode,
152154
/// An amount was provided but was not sufficient in value.
153155
InsufficientAmount,
154156
/// An amount was provided but was not expected.

0 commit comments

Comments
 (0)