9
9
//! a data part. A checksum at the end of the string provides error detection to prevent mistakes
10
10
//! when the string is written off or read out loud.
11
11
//!
12
+ //! Please note, so as to support lighting ([BOLT-11]) we explicitly do not do string length checks
13
+ //! in the top level API. We do however enforce the 90 character limit within the `segwit` modules.
14
+ //!
12
15
//! # Usage
13
16
//!
14
17
//! - If you are doing segwit stuff you likely want to use the [`segwit`] API.
113
116
//!
114
117
//! # }
115
118
//! ```
119
+ //!
120
+ //! [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
116
121
117
122
#![ cfg_attr( all( not( feature = "std" ) , not( test) ) , no_std) ]
118
123
// Experimental features we need.
@@ -166,7 +171,10 @@ pub use {
166
171
/// If this function succeeds the input string was found to be well formed (hrp, separator, bech32
167
172
/// characters), and to have either a valid bech32m checksum or a valid bech32 checksum.
168
173
///
169
- /// If your input string has no checksum use the [`CheckedHrpstring`] constructor, which allows selecting the checksum algorithm explicitly.
174
+ /// If your input string has no checksum use the [`CheckedHrpstring`] constructor, which allows
175
+ /// selecting the checksum algorithm explicitly.
176
+ ///
177
+ /// Note: this function does not enforce any restrictions on the total length of the input string.
170
178
///
171
179
/// # Returns
172
180
///
@@ -213,6 +221,15 @@ pub fn decode(s: &str) -> Result<(Hrp, Vec<u8>), DecodeError> {
213
221
///
214
222
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
215
223
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
224
+ ///
225
+ /// ## Deviation from spec (BIP-173)
226
+ ///
227
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
228
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
229
+ ///
230
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
231
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
232
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
216
233
#[ cfg( feature = "alloc" ) ]
217
234
#[ inline]
218
235
pub fn encode < Ck : Checksum > ( hrp : & Hrp , data : & [ u8 ] ) -> Result < String , fmt:: Error > {
@@ -223,6 +240,15 @@ pub fn encode<Ck: Checksum>(hrp: &Hrp, data: &[u8]) -> Result<String, fmt::Error
223
240
///
224
241
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
225
242
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
243
+ ///
244
+ /// ## Deviation from spec (BIP-173)
245
+ ///
246
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
247
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
248
+ ///
249
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
250
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
251
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
226
252
#[ cfg( feature = "alloc" ) ]
227
253
#[ inline]
228
254
pub fn encode_lower < Ck : Checksum > ( hrp : & Hrp , data : & [ u8 ] ) -> Result < String , fmt:: Error > {
@@ -235,6 +261,15 @@ pub fn encode_lower<Ck: Checksum>(hrp: &Hrp, data: &[u8]) -> Result<String, fmt:
235
261
///
236
262
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
237
263
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
264
+ ///
265
+ /// ## Deviation from spec (BIP-173)
266
+ ///
267
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
268
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
269
+ ///
270
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
271
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
272
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
238
273
#[ cfg( feature = "alloc" ) ]
239
274
#[ inline]
240
275
pub fn encode_upper < Ck : Checksum > ( hrp : & Hrp , data : & [ u8 ] ) -> Result < String , fmt:: Error > {
@@ -247,6 +282,15 @@ pub fn encode_upper<Ck: Checksum>(hrp: &Hrp, data: &[u8]) -> Result<String, fmt:
247
282
///
248
283
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
249
284
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
285
+ ///
286
+ /// ## Deviation from spec (BIP-173)
287
+ ///
288
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
289
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
290
+ ///
291
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
292
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
293
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
250
294
#[ inline]
251
295
pub fn encode_to_fmt < Ck : Checksum , W : fmt:: Write > (
252
296
fmt : & mut W ,
@@ -260,6 +304,15 @@ pub fn encode_to_fmt<Ck: Checksum, W: fmt::Write>(
260
304
///
261
305
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
262
306
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
307
+ ///
308
+ /// ## Deviation from spec (BIP-173)
309
+ ///
310
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
311
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
312
+ ///
313
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
314
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
315
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
263
316
#[ inline]
264
317
pub fn encode_lower_to_fmt < Ck : Checksum , W : fmt:: Write > (
265
318
fmt : & mut W ,
@@ -278,6 +331,15 @@ pub fn encode_lower_to_fmt<Ck: Checksum, W: fmt::Write>(
278
331
///
279
332
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
280
333
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
334
+ ///
335
+ /// ## Deviation from spec (BIP-173)
336
+ ///
337
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
338
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
339
+ ///
340
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
341
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
342
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
281
343
#[ inline]
282
344
pub fn encode_upper_to_fmt < Ck : Checksum , W : fmt:: Write > (
283
345
fmt : & mut W ,
@@ -296,6 +358,15 @@ pub fn encode_upper_to_fmt<Ck: Checksum, W: fmt::Write>(
296
358
///
297
359
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
298
360
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
361
+ ///
362
+ /// ## Deviation from spec (BIP-173)
363
+ ///
364
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
365
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
366
+ ///
367
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
368
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
369
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
299
370
#[ cfg( feature = "std" ) ]
300
371
#[ inline]
301
372
pub fn encode_to_writer < Ck : Checksum , W : std:: io:: Write > (
@@ -310,6 +381,15 @@ pub fn encode_to_writer<Ck: Checksum, W: std::io::Write>(
310
381
///
311
382
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
312
383
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
384
+ ///
385
+ /// ## Deviation from spec (BIP-173)
386
+ ///
387
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
388
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
389
+ ///
390
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
391
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
392
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
313
393
#[ cfg( feature = "std" ) ]
314
394
#[ inline]
315
395
pub fn encode_lower_to_writer < Ck : Checksum , W : std:: io:: Write > (
@@ -329,6 +409,15 @@ pub fn encode_lower_to_writer<Ck: Checksum, W: std::io::Write>(
329
409
///
330
410
/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
331
411
/// `Ck` algorithm (`NoChecksum` to exclude checksum all together).
412
+ ///
413
+ /// ## Deviation from spec (BIP-173)
414
+ ///
415
+ /// In order to support [BOLT-11] this function does not restrict the total length of the returned
416
+ /// string. To encode [BIP-173] / [BIP-350] compliant segwit addresses use [`segwit::encode`].
417
+ ///
418
+ /// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
419
+ /// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
420
+ /// [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
332
421
#[ cfg( feature = "std" ) ]
333
422
#[ inline]
334
423
pub fn encode_upper_to_writer < Ck : Checksum , W : std:: io:: Write > (
@@ -492,4 +581,22 @@ mod tests {
492
581
493
582
assert_eq ! ( got, want) ;
494
583
}
584
+
585
+ #[ test]
586
+ fn can_encode_really_long_string ( ) {
587
+ // Encode around the bech32 limit, mainly here as documentation.
588
+ let tcs = vec ! [
589
+ // Also shows there are no limit checks on the data slice (since segwit limits this to 40 bytes).
590
+ ( [ 0_u8 ; 50 ] , Hrp :: parse_unchecked( "abc" ) ) , // Encodes to 90 characters.
591
+ ( [ 0_u8 ; 50 ] , Hrp :: parse_unchecked( "abcd" ) ) , // Encodes to 91 characters.
592
+ ] ;
593
+ for ( data, hrp) in tcs {
594
+ assert ! ( encode:: <Bech32 >( & hrp, & data) . is_ok( ) ) ;
595
+ }
596
+
597
+ // Encode something arbitrarily long.
598
+ let data = [ 0_u8 ; 1024 ] ;
599
+ let hrp = Hrp :: parse_unchecked ( "abc" ) ;
600
+ assert ! ( encode:: <Bech32m >( & hrp, & data) . is_ok( ) ) ;
601
+ }
495
602
}
0 commit comments