bech32/primitives/
mod.rs

1// SPDX-License-Identifier: MIT
2
3//! Provides the internal nuts and bolts that enable bech32 encoding/decoding.
4
5pub mod checksum;
6pub mod decode;
7pub mod encode;
8pub mod gf32;
9pub mod hrp;
10pub mod iter;
11pub mod segwit;
12
13use checksum::{Checksum, PackedNull};
14
15/// The "null checksum" used on bech32 strings for which we want to do no checksum checking.
16#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
17pub enum NoChecksum {}
18
19/// The bech32 checksum algorithm, defined in [BIP-173].
20///
21/// [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
22#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
23pub enum Bech32 {}
24
25/// The bech32m checksum algorithm, defined in [BIP-350].
26///
27/// [BIP-350]: <https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki>
28#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
29pub enum Bech32m {}
30
31impl Checksum for NoChecksum {
32    type MidstateRepr = PackedNull;
33    const CODE_LENGTH: usize = usize::MAX;
34    const CHECKSUM_LENGTH: usize = 0;
35    const GENERATOR_SH: [PackedNull; 5] = [PackedNull; 5];
36    const TARGET_RESIDUE: PackedNull = PackedNull;
37}
38
39// Bech32[m] generator coefficients, copied from Bitcoin Core src/bech32.cpp
40const GEN: [u32; 5] = [0x3b6a_57b2, 0x2650_8e6d, 0x1ea1_19fa, 0x3d42_33dd, 0x2a14_62b3];
41
42impl Checksum for Bech32 {
43    type MidstateRepr = u32;
44    const CODE_LENGTH: usize = 1023;
45    const CHECKSUM_LENGTH: usize = 6;
46    const GENERATOR_SH: [u32; 5] = GEN;
47    const TARGET_RESIDUE: u32 = 1;
48}
49// Same as Bech32 except TARGET_RESIDUE is different
50impl Checksum for Bech32m {
51    type MidstateRepr = u32;
52    const CODE_LENGTH: usize = 1023;
53    const CHECKSUM_LENGTH: usize = 6;
54    const GENERATOR_SH: [u32; 5] = GEN;
55    const TARGET_RESIDUE: u32 = 0x2bc830a3;
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn bech32_sanity() { Bech32::sanity_check(); }
64
65    #[test]
66    fn bech32m_sanity() { Bech32m::sanity_check(); }
67}