1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2  *
3  * LibTomCrypt is a library that provides various cryptographic
4  * algorithms in a highly modular and flexible manner.
5  *
6  * The library is free for all purposes without any express
7  * guarantee it works.
8  */
9 
10 /* This is the build config file.
11  *
12  * With this you can setup what to inlcude/exclude automatically during any build.  Just comment
13  * out the line that #define's the word for the thing you want to remove.  phew!
14  */
15 
16 #ifndef TOMCRYPT_CFG_H
17 #define TOMCRYPT_CFG_H
18 
19 #if defined(_WIN32) || defined(_MSC_VER)
20    #define LTC_CALL __cdecl
21 #elif !defined(LTC_CALL)
22    #define LTC_CALL
23 #endif
24 
25 #ifndef LTC_EXPORT
26    #define LTC_EXPORT
27 #endif
28 
29 /* certain platforms use macros for these, making the prototypes broken */
30 #ifndef LTC_NO_PROTOTYPES
31 
32 /* you can change how memory allocation works ... */
33 LTC_EXPORT void * LTC_CALL XMALLOC(size_t n);
34 LTC_EXPORT void * LTC_CALL XREALLOC(void *p, size_t n);
35 LTC_EXPORT void * LTC_CALL XCALLOC(size_t n, size_t s);
36 LTC_EXPORT void LTC_CALL XFREE(void *p);
37 
38 LTC_EXPORT void LTC_CALL XQSORT(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
39 
40 
41 /* change the clock function too */
42 LTC_EXPORT clock_t LTC_CALL XCLOCK(void);
43 
44 /* various other functions */
45 LTC_EXPORT void * LTC_CALL XMEMCPY(void *dest, const void *src, size_t n);
46 LTC_EXPORT int   LTC_CALL XMEMCMP(const void *s1, const void *s2, size_t n);
47 LTC_EXPORT void * LTC_CALL XMEMSET(void *s, int c, size_t n);
48 
49 LTC_EXPORT int   LTC_CALL XSTRCMP(const char *s1, const char *s2);
50 
51 #endif
52 
53 /* some compilers do not like "inline" (or maybe "static inline"), namely: HP cc, IBM xlc */
54 #if defined(__HP_cc) || defined(__xlc__)
55    #define LTC_INLINE
56 #elif defined(_MSC_VER)
57    #define LTC_INLINE __inline
58 #else
59    #define LTC_INLINE inline
60 #endif
61 
62 /* type of argument checking, 0=default, 1=fatal and 2=error+continue, 3=nothing */
63 #ifndef ARGTYPE
64    #define ARGTYPE  0
65 #endif
66 
67 #undef LTC_ENCRYPT
68 #define LTC_ENCRYPT 0
69 #undef LTC_DECRYPT
70 #define LTC_DECRYPT 1
71 
72 /* Controls endianess and size of registers.  Leave uncommented to get platform neutral [slower] code
73  *
74  * Note: in order to use the optimized macros your platform must support unaligned 32 and 64 bit read/writes.
75  * The x86 platforms allow this but some others [ARM for instance] do not.  On those platforms you **MUST**
76  * use the portable [slower] macros.
77  */
78 /* detect x86/i386 32bit */
79 #if defined(__i386__) || defined(__i386) || defined(_M_IX86)
80    #define ENDIAN_LITTLE
81    #define ENDIAN_32BITWORD
82    #define LTC_FAST
83 #endif
84 
85 /* detect amd64/x64 */
86 #if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)
87    #define ENDIAN_LITTLE
88    #define ENDIAN_64BITWORD
89    #define LTC_FAST
90 #endif
91 
92 /* detect PPC32 */
93 #if defined(LTC_PPC32)
94    #define ENDIAN_BIG
95    #define ENDIAN_32BITWORD
96    #define LTC_FAST
97 #endif
98 
99 /* detects MIPS R5900 processors (PS2) */
100 #if (defined(__R5900) || defined(R5900) || defined(__R5900__)) && (defined(_mips) || defined(__mips__) || defined(mips))
101    #define ENDIAN_64BITWORD
102    #if defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
103      #define ENDIAN_BIG
104    #endif
105      #define ENDIAN_LITTLE
106    #endif
107 #endif
108 
109 /* detect AIX */
110 #if defined(_AIX) && defined(_BIG_ENDIAN)
111   #define ENDIAN_BIG
112   #if defined(__LP64__) || defined(_ARCH_PPC64)
113     #define ENDIAN_64BITWORD
114   #else
115     #define ENDIAN_32BITWORD
116   #endif
117 #endif
118 
119 /* detect HP-UX */
120 #if defined(__hpux) || defined(__hpux__)
121   #define ENDIAN_BIG
122   #if defined(__ia64) || defined(__ia64__) || defined(__LP64__)
123     #define ENDIAN_64BITWORD
124   #else
125     #define ENDIAN_32BITWORD
126   #endif
127 #endif
128 
129 /* detect Apple OS X */
130 #if defined(__APPLE__) && defined(__MACH__)
131   #if defined(__LITTLE_ENDIAN__) || defined(__x86_64__)
132     #define ENDIAN_LITTLE
133   #else
134     #define ENDIAN_BIG
135   #endif
136   #if defined(__LP64__) || defined(__x86_64__)
137     #define ENDIAN_64BITWORD
138   #else
139     #define ENDIAN_32BITWORD
140   #endif
141 #endif
142 
143 /* detect SPARC and SPARC64 */
144 #if defined(__sparc__) || defined(__sparc)
145   #define ENDIAN_BIG
146   #if defined(__arch64__) || defined(__sparcv9) || defined(__sparc_v9__)
147     #define ENDIAN_64BITWORD
148   #else
149     #define ENDIAN_32BITWORD
150   #endif
151 #endif
152 
153 /* detect IBM S390(x) */
154 #if defined(__s390x__) || defined(__s390__)
155   #define ENDIAN_BIG
156   #if defined(__s390x__)
157     #define ENDIAN_64BITWORD
158   #else
159     #define ENDIAN_32BITWORD
160   #endif
161 #endif
162 
163 /* detect PPC64 */
164 #if defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__)
165    #define ENDIAN_64BITWORD
166    #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
167       #define ENDIAN_BIG
168    #elif  __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
169       #define ENDIAN_LITTLE
170    #endif
171    #define LTC_FAST
172 #endif
173 
174 /* endianness fallback */
175 #if !defined(ENDIAN_BIG) && !defined(ENDIAN_LITTLE)
176   #if defined(_BYTE_ORDER) && _BYTE_ORDER == _BIG_ENDIAN || \
177       defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
178       defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ || \
179       defined(__BIG_ENDIAN__) || \
180       defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \
181       defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
182     #define ENDIAN_BIG
183   #elif defined(_BYTE_ORDER) && _BYTE_ORDER == _LITTLE_ENDIAN || \
184       defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \
185       defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || \
186       defined(__LITTLE_ENDIAN__) || \
187       defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || \
188       defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
189     #define ENDIAN_LITTLE
190   #else
191     #error Cannot detect endianness
192   #endif
193 #endif
194 
195 /* ulong64: 64-bit data type */
196 #ifdef _MSC_VER
197    #define CONST64(n) n ## ui64
198    typedef unsigned __int64 ulong64;
199 #else
200    #define CONST64(n) n ## ULL
201    typedef unsigned long long ulong64;
202 #endif
203 
204 /* ulong32: "32-bit at least" data type */
205 #if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) || \
206     defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \
207     defined(__s390x__) || defined(__arch64__) || defined(__aarch64__) || \
208     defined(__sparcv9) || defined(__sparc_v9__) || defined(__sparc64__) || \
209     defined(__ia64) || defined(__ia64__) || defined(__itanium__) || defined(_M_IA64) || \
210     defined(__LP64__) || defined(_LP64) || defined(__64BIT__)
211    typedef unsigned ulong32;
212    #if !defined(ENDIAN_64BITWORD) && !defined(ENDIAN_32BITWORD)
213      #define ENDIAN_64BITWORD
214    #endif
215 #else
216    typedef unsigned long ulong32;
217    #if !defined(ENDIAN_64BITWORD) && !defined(ENDIAN_32BITWORD)
218      #define ENDIAN_32BITWORD
219    #endif
220 #endif
221 
222 #if defined(ENDIAN_64BITWORD) && !defined(_MSC_VER)
223 typedef unsigned long long ltc_mp_digit;
224 #else
225 typedef unsigned long ltc_mp_digit;
226 #endif
227 
228 /* No asm is a quick way to disable anything "not portable" */
229 #ifdef LTC_NO_ASM
230    #define ENDIAN_NEUTRAL
231    #undef ENDIAN_32BITWORD
232    #undef ENDIAN_64BITWORD
233    #undef LTC_FAST
234    #define LTC_NO_ROLC
235    #define LTC_NO_BSWAP
236 #endif
237 
238 /* No LTC_FAST if: explicitly disabled OR non-gcc/non-clang compiler OR old gcc OR using -ansi -std=c99 */
239 #if defined(LTC_NO_FAST) || (__GNUC__ < 4) || defined(__STRICT_ANSI__)
240    #undef LTC_FAST
241 #endif
242 
243 #ifdef LTC_FAST
244    #define LTC_FAST_TYPE_PTR_CAST(x) ((LTC_FAST_TYPE*)(void*)(x))
245    #ifdef ENDIAN_64BITWORD
246    typedef ulong64 __attribute__((__may_alias__)) LTC_FAST_TYPE;
247    #else
248    typedef ulong32 __attribute__((__may_alias__)) LTC_FAST_TYPE;
249    #endif
250 #endif
251 
252 #if !defined(ENDIAN_NEUTRAL) && (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD))
253    #error You must specify a word size as well as endianess in tomcrypt_cfg.h
254 #endif
255 
256 #if !(defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE))
257    #define ENDIAN_NEUTRAL
258 #endif
259 
260 #if (defined(ENDIAN_32BITWORD) && defined(ENDIAN_64BITWORD))
261    #error Cannot be 32 and 64 bit words...
262 #endif
263 
264 /* gcc 4.3 and up has a bswap builtin; detect it by gcc version.
265  * clang also supports the bswap builtin, and although clang pretends
266  * to be gcc (macro-wise, anyway), clang pretends to be a version
267  * prior to gcc 4.3, so we can't detect bswap that way.  Instead,
268  * clang has a __has_builtin mechanism that can be used to check
269  * for builtins:
270  * http://clang.llvm.org/docs/LanguageExtensions.html#feature_check */
271 #ifndef __has_builtin
272    #define __has_builtin(x) 0
273 #endif
274 #if !defined(LTC_NO_BSWAP) && defined(__GNUC__) &&                      \
275    ((__GNUC__ * 100 + __GNUC_MINOR__ >= 403) ||                         \
276     (__has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64)))
277    #define LTC_HAVE_BSWAP_BUILTIN
278 #endif
279 
280 
281 /* ref:         HEAD -> master, tag: v1.18.1 */
282 /* git commit:  e08fd8630f9d9771226466877064055ee7e863d0 */
283 /* commit time: 2018-01-22 11:02:57 +0100 */
284