1 /* fix for MSVC ...evil! */
3 #define CONST64(n) n ## ui64
4 typedef unsigned __int64 ulong64;
6 #define CONST64(n) n ## ULL
7 typedef unsigned long long ulong64;
10 extern char *crypt_error;
12 /* ---- HELPER MACROS ---- */
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); }
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)); }
25 #define STORE64L(x, y) \
26 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
27 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
28 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
29 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
31 #define LOAD64L(x, y) \
32 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
33 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
34 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
35 (((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); }
41 #define LOAD32H(x, y) \
42 { x = ((unsigned long)((y)[0] & 255)<<24) | \
43 ((unsigned long)((y)[1] & 255)<<16) | \
44 ((unsigned long)((y)[2] & 255)<<8) | \
45 ((unsigned long)((y)[3] & 255)); }
47 #define STORE64H(x, y) \
48 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
49 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
50 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
51 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
53 #define LOAD64H(x, y) \
54 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
55 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
56 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
57 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
59 #endif /* ENDIAN_NEUTRAL */
63 #define STORE32H(x, y) \
64 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
65 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
67 #define LOAD32H(x, y) \
68 { x = ((unsigned long)((y)[0] & 255)<<24) | \
69 ((unsigned long)((y)[1] & 255)<<16) | \
70 ((unsigned long)((y)[2] & 255)<<8) | \
71 ((unsigned long)((y)[3] & 255)); }
73 #define STORE64H(x, y) \
74 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
75 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
76 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
77 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
79 #define LOAD64H(x, y) \
80 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
81 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
82 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
83 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
85 #ifdef ENDIAN_32BITWORD
87 #define STORE32L(x, y) \
88 { unsigned long __t = (x); memcpy(y, &__t, 4); }
90 #define LOAD32L(x, y) \
93 #define STORE64L(x, y) \
94 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
95 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
96 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
97 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
99 #define LOAD64L(x, y) \
100 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
101 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
102 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
103 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
105 #else /* 64-bit words then */
107 #define STORE32L(x, y) \
108 { unsigned long __t = (x); memcpy(y, &__t, 4); }
110 #define LOAD32L(x, y) \
111 { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
113 #define STORE64L(x, y) \
114 { ulong64 __t = (x); memcpy(y, &__t, 8); }
116 #define LOAD64L(x, y) \
117 { memcpy(&(x), y, 8); }
119 #endif /* ENDIAN_64BITWORD */
121 #endif /* ENDIAN_LITTLE */
124 #define STORE32L(x, y) \
125 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
126 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
128 #define LOAD32L(x, y) \
129 { x = ((unsigned long)((y)[0] & 255)<<24) | \
130 ((unsigned long)((y)[1] & 255)<<16) | \
131 ((unsigned long)((y)[2] & 255)<<8) | \
132 ((unsigned long)((y)[3] & 255)); }
134 #define STORE64L(x, y) \
135 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
136 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
137 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
138 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
140 #define LOAD64L(x, y) \
141 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
142 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
143 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
144 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
146 #ifdef ENDIAN_32BITWORD
148 #define STORE32H(x, y) \
149 { unsigned long __t = (x); memcpy(y, &__t, 4); }
151 #define LOAD32H(x, y) \
154 #define STORE64H(x, y) \
155 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
156 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
157 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
158 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
160 #define LOAD64H(x, y) \
161 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
162 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
163 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
164 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
166 #else /* 64-bit words then */
168 #define STORE32H(x, y) \
169 { unsigned long __t = (x); memcpy(y, &__t, 4); }
171 #define LOAD32H(x, y) \
172 { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
174 #define STORE64H(x, y) \
175 { ulong64 __t = (x); memcpy(y, &__t, 8); }
177 #define LOAD64H(x, y) \
178 { memcpy(&(x), y, 8); }
180 #endif /* ENDIAN_64BITWORD */
181 #endif /* ENDIAN_BIG */
183 #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
184 ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
186 #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
187 #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
189 #define ROL64(x, y) \
190 ( (((x)<<((ulong64)(y)&63)) | \
191 (((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))
199 #define MAX(x, y) ( ((x)>(y))?(x):(y) )
200 #define MIN(x, y) ( ((x)<(y))?(x):(y) )