Home | History | Annotate | Line # | Download | only in private
      1 #ifndef common_H
      2 #define common_H 1
      3 
      4 #include <stdint.h>
      5 #include <stdlib.h>
      6 #include <string.h>
      7 
      8 #define COMPILER_ASSERT(X) (void) sizeof(char[(X) ? 1 : -1])
      9 
     10 #ifdef HAVE_TI_MODE
     11 # if defined(__SIZEOF_INT128__)
     12 typedef unsigned __int128 uint128_t;
     13 # else
     14 typedef unsigned uint128_t __attribute__((mode(TI)));
     15 # endif
     16 #endif
     17 
     18 #define ROTL32(X, B) rotl32((X), (B))
     19 static inline uint32_t
     20 rotl32(const uint32_t x, const int b)
     21 {
     22     return (x << b) | (x >> (32 - b));
     23 }
     24 
     25 #define ROTL64(X, B) rotl64((X), (B))
     26 static inline uint64_t
     27 rotl64(const uint64_t x, const int b)
     28 {
     29     return (x << b) | (x >> (64 - b));
     30 }
     31 
     32 #define ROTR32(X, B) rotr32((X), (B))
     33 static inline uint32_t
     34 rotr32(const uint32_t x, const int b)
     35 {
     36     return (x >> b) | (x << (32 - b));
     37 }
     38 
     39 #define ROTR64(X, B) rotr64((X), (B))
     40 static inline uint64_t
     41 rotr64(const uint64_t x, const int b)
     42 {
     43     return (x >> b) | (x << (64 - b));
     44 }
     45 
     46 #define LOAD64_LE(SRC) load64_le(SRC)
     47 static inline uint64_t
     48 load64_le(const uint8_t src[8])
     49 {
     50 #ifdef NATIVE_LITTLE_ENDIAN
     51     uint64_t w;
     52     memcpy(&w, src, sizeof w);
     53     return w;
     54 #else
     55     uint64_t w = (uint64_t) src[0];
     56     w |= (uint64_t) src[1] <<  8;
     57     w |= (uint64_t) src[2] << 16;
     58     w |= (uint64_t) src[3] << 24;
     59     w |= (uint64_t) src[4] << 32;
     60     w |= (uint64_t) src[5] << 40;
     61     w |= (uint64_t) src[6] << 48;
     62     w |= (uint64_t) src[7] << 56;
     63     return w;
     64 #endif
     65 }
     66 
     67 #define STORE64_LE(DST, W) store64_le((DST), (W))
     68 static inline void
     69 store64_le(uint8_t dst[8], uint64_t w)
     70 {
     71 #ifdef NATIVE_LITTLE_ENDIAN
     72     memcpy(dst, &w, sizeof w);
     73 #else
     74     dst[0] = (uint8_t) w; w >>= 8;
     75     dst[1] = (uint8_t) w; w >>= 8;
     76     dst[2] = (uint8_t) w; w >>= 8;
     77     dst[3] = (uint8_t) w; w >>= 8;
     78     dst[4] = (uint8_t) w; w >>= 8;
     79     dst[5] = (uint8_t) w; w >>= 8;
     80     dst[6] = (uint8_t) w; w >>= 8;
     81     dst[7] = (uint8_t) w;
     82 #endif
     83 }
     84 
     85 #define LOAD32_LE(SRC) load32_le(SRC)
     86 static inline uint32_t
     87 load32_le(const uint8_t src[4])
     88 {
     89 #ifdef NATIVE_LITTLE_ENDIAN
     90     uint32_t w;
     91     memcpy(&w, src, sizeof w);
     92     return w;
     93 #else
     94     uint32_t w = (uint32_t) src[0];
     95     w |= (uint32_t) src[1] <<  8;
     96     w |= (uint32_t) src[2] << 16;
     97     w |= (uint32_t) src[3] << 24;
     98     return w;
     99 #endif
    100 }
    101 
    102 #define STORE32_LE(DST, W) store32_le((DST), (W))
    103 static inline void
    104 store32_le(uint8_t dst[4], uint32_t w)
    105 {
    106 #ifdef NATIVE_LITTLE_ENDIAN
    107     memcpy(dst, &w, sizeof w);
    108 #else
    109     dst[0] = (uint8_t) w; w >>= 8;
    110     dst[1] = (uint8_t) w; w >>= 8;
    111     dst[2] = (uint8_t) w; w >>= 8;
    112     dst[3] = (uint8_t) w;
    113 #endif
    114 }
    115 
    116 /* ----- */
    117 
    118 #define LOAD64_BE(SRC) load64_be(SRC)
    119 static inline uint64_t
    120 load64_be(const uint8_t src[8])
    121 {
    122 #ifdef NATIVE_BIG_ENDIAN
    123     uint64_t w;
    124     memcpy(&w, src, sizeof w);
    125     return w;
    126 #else
    127     uint64_t w = (uint64_t) src[7];
    128     w |= (uint64_t) src[6] <<  8;
    129     w |= (uint64_t) src[5] << 16;
    130     w |= (uint64_t) src[4] << 24;
    131     w |= (uint64_t) src[3] << 32;
    132     w |= (uint64_t) src[2] << 40;
    133     w |= (uint64_t) src[1] << 48;
    134     w |= (uint64_t) src[0] << 56;
    135     return w;
    136 #endif
    137 }
    138 
    139 #define STORE64_BE(DST, W) store64_be((DST), (W))
    140 static inline void
    141 store64_be(uint8_t dst[8], uint64_t w)
    142 {
    143 #ifdef NATIVE_BIG_ENDIAN
    144     memcpy(dst, &w, sizeof w);
    145 #else
    146     dst[7] = (uint8_t) w; w >>= 8;
    147     dst[6] = (uint8_t) w; w >>= 8;
    148     dst[5] = (uint8_t) w; w >>= 8;
    149     dst[4] = (uint8_t) w; w >>= 8;
    150     dst[3] = (uint8_t) w; w >>= 8;
    151     dst[2] = (uint8_t) w; w >>= 8;
    152     dst[1] = (uint8_t) w; w >>= 8;
    153     dst[0] = (uint8_t) w;
    154 #endif
    155 }
    156 
    157 #define LOAD32_BE(SRC) load32_be(SRC)
    158 static inline uint32_t
    159 load32_be(const uint8_t src[4])
    160 {
    161 #ifdef NATIVE_BIG_ENDIAN
    162     uint32_t w;
    163     memcpy(&w, src, sizeof w);
    164     return w;
    165 #else
    166     uint32_t w = (uint32_t) src[3];
    167     w |= (uint32_t) src[2] <<  8;
    168     w |= (uint32_t) src[1] << 16;
    169     w |= (uint32_t) src[0] << 24;
    170     return w;
    171 #endif
    172 }
    173 
    174 #define STORE32_BE(DST, W) store32_be((DST), (W))
    175 static inline void
    176 store32_be(uint8_t dst[4], uint32_t w)
    177 {
    178 #ifdef NATIVE_BIG_ENDIAN
    179     memcpy(dst, &w, sizeof w);
    180 #else
    181     dst[3] = (uint8_t) w; w >>= 8;
    182     dst[2] = (uint8_t) w; w >>= 8;
    183     dst[1] = (uint8_t) w; w >>= 8;
    184     dst[0] = (uint8_t) w;
    185 #endif
    186 }
    187 
    188 #define XOR_BUF(OUT, IN, N) xor_buf((OUT), (IN), (N))
    189 static inline void
    190 xor_buf(unsigned char *out, const unsigned char *in, size_t n)
    191 {
    192     size_t i;
    193 
    194     for (i = 0; i < n; i++) {
    195         out[i] ^= in[i];
    196     }
    197 }
    198 
    199 #ifndef __GNUC__
    200 # ifdef __attribute__
    201 #  undef __attribute__
    202 # endif
    203 # define __attribute__(a)
    204 #endif
    205 
    206 #ifndef CRYPTO_ALIGN
    207 # if defined(__INTEL_COMPILER) || defined(_MSC_VER)
    208 #  define CRYPTO_ALIGN(x) __declspec(align(x))
    209 # else
    210 #  define CRYPTO_ALIGN(x) __attribute__ ((aligned(x)))
    211 # endif
    212 #endif
    213 
    214 #if defined(_MSC_VER) && \
    215     (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86))
    216 
    217 # include <intrin.h>
    218 
    219 # define HAVE_INTRIN_H    1
    220 # define HAVE_MMINTRIN_H  1
    221 # define HAVE_EMMINTRIN_H 1
    222 # define HAVE_PMMINTRIN_H 1
    223 # define HAVE_TMMINTRIN_H 1
    224 # define HAVE_SMMINTRIN_H 1
    225 # define HAVE_AVXINTRIN_H 1
    226 # if _MSC_VER >= 1600
    227 #  define HAVE_WMMINTRIN_H 1
    228 # endif
    229 # if _MSC_VER >= 1700 && defined(_M_X64)
    230 #  define HAVE_AVX2INTRIN_H 1
    231 # endif
    232 #elif defined(HAVE_INTRIN_H)
    233 # include <intrin.h>
    234 #endif
    235 
    236 #ifdef HAVE_LIBCTGRIND
    237 extern void ct_poison  (const void *, size_t);
    238 extern void ct_unpoison(const void *, size_t);
    239 # define POISON(X, L)   ct_poison((X), (L))
    240 # define UNPOISON(X, L) ct_unpoison((X), (L))
    241 #else
    242 # define POISON(X, L)   (void) 0
    243 # define UNPOISON(X, L) (void) 0
    244 #endif
    245 
    246 #endif
    247