long_hash decode_mnemonic(const word_list& mnemonic) { const auto sentence = join(mnemonic); const std::string salt(passphrase_prefix); return pkcs5_pbkdf2_hmac_sha512(to_data_chunk(sentence), to_data_chunk(salt), hmac_iterations); }
BCW_API hd_private_key hd_private_key::generate_private_key(uint32_t i) const { if (!valid_) return hd_private_key(); data_chunk data; data.reserve(33 + 4); if (first_hardened_key <= i) { data.push_back(0x00); extend_data(data, k_); extend_data(data, to_big_endian(i)); } else { extend_data(data, K_); extend_data(data, to_big_endian(i)); } auto I = split(hmac_sha512_hash(data, to_data_chunk(c_))); // The child key ki is (parse256(IL) + kpar) mod n: ec_secret ki = k_; if (!ec_add(ki, I.L)) return hd_private_key(); hd_key_lineage lineage { lineage_.testnet, static_cast<uint8_t>(lineage_.depth + 1), fingerprint(), i }; return hd_private_key(ki, I.R, lineage); }
BCW_API hd_public_key hd_public_key::generate_public_key(uint32_t i) const { if (!valid_) return hd_private_key(); if (first_hardened_key <= i) return hd_public_key(); data_chunk data; data.reserve(33 + 4); extend_data(data, K_); extend_data(data, to_big_endian(i)); auto I = split(hmac_sha512_hash(data, to_data_chunk(c_))); // The returned child key Ki is point(parse256(IL)) + Kpar. ec_point Ki = K_; if (!ec_tweak_add(Ki, I.L)) return hd_public_key(); hd_key_lineage lineage { lineage_.testnet, static_cast<uint8_t>(lineage_.depth + 1), fingerprint(), i }; return hd_public_key(Ki, I.R, lineage); }
bool check_minikey(const std::string& minikey) { // Legacy minikeys are 22 chars long if (minikey.size() != 22 && minikey.size() != 30) return false; return sha256_hash(to_data_chunk(minikey + "?"))[0] == 0x00; }
BCW_API hd_private_key::hd_private_key(const data_chunk& seed, bool testnet) : hd_public_key() { std::string key("Bitcoin seed"); split_long_hash I = split(hmac_sha512_hash(seed, to_data_chunk(key))); // The key is invalid if parse256(IL) >= n or 0: if (!verify_private_key(I.L)) return; auto lineage = hd_key_lineage{testnet, 0, 0, 0}; *this = hd_private_key(I.L, I.R, lineage); }
void outgoing_message::send(czmqpp::socket& socket) const { czmqpp::message message; // [ DESTINATION ] (optional - ROUTER sockets strip this) if (!dest_.empty()) message.append(dest_); // [ COMMAND ] append_str(message, command_); // [ ID ] data_chunk raw_id = to_data_chunk(to_little_endian(id_)); BITCOIN_ASSERT(raw_id.size() == sizeof(id_)); message.append(raw_id); // [ DATA ] message.append(data_); // Send. message.send(socket); }
ec_secret minikey_to_secret(const std::string& minikey) { if (!check_minikey(minikey)) return ec_secret(); return sha256_hash(to_data_chunk(minikey)); }