/ src / util / bip32.cpp
bip32.cpp
 1  // Copyright (c) 2019-2022 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 <tinyformat.h>
 6  #include <util/bip32.h>
 7  #include <util/strencodings.h>
 8  
 9  #include <cstdint>
10  #include <cstdio>
11  #include <sstream>
12  
13  bool ParseHDKeypath(const std::string& keypath_str, std::vector<uint32_t>& keypath)
14  {
15      std::stringstream ss(keypath_str);
16      std::string item;
17      bool first = true;
18      while (std::getline(ss, item, '/')) {
19          if (item.compare("m") == 0) {
20              if (first) {
21                  first = false;
22                  continue;
23              }
24              return false;
25          }
26          // Finds whether it is hardened
27          uint32_t path = 0;
28          size_t pos = item.find('\'');
29          if (pos != std::string::npos) {
30              // The hardened tick can only be in the last index of the string
31              if (pos != item.size() - 1) {
32                  return false;
33              }
34              path |= 0x80000000;
35              item = item.substr(0, item.size() - 1); // Drop the last character which is the hardened tick
36          }
37  
38          // Ensure this is only numbers
39          if (item.find_first_not_of( "0123456789" ) != std::string::npos) {
40              return false;
41          }
42          uint32_t number;
43          if (!ParseUInt32(item, &number)) {
44              return false;
45          }
46          path |= number;
47  
48          keypath.push_back(path);
49          first = false;
50      }
51      return true;
52  }
53  
54  std::string FormatHDKeypath(const std::vector<uint32_t>& path, bool apostrophe)
55  {
56      std::string ret;
57      for (auto i : path) {
58          ret += strprintf("/%i", (i << 1) >> 1);
59          if (i >> 31) ret += apostrophe ? '\'' : 'h';
60      }
61      return ret;
62  }
63  
64  std::string WriteHDKeypath(const std::vector<uint32_t>& keypath, bool apostrophe)
65  {
66      return "m" + FormatHDKeypath(keypath, apostrophe);
67  }