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