Revert "Revert "and added files""
[bcm963xx.git] / userapps / opensource / sshd / libtomcrypt / mycrypt_macros.h
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
10 extern char *crypt_error;
11
12 /* ---- HELPER MACROS ---- */
13 #ifdef ENDIAN_NEUTRAL
14
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
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
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); }
30
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))); }
36
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
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)); }
46
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); }
52
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))); }
58
59 #endif /* ENDIAN_NEUTRAL */
60
61 #ifdef ENDIAN_LITTLE
62
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); }
66
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)); }
72
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); }
78
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))); }
84
85 #ifdef ENDIAN_32BITWORD 
86
87 #define STORE32L(x, y)        \
88      { unsigned long __t = (x); memcpy(y, &__t, 4); }
89
90 #define LOAD32L(x, y)         \
91      memcpy(&(x), y, 4);
92
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); }
98
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))); }
104
105 #else /* 64-bit words then  */
106
107 #define STORE32L(x, y)        \
108      { unsigned long __t = (x); memcpy(y, &__t, 4); }
109
110 #define LOAD32L(x, y)         \
111      { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
112
113 #define STORE64L(x, y)        \
114      { ulong64 __t = (x); memcpy(y, &__t, 8); }
115
116 #define LOAD64L(x, y)         \
117     { memcpy(&(x), y, 8); }
118
119 #endif /* ENDIAN_64BITWORD */
120
121 #endif /* ENDIAN_LITTLE */
122
123 #ifdef ENDIAN_BIG
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); }
127
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)); }
133
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); }
139
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))); }
145
146 #ifdef ENDIAN_32BITWORD 
147
148 #define STORE32H(x, y)        \
149      { unsigned long __t = (x); memcpy(y, &__t, 4); }
150
151 #define LOAD32H(x, y)         \
152      memcpy(&(x), y, 4);
153
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); }
159
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))); }
165
166 #else /* 64-bit words then  */
167
168 #define STORE32H(x, y)        \
169      { unsigned long __t = (x); memcpy(y, &__t, 4); }
170
171 #define LOAD32H(x, y)         \
172      { memcpy(&(x), y, 4); x &= 0xFFFFFFFF; }
173
174 #define STORE64H(x, y)        \
175      { ulong64 __t = (x); memcpy(y, &__t, 8); }
176
177 #define LOAD64H(x, y)         \
178     { memcpy(&(x), y, 8); }
179
180 #endif /* ENDIAN_64BITWORD */
181 #endif /* ENDIAN_BIG */
182
183 #define BSWAP(x)  ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL)  | \
184                     ((x>>8)&0x0000FF00UL)  | ((x<<8)&0x00FF0000UL) )
185
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)
188
189 #define ROL64(x, y) \
190     ( (((x)<<((ulong64)(y)&63)) | \
191       (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
192
193 #define ROR64(x, y) \
194     ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
195       ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
196
197 #undef MAX
198 #undef MIN
199 #define MAX(x, y) ( ((x)>(y))?(x):(y) )
200 #define MIN(x, y) ( ((x)<(y))?(x):(y) )