/root/bitcoin/src/bech32.h
Line | Count | Source |
1 | | // Copyright (c) 2017, 2021 Pieter Wuille |
2 | | // Copyright (c) 2021 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 <stdint.h> |
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 | 57 | DecodeResult() : encoding(Encoding::INVALID) {} |
53 | 14 | 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 |