mycrypt_macros.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /* fix for MSVC ...evil! */
  2. #ifdef _MSC_VER
  3. #define CONST64(n) n ## ui64
  4. typedef unsigned __int64 ulong64;
  5. #else
  6. #define CONST64(n) n ## ULL
  7. typedef unsigned long long ulong64;
  8. #endif
  9. /* this is the "32-bit at least" data type
  10. * Re-define it to suit your platform but it must be at least 32-bits
  11. */
  12. #if defined(__x86_64__)
  13. typedef unsigned ulong32;
  14. #else
  15. typedef unsigned long ulong32;
  16. #endif
  17. /* ---- HELPER MACROS ---- */
  18. #ifdef ENDIAN_NEUTRAL
  19. #define STORE32L(x, y) \
  20. { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  21. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  22. #define LOAD32L(x, y) \
  23. { x = ((unsigned long)((y)[3] & 255)<<24) | \
  24. ((unsigned long)((y)[2] & 255)<<16) | \
  25. ((unsigned long)((y)[1] & 255)<<8) | \
  26. ((unsigned long)((y)[0] & 255)); }
  27. #define STORE64L(x, y) \
  28. { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
  29. (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
  30. (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  31. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  32. #define LOAD64L(x, y) \
  33. { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
  34. (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
  35. (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
  36. (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
  37. #define STORE32H(x, y) \
  38. { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
  39. (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
  40. #define LOAD32H(x, y) \
  41. { x = ((unsigned long)((y)[0] & 255)<<24) | \
  42. ((unsigned long)((y)[1] & 255)<<16) | \
  43. ((unsigned long)((y)[2] & 255)<<8) | \
  44. ((unsigned long)((y)[3] & 255)); }
  45. #define STORE64H(x, y) \
  46. { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
  47. (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
  48. (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
  49. (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
  50. #define LOAD64H(x, y) \
  51. { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
  52. (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
  53. (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
  54. (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
  55. #endif /* ENDIAN_NEUTRAL */
  56. #ifdef ENDIAN_LITTLE
  57. #define STORE32H(x, y) \
  58. { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
  59. (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
  60. #define LOAD32H(x, y) \
  61. { x = ((unsigned long)((y)[0] & 255)<<24) | \
  62. ((unsigned long)((y)[1] & 255)<<16) | \
  63. ((unsigned long)((y)[2] & 255)<<8) | \
  64. ((unsigned long)((y)[3] & 255)); }
  65. #define STORE64H(x, y) \
  66. { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
  67. (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
  68. (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
  69. (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
  70. #define LOAD64H(x, y) \
  71. { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
  72. (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
  73. (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
  74. (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
  75. #ifdef ENDIAN_32BITWORD
  76. #define STORE32L(x, y) \
  77. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  78. #define LOAD32L(x, y) \
  79. memcpy(&(x), y, 4);
  80. #define STORE64L(x, y) \
  81. { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
  82. (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
  83. (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  84. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  85. #define LOAD64L(x, y) \
  86. { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
  87. (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
  88. (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
  89. (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
  90. #else /* 64-bit words then */
  91. #define STORE32L(x, y) \
  92. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  93. #define LOAD32L(x, y) \
  94. { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
  95. #define STORE64L(x, y) \
  96. { ulong64 __t = (x); memcpy(y, &__t, 8); }
  97. #define LOAD64L(x, y) \
  98. { memcpy(&(x), y, 8); }
  99. #endif /* ENDIAN_64BITWORD */
  100. #endif /* ENDIAN_LITTLE */
  101. #ifdef ENDIAN_BIG
  102. #define STORE32L(x, y) \
  103. { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  104. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  105. #define LOAD32L(x, y) \
  106. { x = ((unsigned long)((y)[3] & 255)<<24) | \
  107. ((unsigned long)((y)[2] & 255)<<16) | \
  108. ((unsigned long)((y)[1] & 255)<<8) | \
  109. ((unsigned long)((y)[0] & 255)); }
  110. #define STORE64L(x, y) \
  111. { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
  112. (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
  113. (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  114. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  115. #define LOAD64L(x, y) \
  116. { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
  117. (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
  118. (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
  119. (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
  120. #ifdef ENDIAN_32BITWORD
  121. #define STORE32H(x, y) \
  122. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  123. #define LOAD32H(x, y) \
  124. memcpy(&(x), y, 4);
  125. #define STORE64H(x, y) \
  126. { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
  127. (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
  128. (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
  129. (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
  130. #define LOAD64H(x, y) \
  131. { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
  132. (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
  133. (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
  134. (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
  135. #else /* 64-bit words then */
  136. #define STORE32H(x, y) \
  137. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  138. #define LOAD32H(x, y) \
  139. { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
  140. #define STORE64H(x, y) \
  141. { ulong64 __t = (x); memcpy(y, &__t, 8); }
  142. #define LOAD64H(x, y) \
  143. { memcpy(&(x), y, 8); }
  144. #endif /* ENDIAN_64BITWORD */
  145. #endif /* ENDIAN_BIG */
  146. #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
  147. ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
  148. #ifdef _MSC_VER
  149. /* instrinsic rotate */
  150. #include <stdlib.h>
  151. #pragma intrinsic(_lrotr,_lrotl)
  152. #define ROR(x,n) _lrotr(x,n)
  153. #define ROL(x,n) _lrotl(x,n)
  154. #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC)
  155. static inline unsigned ROL(unsigned word, int i)
  156. {
  157. __asm__("roll %%cl,%0"
  158. :"=r" (word)
  159. :"0" (word),"c" (i));
  160. return word;
  161. }
  162. static inline unsigned ROR(unsigned word, int i)
  163. {
  164. __asm__("rorl %%cl,%0"
  165. :"=r" (word)
  166. :"0" (word),"c" (i));
  167. return word;
  168. }
  169. #else
  170. /* rotates the hard way */
  171. #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
  172. #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
  173. #endif
  174. #if defined(__GNUCC__) && defined(__x86_64__)
  175. static inline unsigned long ROL64(unsigned long word, int i)
  176. {
  177. __asm__("rolq %%cl,%0"
  178. :"=r" (word)
  179. :"0" (word),"c" (i));
  180. return word;
  181. }
  182. static inline unsigned long ROR64(unsigned long word, int i)
  183. {
  184. __asm__("rorq %%cl,%0"
  185. :"=r" (word)
  186. :"0" (word),"c" (i));
  187. return word;
  188. }
  189. #else
  190. #define ROL64(x, y) \
  191. ( (((x)<<((ulong64)(y)&63)) | \
  192. (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
  193. #define ROR64(x, y) \
  194. ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
  195. ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
  196. #endif
  197. #undef MAX
  198. #undef MIN
  199. #define MAX(x, y) ( ((x)>(y))?(x):(y) )
  200. #define MIN(x, y) ( ((x)<(y))?(x):(y) )
  201. /* extract a byte portably */
  202. #ifdef _MSC_VER
  203. #define byte(x, n) ((unsigned char)((x) >> (8 * (n))))
  204. #else
  205. #define byte(x, n) (((x) >> (8 * (n))) & 255)
  206. #endif