Mercurial > dropbear
comparison libtomcrypt/src/headers/tomcrypt_macros.h @ 1471:6dba84798cd5
Update to libtomcrypt 1.18.1, merged with Dropbear changes
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 09 Feb 2018 21:44:05 +0800 |
parents | f849a5ca2efc |
children |
comparison
equal
deleted
inserted
replaced
1470:8bba51a55704 | 1471:6dba84798cd5 |
---|---|
1 /* fix for MSVC ...evil! */ | 1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis |
2 #ifdef _MSC_VER | 2 * |
3 #define CONST64(n) n ## ui64 | 3 * LibTomCrypt is a library that provides various cryptographic |
4 typedef unsigned __int64 ulong64; | 4 * algorithms in a highly modular and flexible manner. |
5 #else | 5 * |
6 #define CONST64(n) n ## ULL | 6 * The library is free for all purposes without any express |
7 typedef unsigned long long ulong64; | 7 * guarantee it works. |
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 */ | 8 */ |
13 #if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__)) | |
14 typedef unsigned ulong32; | |
15 #else | |
16 typedef unsigned long ulong32; | |
17 #endif | |
18 | 9 |
19 /* ---- HELPER MACROS ---- */ | 10 /* ---- HELPER MACROS ---- */ |
20 #ifdef ENDIAN_NEUTRAL | 11 #ifdef ENDIAN_NEUTRAL |
21 | 12 |
22 #define STORE32L(x, y) \ | 13 #define STORE32L(x, y) \ |
23 { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ | 14 do { (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); } | 15 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) |
25 | 16 |
26 #define LOAD32L(x, y) \ | 17 #define LOAD32L(x, y) \ |
27 { x = ((unsigned long)((y)[3] & 255)<<24) | \ | 18 do { x = ((ulong32)((y)[3] & 255)<<24) | \ |
28 ((unsigned long)((y)[2] & 255)<<16) | \ | 19 ((ulong32)((y)[2] & 255)<<16) | \ |
29 ((unsigned long)((y)[1] & 255)<<8) | \ | 20 ((ulong32)((y)[1] & 255)<<8) | \ |
30 ((unsigned long)((y)[0] & 255)); } | 21 ((ulong32)((y)[0] & 255)); } while(0) |
31 | 22 |
32 #define STORE64L(x, y) \ | 23 #define STORE64L(x, y) \ |
33 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ | 24 do { (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); \ | 25 (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); \ | 26 (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); } | 27 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) |
37 | 28 |
38 #define LOAD64L(x, y) \ | 29 #define LOAD64L(x, y) \ |
39 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \ | 30 do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \ |
40 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \ | 31 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \ |
41 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \ | 32 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \ |
42 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } | 33 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } while(0) |
43 | 34 |
44 #define STORE32H(x, y) \ | 35 #define STORE32H(x, y) \ |
45 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \ | 36 do { (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); } | 37 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } while(0) |
47 | 38 |
48 #define LOAD32H(x, y) \ | 39 #define LOAD32H(x, y) \ |
49 { x = ((unsigned long)((y)[0] & 255)<<24) | \ | 40 do { x = ((ulong32)((y)[0] & 255)<<24) | \ |
50 ((unsigned long)((y)[1] & 255)<<16) | \ | 41 ((ulong32)((y)[1] & 255)<<16) | \ |
51 ((unsigned long)((y)[2] & 255)<<8) | \ | 42 ((ulong32)((y)[2] & 255)<<8) | \ |
52 ((unsigned long)((y)[3] & 255)); } | 43 ((ulong32)((y)[3] & 255)); } while(0) |
53 | 44 |
54 #define STORE64H(x, y) \ | 45 #define STORE64H(x, y) \ |
55 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ | 46 do { (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); \ | 47 (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); \ | 48 (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); } | 49 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0) |
59 | 50 |
60 #define LOAD64H(x, y) \ | 51 #define LOAD64H(x, y) \ |
61 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ | 52 do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ |
62 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \ | 53 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \ |
63 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ | 54 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ |
64 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } | 55 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } while(0) |
65 | 56 |
66 #endif /* ENDIAN_NEUTRAL */ | 57 |
67 | 58 #elif defined(ENDIAN_LITTLE) |
68 #ifdef ENDIAN_LITTLE | 59 |
69 | 60 #ifdef LTC_HAVE_BSWAP_BUILTIN |
70 #if !defined(LTC_NO_BSWAP) && (defined(INTEL_CC) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__) || defined(__x86_64__)))) | 61 |
62 #define STORE32H(x, y) \ | |
63 do { ulong32 __t = __builtin_bswap32 ((x)); \ | |
64 XMEMCPY ((y), &__t, 4); } while(0) | |
65 | |
66 #define LOAD32H(x, y) \ | |
67 do { XMEMCPY (&(x), (y), 4); \ | |
68 (x) = __builtin_bswap32 ((x)); } while(0) | |
69 | |
70 #elif !defined(LTC_NO_BSWAP) && (defined(INTEL_CC) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__) || defined(__x86_64__)))) | |
71 | 71 |
72 #define STORE32H(x, y) \ | 72 #define STORE32H(x, y) \ |
73 asm __volatile__ ( \ | 73 asm __volatile__ ( \ |
74 "bswapl %0 \n\t" \ | 74 "bswapl %0 \n\t" \ |
75 "movl %0,(%1)\n\t" \ | 75 "movl %0,(%1)\n\t" \ |
83 :"=r"(x): "r"(y)); | 83 :"=r"(x): "r"(y)); |
84 | 84 |
85 #else | 85 #else |
86 | 86 |
87 #define STORE32H(x, y) \ | 87 #define STORE32H(x, y) \ |
88 { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255); \ | 88 do { (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); } | 89 (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); } while(0) |
90 | 90 |
91 #define LOAD32H(x, y) \ | 91 #define LOAD32H(x, y) \ |
92 { x = ((unsigned long)((y)[0] & 255)<<24) | \ | 92 do { x = ((ulong32)((y)[0] & 255)<<24) | \ |
93 ((unsigned long)((y)[1] & 255)<<16) | \ | 93 ((ulong32)((y)[1] & 255)<<16) | \ |
94 ((unsigned long)((y)[2] & 255)<<8) | \ | 94 ((ulong32)((y)[2] & 255)<<8) | \ |
95 ((unsigned long)((y)[3] & 255)); } | 95 ((ulong32)((y)[3] & 255)); } while(0) |
96 | 96 |
97 #endif | 97 #endif |
98 | 98 |
99 #ifdef LTC_HAVE_BSWAP_BUILTIN | |
100 | |
101 #define STORE64H(x, y) \ | |
102 do { ulong64 __t = __builtin_bswap64 ((x)); \ | |
103 XMEMCPY ((y), &__t, 8); } while(0) | |
104 | |
105 #define LOAD64H(x, y) \ | |
106 do { XMEMCPY (&(x), (y), 8); \ | |
107 (x) = __builtin_bswap64 ((x)); } while(0) | |
99 | 108 |
100 /* x86_64 processor */ | 109 /* x86_64 processor */ |
101 #if !defined(LTC_NO_BSWAP) && (defined(__GNUC__) && defined(__x86_64__)) | 110 #elif !defined(LTC_NO_BSWAP) && (defined(__GNUC__) && defined(__x86_64__)) |
102 | 111 |
103 #define STORE64H(x, y) \ | 112 #define STORE64H(x, y) \ |
104 asm __volatile__ ( \ | 113 asm __volatile__ ( \ |
105 "bswapq %0 \n\t" \ | 114 "bswapq %0 \n\t" \ |
106 "movq %0,(%1)\n\t" \ | 115 "movq %0,(%1)\n\t" \ |
107 "bswapq %0 \n\t" \ | 116 "bswapq %0 \n\t" \ |
108 ::"r"(x), "r"(y)); | 117 ::"r"(x), "r"(y): "memory"); |
109 | 118 |
110 #define LOAD64H(x, y) \ | 119 #define LOAD64H(x, y) \ |
111 asm __volatile__ ( \ | 120 asm __volatile__ ( \ |
112 "movq (%1),%0\n\t" \ | 121 "movq (%1),%0\n\t" \ |
113 "bswapq %0\n\t" \ | 122 "bswapq %0\n\t" \ |
114 :"=r"(x): "r"(y)); | 123 :"=r"(x): "r"(y): "memory"); |
115 | 124 |
116 #else | 125 #else |
117 | 126 |
118 #define STORE64H(x, y) \ | 127 #define STORE64H(x, y) \ |
119 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ | 128 do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ |
120 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ | 129 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ |
121 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ | 130 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ |
122 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } | 131 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0) |
123 | 132 |
124 #define LOAD64H(x, y) \ | 133 #define LOAD64H(x, y) \ |
125 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ | 134 do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \ |
126 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \ | 135 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \ |
127 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ | 136 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \ |
128 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } | 137 (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); } while(0) |
129 | 138 |
130 #endif | 139 #endif |
131 | 140 |
132 #ifdef ENDIAN_32BITWORD | 141 #ifdef ENDIAN_32BITWORD |
133 | 142 |
134 #define STORE32L(x, y) \ | 143 #define STORE32L(x, y) \ |
135 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } | 144 do { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } while(0) |
136 | 145 |
137 #define LOAD32L(x, y) \ | 146 #define LOAD32L(x, y) \ |
138 XMEMCPY(&(x), y, 4); | 147 do { XMEMCPY(&(x), y, 4); } while(0) |
139 | 148 |
140 #define STORE64L(x, y) \ | 149 #define STORE64L(x, y) \ |
141 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ | 150 do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ |
142 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ | 151 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ |
143 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ | 152 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ |
144 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } | 153 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) |
145 | 154 |
146 #define LOAD64L(x, y) \ | 155 #define LOAD64L(x, y) \ |
147 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \ | 156 do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \ |
148 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \ | 157 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \ |
149 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \ | 158 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \ |
150 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } | 159 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } while(0) |
151 | 160 |
152 #else /* 64-bit words then */ | 161 #else /* 64-bit words then */ |
153 | 162 |
154 #define STORE32L(x, y) \ | 163 #define STORE32L(x, y) \ |
155 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } | 164 do { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } while(0) |
156 | 165 |
157 #define LOAD32L(x, y) \ | 166 #define LOAD32L(x, y) \ |
158 { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } | 167 do { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } while(0) |
159 | 168 |
160 #define STORE64L(x, y) \ | 169 #define STORE64L(x, y) \ |
161 { ulong64 __t = (x); XMEMCPY(y, &__t, 8); } | 170 do { ulong64 __t = (x); XMEMCPY(y, &__t, 8); } while(0) |
162 | 171 |
163 #define LOAD64L(x, y) \ | 172 #define LOAD64L(x, y) \ |
164 { XMEMCPY(&(x), y, 8); } | 173 do { XMEMCPY(&(x), y, 8); } while(0) |
165 | 174 |
166 #endif /* ENDIAN_64BITWORD */ | 175 #endif /* ENDIAN_64BITWORD */ |
167 | 176 |
168 #endif /* ENDIAN_LITTLE */ | 177 #elif defined(ENDIAN_BIG) |
169 | 178 |
170 #ifdef ENDIAN_BIG | |
171 #define STORE32L(x, y) \ | 179 #define STORE32L(x, y) \ |
172 { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ | 180 do { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ |
173 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } | 181 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) |
174 | 182 |
175 #define LOAD32L(x, y) \ | 183 #define LOAD32L(x, y) \ |
176 { x = ((unsigned long)((y)[3] & 255)<<24) | \ | 184 do { x = ((ulong32)((y)[3] & 255)<<24) | \ |
177 ((unsigned long)((y)[2] & 255)<<16) | \ | 185 ((ulong32)((y)[2] & 255)<<16) | \ |
178 ((unsigned long)((y)[1] & 255)<<8) | \ | 186 ((ulong32)((y)[1] & 255)<<8) | \ |
179 ((unsigned long)((y)[0] & 255)); } | 187 ((ulong32)((y)[0] & 255)); } while(0) |
180 | 188 |
181 #define STORE64L(x, y) \ | 189 #define STORE64L(x, y) \ |
182 { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ | 190 do { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255); \ |
183 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ | 191 (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255); \ |
184 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ | 192 (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255); \ |
185 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } | 193 (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); } while(0) |
186 | 194 |
187 #define LOAD64L(x, y) \ | 195 #define LOAD64L(x, y) \ |
188 { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \ | 196 do { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \ |
189 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \ | 197 (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \ |
190 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \ | 198 (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \ |
191 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } | 199 (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); } while(0) |
192 | 200 |
193 #ifdef ENDIAN_32BITWORD | 201 #ifdef ENDIAN_32BITWORD |
194 | 202 |
195 #define STORE32H(x, y) \ | 203 #define STORE32H(x, y) \ |
196 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } | 204 do { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } while(0) |
197 | 205 |
198 #define LOAD32H(x, y) \ | 206 #define LOAD32H(x, y) \ |
199 XMEMCPY(&(x), y, 4); | 207 do { XMEMCPY(&(x), y, 4); } while(0) |
200 | 208 |
201 #define STORE64H(x, y) \ | 209 #define STORE64H(x, y) \ |
202 { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ | 210 do { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ |
203 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ | 211 (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ |
204 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ | 212 (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ |
205 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } | 213 (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } while(0) |
206 | 214 |
207 #define LOAD64H(x, y) \ | 215 #define LOAD64H(x, y) \ |
208 { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \ | 216 do { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \ |
209 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \ | 217 (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \ |
210 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \ | 218 (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \ |
211 (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); } | 219 (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); } while(0) |
212 | 220 |
213 #else /* 64-bit words then */ | 221 #else /* 64-bit words then */ |
214 | 222 |
215 #define STORE32H(x, y) \ | 223 #define STORE32H(x, y) \ |
216 { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } | 224 do { ulong32 __t = (x); XMEMCPY(y, &__t, 4); } while(0) |
217 | 225 |
218 #define LOAD32H(x, y) \ | 226 #define LOAD32H(x, y) \ |
219 { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } | 227 do { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; } while(0) |
220 | 228 |
221 #define STORE64H(x, y) \ | 229 #define STORE64H(x, y) \ |
222 { ulong64 __t = (x); XMEMCPY(y, &__t, 8); } | 230 do { ulong64 __t = (x); XMEMCPY(y, &__t, 8); } while(0) |
223 | 231 |
224 #define LOAD64H(x, y) \ | 232 #define LOAD64H(x, y) \ |
225 { XMEMCPY(&(x), y, 8); } | 233 do { XMEMCPY(&(x), y, 8); } while(0) |
226 | 234 |
227 #endif /* ENDIAN_64BITWORD */ | 235 #endif /* ENDIAN_64BITWORD */ |
228 #endif /* ENDIAN_BIG */ | 236 #endif /* ENDIAN_BIG */ |
229 | 237 |
230 #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \ | 238 #define BSWAP(x) ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL) | \ |
231 ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) ) | 239 ((x>>8)&0x0000FF00UL) | ((x<<8)&0x00FF0000UL) ) |
232 | 240 |
233 | 241 |
234 /* 32-bit Rotates */ | 242 /* 32-bit Rotates */ |
235 #if defined(_MSC_VER) | 243 #if defined(_MSC_VER) |
244 #define LTC_ROx_ASM | |
236 | 245 |
237 /* instrinsic rotate */ | 246 /* instrinsic rotate */ |
238 #include <stdlib.h> | 247 #include <stdlib.h> |
239 #pragma intrinsic(_lrotr,_lrotl) | 248 #pragma intrinsic(_lrotr,_lrotl) |
240 #define ROR(x,n) _lrotr(x,n) | 249 #define ROR(x,n) _lrotr(x,n) |
241 #define ROL(x,n) _lrotl(x,n) | 250 #define ROL(x,n) _lrotl(x,n) |
242 #define RORc(x,n) _lrotr(x,n) | 251 #define RORc(x,n) _lrotr(x,n) |
243 #define ROLc(x,n) _lrotl(x,n) | 252 #define ROLc(x,n) _lrotl(x,n) |
244 | 253 |
245 #elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM) | 254 #elif !defined(__STRICT_ANSI__) && defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && !defined(INTEL_CC) && !defined(LTC_NO_ASM) |
246 | 255 #define LTC_ROx_ASM |
247 static inline unsigned ROL(unsigned word, int i) | 256 |
257 static inline ulong32 ROL(ulong32 word, int i) | |
248 { | 258 { |
249 asm ("roll %%cl,%0" | 259 asm ("roll %%cl,%0" |
250 :"=r" (word) | 260 :"=r" (word) |
251 :"0" (word),"c" (i)); | 261 :"0" (word),"c" (i)); |
252 return word; | 262 return word; |
253 } | 263 } |
254 | 264 |
255 static inline unsigned ROR(unsigned word, int i) | 265 static inline ulong32 ROR(ulong32 word, int i) |
256 { | 266 { |
257 asm ("rorl %%cl,%0" | 267 asm ("rorl %%cl,%0" |
258 :"=r" (word) | 268 :"=r" (word) |
259 :"0" (word),"c" (i)); | 269 :"0" (word),"c" (i)); |
260 return word; | 270 return word; |
261 } | 271 } |
262 | 272 |
263 #ifndef LTC_NO_ROLC | 273 #ifndef LTC_NO_ROLC |
264 | 274 |
265 static inline unsigned ROLc(unsigned word, const int i) | 275 #define ROLc(word,i) ({ \ |
266 { | 276 ulong32 __ROLc_tmp = (word); \ |
267 asm ("roll %2,%0" | 277 __asm__ ("roll %2, %0" : \ |
268 :"=r" (word) | 278 "=r" (__ROLc_tmp) : \ |
269 :"0" (word),"I" (i)); | 279 "0" (__ROLc_tmp), \ |
270 return word; | 280 "I" (i)); \ |
271 } | 281 __ROLc_tmp; \ |
272 | 282 }) |
273 static inline unsigned RORc(unsigned word, const int i) | 283 #define RORc(word,i) ({ \ |
274 { | 284 ulong32 __RORc_tmp = (word); \ |
275 asm ("rorl %2,%0" | 285 __asm__ ("rorl %2, %0" : \ |
276 :"=r" (word) | 286 "=r" (__RORc_tmp) : \ |
277 :"0" (word),"I" (i)); | 287 "0" (__RORc_tmp), \ |
278 return word; | 288 "I" (i)); \ |
279 } | 289 __RORc_tmp; \ |
290 }) | |
280 | 291 |
281 #else | 292 #else |
282 | 293 |
283 #define ROLc ROL | 294 #define ROLc ROL |
284 #define RORc ROR | 295 #define RORc ROR |
285 | 296 |
286 #endif | 297 #endif |
287 | 298 |
288 #elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32) | 299 #elif !defined(__STRICT_ANSI__) && defined(LTC_PPC32) |
289 | 300 #define LTC_ROx_ASM |
290 static inline unsigned ROL(unsigned word, int i) | 301 |
302 static inline ulong32 ROL(ulong32 word, int i) | |
291 { | 303 { |
292 asm ("rotlw %0,%0,%2" | 304 asm ("rotlw %0,%0,%2" |
293 :"=r" (word) | 305 :"=r" (word) |
294 :"0" (word),"r" (i)); | 306 :"0" (word),"r" (i)); |
295 return word; | 307 return word; |
296 } | 308 } |
297 | 309 |
298 static inline unsigned ROR(unsigned word, int i) | 310 static inline ulong32 ROR(ulong32 word, int i) |
299 { | 311 { |
300 asm ("rotlw %0,%0,%2" | 312 asm ("rotlw %0,%0,%2" |
301 :"=r" (word) | 313 :"=r" (word) |
302 :"0" (word),"r" (32-i)); | 314 :"0" (word),"r" (32-i)); |
303 return word; | 315 return word; |
304 } | 316 } |
305 | 317 |
306 #ifndef LTC_NO_ROLC | 318 #ifndef LTC_NO_ROLC |
307 | 319 |
308 static inline unsigned ROLc(unsigned word, const int i) | 320 static inline ulong32 ROLc(ulong32 word, const int i) |
309 { | 321 { |
310 asm ("rotlwi %0,%0,%2" | 322 asm ("rotlwi %0,%0,%2" |
311 :"=r" (word) | 323 :"=r" (word) |
312 :"0" (word),"I" (i)); | 324 :"0" (word),"I" (i)); |
313 return word; | 325 return word; |
314 } | 326 } |
315 | 327 |
316 static inline unsigned RORc(unsigned word, const int i) | 328 static inline ulong32 RORc(ulong32 word, const int i) |
317 { | 329 { |
318 asm ("rotrwi %0,%0,%2" | 330 asm ("rotrwi %0,%0,%2" |
319 :"=r" (word) | 331 :"=r" (word) |
320 :"0" (word),"I" (i)); | 332 :"0" (word),"I" (i)); |
321 return word; | 333 return word; |
330 | 342 |
331 | 343 |
332 #else | 344 #else |
333 | 345 |
334 /* rotates the hard way */ | 346 /* rotates the hard way */ |
335 #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) | 347 #define ROL(x, y) ( (((ulong32)(x)<<(ulong32)((y)&31)) | (((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL) |
336 #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) | 348 #define ROR(x, y) ( ((((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((y)&31)) | ((ulong32)(x)<<(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL) |
337 #define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) | 349 #define ROLc(x, y) ( (((ulong32)(x)<<(ulong32)((y)&31)) | (((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL) |
338 #define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL) | 350 #define RORc(x, y) ( ((((ulong32)(x)&0xFFFFFFFFUL)>>(ulong32)((y)&31)) | ((ulong32)(x)<<(ulong32)((32-((y)&31))&31))) & 0xFFFFFFFFUL) |
339 | 351 |
340 #endif | 352 #endif |
341 | 353 |
342 | 354 |
343 /* 64-bit Rotates */ | 355 /* 64-bit Rotates */ |
344 #if !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(LTC_NO_ASM) | 356 #if !defined(__STRICT_ANSI__) && defined(__GNUC__) && defined(__x86_64__) && !defined(_WIN64) && !defined(LTC_NO_ASM) |
345 | 357 |
346 static inline unsigned long ROL64(unsigned long word, int i) | 358 static inline ulong64 ROL64(ulong64 word, int i) |
347 { | 359 { |
348 asm("rolq %%cl,%0" | 360 asm("rolq %%cl,%0" |
349 :"=r" (word) | 361 :"=r" (word) |
350 :"0" (word),"c" (i)); | 362 :"0" (word),"c" (i)); |
351 return word; | 363 return word; |
352 } | 364 } |
353 | 365 |
354 static inline unsigned long ROR64(unsigned long word, int i) | 366 static inline ulong64 ROR64(ulong64 word, int i) |
355 { | 367 { |
356 asm("rorq %%cl,%0" | 368 asm("rorq %%cl,%0" |
357 :"=r" (word) | 369 :"=r" (word) |
358 :"0" (word),"c" (i)); | 370 :"0" (word),"c" (i)); |
359 return word; | 371 return word; |
360 } | 372 } |
361 | 373 |
362 #ifndef LTC_NO_ROLC | 374 #ifndef LTC_NO_ROLC |
363 | 375 |
364 static inline unsigned long ROL64c(unsigned long word, const int i) | 376 #define ROL64c(word,i) ({ \ |
365 { | 377 ulong64 __ROL64c_tmp = word; \ |
366 asm("rolq %2,%0" | 378 __asm__ ("rolq %2, %0" : \ |
367 :"=r" (word) | 379 "=r" (__ROL64c_tmp) : \ |
368 :"0" (word),"J" (i)); | 380 "0" (__ROL64c_tmp), \ |
369 return word; | 381 "J" (i)); \ |
370 } | 382 __ROL64c_tmp; \ |
371 | 383 }) |
372 static inline unsigned long ROR64c(unsigned long word, const int i) | 384 #define ROR64c(word,i) ({ \ |
373 { | 385 ulong64 __ROR64c_tmp = word; \ |
374 asm("rorq %2,%0" | 386 __asm__ ("rorq %2, %0" : \ |
375 :"=r" (word) | 387 "=r" (__ROR64c_tmp) : \ |
376 :"0" (word),"J" (i)); | 388 "0" (__ROR64c_tmp), \ |
377 return word; | 389 "J" (i)); \ |
378 } | 390 __ROR64c_tmp; \ |
391 }) | |
379 | 392 |
380 #else /* LTC_NO_ROLC */ | 393 #else /* LTC_NO_ROLC */ |
381 | 394 |
382 #define ROL64c ROL64 | 395 #define ROL64c ROL64 |
383 #define ROR64c ROR64 | 396 #define ROR64c ROR64 |
386 | 399 |
387 #else /* Not x86_64 */ | 400 #else /* Not x86_64 */ |
388 | 401 |
389 #define ROL64(x, y) \ | 402 #define ROL64(x, y) \ |
390 ( (((x)<<((ulong64)(y)&63)) | \ | 403 ( (((x)<<((ulong64)(y)&63)) | \ |
391 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF)) | 404 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF)) |
392 | 405 |
393 #define ROR64(x, y) \ | 406 #define ROR64(x, y) \ |
394 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \ | 407 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \ |
395 ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF)) | 408 ((x)<<(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF)) |
396 | 409 |
397 #define ROL64c(x, y) \ | 410 #define ROL64c(x, y) \ |
398 ( (((x)<<((ulong64)(y)&63)) | \ | 411 ( (((x)<<((ulong64)(y)&63)) | \ |
399 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF)) | 412 (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF)) |
400 | 413 |
401 #define ROR64c(x, y) \ | 414 #define ROR64c(x, y) \ |
402 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \ | 415 ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \ |
403 ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF)) | 416 ((x)<<(((ulong64)64-((y)&63))&63))) & CONST64(0xFFFFFFFFFFFFFFFF)) |
404 | 417 |
405 #endif | 418 #endif |
406 | 419 |
407 #ifndef MAX | 420 #ifndef MAX |
408 #define MAX(x, y) ( ((x)>(y))?(x):(y) ) | 421 #define MAX(x, y) ( ((x)>(y))?(x):(y) ) |
409 #endif | 422 #endif |
410 | 423 |
411 #ifndef MIN | 424 #ifndef MIN |
412 #define MIN(x, y) ( ((x)<(y))?(x):(y) ) | 425 #define MIN(x, y) ( ((x)<(y))?(x):(y) ) |
426 #endif | |
427 | |
428 #ifndef LTC_UNUSED_PARAM | |
429 #define LTC_UNUSED_PARAM(x) (void)(x) | |
413 #endif | 430 #endif |
414 | 431 |
415 /* extract a byte portably */ | 432 /* extract a byte portably */ |
416 #ifdef _MSC_VER | 433 #ifdef _MSC_VER |
417 #define byte(x, n) ((unsigned char)((x) >> (8 * (n)))) | 434 #define byte(x, n) ((unsigned char)((x) >> (8 * (n)))) |
418 #else | 435 #else |
419 #define byte(x, n) (((x) >> (8 * (n))) & 255) | 436 #define byte(x, n) (((x) >> (8 * (n))) & 255) |
420 #endif | 437 #endif |
421 | 438 |
422 /* $Source$ */ | 439 /* there is no snprintf before Visual C++ 2015 */ |
423 /* $Revision$ */ | 440 #if defined(_MSC_VER) && _MSC_VER < 1900 |
424 /* $Date$ */ | 441 #define snprintf _snprintf |
442 #endif | |
443 | |
444 /* ref: $Format:%D$ */ | |
445 /* git commit: $Format:%H$ */ | |
446 /* commit time: $Format:%ai$ */ |