Decode a Bech32 string. */
| 157 | |
| 158 | /** Decode a Bech32 string. */ |
| 159 | std::pair<std::string, data> Decode(const std::string& str) { |
| 160 | bool lower = false, upper = false; |
| 161 | for (size_t i = 0; i < str.size(); ++i) { |
| 162 | unsigned char c = str[i]; |
| 163 | if (c >= 'a' && c <= 'z') lower = true; |
| 164 | else if (c >= 'A' && c <= 'Z') upper = true; |
| 165 | else if (c < 33 || c > 126) return {}; |
| 166 | } |
| 167 | if (lower && upper) return {}; |
| 168 | size_t pos = str.rfind('1'); |
| 169 | if (str.size() > 90 || pos == str.npos || pos == 0 || pos + 7 > str.size()) { |
| 170 | return {}; |
| 171 | } |
| 172 | data values(str.size() - 1 - pos); |
| 173 | for (size_t i = 0; i < str.size() - 1 - pos; ++i) { |
| 174 | unsigned char c = str[i + pos + 1]; |
| 175 | int8_t rev = CHARSET_REV[c]; |
| 176 | |
| 177 | if (rev == -1) { |
| 178 | return {}; |
| 179 | } |
| 180 | values[i] = rev; |
| 181 | } |
| 182 | std::string hrp; |
| 183 | for (size_t i = 0; i < pos; ++i) { |
| 184 | hrp += LowerCase(str[i]); |
| 185 | } |
| 186 | if (!VerifyChecksum(hrp, values)) { |
| 187 | return {}; |
| 188 | } |
| 189 | return {hrp, data(values.begin(), values.end() - 6)}; |
| 190 | } |
| 191 | |
| 192 | } // namespace bech32 |