src/crypto/bip39/impl/bip39_provider_impl.cpp¶
Namespaces¶
| Name |
|---|
| sgns |
| sgns::crypto |
Source code¶
#include "crypto/bip39/impl/bip39_provider_impl.hpp"
#include "crypto/bip39/entropy_accumulator.hpp"
#include "crypto/bip39/mnemonic.hpp"
namespace sgns::crypto {
Bip39ProviderImpl::Bip39ProviderImpl(
std::shared_ptr<Pbkdf2Provider> pbkdf2_provider)
: pbkdf2_provider_(std::move(pbkdf2_provider)),
logger_{base::createLogger("Bip39Provider")} {
dictionary_.initialize();
}
outcome::result<std::vector<uint8_t>> Bip39ProviderImpl::calculateEntropy(
const std::vector<std::string> &word_list) {
// make entropy accumulator
OUTCOME_TRY((auto &&, entropy_accumulator),
bip39::EntropyAccumulator::create(word_list.size()));
// accumulate entropy
for (const auto &w : word_list) {
OUTCOME_TRY((auto &&, entropy_token), dictionary_.findValue(w));
BOOST_OUTCOME_TRYV2(auto &&, entropy_accumulator.append(entropy_token));
}
OUTCOME_TRY((auto &&, mnemonic_checksum), entropy_accumulator.getChecksum());
OUTCOME_TRY((auto &&, calculated_checksum), entropy_accumulator.calculateChecksum());
if (mnemonic_checksum != calculated_checksum) {
return bip39::MnemonicError::INVALID_MNEMONIC;
}
// finally get entropy
return entropy_accumulator.getEntropy();
}
outcome::result<bip39::Bip39Seed> Bip39ProviderImpl::makeSeed(
gsl::span<const uint8_t> entropy, std::string_view password) {
constexpr size_t iterations_count = 2048u;
constexpr auto default_salt = "mnemonic";
base::Buffer salt{};
salt.put(default_salt);
salt.put(password);
return pbkdf2_provider_->deriveKey(
entropy, salt, iterations_count, bip39::constants::BIP39_SEED_LEN_512);
}
} // namespace sgns::crypto
Updated on 2026-03-04 at 13:10:44 -0800