|
@@ -8,15 +8,13 @@
|
|
|
#define TOMCRYPT_CFG_H
|
|
|
|
|
|
#if defined(_WIN32) || defined(_MSC_VER)
|
|
|
-#define LTC_CALL __cdecl
|
|
|
-#else
|
|
|
-#ifndef LTC_CALL
|
|
|
+ #define LTC_CALL __cdecl
|
|
|
+#elif !defined(LTC_CALL)
|
|
|
#define LTC_CALL
|
|
|
#endif
|
|
|
-#endif
|
|
|
|
|
|
#ifndef LTC_EXPORT
|
|
|
-#define LTC_EXPORT
|
|
|
+ #define LTC_EXPORT
|
|
|
#endif
|
|
|
|
|
|
/* certain platforms use macros for these, making the prototypes broken */
|
|
@@ -63,35 +61,122 @@ LTC_EXPORT int LTC_CALL XSTRCMP(const char *s1, const char *s2);
|
|
|
* The x86 platforms allow this but some others [ARM for instance] do not. On those platforms you **MUST**
|
|
|
* use the portable [slower] macros.
|
|
|
*/
|
|
|
+/* detect x86/i386 32bit */
|
|
|
+#if defined(__i386__) || defined(__i386) || defined(_M_IX86)
|
|
|
+ #define ENDIAN_LITTLE
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #define LTC_FAST
|
|
|
+#endif
|
|
|
|
|
|
-/* detect x86-32 machines somewhat */
|
|
|
-#if !defined(__STRICT_ANSI__) && !defined(__x86_64__) && !defined(_WIN64) && ((defined(_MSC_VER) && defined(WIN32)) || (defined(__GNUC__) && (defined(__DJGPP__) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__i386__))))
|
|
|
+/* detect amd64/x64 */
|
|
|
+#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)
|
|
|
#define ENDIAN_LITTLE
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #define LTC_FAST
|
|
|
+#endif
|
|
|
+
|
|
|
+/* detect PPC32 */
|
|
|
+#if defined(LTC_PPC32)
|
|
|
+ #define ENDIAN_BIG
|
|
|
#define ENDIAN_32BITWORD
|
|
|
#define LTC_FAST
|
|
|
#endif
|
|
|
|
|
|
/* detects MIPS R5900 processors (PS2) */
|
|
|
#if (defined(__R5900) || defined(R5900) || defined(__R5900__)) && (defined(_mips) || defined(__mips__) || defined(mips))
|
|
|
- #define ENDIAN_LITTLE
|
|
|
#define ENDIAN_64BITWORD
|
|
|
+ #if defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #endif
|
|
|
+ #define ENDIAN_LITTLE
|
|
|
+ #endif
|
|
|
#endif
|
|
|
|
|
|
-/* detect amd64 */
|
|
|
-#if !defined(__STRICT_ANSI__) && defined(__x86_64__)
|
|
|
- #define ENDIAN_LITTLE
|
|
|
+/* detect AIX */
|
|
|
+#if defined(_AIX) && defined(_BIG_ENDIAN)
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #if defined(__LP64__) || defined(_ARCH_PPC64)
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #else
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #endif
|
|
|
+#endif
|
|
|
+
|
|
|
+/* detect HP-UX */
|
|
|
+#if defined(__hpux) || defined(__hpux__)
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #if defined(__ia64) || defined(__ia64__) || defined(__LP64__)
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #else
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #endif
|
|
|
+#endif
|
|
|
+
|
|
|
+/* detect Apple OS X */
|
|
|
+#if defined(__APPLE__) && defined(__MACH__)
|
|
|
+ #if defined(__LITTLE_ENDIAN__) || defined(__x86_64__)
|
|
|
+ #define ENDIAN_LITTLE
|
|
|
+ #else
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #endif
|
|
|
+ #if defined(__LP64__) || defined(__x86_64__)
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #else
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #endif
|
|
|
+#endif
|
|
|
+
|
|
|
+/* detect SPARC and SPARC64 */
|
|
|
+#if defined(__sparc__) || defined(__sparc)
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #if defined(__arch64__) || defined(__sparcv9) || defined(__sparc_v9__)
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #else
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #endif
|
|
|
+#endif
|
|
|
+
|
|
|
+/* detect IBM S390(x) */
|
|
|
+#if defined(__s390x__) || defined(__s390__)
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #if defined(__s390x__)
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #else
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #endif
|
|
|
+#endif
|
|
|
+
|
|
|
+/* detect PPC64 */
|
|
|
+#if defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__)
|
|
|
#define ENDIAN_64BITWORD
|
|
|
+ #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
|
+ #define ENDIAN_LITTLE
|
|
|
+ #endif
|
|
|
#define LTC_FAST
|
|
|
#endif
|
|
|
|
|
|
-/* detect PPC32 */
|
|
|
-#if !defined(__STRICT_ANSI__) && defined(LTC_PPC32)
|
|
|
- #define ENDIAN_BIG
|
|
|
- #define ENDIAN_32BITWORD
|
|
|
- #define LTC_FAST
|
|
|
+/* endianness fallback */
|
|
|
+#if !defined(ENDIAN_BIG) && !defined(ENDIAN_LITTLE)
|
|
|
+ #if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
|
|
|
+ defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ || \
|
|
|
+ defined(__BIG_ENDIAN__) || defined(_BIG_ENDIAN) || \
|
|
|
+ defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \
|
|
|
+ defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
|
|
|
+ #define ENDIAN_BIG
|
|
|
+ #elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || \
|
|
|
+ defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || \
|
|
|
+ defined(__LITTLE_ENDIAN__) || defined(_LITTLE_ENDIAN) || \
|
|
|
+ defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || \
|
|
|
+ defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
|
|
|
+ #define ENDIAN_LITTLE
|
|
|
+ #else
|
|
|
+ #error Cannot detect endianness
|
|
|
+ #endif
|
|
|
#endif
|
|
|
|
|
|
-/* fix for MSVC ...evil! */
|
|
|
+/* ulong64: 64-bit data type */
|
|
|
#ifdef _MSC_VER
|
|
|
#define CONST64(n) n ## ui64
|
|
|
typedef unsigned __int64 ulong64;
|
|
@@ -100,40 +185,36 @@ LTC_EXPORT int LTC_CALL XSTRCMP(const char *s1, const char *s2);
|
|
|
typedef unsigned long long ulong64;
|
|
|
#endif
|
|
|
|
|
|
-/* this is the "32-bit at least" data type
|
|
|
- * Re-define it to suit your platform but it must be at least 32-bits
|
|
|
- */
|
|
|
-#if defined(__x86_64__) || (defined(__sparc__) && defined(__arch64__))
|
|
|
+/* ulong32: "32-bit at least" data type */
|
|
|
+#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) || \
|
|
|
+ defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \
|
|
|
+ defined(__s390x__) || defined(__arch64__) || defined(__aarch64__) || \
|
|
|
+ defined(__sparcv9) || defined(__sparc_v9__) || defined(__sparc64__) || \
|
|
|
+ defined(__ia64) || defined(__ia64__) || defined(__itanium__) || defined(_M_IA64) || \
|
|
|
+ defined(__LP64__) || defined(_LP64) || defined(__64BIT__)
|
|
|
typedef unsigned ulong32;
|
|
|
+ #if !defined(ENDIAN_64BITWORD) && !defined(ENDIAN_32BITWORD)
|
|
|
+ #define ENDIAN_64BITWORD
|
|
|
+ #endif
|
|
|
#else
|
|
|
typedef unsigned long ulong32;
|
|
|
+ #if !defined(ENDIAN_64BITWORD) && !defined(ENDIAN_32BITWORD)
|
|
|
+ #define ENDIAN_32BITWORD
|
|
|
+ #endif
|
|
|
#endif
|
|
|
|
|
|
-#ifdef LTC_NO_FAST
|
|
|
+/* No LTC_FAST if: explicitly disabled OR non-gcc/non-clang compiler OR old gcc OR using -ansi -std=c99 */
|
|
|
+#if defined(LTC_NO_FAST) || (__GNUC__ < 4) || defined(__STRICT_ANSI__)
|
|
|
#undef LTC_FAST
|
|
|
#endif
|
|
|
|
|
|
#ifdef LTC_FAST
|
|
|
-#if __GNUC__ < 4 /* if the compiler does not support gnu extensions, i.e. its neither clang nor gcc nor icc */
|
|
|
-#error the LTC_FAST hack is only available on compilers that support __attribute__((may_alias)) - disable it for your compiler, and dont worry, it won`t buy you much anyway
|
|
|
-#else
|
|
|
-#ifdef ENDIAN_64BITWORD
|
|
|
-typedef ulong64 __attribute__((__may_alias__)) LTC_FAST_TYPE;
|
|
|
-#else
|
|
|
-typedef ulong32 __attribute__((__may_alias__)) LTC_FAST_TYPE;
|
|
|
-#endif
|
|
|
-#define LTC_FAST_TYPE_PTR_CAST(x) ((LTC_FAST_TYPE*)(void*)(x))
|
|
|
-#endif
|
|
|
-#endif /* LTC_FAST */
|
|
|
-
|
|
|
-/* detect sparc and sparc64 */
|
|
|
-#if defined(__sparc__)
|
|
|
- #define ENDIAN_BIG
|
|
|
- #if defined(__arch64__)
|
|
|
- #define ENDIAN_64BITWORD
|
|
|
- #else
|
|
|
- #define ENDIAN_32BITWORD
|
|
|
- #endif
|
|
|
+ #define LTC_FAST_TYPE_PTR_CAST(x) ((LTC_FAST_TYPE*)(void*)(x))
|
|
|
+ #ifdef ENDIAN_64BITWORD
|
|
|
+ typedef ulong64 __attribute__((__may_alias__)) LTC_FAST_TYPE;
|
|
|
+ #else
|
|
|
+ typedef ulong32 __attribute__((__may_alias__)) LTC_FAST_TYPE;
|
|
|
+ #endif
|
|
|
#endif
|
|
|
|
|
|
#ifdef ENDIAN_64BITWORD
|
|
@@ -144,8 +225,7 @@ typedef ulong32 ltc_mp_digit;
|
|
|
|
|
|
/* No asm is a quick way to disable anything "not portable" */
|
|
|
#ifdef LTC_NO_ASM
|
|
|
- #undef ENDIAN_LITTLE
|
|
|
- #undef ENDIAN_BIG
|
|
|
+ #define ENDIAN_NEUTRAL
|
|
|
#undef ENDIAN_32BITWORD
|
|
|
#undef ENDIAN_64BITWORD
|
|
|
#undef LTC_FAST
|
|
@@ -154,13 +234,7 @@ typedef ulong32 ltc_mp_digit;
|
|
|
#define LTC_NO_BSWAP
|
|
|
#endif
|
|
|
|
|
|
-/* #define ENDIAN_LITTLE */
|
|
|
-/* #define ENDIAN_BIG */
|
|
|
-
|
|
|
-/* #define ENDIAN_32BITWORD */
|
|
|
-/* #define ENDIAN_64BITWORD */
|
|
|
-
|
|
|
-#if (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD))
|
|
|
+#if !defined(ENDIAN_NEUTRAL) && (defined(ENDIAN_BIG) || defined(ENDIAN_LITTLE)) && !(defined(ENDIAN_32BITWORD) || defined(ENDIAN_64BITWORD))
|
|
|
#error You must specify a word size as well as endianess in tomcrypt_cfg.h
|
|
|
#endif
|
|
|
|
|
@@ -169,7 +243,7 @@ typedef ulong32 ltc_mp_digit;
|
|
|
#endif
|
|
|
|
|
|
#if (defined(ENDIAN_32BITWORD) && defined(ENDIAN_64BITWORD))
|
|
|
- #error Can not be 32 and 64 bit words...
|
|
|
+ #error Cannot be 32 and 64 bit words...
|
|
|
#endif
|
|
|
|
|
|
/* gcc 4.3 and up has a bswap builtin; detect it by gcc version.
|
|
@@ -188,8 +262,6 @@ typedef ulong32 ltc_mp_digit;
|
|
|
#define LTC_HAVE_BSWAP_BUILTIN
|
|
|
#endif
|
|
|
|
|
|
-#endif
|
|
|
-
|
|
|
|
|
|
/* $Source$ */
|
|
|
/* $Revision$ */
|