10 #include <openssl/evp.h>
14 if (strength % 32 || strength < 128 || strength > 256) {
26 if (len % 4 || len < 16 || len > 32) {
35 memcpy(&bits[0], &data[0], len);
37 bits.push_back(checksum[0]);
39 int mlen = len * 3 / 4;
43 for (i = 0; i < mlen; i++) {
45 for (j = 0; j < 11; j++) {
47 idx += (bits[(i * 11 + j) / 8] & (1 << (7 - ((i * 11 + j) % 8)))) > 0;
60 if (mnemonic.empty()) {
64 uint32_t nWordCount{};
66 for (
size_t i = 0; i < mnemonic.size(); ++i) {
67 if (mnemonic[i] ==
' ') {
73 if (nWordCount != 12 && nWordCount != 18 && nWordCount != 24) {
80 uint32_t nWordIndex, ki, nBitsCount{};
82 for (
size_t i = 0; i < mnemonic.size(); ++i)
85 while (i + ssCurrentWord.size() < mnemonic.size() && mnemonic[i + ssCurrentWord.size()] !=
' ') {
86 if (ssCurrentWord.size() >= 9) {
89 ssCurrentWord += mnemonic[i + ssCurrentWord.size()];
91 i += ssCurrentWord.size();
97 if (ssCurrentWord ==
wordlist[nWordIndex]) {
98 for (ki = 0; ki < 11; ki++) {
99 if (nWordIndex & (1 << (10 - ki))) {
100 bits[nBitsCount / 8] |= 1 << (7 - (nBitsCount % 8));
109 if (nBitsCount != nWordCount * 11) {
112 bits[32] = bits[nWordCount * 4 / 3];
116 if (nWordCount == 12) {
117 fResult = (bits[0] & 0xF0) == (bits[32] & 0xF0);
119 if (nWordCount == 18) {
120 fResult = (bits[0] & 0xFC) == (bits[32] & 0xFC);
122 if (nWordCount == 24) {
123 fResult = bits[0] == bits[32];
139 PKCS5_PBKDF2_HMAC(mnemonic.c_str(), mnemonic.size(), &vchSalt[0], vchSalt.size(), 2048, EVP_sha512(), 64, &seedRet[0]);