hex_base.cpp raw

   1  // Copyright (c) 2009-present 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 <crypto/hex_base.h>
   6  
   7  #include <array>
   8  #include <cstring>
   9  #include <string>
  10  
  11  namespace {
  12  
  13  using ByteAsHex = std::array<char, 2>;
  14  
  15  constexpr std::array<ByteAsHex, 256> CreateByteToHexMap()
  16  {
  17      constexpr char hexmap[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  18  
  19      std::array<ByteAsHex, 256> byte_to_hex{};
  20      for (size_t i = 0; i < byte_to_hex.size(); ++i) {
  21          byte_to_hex[i][0] = hexmap[i >> 4];
  22          byte_to_hex[i][1] = hexmap[i & 15];
  23      }
  24      return byte_to_hex;
  25  }
  26  
  27  } // namespace
  28  
  29  std::string HexStr(const Span<const uint8_t> s)
  30  {
  31      std::string rv(s.size() * 2, '\0');
  32      static constexpr auto byte_to_hex = CreateByteToHexMap();
  33      static_assert(sizeof(byte_to_hex) == 512);
  34  
  35      char* it = rv.data();
  36      for (uint8_t v : s) {
  37          std::memcpy(it, byte_to_hex[v].data(), 2);
  38          it += 2;
  39      }
  40  
  41      assert(it == rv.data() + rv.size());
  42      return rv;
  43  }
  44  
  45  const signed char p_util_hexdigit[256] =
  46  { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  47    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  48    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  49    0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,
  50    -1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  51    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  52    -1,0xa,0xb,0xc,0xd,0xe,0xf,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  53    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  54    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  55    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  56    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  57    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  58    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  59    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  60    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  61    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, };
  62  
  63  signed char HexDigit(char c)
  64  {
  65      return p_util_hexdigit[(unsigned char)c];
  66  }
  67  
  68