Branch data Line data Source code
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 : 122 : bool ParseHDKeypath(const std::string& keypath_str, std::vector<uint32_t>& keypath)
14 : : {
15 : 122 : std::stringstream ss(keypath_str);
16 : 122 : std::string item;
17 : 122 : bool first = true;
18 [ + - + + ]: 390745 : while (std::getline(ss, item, '/')) {
19 [ + + ]: 390727 : if (item.compare("m") == 0) {
20 [ + + ]: 2 : if (first) {
21 : 1 : first = false;
22 : 1 : continue;
23 : : }
24 : : return false;
25 : : }
26 : : // Finds whether it is hardened
27 : 390725 : uint32_t path = 0;
28 : 390725 : size_t pos = item.find('\'');
29 [ + + ]: 390725 : if (pos != std::string::npos) {
30 : : // The hardened tick can only be in the last index of the string
31 [ + + ]: 2449 : if (pos != item.size() - 1) {
32 : : return false;
33 : : }
34 : 2439 : path |= 0x80000000;
35 [ + - ]: 2439 : 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 [ + + ]: 390715 : if (item.find_first_not_of( "0123456789" ) != std::string::npos) {
40 : : return false;
41 : : }
42 : 390665 : uint32_t number;
43 [ + - + + ]: 390665 : if (!ParseUInt32(item, &number)) {
44 : : return false;
45 : : }
46 : 390622 : path |= number;
47 : :
48 [ + - ]: 390622 : keypath.push_back(path);
49 : : first = false;
50 : : }
51 : : return true;
52 : 122 : }
53 : :
54 : 2265360 : std::string FormatHDKeypath(const std::vector<uint32_t>& path, bool apostrophe)
55 : : {
56 : 2265360 : std::string ret;
57 [ + + ]: 5803781 : for (auto i : path) {
58 [ + - ]: 7076842 : ret += strprintf("/%i", (i << 1) >> 1);
59 [ + + + + ]: 5675155 : if (i >> 31) ret += apostrophe ? '\'' : 'h';
60 : : }
61 : 2265360 : return ret;
62 : 0 : }
63 : :
64 : 501 : std::string WriteHDKeypath(const std::vector<uint32_t>& keypath, bool apostrophe)
65 : : {
66 [ + - ]: 1002 : return "m" + FormatHDKeypath(keypath, apostrophe);
67 : : }
|