Full-node GUI wallet for DragonX cryptocurrency. Built with Dear ImGui, SDL3, and OpenGL3/DX11. Features: - Send/receive shielded and transparent transactions - Autoshield with merged transaction display - Built-in CPU mining (xmrig) - Peer management and network monitoring - Wallet encryption with PIN lock - QR code generation for receive addresses - Transaction history with pagination - Console for direct RPC commands - Cross-platform (Linux, Windows)
105 lines
3.1 KiB
C++
105 lines
3.1 KiB
C++
// DragonX Wallet - ImGui Edition
|
|
// Copyright 2024-2026 The Hush Developers
|
|
// Released under the GPLv3
|
|
|
|
#include "base64.h"
|
|
#include <cstring>
|
|
|
|
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<unsigned char> 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<unsigned char> 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<unsigned char>(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<unsigned char>(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
|