Branch data Line data Source code
1 : : // Copyright (c) 2014-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 : : #ifndef BITCOIN_CRYPTO_COMMON_H 6 : : #define BITCOIN_CRYPTO_COMMON_H 7 : : 8 : : #if defined(HAVE_CONFIG_H) 9 : : #include <config/bitcoin-config.h> 10 : : #endif 11 : : 12 : : #include <stdint.h> 13 : : #include <string.h> 14 : : 15 : : #include <compat/endian.h> 16 : : 17 : 125154 : uint16_t static inline ReadLE16(const unsigned char* ptr) 18 : : { 19 : : uint16_t x; 20 : 125154 : memcpy(&x, ptr, 2); 21 : 125154 : return le16toh(x); 22 : : } 23 : : 24 : 269956974 : uint32_t static inline ReadLE32(const unsigned char* ptr) 25 : : { 26 : : uint32_t x; 27 : 269956974 : memcpy(&x, ptr, 4); 28 : 269956974 : return le32toh(x); 29 : : } 30 : : 31 : 471364779 : uint64_t static inline ReadLE64(const unsigned char* ptr) 32 : : { 33 : : uint64_t x; 34 : 471364779 : memcpy(&x, ptr, 8); 35 : 471364779 : return le64toh(x); 36 : : } 37 : : 38 : 10115 : void static inline WriteLE16(unsigned char* ptr, uint16_t x) 39 : : { 40 : 10115 : uint16_t v = htole16(x); 41 : 10115 : memcpy(ptr, &v, 2); 42 : 10115 : } 43 : : 44 : 121551262 : void static inline WriteLE32(unsigned char* ptr, uint32_t x) 45 : : { 46 : 121551262 : uint32_t v = htole32(x); 47 : 121551262 : memcpy(ptr, &v, 4); 48 : 121551262 : } 49 : : 50 : 11064293 : void static inline WriteLE64(unsigned char* ptr, uint64_t x) 51 : : { 52 : 11064293 : uint64_t v = htole64(x); 53 : 11064293 : memcpy(ptr, &v, 8); 54 : 11064293 : } 55 : : 56 : 3819960 : uint16_t static inline ReadBE16(const unsigned char* ptr) 57 : : { 58 : : uint16_t x; 59 : 3819960 : memcpy(&x, ptr, 2); 60 : 3819960 : return be16toh(x); 61 : : } 62 : : 63 : 408956340 : uint32_t static inline ReadBE32(const unsigned char* ptr) 64 : : { 65 : : uint32_t x; 66 : 408956340 : memcpy(&x, ptr, 4); 67 : 408956340 : return be32toh(x); 68 : : } 69 : : 70 : 165306570 : uint64_t static inline ReadBE64(const unsigned char* ptr) 71 : : { 72 : : uint64_t x; 73 : 165306570 : memcpy(&x, ptr, 8); 74 : 165306570 : return be64toh(x); 75 : : } 76 : : 77 : 812432266 : void static inline WriteBE32(unsigned char* ptr, uint32_t x) 78 : : { 79 : 812432266 : uint32_t v = htobe32(x); 80 : 812432266 : memcpy(ptr, &v, 4); 81 : 812432266 : } 82 : : 83 : 186726132 : void static inline WriteBE64(unsigned char* ptr, uint64_t x) 84 : : { 85 : 186726132 : uint64_t v = htobe64(x); 86 : 186726132 : memcpy(ptr, &v, 8); 87 : 186726132 : } 88 : : 89 : : /** Return the smallest number n such that (x >> n) == 0 (or 64 if the highest bit in x is set. */ 90 : 24352878 : uint64_t static inline CountBits(uint64_t x) 91 : : { 92 : : #if HAVE_BUILTIN_CLZL 93 : : if (sizeof(unsigned long) >= sizeof(uint64_t)) { 94 [ + + ]: 24352878 : return x ? 8 * sizeof(unsigned long) - __builtin_clzl(x) : 0; 95 : : } 96 : : #endif 97 : : #if HAVE_BUILTIN_CLZLL 98 : : if (sizeof(unsigned long long) >= sizeof(uint64_t)) { 99 : : return x ? 8 * sizeof(unsigned long long) - __builtin_clzll(x) : 0; 100 : : } 101 : : #endif 102 : : int ret = 0; 103 : : while (x) { 104 : : x >>= 1; 105 : : ++ret; 106 : : } 107 : : return ret; 108 : : } 109 : : 110 : : #endif // BITCOIN_CRYPTO_COMMON_H