Line data Source code
1 : // Copyright (c) 2019-2020 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #include <sstream> 6 : #include <stdio.h> 7 : #include <tinyformat.h> 8 : #include <util/bip32.h> 9 : #include <util/strencodings.h> 10 : 11 : 12 60 : bool ParseHDKeypath(const std::string& keypath_str, std::vector<uint32_t>& keypath) 13 : { 14 60 : std::stringstream ss(keypath_str); 15 60 : std::string item; 16 : bool first = true; 17 277 : while (std::getline(ss, item, '/')) { 18 240 : if (item.compare("m") == 0) { 19 34 : if (first) { 20 : first = false; 21 34 : continue; 22 : } 23 0 : return false; 24 : } 25 : // Finds whether it is hardened 26 206 : uint32_t path = 0; 27 206 : size_t pos = item.find("'"); 28 206 : if (pos != std::string::npos) { 29 : // The hardened tick can only be in the last index of the string 30 49 : if (pos != item.size() - 1) { 31 3 : return false; 32 : } 33 46 : path |= 0x80000000; 34 46 : item = item.substr(0, item.size() - 1); // Drop the last character which is the hardened tick 35 46 : } 36 : 37 : // Ensure this is only numbers 38 203 : if (item.find_first_not_of( "0123456789" ) != std::string::npos) { 39 11 : return false; 40 : } 41 192 : uint32_t number; 42 192 : if (!ParseUInt32(item, &number)) { 43 9 : return false; 44 : } 45 183 : path |= number; 46 : 47 183 : keypath.push_back(path); 48 : first = false; 49 206 : } 50 37 : return true; 51 60 : } 52 : 53 124896 : std::string FormatHDKeypath(const std::vector<uint32_t>& path) 54 : { 55 124896 : std::string ret; 56 448407 : for (auto i : path) { 57 323511 : ret += strprintf("/%i", (i << 1) >> 1); 58 323511 : if (i >> 31) ret += '\''; 59 : } 60 : return ret; 61 124896 : } 62 : 63 2235 : std::string WriteHDKeypath(const std::vector<uint32_t>& keypath) 64 : { 65 2235 : return "m" + FormatHDKeypath(keypath); 66 0 : }