ecrypt-portable.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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) \
  36. (U8V((v) << (n)) | ((v) >> (8 - (n))))
  37. #define ROTL16(v, n) \
  38. (U16V((v) << (n)) | ((v) >> (16 - (n))))
  39. #define ROTL32(v, n) \
  40. (U32V((v) << (n)) | ((v) >> (32 - (n))))
  41. #define ROTL64(v, n) \
  42. (U64V((v) << (n)) | ((v) >> (64 - (n))))
  43. #define ROTR8(v, n) ROTL8(v, 8 - (n))
  44. #define ROTR16(v, n) ROTL16(v, 16 - (n))
  45. #define ROTR32(v, n) ROTL32(v, 32 - (n))
  46. #define ROTR64(v, n) ROTL64(v, 64 - (n))
  47. #include "ecrypt-machine.h"
  48. /* ------------------------------------------------------------------------- */
  49. /*
  50. * The following macros return a word with bytes in reverse order.
  51. */
  52. #define ECRYPT_DEFAULT_SWAP
  53. #define SWAP16(v) \
  54. ROTL16(v, 8)
  55. #define SWAP32(v) \
  56. ((ROTL32(v, 8) & U32C(0x00FF00FF)) | \
  57. (ROTL32(v, 24) & U32C(0xFF00FF00)))
  58. #ifdef ECRYPT_NATIVE64
  59. #define SWAP64(v) \
  60. ((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | \
  61. (ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \
  62. (ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | \
  63. (ROTL64(v, 56) & U64C(0xFF000000FF000000)))
  64. #else
  65. #define SWAP64(v) \
  66. (((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32)))
  67. #endif
  68. #include "ecrypt-machine.h"
  69. #define ECRYPT_DEFAULT_WTOW
  70. #ifdef ECRYPT_LITTLE_ENDIAN
  71. #define U16TO16_LITTLE(v) (v)
  72. #define U32TO32_LITTLE(v) (v)
  73. #define U64TO64_LITTLE(v) (v)
  74. #define U16TO16_BIG(v) SWAP16(v)
  75. #define U32TO32_BIG(v) SWAP32(v)
  76. #define U64TO64_BIG(v) SWAP64(v)
  77. #endif
  78. #ifdef ECRYPT_BIG_ENDIAN
  79. #define U16TO16_LITTLE(v) SWAP16(v)
  80. #define U32TO32_LITTLE(v) SWAP32(v)
  81. #define U64TO64_LITTLE(v) SWAP64(v)
  82. #define U16TO16_BIG(v) (v)
  83. #define U32TO32_BIG(v) (v)
  84. #define U64TO64_BIG(v) (v)
  85. #endif
  86. #include "ecrypt-machine.h"
  87. /*
  88. * The following macros load words from an array of bytes with
  89. * different types of endianness, and vice versa.
  90. */
  91. #define ECRYPT_DEFAULT_BTOW
  92. #if (!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE))
  93. #define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16*)(p))[0])
  94. #define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32*)(p))[0])
  95. #define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64*)(p))[0])
  96. #define U8TO16_BIG(p) U16TO16_BIG(((u16*)(p))[0])
  97. #define U8TO32_BIG(p) U32TO32_BIG(((u32*)(p))[0])
  98. #define U8TO64_BIG(p) U64TO64_BIG(((u64*)(p))[0])
  99. #define U16TO8_LITTLE(p, v) (((u16*)(p))[0] = U16TO16_LITTLE(v))
  100. #define U32TO8_LITTLE(p, v) (((u32*)(p))[0] = U32TO32_LITTLE(v))
  101. #define U64TO8_LITTLE(p, v) (((u64*)(p))[0] = U64TO64_LITTLE(v))
  102. #define U16TO8_BIG(p, v) (((u16*)(p))[0] = U16TO16_BIG(v))
  103. #define U32TO8_BIG(p, v) (((u32*)(p))[0] = U32TO32_BIG(v))
  104. #define U64TO8_BIG(p, v) (((u64*)(p))[0] = U64TO64_BIG(v))
  105. #else
  106. #define U8TO16_LITTLE(p) \
  107. (((u16)((p)[0]) ) | \
  108. ((u16)((p)[1]) << 8))
  109. #define U8TO32_LITTLE(p) \
  110. (((u32)((p)[0]) ) | \
  111. ((u32)((p)[1]) << 8) | \
  112. ((u32)((p)[2]) << 16) | \
  113. ((u32)((p)[3]) << 24))
  114. #ifdef ECRYPT_NATIVE64
  115. #define U8TO64_LITTLE(p) \
  116. (((u64)((p)[0]) ) | \
  117. ((u64)((p)[1]) << 8) | \
  118. ((u64)((p)[2]) << 16) | \
  119. ((u64)((p)[3]) << 24) | \
  120. ((u64)((p)[4]) << 32) | \
  121. ((u64)((p)[5]) << 40) | \
  122. ((u64)((p)[6]) << 48) | \
  123. ((u64)((p)[7]) << 56))
  124. #else
  125. #define U8TO64_LITTLE(p) \
  126. ((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32))
  127. #endif
  128. #define U8TO16_BIG(p) \
  129. (((u16)((p)[0]) << 8) | \
  130. ((u16)((p)[1]) ))
  131. #define U8TO32_BIG(p) \
  132. (((u32)((p)[0]) << 24) | \
  133. ((u32)((p)[1]) << 16) | \
  134. ((u32)((p)[2]) << 8) | \
  135. ((u32)((p)[3]) ))
  136. #ifdef ECRYPT_NATIVE64
  137. #define U8TO64_BIG(p) \
  138. (((u64)((p)[0]) << 56) | \
  139. ((u64)((p)[1]) << 48) | \
  140. ((u64)((p)[2]) << 40) | \
  141. ((u64)((p)[3]) << 32) | \
  142. ((u64)((p)[4]) << 24) | \
  143. ((u64)((p)[5]) << 16) | \
  144. ((u64)((p)[6]) << 8) | \
  145. ((u64)((p)[7]) ))
  146. #else
  147. #define U8TO64_BIG(p) \
  148. (((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4))
  149. #endif
  150. #define U16TO8_LITTLE(p, v) \
  151. do { \
  152. (p)[0] = U8V((v) ); \
  153. (p)[1] = U8V((v) >> 8); \
  154. } while (0)
  155. #define U32TO8_LITTLE(p, v) \
  156. do { \
  157. (p)[0] = U8V((v) ); \
  158. (p)[1] = U8V((v) >> 8); \
  159. (p)[2] = U8V((v) >> 16); \
  160. (p)[3] = U8V((v) >> 24); \
  161. } while (0)
  162. #ifdef ECRYPT_NATIVE64
  163. #define U64TO8_LITTLE(p, v) \
  164. do { \
  165. (p)[0] = U8V((v) ); \
  166. (p)[1] = U8V((v) >> 8); \
  167. (p)[2] = U8V((v) >> 16); \
  168. (p)[3] = U8V((v) >> 24); \
  169. (p)[4] = U8V((v) >> 32); \
  170. (p)[5] = U8V((v) >> 40); \
  171. (p)[6] = U8V((v) >> 48); \
  172. (p)[7] = U8V((v) >> 56); \
  173. } while (0)
  174. #else
  175. #define U64TO8_LITTLE(p, v) \
  176. do { \
  177. U32TO8_LITTLE((p), U32V((v) )); \
  178. U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \
  179. } while (0)
  180. #endif
  181. #define U16TO8_BIG(p, v) \
  182. do { \
  183. (p)[0] = U8V((v) ); \
  184. (p)[1] = U8V((v) >> 8); \
  185. } while (0)
  186. #define U32TO8_BIG(p, v) \
  187. do { \
  188. (p)[0] = U8V((v) >> 24); \
  189. (p)[1] = U8V((v) >> 16); \
  190. (p)[2] = U8V((v) >> 8); \
  191. (p)[3] = U8V((v) ); \
  192. } while (0)
  193. #ifdef ECRYPT_NATIVE64
  194. #define U64TO8_BIG(p, v) \
  195. do { \
  196. (p)[0] = U8V((v) >> 56); \
  197. (p)[1] = U8V((v) >> 48); \
  198. (p)[2] = U8V((v) >> 40); \
  199. (p)[3] = U8V((v) >> 32); \
  200. (p)[4] = U8V((v) >> 24); \
  201. (p)[5] = U8V((v) >> 16); \
  202. (p)[6] = U8V((v) >> 8); \
  203. (p)[7] = U8V((v) ); \
  204. } while (0)
  205. #else
  206. #define U64TO8_BIG(p, v) \
  207. do { \
  208. U32TO8_BIG((p), U32V((v) >> 32)); \
  209. U32TO8_BIG((p) + 4, U32V((v) )); \
  210. } while (0)
  211. #endif
  212. #endif
  213. #include "ecrypt-machine.h"
  214. /* ------------------------------------------------------------------------- */
  215. #define AT_LEAST_ONE(n) (((n) < 1) ? 1 : (n))
  216. #define ALIGN(t, v, n) \
  217. union { t b[n]; MAXT l[AT_LEAST_ONE(n * sizeof(t) / sizeof(MAXT))]; } v
  218. /* ------------------------------------------------------------------------- */
  219. #endif