32 #include <openssl/evp.h> 36 if (strength % 32 || strength < 128 || strength > 256) {
48 if (len % 4 || len < 16 || len > 32) {
61 int mlen = len * 3 / 4;
65 for (i = 0; i < mlen; i++) {
67 for (j = 0; j < 11; j++) {
69 idx += (bits[(i * 11 + j) / 8] & (1 << (7 - ((i * 11 + j) % 8)))) > 0;
82 if (mnemonic.empty()) {
86 uint32_t nWordCount{};
88 for (
size_t i = 0; i < mnemonic.size(); ++i) {
89 if (mnemonic[i] ==
' ') {
95 if (nWordCount != 12 && nWordCount != 18 && nWordCount != 24) {
102 uint32_t nWordIndex, ki, nBitsCount{};
104 for (
size_t i = 0; i < mnemonic.size(); ++i)
107 while (i + ssCurrentWord.size() < mnemonic.size() && mnemonic[i + ssCurrentWord.size()] !=
' ') {
108 if (ssCurrentWord.size() >= 9) {
111 ssCurrentWord += mnemonic[i + ssCurrentWord.size()];
113 i += ssCurrentWord.size();
119 if (ssCurrentWord ==
wordlist[nWordIndex]) {
120 for (ki = 0; ki < 11; ki++) {
121 if (nWordIndex & (1 << (10 - ki))) {
122 bits[nBitsCount / 8] |= 1 << (7 - (nBitsCount % 8));
131 if (nBitsCount != nWordCount * 11) {
134 bits[32] = bits[nWordCount * 4 / 3];
138 if (nWordCount == 12) {
139 fResult = (bits[0] & 0xF0) == (bits[32] & 0xF0);
141 if (nWordCount == 18) {
142 fResult = (bits[0] & 0xFC) == (bits[32] & 0xFC);
144 if (nWordCount == 24) {
145 fResult = bits[0] == bits[32];
161 PKCS5_PBKDF2_HMAC(mnemonic.c_str(), mnemonic.size(), &vchSalt[0], vchSalt.size(), 2048, EVP_sha512(), 64, &seedRet[0]);
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
void Finalize(unsigned char hash[OUTPUT_SIZE])
static SecureString FromData(const SecureVector &data, int len)
static bool Check(SecureString mnemonic)
std::vector< unsigned char, secure_allocator< unsigned char > > SecureVector
const char *const wordlist[]
CSHA256 & Write(const unsigned char *data, size_t len)
void * memcpy(void *a, const void *b, size_t c)
static SecureString Generate(int strength)
void GetRandBytes(unsigned char *buf, int num)
static void ToSeed(SecureString mnemonic, SecureString passphrase, SecureVector &seedRet)