LCOV - code coverage report
Current view: top level - src/util - bip32.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 33 35 94.3 %
Date: 2020-09-26 01:30:44 Functions: 3 3 100.0 %

          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 : }

Generated by: LCOV version 1.15