*/
-//Do not set these macros to 1, unless you are developing/testing for Windows
+//Do not set this macros to 1, unless you are developing/testing for Linux under macOS
+#define CORECRYPTO_SIMULATE_POSIX_ENVIRONMENT 0
+
+//Do not set these macros to 1, unless you are developing/testing for Windows under macOS
#define CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT 0
-#define CORECRYPTO_HACK_FOR_WINDOWS_DEVELOPMENT 0 //to be removed after <rdar://problem/26585938> port corecrypto to Windows
+#define CORECRYPTO_HACK_FOR_WINDOWS_DEVELOPMENT 0 //to be removed after <rdar://problem/27304763> 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
+#if defined(__cplusplus)
+#define CORECRYPTO_USE_TRANSPARENT_UNION 0
+#elif defined(CORECRYPTO_DONOT_USE_TRANSPARENT_UNION)
+ #define CORECRYPTO_USE_TRANSPARENT_UNION !CORECRYPTO_DONOT_USE_TRANSPARENT_UNION
#else
#define CORECRYPTO_USE_TRANSPARENT_UNION 1
#endif
#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)
+#if defined(__linux__) || CORECRYPTO_SIMULATE_POSIX_ENVIRONMENT
#define CC_LINUX 1
#else
#define CC_LINUX 0
#define CC_USE_L4 0
#endif
+#if defined(RTKIT) && (RTKIT)
+ #define CC_RTKIT 1
+#else
+ #define CC_RTKIT 0
+#endif
+
#if defined(USE_SEPROM) && (USE_SEPROM)
#define CC_USE_SEPROM 1
#else
#define CC_IBOOT 0
#endif
-// BB configuration
+// Defined by the XNU build scripts
+// Applies to code embedded in XNU but NOT to the kext
+#if defined(XNU_KERNEL_PRIVATE)
+ #define CC_XNU_KERNEL_PRIVATE 1
+#else
+ #define CC_XNU_KERNEL_PRIVATE 0
+#endif
+
+// handle unaligned data, if the cpu cannot. Currently for gladman AES and the C version of the SHA256
+#define CC_HANDLE_UNALIGNED_DATA CC_BASEBAND
+
+// BaseBand configuration
#if CC_BASEBAND
// -- ENDIANESS
+#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
#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
+#endif
// -- Architecture
#define CCN_UNIT_SIZE 4 // 32 bits
- #define SAFE_IO // AES support for unaligned Input/Output
// -- External function
#define assert ASSERT // sanity
// #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__)
+ #ifdef __arm__
+ #pragma diag_suppress 186, 1254,546
+ #elif defined(__GNUC__)
// warning: pointer of type 'void *' used in arithmetic
#pragma GCC diagnostic ignored "-Wpointer-arith"
- #endif // arm or gnuc
-
+ #endif // __arm__
#endif // CC_BASEBAND
//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__)
+#if defined(__APPLE__) && defined(__MACH__)
#define CC_XNU_KERNEL_AVAILABLE 1
#else
#define CC_XNU_KERNEL_AVAILABLE 0
#endif
+//arm arch64 definition for gcc
+#if defined(__GNUC__) && defined(__aarch64__) && !defined(__arm64__)
+ #define __arm64__
+#endif
+
#if !defined(CCN_UNIT_SIZE)
#if defined(__arm64__) || defined(__x86_64__) || defined(_WIN64)
#define CCN_UNIT_SIZE 8
#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))
+#if defined(_MSC_VER)
+ #if defined(__clang__)
+ #define CC_ALIGNED(x) __attribute__ ((aligned(x))) //clang compiler
+ #else
+ #define CC_ALIGNED(x) __declspec(align(x)) //MS complier
+ #endif
#else
- #define CC_ALIGNED(x) __attribute__ ((aligned((x)>8?8:(x))))
+ #if __clang__ || CCN_UNIT_SIZE==8
+ #define CC_ALIGNED(x) __attribute__ ((aligned(x)))
+ #else
+ #define CC_ALIGNED(x) __attribute__ ((aligned((x)>8?8:(x))))
+ #endif
#endif
+#if defined(__arm__)
+//this is copied from <arm/arch.h>, because <arm/arch.h> is not available on SEPROM environment
+ #if defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7S__) || defined (__ARM_ARCH_7F__) || defined (__ARM_ARCH_7K__)
+ #define _ARM_ARCH_7
+ #endif
+
+ #if defined(__ARM_ARCH_6M__) || defined(__TARGET_ARCH_6S_M) || defined (__armv6m__)
+ #define _ARM_ARCH_6M
+ #endif
+#endif
-#if defined(__x86_64__) || defined(__i386__)
+#if defined(__arm64__) || defined(__arm__)
+ #define CCN_IOS 1
+ #define CCN_OSX 0
+#elif defined(__x86_64__) || defined(__i386__)
#define CCN_IOS 0
#define CCN_OSX 1
#endif
#endif
#if !defined(CC_USE_HEAP_FOR_WORKSPACE)
- #if CC_USE_L4 || CC_IBOOT || 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
+ #if CC_USE_S3 || CC_USE_SEPROM || CC_RTKIT
#define CC_USE_HEAP_FOR_WORKSPACE 0
+ #else
+ #define CC_USE_HEAP_FOR_WORKSPACE 1
#endif
#endif
/* memset_s is only available in few target */
-#if CC_KERNEL || CC_USE_SEPROM || defined(__CC_ARM) \
+#if CC_USE_SEPROM || defined(__CC_ARM) \
|| defined(__hexagon__) || CC_EFI
#define CC_HAS_MEMSET_S 0
#else
#endif /* __has_include(<TargetConditionals.h>) */
#endif /* defined(__has_include) */
-// Disable FIPS key gen algorithm on userland and kext so that related POST
-// is skipped and boot time is reduced
+// Disable RSA Keygen on iBridge
#if defined(TARGET_OS_BRIDGE) && TARGET_OS_BRIDGE && CC_KERNEL
#define CC_DISABLE_RSAKEYGEN 1 /* for iBridge */
#else
//- 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
+#if !(CC_XNU_KERNEL_AVAILABLE || CC_KERNEL || CC_USE_L4 || CC_IBOOT || CC_RTKIT || 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
+// Use this macro to strictly disable assembly regardless of cpu/os/compiler/etc.
+// Our assembly code is not gcc compatible. Clang defines the __GNUC__ macro as well.
#if !defined(CC_USE_ASM)
- #if defined(_MSC_VER) || CC_LINUX || CC_EFI || CC_BASEBAND
+ #if defined(_WIN32) || CC_EFI || CC_BASEBAND || CC_XNU_KERNEL_PRIVATE || (defined(__GNUC__) && !defined(__clang__)) || defined(__ANDROID_API__)
#define CC_USE_ASM 0
#else
#define CC_USE_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
+ #if CC_KERNEL || CC_USE_L4 || CC_IBOOT || CC_RTKIT || CC_USE_SEPROM || CC_USE_S3
#define CCAES_MUX 0
#else
#define CCAES_MUX 1
#define CCSHA256_ARMV6M_ASM 0
//-(2) ARM 64
+#elif defined(__arm64__) && __clang__ && CC_USE_ASM
+ #define CCN_DEDICATED_SQR 1
+ #define CCN_MUL_KARATSUBA 1 // 4*n CCN_UNIT extra memory required.
+ #define CCN_ADD_ASM 1
+ #define CCN_SUB_ASM 1
+ #define CCN_MUL_ASM 1
+ #define CCN_ADDMUL1_ASM 0
+ #define CCN_MUL1_ASM 0
+ #define CCN_CMP_ASM 1
+ #define CCN_ADD1_ASM 0
+ #define CCN_SUB1_ASM 0
+ #define CCN_N_ASM 1
+ #define CCN_SET_ASM 0
+ #define CCN_SHIFT_RIGHT_ASM 1
+ #define CCAES_ARM_ASM 1
+ #define CCAES_INTEL_ASM 0
+ #define CCAES_MUX 0 // On 64bit SoC, asm is much faster than HW
+ #define CCN_USE_BUILTIN_CLZ 1
+ #define CCSHA1_VNG_INTEL 0
+ #define CCSHA2_VNG_INTEL 0
+ #define CCSHA1_VNG_ARMV7NEON 1 // reused this to avoid making change to xcode project, put arm64 assembly code with armv7 code
+ #define CCSHA2_VNG_ARMV7NEON 1
+ #define CCSHA256_ARMV6M_ASM 0
+
+//-(3) Intel 32/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.
#define CC_MALLOC
#endif /* !__GNUC__ */
+// Enable FIPSPOST function tracing only when supported. */
+#ifdef CORECRYPTO_POST_TRACE
+#define CC_FIPSPOST_TRACE 1
+#else
+#define CC_FIPSPOST_TRACE 0
+#endif
#endif /* _CORECRYPTO_CC_CONFIG_H_ */