/ src / crypto / common.h
common.h
  1  // Copyright (c) 2014-present 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  #ifndef BITCOIN_CRYPTO_COMMON_H
  6  #define BITCOIN_CRYPTO_COMMON_H
  7  
  8  #include <compat/endian.h>
  9  
 10  #include <concepts>
 11  #include <cstddef>
 12  #include <cstdint>
 13  #include <cstring>
 14  
 15  template <typename B>
 16  concept ByteType = std::same_as<B, unsigned char> || std::same_as<B, std::byte>;
 17  
 18  template <ByteType B>
 19  inline uint16_t ReadLE16(const B* ptr)
 20  {
 21      uint16_t x;
 22      memcpy(&x, ptr, 2);
 23      return le16toh_internal(x);
 24  }
 25  
 26  template <ByteType B>
 27  inline uint32_t ReadLE32(const B* ptr)
 28  {
 29      uint32_t x;
 30      memcpy(&x, ptr, 4);
 31      return le32toh_internal(x);
 32  }
 33  
 34  template <ByteType B>
 35  inline uint64_t ReadLE64(const B* ptr)
 36  {
 37      uint64_t x;
 38      memcpy(&x, ptr, 8);
 39      return le64toh_internal(x);
 40  }
 41  
 42  template <ByteType B>
 43  inline void WriteLE16(B* ptr, uint16_t x)
 44  {
 45      uint16_t v = htole16_internal(x);
 46      memcpy(ptr, &v, 2);
 47  }
 48  
 49  template <ByteType B>
 50  inline void WriteLE32(B* ptr, uint32_t x)
 51  {
 52      uint32_t v = htole32_internal(x);
 53      memcpy(ptr, &v, 4);
 54  }
 55  
 56  template <ByteType B>
 57  inline void WriteLE64(B* ptr, uint64_t x)
 58  {
 59      uint64_t v = htole64_internal(x);
 60      memcpy(ptr, &v, 8);
 61  }
 62  
 63  template <ByteType B>
 64  inline uint16_t ReadBE16(const B* ptr)
 65  {
 66      uint16_t x;
 67      memcpy(&x, ptr, 2);
 68      return be16toh_internal(x);
 69  }
 70  
 71  template <ByteType B>
 72  inline uint32_t ReadBE32(const B* ptr)
 73  {
 74      uint32_t x;
 75      memcpy(&x, ptr, 4);
 76      return be32toh_internal(x);
 77  }
 78  
 79  template <ByteType B>
 80  inline uint64_t ReadBE64(const B* ptr)
 81  {
 82      uint64_t x;
 83      memcpy(&x, ptr, 8);
 84      return be64toh_internal(x);
 85  }
 86  
 87  template <ByteType B>
 88  inline void WriteBE16(B* ptr, uint16_t x)
 89  {
 90      uint16_t v = htobe16_internal(x);
 91      memcpy(ptr, &v, 2);
 92  }
 93  
 94  template <ByteType B>
 95  inline void WriteBE32(B* ptr, uint32_t x)
 96  {
 97      uint32_t v = htobe32_internal(x);
 98      memcpy(ptr, &v, 4);
 99  }
100  
101  template <ByteType B>
102  inline void WriteBE64(B* ptr, uint64_t x)
103  {
104      uint64_t v = htobe64_internal(x);
105      memcpy(ptr, &v, 8);
106  }
107  
108  #endif // BITCOIN_CRYPTO_COMMON_H