mycrypt_macros.h 10 KB

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