20typedef std::vector<uint8_t> data;
23const char*
CHARSET =
"qpzry9x8gf2tvdw0s3jn54khce6mua7l";
27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
28 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
29 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
30 15, -1, 10, 17, 21, 20, 26, 30, 7, 5, -1, -1, -1, -1, -1, -1,
31 -1, 29, -1, 24, 13, 25, 9, 8, 23, -1, 18, 22, 31, 27, 19, -1,
32 1, 0, 3, 16, 11, 28, 12, 14, 6, 4, 2, -1, -1, -1, -1, -1,
33 -1, 29, -1, 24, 13, 25, 9, 8, 23, -1, 18, 22, 31, 27, 19, -1,
34 1, 0, 3, 16, 11, 28, 12, 14, 6, 4, 2, -1, -1, -1, -1, -1
46constexpr std::pair<std::array<int16_t, 1023>, std::array<int16_t, 1024>>
GenerateGFTables()
66 for (
int i = 1; i < 31; ++i) {
73 if (v & 32) v ^=
fmod;
102 for (
int i = 1; i < 1023; ++i) {
178 for (
const auto v_i : v) {
197 c = ((
c & 0x1ffffff) << 5) ^
v_i;
208 if (
c0 & 1)
c ^= 0x3b6a57b2;
209 if (
c0 & 2)
c ^= 0x26508e6d;
210 if (
c0 & 4)
c ^= 0x1ea119fa;
211 if (
c0 & 8)
c ^= 0x3d4233dd;
212 if (
c0 & 16)
c ^= 0x2a1462b3;
242 for (
int k = 1;
k < 6; ++
k) {
274 for (
int i = 0; i < 25; ++i) {
281inline unsigned char LowerCase(
unsigned char c)
283 return (
c >=
'A' &&
c <=
'Z') ? (
c -
'A') +
'a' :
c;
290 for (
size_t i = 0; i < str.size(); ++i) {
291 unsigned char c{(
unsigned char)(str[i])};
292 if (
c >=
'a' &&
c <=
'z') {
298 }
else if (
c >=
'A' &&
c <=
'Z') {
317 for (
size_t i = 0; i < hrp.size(); ++i)
ret.push_back(hrp[i] >> 5);
319 for (
size_t i = 0; i < hrp.size(); ++i)
ret.push_back(hrp[i] & 0x1f);
350 ret[i] = (
mod >> (5 * (5 - i))) & 31;
362 for (
const char&
c : hrp)
assert(
c <
'A' ||
c >
'Z');
378 if (str.size() >
limit)
return {};
379 if (pos == str.npos || pos == 0 || pos +
CHECKSUM_SIZE >= str.size()) {
382 data
values(str.size() - 1 - pos);
383 for (
size_t i = 0; i < str.size() - 1 - pos; ++i) {
384 unsigned char c = str[i + pos + 1];
394 for (
size_t i = 0; i < pos; ++i) {
406 if (str.size() >
limit) {
409 return std::make_pair(
"Bech32 string too long", std::move(
error_locations));
413 return std::make_pair(
"Invalid character or mixed case", std::move(
error_locations));
417 if (pos == str.npos) {
418 return std::make_pair(
"Missing separator", std::vector<int>{});
422 return std::make_pair(
"Invalid separator position", std::move(
error_locations));
427 for (
size_t i = 0; i < pos; ++i) {
431 size_t length = str.size() - 1 - pos;
433 for (
size_t i = pos + 1; i < str.size(); ++i) {
434 unsigned char c = str[i];
438 return std::make_pair(
"Invalid Base 32 character", std::move(
error_locations));
461 int s0 =
syn & 0x3FF;
462 int s1 = (
syn >> 10) & 0x3FF;
484 if (
p1 < length && !(
l_e1 % 33)) {
493 for (
size_t p1 = 0;
p1 < length; ++
p1) {
519 if (
p2 >= length ||
p1 ==
p2)
continue;
536 if (
l_e2 % 33)
continue;
543 if (
l_e1 % 33)
continue;
559 return std::make_pair(
"", std::vector<int>{});
569 :
"Invalid checksum";