bip32.cpp raw
1 // Copyright (c) 2019-2022 The Limenka 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 }
68