]>
Dogcows Code - chaz/p5-File-KDBX-XS/blob - tomcrypt_macros.h
94aa7c32d20fd737fd5eafe070ce68b200b93a64
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
4 /* ---- HELPER MACROS ---- */
7 #define STORE32L(x, y) \
8 do { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
9 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
11 #define LOAD32L(x, y) \
12 do { x = ((ulong32)((y)[3] & 255)<<24) | \
13 ((ulong32)((y)[2] & 255)<<16) | \
14 ((ulong32)((y)[1] & 255)<<8) | \
15 ((ulong32)((y)[0] & 255)); } while(0)
17 #define STORE64L(x, y) \
18 do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
19 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
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); } while(0)
23 #define LOAD64L(x, y) \
24 do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
25 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
26 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
27 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } while(0)
29 #define STORE32H(x, y) \
30 do { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
31 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } while(0)
33 #define LOAD32H(x, y) \
34 do { x = ((ulong32)((y)[0] & 255)<<24) | \
35 ((ulong32)((y)[1] & 255)<<16) | \
36 ((ulong32)((y)[2] & 255)<<8) | \
37 ((ulong32)((y)[3] & 255)); } while(0)
39 #define STORE64H(x, y) \
40 do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
41 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
42 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
43 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0)
45 #define LOAD64H(x, y) \
46 do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
47 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
48 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
49 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } while(0)
52 #elif defined(ENDIAN_LITTLE)
54 #ifdef LTC_HAVE_BSWAP_BUILTIN
56 #define STORE32H(x, y) \
57 do { ulong32 ttt = __builtin_bswap32 ((x)); \
58 XMEMCPY ((y), &ttt, 4); } while(0)
60 #define LOAD32H(x, y) \
61 do { XMEMCPY (&(x), (y), 4); \
62 (x) = __builtin_bswap32 ((x)); } while(0)
64 #elif !defined(LTC_NO_BSWAP) && (defined(INTEL_CC) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__) || defined(__x86_64__))))
66 #define STORE32H(x, y) \
71 ::"r"(x), "r"(y): "memory");
73 #define LOAD32H(x, y) \
77 :"=r"(x): "r"(y): "memory");
81 #define STORE32H(x, y) \
82 do { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
83 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } while(0)
85 #define LOAD32H(x, y) \
86 do { x = ((ulong32)((y)[0] & 255)<<24) | \
87 ((ulong32)((y)[1] & 255)<<16) | \
88 ((ulong32)((y)[2] & 255)<<8) | \
89 ((ulong32)((y)[3] & 255)); } while(0)
93 #ifdef LTC_HAVE_BSWAP_BUILTIN
95 #define STORE64H(x, y) \
96 do { ulong64 ttt = __builtin_bswap64 ((x)); \
97 XMEMCPY ((y), &ttt, 8); } while(0)
99 #define LOAD64H(x, y) \
100 do { XMEMCPY (&(x), (y), 8); \
101 (x) = __builtin_bswap64 ((x)); } while(0)
103 /* x86_64 processor */
104 #elif !defined(LTC_NO_BSWAP) && (defined(__GNUC__) && defined(__x86_64__))
106 #define STORE64H(x, y) \
111 ::"r"(x), "r"(y): "memory");
113 #define LOAD64H(x, y) \
117 :"=r"(x): "r"(y): "memory");
121 #define STORE64H(x, y) \
122 do { (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); } while(0)
127 #define LOAD64H(x, y) \
128 do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
129 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
130 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
131 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } while(0)
135 #ifdef ENDIAN_32BITWORD
137 #define STORE32L(x, y) \
138 do { ulong32 ttt = (x); XMEMCPY(y, &ttt, 4); } while(0)
140 #define LOAD32L(x, y) \
141 do { XMEMCPY(&(x), y, 4); } while(0)
143 #define STORE64L(x, y) \
144 do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
145 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
146 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
147 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
149 #define LOAD64L(x, y) \
150 do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
151 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
152 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
153 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } while(0)
155 #else /* 64-bit words then */
157 #define STORE32L(x, y) \
158 do { ulong32 ttt = (x); XMEMCPY(y, &ttt, 4); } while(0)
160 #define LOAD32L(x, y) \
161 do { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } while(0)
163 #define STORE64L(x, y) \
164 do { ulong64 ttt = (x); XMEMCPY(y, &ttt, 8); } while(0)
166 #define LOAD64L(x, y) \
167 do { XMEMCPY(&(x), y, 8); } while(0)
169 #endif /* ENDIAN_64BITWORD */
171 #elif defined(ENDIAN_BIG)
173 #define STORE32L(x, y) \
174 do { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
175 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
177 #define LOAD32L(x, y) \
178 do { x = ((ulong32)((y)[3] & 255)<<24) | \
179 ((ulong32)((y)[2] & 255)<<16) | \
180 ((ulong32)((y)[1] & 255)<<8) | \
181 ((ulong32)((y)[0] & 255)); } while(0)
183 #define STORE64L(x, y) \
184 do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
185 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
186 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
187 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0)
189 #define LOAD64L(x, y) \
190 do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
191 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
192 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
193 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } while(0)
195 #ifdef ENDIAN_32BITWORD
197 #define STORE32H(x, y) \
198 do { ulong32 ttt = (x); XMEMCPY(y, &ttt, 4); } while(0)
200 #define LOAD32H(x, y) \
201 do { XMEMCPY(&(x), y, 4); } while(0)
203 #define STORE64H(x, y) \
204 do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
205 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
206 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
207 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0)
209 #define LOAD64H(x, y) \
210 do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
211 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
212 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
213 (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); } while(0)
215 #else /* 64-bit words then */
217 #define STORE32H(x, y) \
218 do { ulong32 ttt = (x); XMEMCPY(y, &ttt, 4); } while(0)
220 #define LOAD32H(x, y) \
221 do { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } while(0)
223 #define STORE64H(x, y) \
224 do { ulong64 ttt = (x); XMEMCPY(y, &ttt, 8); } while(0)
226 #define LOAD64H(x, y) \
227 do { XMEMCPY(&(x), y, 8); } while(0)
229 #endif /* ENDIAN_64BITWORD */
230 #endif /* ENDIAN_BIG */
232 #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
233 ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
237 #if defined(_MSC_VER)
238 #define LTC_ROx_BUILTIN
240 /* instrinsic rotate */
242 #pragma intrinsic(_rotr,_rotl)
243 #define ROR(x,n) _rotr(x,n)
244 #define ROL(x,n) _rotl(x,n)
245 #define RORc(x,n) ROR(x,n)
246 #define ROLc(x,n) ROL(x,n)
248 #elif defined(LTC_HAVE_ROTATE_BUILTIN)
249 #define LTC_ROx_BUILTIN
251 #define ROR(x,n) __builtin_rotateright32(x,n)
252 #define ROL(x,n) __builtin_rotateleft32(x,n)
253 #define ROLc(x,n) ROL(x,n)
254 #define RORc(x,n) ROR(x,n)
256 #elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM)
259 static inline ulong32
ROL(ulong32 word
, int i
)
263 :"0" (word
),"c" (i
));
267 static inline ulong32
ROR(ulong32 word
, int i
)
271 :"0" (word
),"c" (i
));
277 #define ROLc(word,i) ({ \
278 ulong32 ROLc_tmp = (word); \
279 __asm__ ("roll %2, %0" : \
285 #define RORc(word,i) ({ \
286 ulong32 RORc_tmp = (word); \
287 __asm__ ("rorl %2, %0" : \
301 #elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32)
304 static inline ulong32
ROL(ulong32 word
, int i
)
306 asm ("rotlw %0,%0,%2"
308 :"0" (word
),"r" (i
));
312 static inline ulong32
ROR(ulong32 word
, int i
)
314 asm ("rotlw %0,%0,%2"
316 :"0" (word
),"r" (32-i
));
322 static inline ulong32
ROLc(ulong32 word
, const int i
)
324 asm ("rotlwi %0,%0,%2"
326 :"0" (word
),"I" (i
));
330 static inline ulong32
RORc(ulong32 word
, const int i
)
332 asm ("rotrwi %0,%0,%2"
334 :"0" (word
),"I" (i
));
348 /* rotates the hard way */
349 #define ROL(x, y) ( (((ulong32)(x)<<(ulong32)((y)&31)) | (((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL)
350 #define ROR(x, y) ( ((((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((y)&31)) | ((ulong32)(x)<<(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL)
351 #define ROLc(x, y) ( (((ulong32)(x)<<(ulong32)((y)&31)) | (((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL)
352 #define RORc(x, y) ( ((((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((y)&31)) | ((ulong32)(x)<<(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL)
358 #if defined(_MSC_VER)
360 /* instrinsic rotate */
362 #pragma intrinsic(_rotr64,_rotr64)
363 #define ROR64(x,n) _rotr64(x,n)
364 #define ROL64(x,n) _rotl64(x,n)
365 #define ROR64c(x,n) ROR64(x,n)
366 #define ROL64c(x,n) ROL64(x,n)
368 #elif defined(LTC_HAVE_ROTATE_BUILTIN)
370 #define ROR64(x,n) __builtin_rotateright64(x,n)
371 #define ROL64(x,n) __builtin_rotateleft64(x,n)
372 #define ROR64c(x,n) ROR64(x,n)
373 #define ROL64c(x,n) ROL64(x,n)
375 #elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(INTEL_CC) && !defined(LTC_NO_ASM)
377 static inline ulong64
ROL64(ulong64 word
, int i
)
381 :"0" (word
),"c" (i
));
385 static inline ulong64
ROR64(ulong64 word
, int i
)
389 :"0" (word
),"c" (i
));
395 #define ROL64c(word,i) ({ \
396 ulong64 ROL64c_tmp = word; \
397 __asm__ ("rolq %2, %0" : \
398 "=r" (ROL64c_tmp) : \
403 #define ROR64c(word,i) ({ \
404 ulong64 ROR64c_tmp = word; \
405 __asm__ ("rorq %2, %0" : \
406 "=r" (ROR64c_tmp) : \
412 #else /* LTC_NO_ROLC */
419 #else /* Not x86_64 */
421 #define ROL64(x, y) \
422 ( (((x)<<((ulong64)(y)&63)) | \
423 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF))
425 #define ROR64(x, y) \
426 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
427 ((x)<<(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF))
429 #define ROL64c(x, y) \
430 ( (((x)<<((ulong64)(y)&63)) | \
431 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF))
433 #define ROR64c(x, y) \
434 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
435 ((x)<<(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF))
440 #define MAX(x, y) ( ((x)>(y))?(x):(y) )
444 #define MIN(x, y) ( ((x)<(y))?(x):(y) )
447 #ifndef LTC_UNUSED_PARAM
448 #define LTC_UNUSED_PARAM(x) (void)(x)
451 /* there is no snprintf before Visual C++ 2015 */
452 #if defined(_MSC_VER) && _MSC_VER < 1900
453 #define snprintf _snprintf
This page took 0.053782 seconds and 3 git commands to generate.