// DragonX Wallet - ImGui Edition // Copyright 2024-2026 The Hush Developers // Released under the GPLv3 #include "base64.h" #include namespace dragonx { namespace util { static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; static inline bool is_base64(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); } std::string base64_encode(const unsigned char* data, size_t len) { std::string ret; ret.reserve(((len + 2) / 3) * 4); int i = 0; unsigned char char_array_3[3]; unsigned char char_array_4[4]; while (len--) { char_array_3[i++] = *(data++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (i = 0; i < 4; i++) ret += base64_chars[char_array_4[i]]; i = 0; } } if (i) { for (int j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); for (int j = 0; j < i + 1; j++) ret += base64_chars[char_array_4[j]]; while (i++ < 3) ret += '='; } return ret; } std::vector base64_decode(const std::string& encoded) { size_t in_len = encoded.size(); int i = 0; int in_ = 0; unsigned char char_array_4[4], char_array_3[3]; std::vector ret; while (in_len-- && (encoded[in_] != '=') && is_base64(encoded[in_])) { char_array_4[i++] = encoded[in_]; in_++; if (i == 4) { for (i = 0; i < 4; i++) { const char* p = strchr(base64_chars, char_array_4[i]); char_array_4[i] = p ? static_cast(p - base64_chars) : 0; } char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (i = 0; i < 3; i++) ret.push_back(char_array_3[i]); i = 0; } } if (i) { for (int j = 0; j < i; j++) { const char* p = strchr(base64_chars, char_array_4[j]); char_array_4[j] = p ? static_cast(p - base64_chars) : 0; } char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); for (int j = 0; j < i - 1; j++) ret.push_back(char_array_3[j]); } return ret; } } // namespace util } // namespace dragonx