99//! a data part. A checksum at the end of the string provides error detection to prevent mistakes
1010//! when the string is written off or read out loud.
1111//!
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+ //!
1215//! # Usage
1316//!
1417//! - If you are doing segwit stuff you likely want to use the [`segwit`] API.
113116//!
114117//! # }
115118//! ```
119+ //!
120+ //! [BOLT-11]: <https://github.com/lightning/bolts/blob/master/11-payment-encoding.md>
116121
117122#![ cfg_attr( all( not( feature = "std" ) , not( test) ) , no_std) ]
118123// Experimental features we need.
@@ -166,7 +171,10 @@ pub use {
166171/// If this function succeeds the input string was found to be well formed (hrp, separator, bech32
167172/// characters), and to have either a valid bech32m checksum or a valid bech32 checksum.
168173///
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.
170178///
171179/// # Returns
172180///
@@ -213,6 +221,15 @@ pub fn decode(s: &str) -> Result<(Hrp, Vec<u8>), DecodeError> {
213221///
214222/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
215223/// `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>
216233#[ cfg( feature = "alloc" ) ]
217234#[ inline]
218235pub 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
223240///
224241/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
225242/// `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>
226252#[ cfg( feature = "alloc" ) ]
227253#[ inline]
228254pub 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:
235261///
236262/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
237263/// `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>
238273#[ cfg( feature = "alloc" ) ]
239274#[ inline]
240275pub 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:
247282///
248283/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
249284/// `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>
250294#[ inline]
251295pub fn encode_to_fmt < Ck : Checksum , W : fmt:: Write > (
252296 fmt : & mut W ,
@@ -260,6 +304,15 @@ pub fn encode_to_fmt<Ck: Checksum, W: fmt::Write>(
260304///
261305/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
262306/// `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>
263316#[ inline]
264317pub fn encode_lower_to_fmt < Ck : Checksum , W : fmt:: Write > (
265318 fmt : & mut W ,
@@ -278,6 +331,15 @@ pub fn encode_lower_to_fmt<Ck: Checksum, W: fmt::Write>(
278331///
279332/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
280333/// `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>
281343#[ inline]
282344pub fn encode_upper_to_fmt < Ck : Checksum , W : fmt:: Write > (
283345 fmt : & mut W ,
@@ -296,6 +358,15 @@ pub fn encode_upper_to_fmt<Ck: Checksum, W: fmt::Write>(
296358///
297359/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
298360/// `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>
299370#[ cfg( feature = "std" ) ]
300371#[ inline]
301372pub 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>(
310381///
311382/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
312383/// `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>
313393#[ cfg( feature = "std" ) ]
314394#[ inline]
315395pub 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>(
329409///
330410/// Encoded string will be prefixed with the `hrp` and have a checksum appended as specified by the
331411/// `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>
332421#[ cfg( feature = "std" ) ]
333422#[ inline]
334423pub fn encode_upper_to_writer < Ck : Checksum , W : std:: io:: Write > (
@@ -492,4 +581,22 @@ mod tests {
492581
493582 assert_eq ! ( got, want) ;
494583 }
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+ }
495602}
0 commit comments