LibLogicalAccess  2.5.0
An Open Source RFID Library
Loading...
Searching...
No Matches
tomcrypt_macros.h
Go to the documentation of this file.
1/* fix for MSVC ...evil! */
2#ifdef _MSC_VER
3#define CONST64(n) n ## ui64
4typedef unsigned __int64 ulong64;
5#else
6#define CONST64(n) n ## ULL
7typedef unsigned long long ulong64;
8#endif
9
10/* this is the "32-bit at least" data type
11 * Re-define it to suit your platform but it must be at least 32-bits
12 */
13#if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__))
14typedef unsigned ulong32;
15#else
16typedef unsigned long ulong32;
17#endif
18
19/* ---- HELPER MACROS ---- */
20#ifdef ENDIAN_NEUTRAL
21
22#define STORE32L(x, y) \
23 { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
24 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
25
26#define LOAD32L(x, y) \
27 { x = ((unsigned long)((y)[3] & 255)<<24) | \
28 ((unsigned long)((y)[2] & 255)<<16) | \
29 ((unsigned long)((y)[1] & 255)<<8) | \
30 ((unsigned long)((y)[0] & 255)); }
31
32#define STORE64L(x, y) \
33 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
34 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
35 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
36 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
37
38#define LOAD64L(x, y) \
39 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
40 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
41 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
42 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
43
44#define STORE32H(x, y) \
45 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
46 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
47
48#define LOAD32H(x, y) \
49 { x = ((unsigned long)((y)[0] & 255)<<24) | \
50 ((unsigned long)((y)[1] & 255)<<16) | \
51 ((unsigned long)((y)[2] & 255)<<8) | \
52 ((unsigned long)((y)[3] & 255)); }
53
54#define STORE64H(x, y) \
55 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
56 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
57 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
58 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
59
60#define LOAD64H(x, y) \
61 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
62 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
63 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
64 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
65
66#endif /* ENDIAN_NEUTRAL */
67
68#ifdef ENDIAN_LITTLE
69
70#if !defined(LTC_NO_BSWAP) && (defined(INTEL_CC) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__) || defined(__x86_64__))))
71
72#define STORE32H(x, y) \
73asm __volatile__ ( \
74 "bswapl %0 \n\t" \
75 "movl %0,(%1)\n\t" \
76 "bswapl %0 \n\t" \
77 ::"r"(x), "r"(y));
78
79#define LOAD32H(x, y) \
80asm __volatile__ ( \
81 "movl (%1),%0\n\t" \
82 "bswapl %0\n\t" \
83 :"=r"(x): "r"(y));
84
85#else
86
87#define STORE32H(x, y) \
88 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \
89 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
90
91#define LOAD32H(x, y) \
92 { x = ((unsigned long)((y)[0] & 255)<<24) | \
93 ((unsigned long)((y)[1] & 255)<<16) | \
94 ((unsigned long)((y)[2] & 255)<<8) | \
95 ((unsigned long)((y)[3] & 255)); }
96
97#endif
98
99/* x86_64 processor */
100#if !defined(LTC_NO_BSWAP) && (defined(__GNUC__) && defined(__x86_64__))
101
102#define STORE64H(x, y) \
103asm __volatile__ ( \
104 "bswapq %0 \n\t" \
105 "movq %0,(%1)\n\t" \
106 "bswapq %0 \n\t" \
107 ::"r"(x), "r"(y));
108
109#define LOAD64H(x, y) \
110asm __volatile__ ( \
111 "movq (%1),%0\n\t" \
112 "bswapq %0\n\t" \
113 :"=r"(x): "r"(y));
114
115#else
116
117#define STORE64H(x, y) \
118 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
119 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
120 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
121 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
122
123#define LOAD64H(x, y) \
124 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
125 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
126 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
127 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
128
129#endif
130
131#ifdef ENDIAN_32BITWORD
132
133#define STORE32L(x, y) \
134 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
135
136#define LOAD32L(x, y) \
137 XMEMCPY(&(x), y, 4);
138
139#define STORE64L(x, y) \
140 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
141 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
142 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
143 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
144
145#define LOAD64L(x, y) \
146 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
147 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
148 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
149 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
150
151#else /* 64-bit words then */
152
153#define STORE32L(x, y) \
154 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
155
156#define LOAD32L(x, y) \
157 { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; }
158
159#define STORE64L(x, y) \
160 { ulong64 __t = (x); XMEMCPY(y, &__t, 8); }
161
162#define LOAD64L(x, y) \
163 { XMEMCPY(&(x), y, 8); }
164
165#endif /* ENDIAN_64BITWORD */
166
167#endif /* ENDIAN_LITTLE */
168
169#ifdef ENDIAN_BIG
170#define STORE32L(x, y) \
171 { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
172 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
173
174#define LOAD32L(x, y) \
175 { x = ((unsigned long)((y)[3] & 255)<<24) | \
176 ((unsigned long)((y)[2] & 255)<<16) | \
177 ((unsigned long)((y)[1] & 255)<<8) | \
178 ((unsigned long)((y)[0] & 255)); }
179
180#define STORE64L(x, y) \
181 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \
182 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \
183 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \
184 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
185
186#define LOAD64L(x, y) \
187 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
188 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
189 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
190 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
191
192#ifdef ENDIAN_32BITWORD
193
194#define STORE32H(x, y) \
195 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
196
197#define LOAD32H(x, y) \
198 XMEMCPY(&(x), y, 4);
199
200#define STORE64H(x, y) \
201 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \
202 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \
203 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \
204 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
205
206#define LOAD64H(x, y) \
207 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
208 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
209 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
210 (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
211
212#else /* 64-bit words then */
213
214#define STORE32H(x, y) \
215 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
216
217#define LOAD32H(x, y) \
218 { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; }
219
220#define STORE64H(x, y) \
221 { ulong64 __t = (x); XMEMCPY(y, &__t, 8); }
222
223#define LOAD64H(x, y) \
224 { XMEMCPY(&(x), y, 8); }
225
226#endif /* ENDIAN_64BITWORD */
227#endif /* ENDIAN_BIG */
228
229#define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \
230 ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) )
231
232/* 32-bit Rotates */
233#if defined(_MSC_VER)
234
235/* instrinsic rotate */
236#include <stdlib.h>
237#pragma intrinsic(_lrotr,_lrotl)
238#define ROR(x,n) _lrotr(x,n)
239#define ROL(x,n) _lrotl(x,n)
240#define RORc(x,n) _lrotr(x,n)
241#define ROLc(x,n) _lrotl(x,n)
242
243#elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM)
244
245static inline unsigned ROL(unsigned word, int i)
246{
247 asm("roll %%cl,%0"
248 :"=r" (word)
249 : "0" (word), "c" (i));
250 return word;
251}
252
253static inline unsigned ROR(unsigned word, int i)
254{
255 asm("rorl %%cl,%0"
256 :"=r" (word)
257 : "0" (word), "c" (i));
258 return word;
259}
260
261#ifndef LTC_NO_ROLC
262
263static inline unsigned ROLc(unsigned word, const int i)
264{
265 asm("roll %2,%0"
266 :"=r" (word)
267 : "0" (word), "I" (i));
268 return word;
269}
270
271static inline unsigned RORc(unsigned word, const int i)
272{
273 asm("rorl %2,%0"
274 :"=r" (word)
275 : "0" (word), "I" (i));
276 return word;
277}
278
279#else
280
281#define ROLc ROL
282#define RORc ROR
283
284#endif
285
286#elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32)
287
288static inline unsigned ROL(unsigned word, int i)
289{
290 asm("rotlw %0,%0,%2"
291 :"=r" (word)
292 : "0" (word), "r" (i));
293 return word;
294}
295
296static inline unsigned ROR(unsigned word, int i)
297{
298 asm("rotlw %0,%0,%2"
299 :"=r" (word)
300 : "0" (word), "r" (32 - i));
301 return word;
302}
303
304#ifndef LTC_NO_ROLC
305
306static inline unsigned ROLc(unsigned word, const int i)
307{
308 asm("rotlwi %0,%0,%2"
309 :"=r" (word)
310 : "0" (word), "I" (i));
311 return word;
312}
313
314static inline unsigned RORc(unsigned word, const int i)
315{
316 asm("rotrwi %0,%0,%2"
317 :"=r" (word)
318 : "0" (word), "I" (i));
319 return word;
320}
321
322#else
323
324#define ROLc ROL
325#define RORc ROR
326
327#endif
328
329#else
330
331/* rotates the hard way */
332#define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
333#define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
334#define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
335#define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
336
337#endif
338
339/* 64-bit Rotates */
340#if !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(LTC_NO_ASM)
341
342static inline unsigned long ROL64(unsigned long word, int i)
343{
344 asm("rolq %%cl,%0"
345 :"=r" (word)
346 : "0" (word), "c" (i));
347 return word;
348}
349
350static inline unsigned long ROR64(unsigned long word, int i)
351{
352 asm("rorq %%cl,%0"
353 :"=r" (word)
354 : "0" (word), "c" (i));
355 return word;
356}
357
358#ifndef LTC_NO_ROLC
359
360static inline unsigned long ROL64c(unsigned long word, const int i)
361{
362 asm("rolq %2,%0"
363 :"=r" (word)
364 : "0" (word), "J" (i));
365 return word;
366}
367
368static inline unsigned long ROR64c(unsigned long word, const int i)
369{
370 asm("rorq %2,%0"
371 :"=r" (word)
372 : "0" (word), "J" (i));
373 return word;
374}
375
376#else /* LTC_NO_ROLC */
377
378#define ROL64c ROL64
379#define ROR64c ROR64
380
381#endif
382
383#else /* Not x86_64 */
384
385#define ROL64(x, y) \
386 ( (((x)<<((ulong64)(y)&63)) | \
387 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
388
389#define ROR64(x, y) \
390 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
391 ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
392
393#define ROL64c(x, y) \
394 ( (((x)<<((ulong64)(y)&63)) | \
395 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
396
397#define ROR64c(x, y) \
398 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
399 ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
400
401#endif
402
403#ifndef MAX
404#define MAX(x, y) ( ((x)>(y))?(x):(y) )
405#endif
406
407#ifndef MIN
408#define MIN(x, y) ( ((x)<(y))?(x):(y) )
409#endif
410
411/* extract a byte portably */
412#ifdef _MSC_VER
413#define byte(x, n) ((unsigned char)((x) >> (8 * (n))))
414#else
415#define byte(x, n) (((x) >> (8 * (n))) & 255)
416#endif
417
418/* $Source$ */
419/* $Revision$ */
420/* $Date$ */
#define ROL64(x, y)
Definition: tomcrypt_macros.h:385
#define ROR64c(x, y)
Definition: tomcrypt_macros.h:397
#define ROL64c(x, y)
Definition: tomcrypt_macros.h:393
unsigned long ulong32
Definition: tomcrypt_macros.h:16
#define ROL(x, y)
Definition: tomcrypt_macros.h:332
#define ROLc(x, y)
Definition: tomcrypt_macros.h:334
#define ROR64(x, y)
Definition: tomcrypt_macros.h:389
#define ROR(x, y)
Definition: tomcrypt_macros.h:333
unsigned long long ulong64
Definition: tomcrypt_macros.h:7
#define RORc(x, y)
Definition: tomcrypt_macros.h:335