ecrypt_portable.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /* ecrypt_portable.h */
  2. /*
  3. * WARNING: the conversions defined below are implemented as macros,
  4. * and should be used carefully. They should NOT be used with
  5. * parameters which perform some action. E.g., the following two lines
  6. * are not equivalent:
  7. *
  8. * 1) ++x; y = ROTL32(x, n);
  9. * 2) y = ROTL32(++x, n);
  10. */
  11. /*
  12. * *** Please do not edit this file. ***
  13. *
  14. * The default macros can be overridden for specific architectures by
  15. * editing 'ecrypt_machine.h'.
  16. */
  17. #ifndef ECRYPT_PORTABLE
  18. #define ECRYPT_PORTABLE
  19. #include "ecrypt_config.h"
  20. #include "ecrypt_types.h"
  21. /* ------------------------------------------------------------------------- */
  22. /*
  23. * The following macros are used to obtain exact-width results.
  24. */
  25. #define U8V(v) ((u8)(v)&U8C(0xFF))
  26. #define U16V(v) ((u16)(v)&U16C(0xFFFF))
  27. #define U32V(v) ((u32)(v)&U32C(0xFFFFFFFF))
  28. #define U64V(v) ((u64)(v)&U64C(0xFFFFFFFFFFFFFFFF))
  29. /* ------------------------------------------------------------------------- */
  30. /*
  31. * The following macros return words with their bits rotated over n
  32. * positions to the left/right.
  33. */
  34. #define ECRYPT_DEFAULT_ROT
  35. #define ROTL8(v, n) (U8V((v) << (n)) | ((v) >> (8 - (n))))
  36. #define ROTL16(v, n) (U16V((v) << (n)) | ((v) >> (16 - (n))))
  37. #define ROTL32(v, n) (U32V((v) << (n)) | ((v) >> (32 - (n))))
  38. #define ROTL64(v, n) (U64V((v) << (n)) | ((v) >> (64 - (n))))
  39. #define ROTR8(v, n) ROTL8(v, 8 - (n))
  40. #define ROTR16(v, n) ROTL16(v, 16 - (n))
  41. #define ROTR32(v, n) ROTL32(v, 32 - (n))
  42. #define ROTR64(v, n) ROTL64(v, 64 - (n))
  43. #include "ecrypt_machine.h"
  44. /* ------------------------------------------------------------------------- */
  45. /*
  46. * The following macros return a word with bytes in reverse order.
  47. */
  48. #define ECRYPT_DEFAULT_SWAP
  49. #define SWAP16(v) ROTL16(v, 8)
  50. #define SWAP32(v) ((ROTL32(v, 8) & U32C(0x00FF00FF)) | (ROTL32(v, 24) & U32C(0xFF00FF00)))
  51. #ifdef ECRYPT_NATIVE64
  52. #define SWAP64(v) \
  53. ((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | (ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \
  54. (ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | (ROTL64(v, 56) & U64C(0xFF000000FF000000)))
  55. #else
  56. #define SWAP64(v) (((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32)))
  57. #endif
  58. #include "ecrypt_machine.h"
  59. #define ECRYPT_DEFAULT_WTOW
  60. #ifdef ECRYPT_LITTLE_ENDIAN
  61. #define U16TO16_LITTLE(v) (v)
  62. #define U32TO32_LITTLE(v) (v)
  63. #define U64TO64_LITTLE(v) (v)
  64. #define U16TO16_BIG(v) SWAP16(v)
  65. #define U32TO32_BIG(v) SWAP32(v)
  66. #define U64TO64_BIG(v) SWAP64(v)
  67. #endif
  68. #ifdef ECRYPT_BIG_ENDIAN
  69. #define U16TO16_LITTLE(v) SWAP16(v)
  70. #define U32TO32_LITTLE(v) SWAP32(v)
  71. #define U64TO64_LITTLE(v) SWAP64(v)
  72. #define U16TO16_BIG(v) (v)
  73. #define U32TO32_BIG(v) (v)
  74. #define U64TO64_BIG(v) (v)
  75. #endif
  76. #include "ecrypt_machine.h"
  77. /*
  78. * The following macros load words from an array of bytes with
  79. * different types of endianness, and vice versa.
  80. */
  81. #define ECRYPT_DEFAULT_BTOW
  82. #if(!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE))
  83. #define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16*)(p))[0])
  84. #define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32*)(p))[0])
  85. #define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64*)(p))[0])
  86. #define U8TO16_BIG(p) U16TO16_BIG(((u16*)(p))[0])
  87. #define U8TO32_BIG(p) U32TO32_BIG(((u32*)(p))[0])
  88. #define U8TO64_BIG(p) U64TO64_BIG(((u64*)(p))[0])
  89. #define U16TO8_LITTLE(p, v) (((u16*)(p))[0] = U16TO16_LITTLE(v))
  90. #define U32TO8_LITTLE(p, v) (((u32*)(p))[0] = U32TO32_LITTLE(v))
  91. #define U64TO8_LITTLE(p, v) (((u64*)(p))[0] = U64TO64_LITTLE(v))
  92. #define U16TO8_BIG(p, v) (((u16*)(p))[0] = U16TO16_BIG(v))
  93. #define U32TO8_BIG(p, v) (((u32*)(p))[0] = U32TO32_BIG(v))
  94. #define U64TO8_BIG(p, v) (((u64*)(p))[0] = U64TO64_BIG(v))
  95. #else
  96. #define U8TO16_LITTLE(p) (((u16)((p)[0])) | ((u16)((p)[1]) << 8))
  97. #define U8TO32_LITTLE(p) \
  98. (((u32)((p)[0])) | ((u32)((p)[1]) << 8) | ((u32)((p)[2]) << 16) | ((u32)((p)[3]) << 24))
  99. #ifdef ECRYPT_NATIVE64
  100. #define U8TO64_LITTLE(p) \
  101. (((u64)((p)[0])) | ((u64)((p)[1]) << 8) | ((u64)((p)[2]) << 16) | ((u64)((p)[3]) << 24) | \
  102. ((u64)((p)[4]) << 32) | ((u64)((p)[5]) << 40) | ((u64)((p)[6]) << 48) | \
  103. ((u64)((p)[7]) << 56))
  104. #else
  105. #define U8TO64_LITTLE(p) ((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32))
  106. #endif
  107. #define U8TO16_BIG(p) (((u16)((p)[0]) << 8) | ((u16)((p)[1])))
  108. #define U8TO32_BIG(p) \
  109. (((u32)((p)[0]) << 24) | ((u32)((p)[1]) << 16) | ((u32)((p)[2]) << 8) | ((u32)((p)[3])))
  110. #ifdef ECRYPT_NATIVE64
  111. #define U8TO64_BIG(p) \
  112. (((u64)((p)[0]) << 56) | ((u64)((p)[1]) << 48) | ((u64)((p)[2]) << 40) | \
  113. ((u64)((p)[3]) << 32) | ((u64)((p)[4]) << 24) | ((u64)((p)[5]) << 16) | \
  114. ((u64)((p)[6]) << 8) | ((u64)((p)[7])))
  115. #else
  116. #define U8TO64_BIG(p) (((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4))
  117. #endif
  118. #define U16TO8_LITTLE(p, v) \
  119. do { \
  120. (p)[0] = U8V((v)); \
  121. (p)[1] = U8V((v) >> 8); \
  122. } while(0)
  123. #define U32TO8_LITTLE(p, v) \
  124. do { \
  125. (p)[0] = U8V((v)); \
  126. (p)[1] = U8V((v) >> 8); \
  127. (p)[2] = U8V((v) >> 16); \
  128. (p)[3] = U8V((v) >> 24); \
  129. } while(0)
  130. #ifdef ECRYPT_NATIVE64
  131. #define U64TO8_LITTLE(p, v) \
  132. do { \
  133. (p)[0] = U8V((v)); \
  134. (p)[1] = U8V((v) >> 8); \
  135. (p)[2] = U8V((v) >> 16); \
  136. (p)[3] = U8V((v) >> 24); \
  137. (p)[4] = U8V((v) >> 32); \
  138. (p)[5] = U8V((v) >> 40); \
  139. (p)[6] = U8V((v) >> 48); \
  140. (p)[7] = U8V((v) >> 56); \
  141. } while(0)
  142. #else
  143. #define U64TO8_LITTLE(p, v) \
  144. do { \
  145. U32TO8_LITTLE((p), U32V((v))); \
  146. U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \
  147. } while(0)
  148. #endif
  149. #define U16TO8_BIG(p, v) \
  150. do { \
  151. (p)[0] = U8V((v)); \
  152. (p)[1] = U8V((v) >> 8); \
  153. } while(0)
  154. #define U32TO8_BIG(p, v) \
  155. do { \
  156. (p)[0] = U8V((v) >> 24); \
  157. (p)[1] = U8V((v) >> 16); \
  158. (p)[2] = U8V((v) >> 8); \
  159. (p)[3] = U8V((v)); \
  160. } while(0)
  161. #ifdef ECRYPT_NATIVE64
  162. #define U64TO8_BIG(p, v) \
  163. do { \
  164. (p)[0] = U8V((v) >> 56); \
  165. (p)[1] = U8V((v) >> 48); \
  166. (p)[2] = U8V((v) >> 40); \
  167. (p)[3] = U8V((v) >> 32); \
  168. (p)[4] = U8V((v) >> 24); \
  169. (p)[5] = U8V((v) >> 16); \
  170. (p)[6] = U8V((v) >> 8); \
  171. (p)[7] = U8V((v)); \
  172. } while(0)
  173. #else
  174. #define U64TO8_BIG(p, v) \
  175. do { \
  176. U32TO8_BIG((p), U32V((v) >> 32)); \
  177. U32TO8_BIG((p) + 4, U32V((v))); \
  178. } while(0)
  179. #endif
  180. #endif
  181. #include "ecrypt_machine.h"
  182. /* ------------------------------------------------------------------------- */
  183. #define AT_LEAST_ONE(n) (((n) < 1) ? 1 : (n))
  184. #define ALIGN(t, v, n) \
  185. union { \
  186. t b[n]; \
  187. MAXT l[AT_LEAST_ONE(n * sizeof(t) / sizeof(MAXT))]; \
  188. } v
  189. /* ------------------------------------------------------------------------- */
  190. #endif