/ src / bech32.h
bech32.h
 1  // Copyright (c) 2017, 2021 Pieter Wuille
 2  // Copyright (c) 2021-present The Bitcoin Core developers
 3  // Distributed under the MIT software license, see the accompanying
 4  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 5  
 6  // Bech32 and Bech32m are string encoding formats used in newer
 7  // address types. The outputs consist of a human-readable part
 8  // (alphanumeric), a separator character (1), and a base32 data
 9  // section, the last 6 characters of which are a checksum. The
10  // module is namespaced under bech32 for historical reasons.
11  //
12  // For more information, see BIP 173 and BIP 350.
13  
14  #ifndef BITCOIN_BECH32_H
15  #define BITCOIN_BECH32_H
16  
17  #include <cstdint>
18  #include <string>
19  #include <vector>
20  
21  namespace bech32
22  {
23  
24  static constexpr size_t CHECKSUM_SIZE = 6;
25  static constexpr char SEPARATOR = '1';
26  
27  enum class Encoding {
28      INVALID, //!< Failed decoding
29  
30      BECH32,  //!< Bech32 encoding as defined in BIP173
31      BECH32M, //!< Bech32m encoding as defined in BIP350
32  };
33  
34  /** Character limits for Bech32(m) encoded strings. Character limits are how we provide error location guarantees.
35   *  These values should never exceed 2^31 - 1 (max value for a 32-bit int), since there are places where we may need to
36   *  convert the CharLimit::VALUE to an int. In practice, this should never happen since this CharLimit applies to an address encoding
37   *  and we would never encode an address with such a massive value */
38  enum CharLimit : size_t {
39      BECH32 = 90,            //!< BIP173/350 imposed character limit for Bech32(m) encoded addresses. This guarantees finding up to 4 errors.
40  };
41  
42  /** Encode a Bech32 or Bech32m string. If hrp contains uppercase characters, this will cause an
43   *  assertion error. Encoding must be one of BECH32 or BECH32M. */
44  std::string Encode(Encoding encoding, const std::string& hrp, const std::vector<uint8_t>& values);
45  
46  struct DecodeResult
47  {
48      Encoding encoding;         //!< What encoding was detected in the result; Encoding::INVALID if failed.
49      std::string hrp;           //!< The human readable part
50      std::vector<uint8_t> data; //!< The payload (excluding checksum)
51  
52      DecodeResult() : encoding(Encoding::INVALID) {}
53      DecodeResult(Encoding enc, std::string&& h, std::vector<uint8_t>&& d) : encoding(enc), hrp(std::move(h)), data(std::move(d)) {}
54  };
55  
56  /** Decode a Bech32 or Bech32m string. */
57  DecodeResult Decode(const std::string& str, CharLimit limit = CharLimit::BECH32);
58  
59  /** Return the positions of errors in a Bech32 string. */
60  std::pair<std::string, std::vector<int>> LocateErrors(const std::string& str, CharLimit limit = CharLimit::BECH32);
61  
62  } // namespace bech32
63  
64  #endif // BITCOIN_BECH32_H