Bitcoin Core  27.99.0
P2P Digital Currency
bip32.cpp
Go to the documentation of this file.
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 }
bool ParseHDKeypath(const std::string &keypath_str, std::vector< uint32_t > &keypath)
Parse an HD keypaths like "m/7/0'/2000".
Definition: bip32.cpp:13
std::string FormatHDKeypath(const std::vector< uint32_t > &path, bool apostrophe)
Definition: bip32.cpp:54
std::string WriteHDKeypath(const std::vector< uint32_t > &keypath, bool apostrophe)
Write HD keypaths as strings.
Definition: bip32.cpp:64
int ret
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1162
bool ParseUInt32(std::string_view str, uint32_t *out)
Convert decimal string to unsigned 32-bit integer with strict parse error feedback.