mycrypt_macros.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. extern char *crypt_error;
  14. /* ---- HELPER MACROS ---- */
  15. #ifdef ENDIAN_NEUTRAL
  16. #define STORE32L(x, y) \
  17. { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  18. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  19. #define LOAD32L(x, y) \
  20. { x = ((unsigned long)((y)[3] & 255)<<24) | \
  21. ((unsigned long)((y)[2] & 255)<<16) | \
  22. ((unsigned long)((y)[1] & 255)<<8) | \
  23. ((unsigned long)((y)[0] & 255)); }
  24. #define STORE64L(x, y) \
  25. { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
  26. (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
  27. (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  28. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  29. #define LOAD64L(x, y) \
  30. { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
  31. (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
  32. (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
  33. (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
  34. #define STORE32H(x, y) \
  35. { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
  36. (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
  37. #define LOAD32H(x, y) \
  38. { x = ((unsigned long)((y)[0] & 255)<<24) | \
  39. ((unsigned long)((y)[1] & 255)<<16) | \
  40. ((unsigned long)((y)[2] & 255)<<8) | \
  41. ((unsigned long)((y)[3] & 255)); }
  42. #define STORE64H(x, y) \
  43. { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
  44. (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
  45. (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
  46. (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
  47. #define LOAD64H(x, y) \
  48. { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
  49. (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
  50. (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
  51. (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
  52. #endif /* ENDIAN_NEUTRAL */
  53. #ifdef ENDIAN_LITTLE
  54. #define STORE32H(x, y) \
  55. { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
  56. (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
  57. #define LOAD32H(x, y) \
  58. { x = ((unsigned long)((y)[0] & 255)<<24) | \
  59. ((unsigned long)((y)[1] & 255)<<16) | \
  60. ((unsigned long)((y)[2] & 255)<<8) | \
  61. ((unsigned long)((y)[3] & 255)); }
  62. #define STORE64H(x, y) \
  63. { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
  64. (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
  65. (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
  66. (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
  67. #define LOAD64H(x, y) \
  68. { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
  69. (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
  70. (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
  71. (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
  72. #ifdef ENDIAN_32BITWORD
  73. #define STORE32L(x, y) \
  74. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  75. #define LOAD32L(x, y) \
  76. memcpy(&(x), y, 4);
  77. #define STORE64L(x, y) \
  78. { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
  79. (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
  80. (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  81. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  82. #define LOAD64L(x, y) \
  83. { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
  84. (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
  85. (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
  86. (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
  87. #else /* 64-bit words then */
  88. #define STORE32L(x, y) \
  89. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  90. #define LOAD32L(x, y) \
  91. { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
  92. #define STORE64L(x, y) \
  93. { ulong64 __t = (x); memcpy(y, &__t, 8); }
  94. #define LOAD64L(x, y) \
  95. { memcpy(&(x), y, 8); }
  96. #endif /* ENDIAN_64BITWORD */
  97. #endif /* ENDIAN_LITTLE */
  98. #ifdef ENDIAN_BIG
  99. #define STORE32L(x, y) \
  100. { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
  101. (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
  102. #define LOAD32L(x, y) \
  103. { x = ((unsigned long)((y)[0] & 255)<<24) | \
  104. ((unsigned long)((y)[1] & 255)<<16) | \
  105. ((unsigned long)((y)[2] & 255)<<8) | \
  106. ((unsigned long)((y)[3] & 255)); }
  107. #define STORE64L(x, y) \
  108. { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
  109. (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
  110. (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
  111. (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
  112. #define LOAD64L(x, y) \
  113. { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
  114. (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
  115. (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
  116. (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
  117. #ifdef ENDIAN_32BITWORD
  118. #define STORE32H(x, y) \
  119. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  120. #define LOAD32H(x, y) \
  121. memcpy(&(x), y, 4);
  122. #define STORE64H(x, y) \
  123. { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
  124. (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
  125. (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
  126. (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
  127. #define LOAD64H(x, y) \
  128. { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
  129. (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
  130. (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
  131. (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
  132. #else /* 64-bit words then */
  133. #define STORE32H(x, y) \
  134. { unsigned long __t = (x); memcpy(y, &__t, 4); }
  135. #define LOAD32H(x, y) \
  136. { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
  137. #define STORE64H(x, y) \
  138. { ulong64 __t = (x); memcpy(y, &__t, 8); }
  139. #define LOAD64H(x, y) \
  140. { memcpy(&(x), y, 8); }
  141. #endif /* ENDIAN_64BITWORD */
  142. #endif /* ENDIAN_BIG */
  143. #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
  144. ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
  145. #ifdef _MSC_VER
  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. #else
  151. #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
  152. #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
  153. #endif
  154. #define ROL64(x, y) \
  155. ( (((x)<<((ulong64)(y)&63)) | \
  156. (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
  157. #define ROR64(x, y) \
  158. ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
  159. ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
  160. #undef MAX
  161. #undef MIN
  162. #define MAX(x, y) ( ((x)>(y))?(x):(y) )
  163. #define MIN(x, y) ( ((x)<(y))?(x):(y) )
  164. /* extract a byte portably */
  165. #if (CHAR_BIT == 8)
  166. #define byte(x, n) ((unsigned char)((x) >> (8 * (n))))
  167. #else
  168. #define byte(x, n) (((x) >> (8 * (n))) & 255)
  169. #endif