X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/fe8ab488e9161c46dd9885d58fc52996dc0249ff..d190cdc3f5544636abb56dc1874be391d3e1b148:/EXTERNAL_HEADERS/corecrypto/cc_config.h diff --git a/EXTERNAL_HEADERS/corecrypto/cc_config.h b/EXTERNAL_HEADERS/corecrypto/cc_config.h index 9149edb00..807d58cea 100644 --- a/EXTERNAL_HEADERS/corecrypto/cc_config.h +++ b/EXTERNAL_HEADERS/corecrypto/cc_config.h @@ -2,8 +2,9 @@ * cc_config.h * corecrypto * - * Created by Michael Brouwer on 10/18/10. - * Copyright 2010,2011 Apple Inc. All rights reserved. + * Created on 11/16/2010 + * + * Copyright (c) 2010,2011,2012,2013,2014,2015 Apple Inc. All rights reserved. * */ @@ -44,233 +45,391 @@ */ -#if defined(DEBUG) && (DEBUG) +//Do not set these macros to 1, unless you are developing/testing for Windows +#define CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT 0 +#define CORECRYPTO_HACK_FOR_WINDOWS_DEVELOPMENT 0 //to be removed after port corecrypto to Windows + +//this macro is used to turn on/off usage of transparent union in corecrypto +//it should be commented out in corecrypto and be used only by the software that use corecrypto +//#define CORECRYPTO_DONOT_USE_TRANSPARENT_UNION +#ifdef CORECRYPTO_DONOT_USE_TRANSPARENT_UNION + #define CORECRYPTO_USE_TRANSPARENT_UNION 0 +#else + #define CORECRYPTO_USE_TRANSPARENT_UNION 1 +#endif + +#if (defined(DEBUG) && (DEBUG)) || defined(_DEBUG) //MSVC defines _DEBUG /* CC_DEBUG is already used in CommonCrypto */ -#define CORECRYPTO_DEBUG 1 + #define CORECRYPTO_DEBUG 1 #else -#define CORECRYPTO_DEBUG 0 + #define CORECRYPTO_DEBUG 0 #endif +// This macro can be used to enable prints when a condition in the macro "cc_require" +// is false. This is especially useful to confirm that negative testing fails +// at the intended location +#define CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS 0 + #if defined(KERNEL) && (KERNEL) -#define CC_KERNEL 1 + #define CC_KERNEL 1 // KEXT, XNU repo or kernel components such as AppleKeyStore #else -#define CC_KERNEL 0 + #define CC_KERNEL 0 +#endif + +// LINUX_BUILD_TEST is for sanity check of the configuration +// > xcodebuild -scheme "corecrypto_test" OTHER_CFLAGS="$(values) -DLINUX_BUILD_TEST" +#if defined(__linux__) || defined(LINUX_BUILD_TEST) + #define CC_LINUX 1 +#else + #define CC_LINUX 0 #endif #if defined(USE_L4) && (USE_L4) -#define CC_USE_L4 1 + #define CC_USE_L4 1 #else -#define CC_USE_L4 0 + #define CC_USE_L4 0 #endif -#if defined(MAVERICK) && (MAVERICK) -#define CC_MAVERICK 1 +#if defined(USE_SEPROM) && (USE_SEPROM) + #define CC_USE_SEPROM 1 #else -#define CC_MAVERICK 0 + #define CC_USE_SEPROM 0 +#endif + +#if defined(USE_S3) && (USE_S3) + #define CC_USE_S3 1 +#else + #define CC_USE_S3 0 +#endif + +#if (defined(ICE_FEATURES_ENABLED)) || (defined(MAVERICK) && (MAVERICK)) + #define CC_BASEBAND 1 +#else + #define CC_BASEBAND 0 +#endif + +#if defined(EFI) && (EFI) + #define CC_EFI 1 +#else + #define CC_EFI 0 #endif #if defined(IBOOT) && (IBOOT) -#define CC_IBOOT 1 + #define CC_IBOOT 1 #else -#define CC_IBOOT 0 + #define CC_IBOOT 0 #endif // BB configuration -#if CC_MAVERICK +#if CC_BASEBAND // -- ENDIANESS -#if defined(ENDIAN_LITTLE) || (defined(__arm__) && !defined(__BIG_ENDIAN)) -#define __LITTLE_ENDIAN__ -#elif !defined(ENDIAN_BIG) && !defined(__BIG_ENDIAN) -#error Baseband endianess not defined. -#endif -#define AESOPT_ENDIAN_NO_FILE + #if defined(ENDIAN_LITTLE) || (defined(__arm__) && !defined(__BIG_ENDIAN)) + #define __LITTLE_ENDIAN__ + #elif !defined(ENDIAN_BIG) && !defined(__BIG_ENDIAN) + #error Baseband endianess not defined. + #endif + #define AESOPT_ENDIAN_NO_FILE // -- Architecture -#define CCN_UNIT_SIZE 4 // 32 bits -#define aligned(x) aligned((x)>8?8:(x)) // Alignment on 8 bytes max -#define SAFE_IO // AES support for unaligned Input/Output + #define CCN_UNIT_SIZE 4 // 32 bits + #define SAFE_IO // AES support for unaligned Input/Output // -- External function -#define assert ASSERT // sanity + #define assert ASSERT // sanity // -- Warnings // Ignore irrelevant warnings after verification // #1254-D: arithmetic on pointer to void or function type // #186-D: pointless comparison of unsigned integer with zero // #546-D: transfer of control bypasses initialization of -#if defined(__GNUC__) + #if defined(__GNUC__) // warning: pointer of type 'void *' used in arithmetic -#pragma GCC diagnostic ignored "-Wpointer-arith" -#endif // arm or gnuc + #pragma GCC diagnostic ignored "-Wpointer-arith" + #endif // arm or gnuc -#endif // MAVERICK +#endif // CC_BASEBAND -#if !defined(CCN_UNIT_SIZE) -#if defined(__arm64__) || defined(__x86_64__) -#define CCN_UNIT_SIZE 8 -#elif defined(__arm__) || defined(__i386__) -#define CCN_UNIT_SIZE 4 +//CC_XNU_KERNEL_AVAILABLE indicates the availibity of XNU kernel functions, +//like what we have on OSX, iOS, tvOS, Watch OS +#if defined(__APPLE__) && defined(__MACH__) + #define CC_XNU_KERNEL_AVAILABLE 1 #else -#define CCN_UNIT_SIZE 2 + #define CC_XNU_KERNEL_AVAILABLE 0 #endif + +#if !defined(CCN_UNIT_SIZE) + #if defined(__arm64__) || defined(__x86_64__) || defined(_WIN64) + #define CCN_UNIT_SIZE 8 + #elif defined(__arm__) || defined(__i386__) || defined(_WIN32) + #define CCN_UNIT_SIZE 4 + #else + #error undefined architecture + #endif #endif /* !defined(CCN_UNIT_SIZE) */ + +//this allows corecrypto Windows development using xcode +#if defined(CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT) + #if CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT && CC_XNU_KERNEL_AVAILABLE && CORECRYPTO_DEBUG + #define CC_USE_ASM 0 + #define CC_USE_HEAP_FOR_WORKSPACE 1 + #if (CCN_UNIT_SIZE==8) + #define CCN_UINT128_SUPPORT_FOR_64BIT_ARCH 0 + #else + #define CCN_UINT128_SUPPORT_FOR_64BIT_ARCH 1 + #endif + #endif +#endif + +#if !defined(CCN_UINT128_SUPPORT_FOR_64BIT_ARCH) + #if defined(_WIN64) && defined(_WIN32) && (CCN_UNIT_SIZE==8) + #define CCN_UINT128_SUPPORT_FOR_64BIT_ARCH 0 + #elif defined(_WIN32) + #define CCN_UINT128_SUPPORT_FOR_64BIT_ARCH 1//should not be a problem + #else + #define CCN_UINT128_SUPPORT_FOR_64BIT_ARCH 1 + #endif +#endif + +#if __clang__ || CCN_UNIT_SIZE==8 + #define CC_ALIGNED(x) __attribute__ ((aligned(x))) +#elif _MSC_VER + #define CC_ALIGNED(x) __declspec(align(x)) +#else + #define CC_ALIGNED(x) __attribute__ ((aligned((x)>8?8:(x)))) +#endif + + #if defined(__x86_64__) || defined(__i386__) -#define CCN_IOS 0 -#define CCN_OSX 1 + #define CCN_IOS 0 + #define CCN_OSX 1 #endif +#if CC_USE_L4 || CC_USE_S3 /* No dynamic linking allowed in L4, e.g. avoid nonlazy symbols */ -/* For corecrypto kext, CC_STATIC should be 0 */ -#if CC_USE_L4 -#define CC_STATIC 1 +/* For corecrypto kext, CC_STATIC should be undefined */ + #define CC_STATIC 1 #endif -/* L4 do not have bzero, neither does hexagon of ARMCC even with gnu compatibility mode */ -#if CC_USE_L4 || defined(__CC_ARM) || defined(__hexagon__) -#define CC_HAS_BZERO 0 +#if !defined(CC_USE_HEAP_FOR_WORKSPACE) + #if CC_USE_L4 || CC_IBOOT || CC_BASEBAND || defined(_MSC_VER) + /* For L4, stack is too short, need to use HEAP for some computations */ + /* CC_USE_HEAP_FOR_WORKSPACE not supported for KERNEL! */ + #define CC_USE_HEAP_FOR_WORKSPACE 1 + #else + #define CC_USE_HEAP_FOR_WORKSPACE 0 + #endif +#endif + +/* memset_s is only available in few target */ +#if CC_KERNEL || CC_USE_SEPROM || defined(__CC_ARM) \ + || defined(__hexagon__) || CC_EFI + #define CC_HAS_MEMSET_S 0 #else -#define CC_HAS_BZERO 1 + #define CC_HAS_MEMSET_S 1 #endif -#if defined(__CC_ARM) || defined(__hexagon__) -// ARMASM.exe does not to like the file syntax of the asm implementation - -#define CCN_ADD_ASM 0 -#define CCN_SUB_ASM 0 -#define CCN_MUL_ASM 0 -#define CCN_ADDMUL1_ASM 0 -#define CCN_MUL1_ASM 0 -#define CCN_CMP_ASM 0 -#define CCN_ADD1_ASM 0 -#define CCN_SUB1_ASM 0 -#define CCN_N_ASM 0 -#define CCN_SET_ASM 0 -#define CCAES_ARM 0 -#define CCAES_INTEL 0 -#define CCN_USE_BUILTIN_CLZ 0 -#define CCSHA1_VNG_INTEL 0 -#define CCSHA2_VNG_INTEL 0 - -#elif defined(__x86_64__) || defined(__i386__) - -/* These assembly routines only work for a single CCN_UNIT_SIZE. */ -#if (defined(__x86_64__) && CCN_UNIT_SIZE == 8) || (defined(__i386__) && CCN_UNIT_SIZE == 4) -#define CCN_ADD_ASM 1 -#define CCN_SUB_ASM 1 -#define CCN_MUL_ASM 1 +// Include target conditionals if available. +#if defined(__has_include) /* portability */ +#if __has_include() +#include +#endif /* __has_include() */ +#endif /* defined(__has_include) */ + +// Disable FIPS key gen algorithm on userland and kext so that related POST +// is skipped and boot time is reduced +#if defined(TARGET_OS_BRIDGE) && TARGET_OS_BRIDGE && CC_KERNEL +#define CC_DISABLE_RSAKEYGEN 1 /* for iBridge */ #else -#define CCN_ADD_ASM 0 -#define CCN_SUB_ASM 0 -#define CCN_MUL_ASM 0 +#define CC_DISABLE_RSAKEYGEN 0 /* default */ #endif -#define CCN_ADDMUL1_ASM 0 -#define CCN_MUL1_ASM 0 -#define CCN_CMP_ASM 0 -#define CCN_ADD1_ASM 0 -#define CCN_SUB1_ASM 0 -#define CCN_N_ASM 0 -#define CCN_SET_ASM 0 -#define CCAES_ARM 0 -#define CCAES_INTEL 1 -#define CCAES_MUX 0 -#define CCN_USE_BUILTIN_CLZ 0 -#define CCSHA1_VNG_INTEL 1 -#define CCSHA2_VNG_INTEL 1 -#define CCSHA1_VNG_ARMV7NEON 0 -#define CCSHA2_VNG_ARMV7NEON 0 +//- functions implemented in assembly ------------------------------------------ +//this the list of corecrypto clients that use assembly and the clang compiler +#if !(CC_XNU_KERNEL_AVAILABLE || CC_KERNEL || CC_USE_L4 || CC_IBOOT || CC_USE_SEPROM || CC_USE_S3) && !defined(_WIN32) && CORECRYPTO_DEBUG + #warning "You are using the default corecrypto configuration, assembly optimizations may not be available for your platform" +#endif +// use this macro to strictly disable assembly regardless of cpu/os/compiler/etc +#if !defined(CC_USE_ASM) + #if defined(_MSC_VER) || CC_LINUX || CC_EFI || CC_BASEBAND + #define CC_USE_ASM 0 + #else + #define CC_USE_ASM 1 + #endif +#endif + +//-(1) ARM V7 +#if defined(_ARM_ARCH_7) && __clang__ && CC_USE_ASM + #define CCN_DEDICATED_SQR 1 + #define CCN_MUL_KARATSUBA 0 // no performance improvement + #define CCN_ADD_ASM 1 + #define CCN_SUB_ASM 1 + #define CCN_MUL_ASM 0 + #define CCN_ADDMUL1_ASM 1 + #define CCN_MUL1_ASM 1 + #define CCN_CMP_ASM 1 + #define CCN_ADD1_ASM 0 + #define CCN_SUB1_ASM 0 + #define CCN_N_ASM 1 + #define CCN_SET_ASM 1 + #define CCN_SHIFT_RIGHT_ASM 1 + #define CCAES_ARM_ASM 1 + #define CCAES_INTEL_ASM 0 + #if CC_KERNEL || CC_USE_L4 || CC_IBOOT || CC_USE_SEPROM || CC_USE_S3 + #define CCAES_MUX 0 + #else + #define CCAES_MUX 1 + #endif + #define CCN_USE_BUILTIN_CLZ 1 + #define CCSHA1_VNG_INTEL 0 + #define CCSHA2_VNG_INTEL 0 + + #if defined(__ARM_NEON__) || CC_KERNEL + #define CCSHA1_VNG_ARMV7NEON 1 + #define CCSHA2_VNG_ARMV7NEON 1 + #else /* !defined(__ARM_NEON__) */ + #define CCSHA1_VNG_ARMV7NEON 0 + #define CCSHA2_VNG_ARMV7NEON 0 + #endif /* !defined(__ARM_NEON__) */ + #define CCSHA256_ARMV6M_ASM 0 + +//-(2) ARM 64 +#elif (defined(__x86_64__) || defined(__i386__)) && __clang__ && CC_USE_ASM + #define CCN_DEDICATED_SQR 1 + #define CCN_MUL_KARATSUBA 1 // 4*n CCN_UNIT extra memory required. + /* These assembly routines only work for a single CCN_UNIT_SIZE. */ + #if (defined(__x86_64__) && CCN_UNIT_SIZE == 8) || (defined(__i386__) && CCN_UNIT_SIZE == 4) + #define CCN_ADD_ASM 1 + #define CCN_SUB_ASM 1 + #define CCN_MUL_ASM 1 + #else + #define CCN_ADD_ASM 0 + #define CCN_SUB_ASM 0 + #define CCN_MUL_ASM 0 + #endif + + #if (defined(__x86_64__) && CCN_UNIT_SIZE == 8) + #define CCN_CMP_ASM 1 + #define CCN_N_ASM 1 + #define CCN_SHIFT_RIGHT_ASM 1 + #else + #define CCN_CMP_ASM 0 + #define CCN_N_ASM 0 + #define CCN_SHIFT_RIGHT_ASM 0 + #endif + + #define CCN_ADDMUL1_ASM 0 + #define CCN_MUL1_ASM 0 + #define CCN_ADD1_ASM 0 + #define CCN_SUB1_ASM 0 + #define CCN_SET_ASM 0 + #define CCAES_ARM_ASM 0 + #define CCAES_INTEL_ASM 1 + #define CCAES_MUX 0 + #define CCN_USE_BUILTIN_CLZ 0 + #define CCSHA1_VNG_INTEL 1 + #define CCSHA2_VNG_INTEL 1 + #define CCSHA1_VNG_ARMV7NEON 0 + #define CCSHA2_VNG_ARMV7NEON 0 + #define CCSHA256_ARMV6M_ASM 0 + +//-(4) disable assembly #else + #if CCN_UINT128_SUPPORT_FOR_64BIT_ARCH + #define CCN_DEDICATED_SQR 1 + #else + #define CCN_DEDICATED_SQR 0 //when assembly is off and 128-bit integers are not supported, dedicated square is off. This is the case on Windows + #endif + #define CCN_MUL_KARATSUBA 1 // 4*n CCN_UNIT extra memory required. + #define CCN_ADD_ASM 0 + #define CCN_SUB_ASM 0 + #define CCN_MUL_ASM 0 + #define CCN_ADDMUL1_ASM 0 + #define CCN_MUL1_ASM 0 + #define CCN_CMP_ASM 0 + #define CCN_ADD1_ASM 0 + #define CCN_SUB1_ASM 0 + #define CCN_N_ASM 0 + #define CCN_SET_ASM 0 + #define CCN_SHIFT_RIGHT_ASM 0 + #define CCAES_ARM_ASM 0 + #define CCAES_INTEL_ASM 0 + #define CCAES_MUX 0 + #define CCN_USE_BUILTIN_CLZ 0 + #define CCSHA1_VNG_INTEL 0 + #define CCSHA2_VNG_INTEL 0 + #define CCSHA1_VNG_ARMV7NEON 0 + #define CCSHA2_VNG_ARMV7NEON 0 + #define CCSHA256_ARMV6M_ASM 0 -#define CCN_ADD_ASM 0 -#define CCN_SUB_ASM 0 -#define CCN_MUL_ASM 0 -#define CCN_ADDMUL1_ASM 0 -#define CCN_MUL1_ASM 0 -#define CCN_CMP_ASM 0 -#define CCN_ADD1_ASM 0 -#define CCN_SUB1_ASM 0 -#define CCN_N_ASM 0 -#define CCN_SET_ASM 0 -#define CCAES_ARM 0 -#define CCAES_INTEL 0 -#define CCAES_MUX 0 -#define CCN_USE_BUILTIN_CLZ 0 -#define CCSHA1_VNG_INTEL 0 -#define CCSHA2_VNG_INTEL 0 -#define CCSHA1_VNG_ARMV7NEON 0 -#define CCSHA2_VNG_ARMV7NEON 0 - -#endif /* !defined(__i386__) */ - -#define CCN_N_INLINE 0 -#define CCN_CMP_INLINE 0 +#endif #define CC_INLINE static inline -#ifdef __GNUC__ -#define CC_NORETURN __attribute__((__noreturn__)) -#define CC_NOTHROW __attribute__((__nothrow__)) -// Transparent Union -#if defined(__CC_ARM) || defined(__hexagon__) -#define CC_NONNULL_TU(N) +#if CORECRYPTO_USE_TRANSPARENT_UNION +// Non null for transparent unions is ambiguous and cause problems +// for most tools (GCC and others: 23919290). + #define CC_NONNULL_TU(N) #else -#define CC_NONNULL_TU(N) __attribute__((__nonnull__ N)) + #define CC_NONNULL_TU(N) CC_NONNULL(N) #endif -#define CC_NONNULL(N) __attribute__((__nonnull__ N)) -#define CC_NONNULL1 __attribute__((__nonnull__(1))) -#define CC_NONNULL2 __attribute__((__nonnull__(2))) -#define CC_NONNULL3 __attribute__((__nonnull__(3))) -#define CC_NONNULL4 __attribute__((__nonnull__(4))) -#define CC_NONNULL5 __attribute__((__nonnull__(5))) -#define CC_NONNULL6 __attribute__((__nonnull__(6))) -#define CC_NONNULL7 __attribute__((__nonnull__(7))) -#define CC_NONNULL_ALL __attribute__((__nonnull__)) -#define CC_SENTINEL __attribute__((__sentinel__)) -#define CC_CONST __attribute__((__const__)) -#define CC_PURE __attribute__((__pure__)) -#define CC_WARN_RESULT __attribute__((__warn_unused_result__)) -#define CC_MALLOC __attribute__((__malloc__)) -#define CC_UNUSED __attribute__((unused)) + +#ifdef __GNUC__ + #define CC_NORETURN __attribute__((__noreturn__)) + #define CC_NOTHROW __attribute__((__nothrow__)) + #define CC_NONNULL(N) __attribute__((__nonnull__ N)) + #define CC_NONNULL1 __attribute__((__nonnull__(1))) + #define CC_NONNULL2 __attribute__((__nonnull__(2))) + #define CC_NONNULL3 __attribute__((__nonnull__(3))) + #define CC_NONNULL4 __attribute__((__nonnull__(4))) + #define CC_NONNULL5 __attribute__((__nonnull__(5))) + #define CC_NONNULL6 __attribute__((__nonnull__(6))) + #define CC_NONNULL7 __attribute__((__nonnull__(7))) + #define CC_NONNULL_ALL __attribute__((__nonnull__)) + #define CC_SENTINEL __attribute__((__sentinel__)) + #define CC_CONST __attribute__((__const__)) + #define CC_PURE __attribute__((__pure__)) + #define CC_WARN_RESULT __attribute__((__warn_unused_result__)) + #define CC_MALLOC __attribute__((__malloc__)) + #define CC_UNUSED __attribute__((unused)) #else /* !__GNUC__ */ /*! @parseOnly */ -#define CC_UNUSED + #define CC_UNUSED /*! @parseOnly */ -#define CC_NONNULL_TU(N) + #define CC_NONNULL(N) /*! @parseOnly */ -#define CC_NONNULL(N) + #define CC_NORETURN /*! @parseOnly */ -#define CC_NORETURN + #define CC_NOTHROW /*! @parseOnly */ -#define CC_NOTHROW + #define CC_NONNULL1 /*! @parseOnly */ -#define CC_NONNULL1 + #define CC_NONNULL2 /*! @parseOnly */ -#define CC_NONNULL2 + #define CC_NONNULL3 /*! @parseOnly */ -#define CC_NONNULL3 + #define CC_NONNULL4 /*! @parseOnly */ -#define CC_NONNULL4 + #define CC_NONNULL5 /*! @parseOnly */ -#define CC_NONNULL5 + #define CC_NONNULL6 /*! @parseOnly */ -#define CC_NONNULL6 + #define CC_NONNULL7 /*! @parseOnly */ -#define CC_NONNULL7 + #define CC_NONNULL_ALL /*! @parseOnly */ -#define CC_NONNULL_ALL + #define CC_SENTINEL /*! @parseOnly */ -#define CC_SENTINEL + #define CC_CONST /*! @parseOnly */ -#define CC_CONST + #define CC_PURE /*! @parseOnly */ -#define CC_PURE + #define CC_WARN_RESULT /*! @parseOnly */ -#define CC_WARN_RESULT -/*! @parseOnly */ -#define CC_MALLOC + #define CC_MALLOC #endif /* !__GNUC__ */ + #endif /* _CORECRYPTO_CC_CONFIG_H_ */