bech32.cpp raw

   1  // Copyright (c) 2017, 2021 Pieter Wuille
   2  // Copyright (c) 2021-2022 The Limenka 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  #include <bech32.h>
   7  #include <util/vector.h>
   8  
   9  #include <array>
  10  #include <assert.h>
  11  #include <numeric>
  12  #include <optional>
  13  
  14  namespace bech32
  15  {
  16  
  17  namespace
  18  {
  19  
  20  typedef internal::data data;
  21  
  22  /** We work with the finite field GF(1024) defined as a degree 2 extension of the base field GF(32)
  23   * The defining polynomial of the extension is x^2 + 9x + 23.
  24   * Let (e) be a root of this defining polynomial. Then (e) is a primitive element of GF(1024),
  25   * that is, a generator of the field. Every non-zero element of the field can then be represented
  26   * as (e)^k for some power k.
  27   * The array GF1024_EXP contains all these powers of (e) - GF1024_EXP[k] = (e)^k in GF(1024).
  28   * Conversely, GF1024_LOG contains the discrete logarithms of these powers, so
  29   * GF1024_LOG[GF1024_EXP[k]] == k.
  30   * The following function generates the two tables GF1024_EXP and GF1024_LOG as constexprs. */
  31  constexpr std::pair<std::array<int16_t, 1023>, std::array<int16_t, 1024>> GenerateGFTables()
  32  {
  33      // Build table for GF(32).
  34      // We use these tables to perform arithmetic in GF(32) below, when constructing the
  35      // tables for GF(1024).
  36      std::array<int8_t, 31> GF32_EXP{};
  37      std::array<int8_t, 32> GF32_LOG{};
  38  
  39      // fmod encodes the defining polynomial of GF(32) over GF(2), x^5 + x^3 + 1.
  40      // Because coefficients in GF(2) are binary digits, the coefficients are packed as 101001.
  41      const int fmod = 41;
  42  
  43      // Elements of GF(32) are encoded as vectors of length 5 over GF(2), that is,
  44      // 5 binary digits. Each element (b_4, b_3, b_2, b_1, b_0) encodes a polynomial
  45      // b_4*x^4 + b_3*x^3 + b_2*x^2 + b_1*x^1 + b_0 (modulo fmod).
  46      // For example, 00001 = 1 is the multiplicative identity.
  47      GF32_EXP[0] = 1;
  48      GF32_LOG[0] = -1;
  49      GF32_LOG[1] = 0;
  50      int v = 1;
  51      for (int i = 1; i < 31; ++i) {
  52          // Multiplication by x is the same as shifting left by 1, as
  53          // every coefficient of the polynomial is moved up one place.
  54          v = v << 1;
  55          // If the polynomial now has an x^5 term, we subtract fmod from it
  56          // to remain working modulo fmod. Subtraction is the same as XOR in characteristic
  57          // 2 fields.
  58          if (v & 32) v ^= fmod;
  59          GF32_EXP[i] = v;
  60          GF32_LOG[v] = i;
  61      }
  62  
  63      // Build table for GF(1024)
  64      std::array<int16_t, 1023> GF1024_EXP{};
  65      std::array<int16_t, 1024> GF1024_LOG{};
  66  
  67      GF1024_EXP[0] = 1;
  68      GF1024_LOG[0] = -1;
  69      GF1024_LOG[1] = 0;
  70  
  71      // Each element v of GF(1024) is encoded as a 10 bit integer in the following way:
  72      // v = v1 || v0 where v0, v1 are 5-bit integers (elements of GF(32)).
  73      // The element (e) is encoded as 1 || 0, to represent 1*(e) + 0. Every other element
  74      // a*(e) + b is represented as a || b (a and b are both GF(32) elements). Given (v),
  75      // we compute (e)*(v) by multiplying in the following way:
  76      //
  77      // v0' = 23*v1
  78      // v1' = 9*v1 + v0
  79      // e*v = v1' || v0'
  80      //
  81      // Where 23, 9 are GF(32) elements encoded as described above. Multiplication in GF(32)
  82      // is done using the log/exp tables:
  83      // e^x * e^y = e^(x + y) so a * b = EXP[ LOG[a] + LOG [b] ]
  84      // for non-zero a and b.
  85  
  86      v = 1;
  87      for (int i = 1; i < 1023; ++i) {
  88          int v0 = v & 31;
  89          int v1 = v >> 5;
  90  
  91          int v0n = v1 ? GF32_EXP.at((GF32_LOG.at(v1) + GF32_LOG.at(23)) % 31) : 0;
  92          int v1n = (v1 ? GF32_EXP.at((GF32_LOG.at(v1) + GF32_LOG.at(9)) % 31) : 0) ^ v0;
  93  
  94          v = v1n << 5 | v0n;
  95          GF1024_EXP[i] = v;
  96          GF1024_LOG[v] = i;
  97      }
  98  
  99      return std::make_pair(GF1024_EXP, GF1024_LOG);
 100  }
 101  
 102  constexpr auto tables = GenerateGFTables();
 103  constexpr const std::array<int16_t, 1023>& GF1024_EXP = tables.first;
 104  constexpr const std::array<int16_t, 1024>& GF1024_LOG = tables.second;
 105  
 106  /* Determine the final constant to use for the specified encoding. */
 107  uint32_t EncodingConstant(Encoding encoding) {
 108      assert(encoding == Encoding::BECH32 || encoding == Encoding::BECH32M);
 109      return encoding == Encoding::BECH32 ? 1 : 0x2bc830a3;
 110  }
 111  
 112  /** This function will compute what 6 5-bit values to XOR into the last 6 input values, in order to
 113   *  make the checksum 0. These 6 values are packed together in a single 30-bit integer. The higher
 114   *  bits correspond to earlier values. */
 115  uint32_t PolyMod(const data& v)
 116  {
 117      // The input is interpreted as a list of coefficients of a polynomial over F = GF(32), with an
 118      // implicit 1 in front. If the input is [v0,v1,v2,v3,v4], that polynomial is v(x) =
 119      // 1*x^5 + v0*x^4 + v1*x^3 + v2*x^2 + v3*x + v4. The implicit 1 guarantees that
 120      // [v0,v1,v2,...] has a distinct checksum from [0,v0,v1,v2,...].
 121  
 122      // The output is a 30-bit integer whose 5-bit groups are the coefficients of the remainder of
 123      // v(x) mod g(x), where g(x) is the Bech32 generator,
 124      // x^6 + {29}x^5 + {22}x^4 + {20}x^3 + {21}x^2 + {29}x + {18}. g(x) is chosen in such a way
 125      // that the resulting code is a BCH code, guaranteeing detection of up to 3 errors within a
 126      // window of 1023 characters. Among the various possible BCH codes, one was selected to in
 127      // fact guarantee detection of up to 4 errors within a window of 89 characters.
 128  
 129      // Note that the coefficients are elements of GF(32), here represented as decimal numbers
 130      // between {}. In this finite field, addition is just XOR of the corresponding numbers. For
 131      // example, {27} + {13} = {27 ^ 13} = {22}. Multiplication is more complicated, and requires
 132      // treating the bits of values themselves as coefficients of a polynomial over a smaller field,
 133      // GF(2), and multiplying those polynomials mod a^5 + a^3 + 1. For example, {5} * {26} =
 134      // (a^2 + 1) * (a^4 + a^3 + a) = (a^4 + a^3 + a) * a^2 + (a^4 + a^3 + a) = a^6 + a^5 + a^4 + a
 135      // = a^3 + 1 (mod a^5 + a^3 + 1) = {9}.
 136  
 137      // During the course of the loop below, `c` contains the bitpacked coefficients of the
 138      // polynomial constructed from just the values of v that were processed so far, mod g(x). In
 139      // the above example, `c` initially corresponds to 1 mod g(x), and after processing 2 inputs of
 140      // v, it corresponds to x^2 + v0*x + v1 mod g(x). As 1 mod g(x) = 1, that is the starting value
 141      // for `c`.
 142  
 143      // The following Sage code constructs the generator used:
 144      //
 145      // B = GF(2) # Binary field
 146      // BP.<b> = B[] # Polynomials over the binary field
 147      // F_mod = b**5 + b**3 + 1
 148      // F.<f> = GF(32, modulus=F_mod, repr='int') # GF(32) definition
 149      // FP.<x> = F[] # Polynomials over GF(32)
 150      // E_mod = x**2 + F.fetch_int(9)*x + F.fetch_int(23)
 151      // E.<e> = F.extension(E_mod) # GF(1024) extension field definition
 152      // for p in divisors(E.order() - 1): # Verify e has order 1023.
 153      //    assert((e**p == 1) == (p % 1023 == 0))
 154      // G = lcm([(e**i).minpoly() for i in range(997,1000)])
 155      // print(G) # Print out the generator
 156      //
 157      // It demonstrates that g(x) is the least common multiple of the minimal polynomials
 158      // of 3 consecutive powers (997,998,999) of a primitive element (e) of GF(1024).
 159      // That guarantees it is, in fact, the generator of a primitive BCH code with cycle
 160      // length 1023 and distance 4. See https://en.wikipedia.org/wiki/BCH_code for more details.
 161  
 162      uint32_t c = 1;
 163      for (const auto v_i : v) {
 164          // We want to update `c` to correspond to a polynomial with one extra term. If the initial
 165          // value of `c` consists of the coefficients of c(x) = f(x) mod g(x), we modify it to
 166          // correspond to c'(x) = (f(x) * x + v_i) mod g(x), where v_i is the next input to
 167          // process. Simplifying:
 168          // c'(x) = (f(x) * x + v_i) mod g(x)
 169          //         ((f(x) mod g(x)) * x + v_i) mod g(x)
 170          //         (c(x) * x + v_i) mod g(x)
 171          // If c(x) = c0*x^5 + c1*x^4 + c2*x^3 + c3*x^2 + c4*x + c5, we want to compute
 172          // c'(x) = (c0*x^5 + c1*x^4 + c2*x^3 + c3*x^2 + c4*x + c5) * x + v_i mod g(x)
 173          //       = c0*x^6 + c1*x^5 + c2*x^4 + c3*x^3 + c4*x^2 + c5*x + v_i mod g(x)
 174          //       = c0*(x^6 mod g(x)) + c1*x^5 + c2*x^4 + c3*x^3 + c4*x^2 + c5*x + v_i
 175          // If we call (x^6 mod g(x)) = k(x), this can be written as
 176          // c'(x) = (c1*x^5 + c2*x^4 + c3*x^3 + c4*x^2 + c5*x + v_i) + c0*k(x)
 177  
 178          // First, determine the value of c0:
 179          uint8_t c0 = c >> 25;
 180  
 181          // Then compute c1*x^5 + c2*x^4 + c3*x^3 + c4*x^2 + c5*x + v_i:
 182          c = ((c & 0x1ffffff) << 5) ^ v_i;
 183  
 184          // Finally, for each set bit n in c0, conditionally add {2^n}k(x). These constants can be
 185          // computed using the following Sage code (continuing the code above):
 186          //
 187          // for i in [1,2,4,8,16]: # Print out {1,2,4,8,16}*(g(x) mod x^6), packed in hex integers.
 188          //     v = 0
 189          //     for coef in reversed((F.fetch_int(i)*(G % x**6)).coefficients(sparse=True)):
 190          //         v = v*32 + coef.integer_representation()
 191          //     print("0x%x" % v)
 192          //
 193          if (c0 & 1)  c ^= 0x3b6a57b2; //     k(x) = {29}x^5 + {22}x^4 + {20}x^3 + {21}x^2 + {29}x + {18}
 194          if (c0 & 2)  c ^= 0x26508e6d; //  {2}k(x) = {19}x^5 +  {5}x^4 +     x^3 +  {3}x^2 + {19}x + {13}
 195          if (c0 & 4)  c ^= 0x1ea119fa; //  {4}k(x) = {15}x^5 + {10}x^4 +  {2}x^3 +  {6}x^2 + {15}x + {26}
 196          if (c0 & 8)  c ^= 0x3d4233dd; //  {8}k(x) = {30}x^5 + {20}x^4 +  {4}x^3 + {12}x^2 + {30}x + {29}
 197          if (c0 & 16) c ^= 0x2a1462b3; // {16}k(x) = {21}x^5 +     x^4 +  {8}x^3 + {24}x^2 + {21}x + {19}
 198  
 199      }
 200      return c;
 201  }
 202  
 203  /** Syndrome computes the values s_j = R(e^j) for j in [997, 998, 999]. As described above, the
 204   * generator polynomial G is the LCM of the minimal polynomials of (e)^997, (e)^998, and (e)^999.
 205   *
 206   * Consider a codeword with errors, of the form R(x) = C(x) + E(x). The residue is the bit-packed
 207   * result of computing R(x) mod G(X), where G is the generator of the code. Because C(x) is a valid
 208   * codeword, it is a multiple of G(X), so the residue is in fact just E(x) mod G(x). Note that all
 209   * of the (e)^j are roots of G(x) by definition, so R((e)^j) = E((e)^j).
 210   *
 211   * Let R(x) = r1*x^5 + r2*x^4 + r3*x^3 + r4*x^2 + r5*x + r6
 212   *
 213   * To compute R((e)^j), we are really computing:
 214   * r1*(e)^(j*5) + r2*(e)^(j*4) + r3*(e)^(j*3) + r4*(e)^(j*2) + r5*(e)^j + r6
 215   *
 216   * Now note that all of the (e)^(j*i) for i in [5..0] are constants and can be precomputed.
 217   * But even more than that, we can consider each coefficient as a bit-string.
 218   * For example, take r5 = (b_5, b_4, b_3, b_2, b_1) written out as 5 bits. Then:
 219   * r5*(e)^j = b_1*(e)^j + b_2*(2*(e)^j) + b_3*(4*(e)^j) + b_4*(8*(e)^j) + b_5*(16*(e)^j)
 220   * where all the (2^i*(e)^j) are constants and can be precomputed.
 221   *
 222   * Then we just add each of these corresponding constants to our final value based on the
 223   * bit values b_i. This is exactly what is done in the Syndrome function below.
 224   */
 225  constexpr std::array<uint32_t, 25> GenerateSyndromeConstants() {
 226      std::array<uint32_t, 25> SYNDROME_CONSTS{};
 227      for (int k = 1; k < 6; ++k) {
 228          for (int shift = 0; shift < 5; ++shift) {
 229              int16_t b = GF1024_LOG.at(size_t{1} << shift);
 230              int16_t c0 = GF1024_EXP.at((997*k + b) % 1023);
 231              int16_t c1 = GF1024_EXP.at((998*k + b) % 1023);
 232              int16_t c2 = GF1024_EXP.at((999*k + b) % 1023);
 233              uint32_t c = c2 << 20 | c1 << 10 | c0;
 234              int ind = 5*(k-1) + shift;
 235              SYNDROME_CONSTS[ind] = c;
 236          }
 237      }
 238      return SYNDROME_CONSTS;
 239  }
 240  constexpr std::array<uint32_t, 25> SYNDROME_CONSTS = GenerateSyndromeConstants();
 241  
 242  /**
 243   * Syndrome returns the three values s_997, s_998, and s_999 described above,
 244   * packed into a 30-bit integer, where each group of 10 bits encodes one value.
 245   */
 246  uint32_t Syndrome(const uint32_t residue) {
 247      // low is the first 5 bits, corresponding to the r6 in the residue
 248      // (the constant term of the polynomial).
 249      uint32_t low = residue & 0x1f;
 250  
 251      // We begin by setting s_j = low = r6 for all three values of j, because these are unconditional.
 252      uint32_t result = low ^ (low << 10) ^ (low << 20);
 253  
 254      // Then for each following bit, we add the corresponding precomputed constant if the bit is 1.
 255      // For example, 0x31edd3c4 is 1100011110 1101110100 1111000100 when unpacked in groups of 10
 256      // bits, corresponding exactly to a^999 || a^998 || a^997 (matching the corresponding values in
 257      // GF1024_EXP above). In this way, we compute all three values of s_j for j in (997, 998, 999)
 258      // simultaneously. Recall that XOR corresponds to addition in a characteristic 2 field.
 259      for (int i = 0; i < 25; ++i) {
 260          result ^= ((residue >> (5+i)) & 1 ? SYNDROME_CONSTS.at(i) : 0);
 261      }
 262      return result;
 263  }
 264  
 265  /** Convert to lower case. */
 266  inline unsigned char LowerCase(unsigned char c)
 267  {
 268      return (c >= 'A' && c <= 'Z') ? (c - 'A') + 'a' : c;
 269  }
 270  
 271  /** Return indices of invalid characters in a Bech32 string. */
 272  bool CheckCharacters(const std::string& str, std::vector<int>& errors)
 273  {
 274      bool lower = false, upper = false;
 275      for (size_t i = 0; i < str.size(); ++i) {
 276          unsigned char c{(unsigned char)(str[i])};
 277          if (c >= 'a' && c <= 'z') {
 278              if (upper) {
 279                  errors.push_back(i);
 280              } else {
 281                  lower = true;
 282              }
 283          } else if (c >= 'A' && c <= 'Z') {
 284              if (lower) {
 285                  errors.push_back(i);
 286              } else {
 287                  upper = true;
 288              }
 289          } else if (c < 33 || c > 126) {
 290              errors.push_back(i);
 291          }
 292      }
 293      return errors.empty();
 294  }
 295  
 296  /** Verify a checksum. */
 297  Encoding VerifyChecksum(const std::string& hrp, const data& values)
 298  {
 299      // PolyMod computes what value to xor into the final values to make the checksum 0. However,
 300      // if we required that the checksum was 0, it would be the case that appending a 0 to a valid
 301      // list of values would result in a new valid list. For that reason, Bech32 requires the
 302      // resulting checksum to be 1 instead. In Bech32m, this constant was amended. See
 303      // https://gist.github.com/sipa/14c248c288c3880a3b191f978a34508e for details.
 304      auto enc = internal::PreparePolynomialCoefficients(hrp, values);
 305      const uint32_t check = PolyMod(enc);
 306      if (check == EncodingConstant(Encoding::BECH32)) return Encoding::BECH32;
 307      if (check == EncodingConstant(Encoding::BECH32M)) return Encoding::BECH32M;
 308      return Encoding::INVALID;
 309  }
 310  
 311  /** Create a checksum. */
 312  data CreateChecksum(Encoding encoding, const std::string& hrp, const data& values)
 313  {
 314      auto enc = internal::PreparePolynomialCoefficients(hrp, values);
 315      enc.insert(enc.end(), CHECKSUM_SIZE, 0x00);
 316      uint32_t mod = PolyMod(enc) ^ EncodingConstant(encoding); // Determine what to XOR into those 6 zeroes.
 317      data ret(CHECKSUM_SIZE);
 318      for (size_t i = 0; i < CHECKSUM_SIZE; ++i) {
 319          // Convert the 5-bit groups in mod to checksum values.
 320          ret[i] = (mod >> (5 * (5 - i))) & 31;
 321      }
 322      return ret;
 323  }
 324  
 325  } // namespace
 326  
 327  namespace internal {
 328  
 329  /** The Bech32 and Bech32m character set for encoding. */
 330  const char* CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
 331  
 332  /** The Bech32 and Bech32m character set for decoding. */
 333  const int8_t CHARSET_REV[128] = {
 334      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 335      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 336      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 337      15, -1, 10, 17, 21, 20, 26, 30,  7,  5, -1, -1, -1, -1, -1, -1,
 338      -1, 29, -1, 24, 13, 25,  9,  8, 23, -1, 18, 22, 31, 27, 19, -1,
 339       1,  0,  3, 16, 11, 28, 12, 14,  6,  4,  2, -1, -1, -1, -1, -1,
 340      -1, 29, -1, 24, 13, 25,  9,  8, 23, -1, 18, 22, 31, 27, 19, -1,
 341       1,  0,  3, 16, 11, 28, 12, 14,  6,  4,  2, -1, -1, -1, -1, -1
 342  };
 343  
 344  
 345  std::vector<unsigned char> PreparePolynomialCoefficients(const std::string& hrp, const data& values)
 346  {
 347      data ret;
 348      ret.reserve(hrp.size() + 1 + hrp.size() + values.size() + CHECKSUM_SIZE);
 349  
 350      /** Expand a HRP for use in checksum computation. */
 351      for (size_t i = 0; i < hrp.size(); ++i) ret.push_back(hrp[i] >> 5);
 352      ret.push_back(0);
 353      for (size_t i = 0; i < hrp.size(); ++i) ret.push_back(hrp[i] & 0x1f);
 354  
 355      ret.insert(ret.end(), values.begin(), values.end());
 356  
 357      return ret;
 358  }
 359  
 360  
 361  /** Encode a hrpstring without concerning ourselves with checksum validity */
 362  std::string Encode(const std::string& hrp, const data& values, const data& checksum) {
 363      // First ensure that the HRP is all lowercase. BIP-173 and BIP350 require an encoder
 364      // to return a lowercase Bech32/Bech32m string, but if given an uppercase HRP, the
 365      // result will always be invalid.
 366      for (const char& c : hrp) assert(c < 'A' || c > 'Z');
 367  
 368      std::string ret;
 369      ret.reserve(hrp.size() + 1 + values.size() + CHECKSUM_SIZE);
 370      ret += hrp;
 371      ret += SEPARATOR;
 372      for (const uint8_t& i : values) ret += CHARSET[i];
 373      for (const uint8_t& i : checksum) ret += CHARSET[i];
 374      return ret;
 375  }
 376  
 377  /** Decode a hrpstring without concerning ourselves with checksum validity */
 378  std::pair<std::string, data> Decode(const std::string& str, CharLimit limit, size_t checksum_length) {
 379      std::vector<int> errors;
 380      if (!CheckCharacters(str, errors)) return {};
 381      size_t pos = str.rfind(SEPARATOR);
 382      if (str.size() > limit) return {};
 383      if (pos == str.npos || pos == 0 || pos + checksum_length >= str.size()) {
 384          return {};
 385      }
 386      data values(str.size() - 1 - pos);
 387      for (size_t i = 0; i < str.size() - 1 - pos; ++i) {
 388          unsigned char c = str[i + pos + 1];
 389          int8_t rev = CHARSET_REV[c];
 390  
 391          if (rev == -1) {
 392              return {};
 393          }
 394          values[i] = rev;
 395      }
 396      std::string hrp;
 397      hrp.reserve(pos);
 398      for (size_t i = 0; i < pos; ++i) {
 399          hrp += LowerCase(str[i]);
 400      }
 401      return std::make_pair(hrp, values);
 402  }
 403  
 404  } // namespace internal
 405  
 406  /** Encode a Bech32 or Bech32m string. */
 407  std::string Encode(Encoding encoding, const std::string& hrp, const data& values) {
 408      return internal::Encode(hrp, values, CreateChecksum(encoding, hrp, values));
 409  }
 410  
 411  /** Decode a Bech32 or Bech32m string. */
 412  DecodeResult Decode(const std::string& str, CharLimit limit) {
 413      auto res = internal::Decode(str, limit, CHECKSUM_SIZE);
 414      Encoding result = VerifyChecksum(res.first, res.second);
 415      if (result == Encoding::INVALID) return {};
 416      return {result, std::move(res.first), data(res.second.begin(), res.second.end() - CHECKSUM_SIZE)};
 417  }
 418  
 419  /** Find index of an incorrect character in a Bech32 string. */
 420  std::pair<std::string, std::vector<int>> LocateErrors(const std::string& str, CharLimit limit) {
 421      std::vector<int> error_locations{};
 422  
 423      if (str.size() > limit) {
 424          error_locations.resize(str.size() - limit);
 425          std::iota(error_locations.begin(), error_locations.end(), static_cast<int>(limit));
 426          return std::make_pair("Bech32 string too long", std::move(error_locations));
 427      }
 428  
 429      if (!CheckCharacters(str, error_locations)){
 430          return std::make_pair("Invalid character or mixed case", std::move(error_locations));
 431      }
 432  
 433      size_t pos = str.rfind(SEPARATOR);
 434      if (pos == str.npos) {
 435          return std::make_pair("Missing separator", std::vector<int>{});
 436      }
 437      if (pos == 0 || pos + CHECKSUM_SIZE >= str.size()) {
 438          error_locations.push_back(pos);
 439          return std::make_pair("Invalid separator position", std::move(error_locations));
 440      }
 441  
 442      std::string hrp;
 443      hrp.reserve(pos);
 444      for (size_t i = 0; i < pos; ++i) {
 445          hrp += LowerCase(str[i]);
 446      }
 447  
 448      size_t length = str.size() - 1 - pos; // length of data part
 449      data values(length);
 450      for (size_t i = pos + 1; i < str.size(); ++i) {
 451          unsigned char c = str[i];
 452          int8_t rev = internal::CHARSET_REV[c];
 453          if (rev == -1) {
 454              error_locations.push_back(i);
 455              return std::make_pair("Invalid Base 32 character", std::move(error_locations));
 456          }
 457          values[i - pos - 1] = rev;
 458      }
 459  
 460      // We attempt error detection with both bech32 and bech32m, and choose the one with the fewest errors
 461      // We can't simply use the segwit version, because that may be one of the errors
 462      std::optional<Encoding> error_encoding;
 463      for (Encoding encoding : {Encoding::BECH32, Encoding::BECH32M}) {
 464          std::vector<int> possible_errors;
 465          // Recall that (expanded hrp + values) is interpreted as a list of coefficients of a polynomial
 466          // over GF(32). PolyMod computes the "remainder" of this polynomial modulo the generator G(x).
 467          auto enc = internal::PreparePolynomialCoefficients(hrp, values);
 468          uint32_t residue = PolyMod(enc) ^ EncodingConstant(encoding);
 469  
 470          // All valid codewords should be multiples of G(x), so this remainder (after XORing with the encoding
 471          // constant) should be 0 - hence 0 indicates there are no errors present.
 472          if (residue != 0) {
 473              // If errors are present, our polynomial must be of the form C(x) + E(x) where C is the valid
 474              // codeword (a multiple of G(x)), and E encodes the errors.
 475              uint32_t syn = Syndrome(residue);
 476  
 477              // Unpack the three 10-bit syndrome values
 478              int s0 = syn & 0x3FF;
 479              int s1 = (syn >> 10) & 0x3FF;
 480              int s2 = syn >> 20;
 481  
 482              // Get the discrete logs of these values in GF1024 for more efficient computation
 483              int l_s0 = GF1024_LOG.at(s0);
 484              int l_s1 = GF1024_LOG.at(s1);
 485              int l_s2 = GF1024_LOG.at(s2);
 486  
 487              // First, suppose there is only a single error. Then E(x) = e1*x^p1 for some position p1
 488              // Then s0 = E((e)^997) = e1*(e)^(997*p1) and s1 = E((e)^998) = e1*(e)^(998*p1)
 489              // Therefore s1/s0 = (e)^p1, and by the same logic, s2/s1 = (e)^p1 too.
 490              // Hence, s1^2 == s0*s2, which is exactly the condition we check first:
 491              if (l_s0 != -1 && l_s1 != -1 && l_s2 != -1 && (2 * l_s1 - l_s2 - l_s0 + 2046) % 1023 == 0) {
 492                  // Compute the error position p1 as l_s1 - l_s0 = p1 (mod 1023)
 493                  size_t p1 = (l_s1 - l_s0 + 1023) % 1023; // the +1023 ensures it is positive
 494                  // Now because s0 = e1*(e)^(997*p1), we get e1 = s0/((e)^(997*p1)). Remember that (e)^1023 = 1,
 495                  // so 1/((e)^997) = (e)^(1023-997).
 496                  int l_e1 = l_s0 + (1023 - 997) * p1;
 497                  // Finally, some sanity checks on the result:
 498                  // - The error position should be within the length of the data
 499                  // - e1 should be in GF(32), which implies that e1 = (e)^(33k) for some k (the 31 non-zero elements
 500                  // of GF(32) form an index 33 subgroup of the 1023 non-zero elements of GF(1024)).
 501                  if (p1 < length && !(l_e1 % 33)) {
 502                      // Polynomials run from highest power to lowest, so the index p1 is from the right.
 503                      // We don't return e1 because it is dangerous to suggest corrections to the user,
 504                      // the user should check the address themselves.
 505                      possible_errors.push_back(str.size() - p1 - 1);
 506                  }
 507              // Otherwise, suppose there are two errors. Then E(x) = e1*x^p1 + e2*x^p2.
 508              } else {
 509                  // For all possible first error positions p1
 510                  for (size_t p1 = 0; p1 < length; ++p1) {
 511                      // We have guessed p1, and want to solve for p2. Recall that E(x) = e1*x^p1 + e2*x^p2, so
 512                      // s0 = E((e)^997) = e1*(e)^(997^p1) + e2*(e)^(997*p2), and similar for s1 and s2.
 513                      //
 514                      // Consider s2 + s1*(e)^p1
 515                      //          = 2e1*(e)^(999^p1) + e2*(e)^(999*p2) + e2*(e)^(998*p2)*(e)^p1
 516                      //          = e2*(e)^(999*p2) + e2*(e)^(998*p2)*(e)^p1
 517                      //    (Because we are working in characteristic 2.)
 518                      //          = e2*(e)^(998*p2) ((e)^p2 + (e)^p1)
 519                      //
 520                      int s2_s1p1 = s2 ^ (s1 == 0 ? 0 : GF1024_EXP.at((l_s1 + p1) % 1023));
 521                      if (s2_s1p1 == 0) continue;
 522                      int l_s2_s1p1 = GF1024_LOG.at(s2_s1p1);
 523  
 524                      // Similarly, s1 + s0*(e)^p1
 525                      //          = e2*(e)^(997*p2) ((e)^p2 + (e)^p1)
 526                      int s1_s0p1 = s1 ^ (s0 == 0 ? 0 : GF1024_EXP.at((l_s0 + p1) % 1023));
 527                      if (s1_s0p1 == 0) continue;
 528                      int l_s1_s0p1 = GF1024_LOG.at(s1_s0p1);
 529  
 530                      // So, putting these together, we can compute the second error position as
 531                      // (e)^p2 = (s2 + s1^p1)/(s1 + s0^p1)
 532                      // p2 = log((e)^p2)
 533                      size_t p2 = (l_s2_s1p1 - l_s1_s0p1 + 1023) % 1023;
 534  
 535                      // Sanity checks that p2 is a valid position and not the same as p1
 536                      if (p2 >= length || p1 == p2) continue;
 537  
 538                      // Now we want to compute the error values e1 and e2.
 539                      // Similar to above, we compute s1 + s0*(e)^p2
 540                      //          = e1*(e)^(997*p1) ((e)^p1 + (e)^p2)
 541                      int s1_s0p2 = s1 ^ (s0 == 0 ? 0 : GF1024_EXP.at((l_s0 + p2) % 1023));
 542                      if (s1_s0p2 == 0) continue;
 543                      int l_s1_s0p2 = GF1024_LOG.at(s1_s0p2);
 544  
 545                      // And compute (the log of) 1/((e)^p1 + (e)^p2))
 546                      int inv_p1_p2 = 1023 - GF1024_LOG.at(GF1024_EXP.at(p1) ^ GF1024_EXP.at(p2));
 547  
 548                      // Then (s1 + s0*(e)^p1) * (1/((e)^p1 + (e)^p2)))
 549                      //         = e2*(e)^(997*p2)
 550                      // Then recover e2 by dividing by (e)^(997*p2)
 551                      int l_e2 = l_s1_s0p1 + inv_p1_p2 + (1023 - 997) * p2;
 552                      // Check that e2 is in GF(32)
 553                      if (l_e2 % 33) continue;
 554  
 555                      // In the same way, (s1 + s0*(e)^p2) * (1/((e)^p1 + (e)^p2)))
 556                      //         = e1*(e)^(997*p1)
 557                      // So recover e1 by dividing by (e)^(997*p1)
 558                      int l_e1 = l_s1_s0p2 + inv_p1_p2 + (1023 - 997) * p1;
 559                      // Check that e1 is in GF(32)
 560                      if (l_e1 % 33) continue;
 561  
 562                      // Again, we do not return e1 or e2 for safety.
 563                      // Order the error positions from the left of the string and return them
 564                      if (p1 > p2) {
 565                          possible_errors.push_back(str.size() - p1 - 1);
 566                          possible_errors.push_back(str.size() - p2 - 1);
 567                      } else {
 568                          possible_errors.push_back(str.size() - p2 - 1);
 569                          possible_errors.push_back(str.size() - p1 - 1);
 570                      }
 571                      break;
 572                  }
 573              }
 574          } else {
 575              // No errors
 576              return std::make_pair("", std::vector<int>{});
 577          }
 578  
 579          if (error_locations.empty() || (!possible_errors.empty() && possible_errors.size() < error_locations.size())) {
 580              error_locations = std::move(possible_errors);
 581              if (!error_locations.empty()) error_encoding = encoding;
 582          }
 583      }
 584      std::string error_message = error_encoding == Encoding::BECH32M ? "Invalid Bech32m checksum"
 585                                : error_encoding == Encoding::BECH32 ? "Invalid Bech32 checksum"
 586                                : "Invalid checksum";
 587  
 588      return std::make_pair(error_message, std::move(error_locations));
 589  }
 590  
 591  } // namespace bech32
 592