Changeset View
Changeset View
Standalone View
Standalone View
src/util/bip32.cpp
- This file was added.
// Copyright (c) 2019 The Bitcoin Core developers | |||||
// Distributed under the MIT software license, see the accompanying | |||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
#include <util/bip32.h> | |||||
#include <tinyformat.h> | |||||
#include <util/strencodings.h> | |||||
#include <cstdio> | |||||
#include <sstream> | |||||
bool ParseHDKeypath(const std::string &keypath_str, | |||||
std::vector<uint32_t> &keypath) { | |||||
std::stringstream ss(keypath_str); | |||||
std::string item; | |||||
bool first = true; | |||||
while (std::getline(ss, item, '/')) { | |||||
if (item.compare("m") == 0) { | |||||
if (first) { | |||||
first = false; | |||||
continue; | |||||
} | |||||
return false; | |||||
} | |||||
// Finds whether it is hardened | |||||
uint32_t path = 0; | |||||
size_t pos = item.find("'"); | |||||
if (pos != std::string::npos) { | |||||
// The hardened tick can only be in the last index of the string | |||||
if (pos != item.size() - 1) { | |||||
return false; | |||||
} | |||||
path |= 0x80000000; | |||||
// Drop the last character which is the hardened tick | |||||
item = item.substr(0, item.size() - 1); | |||||
} | |||||
// Ensure this is only numbers | |||||
if (item.find_first_not_of("0123456789") != std::string::npos) { | |||||
return false; | |||||
} | |||||
uint32_t number; | |||||
if (!ParseUInt32(item, &number)) { | |||||
return false; | |||||
} | |||||
path |= number; | |||||
keypath.push_back(path); | |||||
first = false; | |||||
} | |||||
return true; | |||||
} | |||||
std::string FormatHDKeypath(const std::vector<uint32_t> &path) { | |||||
std::string ret; | |||||
for (auto i : path) { | |||||
ret += strprintf("/%i", (i << 1) >> 1); | |||||
if (i >> 31) { | |||||
ret += '\''; | |||||
} | |||||
} | |||||
return ret; | |||||
} | |||||
std::string WriteHDKeypath(const std::vector<uint32_t> &keypath) { | |||||
return "m" + FormatHDKeypath(keypath); | |||||
} |