1 /* Copyright (c) (2010-2023) Apple Inc. All rights reserved. 2 * 3 * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which 4 * is contained in the License.txt file distributed with corecrypto) and only to 5 * people who accept that license. IMPORTANT: Any license rights granted to you by 6 * Apple Inc. (if any) are limited to internal use within your organization only on 7 * devices and computers you own or control, for the sole purpose of verifying the 8 * security characteristics and correct functioning of the Apple Software. You may 9 * not, directly or indirectly, redistribute the Apple Software or any portions thereof. 10 */ 11 12 #ifndef _CORECRYPTO_CC_CONFIG_H_ 13 #define _CORECRYPTO_CC_CONFIG_H_ 14 15 /* A word about configuration macros: 16 17 Conditional configuration macros specific to corecrypto should be named CORECRYPTO_xxx 18 or CCxx_yyy and be defined to be either 0 or 1 in this file. You can add an 19 #ifndef #error construct at the end of this file to make sure it's always defined. 20 21 They should always be tested using the #if directive, never the #ifdef directive. 22 23 No other conditional macros shall ever be used (except in this file) 24 25 Configuration Macros that are defined outside of corecrypto (eg: KERNEL, DEBUG, ...) 26 shall only be used in this file to define CCxxx macros. 27 28 External macros should be assumed to be either undefined, defined with no value, 29 or defined as true or false. We shall strive to build with -Wundef whenever possible, 30 so the following construct should be used to test external macros in this file: 31 32 #if defined(DEBUG) && (DEBUG) 33 #define CORECRYPTO_DEBUG 1 34 #else 35 #define CORECRYPTO_DEBUG 0 36 #endif 37 38 39 It is acceptable to define a conditional CC_xxxx macro in an implementation file, 40 to be used only in this file. 41 42 The current code is not guaranteed to follow those rules, but should be fixed to. 43 44 Corecrypto requires GNU and C99 compatibility. 45 Typically enabled by passing --gnu --c99 to the compiler (eg. armcc) 46 47 */ 48 49 #if !defined(__has_feature) 50 #define __has_feature(FEATURE) 0 51 #endif 52 53 #if !defined(__has_extension) 54 #define __has_extension(EXT) 0 55 #endif 56 57 #if !defined(__has_attribute) 58 #define __has_attribute(ATTR) 0 59 #endif 60 61 #ifndef __cc_printflike 62 #define __cc_printflike(fmtarg, firstvararg) __attribute__((format(printf, fmtarg, firstvararg))) 63 #endif 64 65 //Do not set this macros to 1, unless you are developing/testing for Linux under macOS 66 #define CORECRYPTO_SIMULATE_POSIX_ENVIRONMENT 0 67 68 //Do not set these macros to 1, unless you are developing/testing for Windows under macOS 69 #define CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT 0 70 #define CORECRYPTO_HACK_FOR_WINDOWS_DEVELOPMENT 0 71 72 #if (defined(DEBUG) && (DEBUG)) || defined(_DEBUG) //MSVC defines _DEBUG 73 /* CC_DEBUG is already used in CommonCrypto */ 74 #define CORECRYPTO_DEBUG 1 75 #else 76 #define CORECRYPTO_DEBUG 0 77 #endif 78 79 // Enable specific configurations only relevant in test builds 80 #if defined(CORECRYPTO_BUILT_FOR_TESTING) && CORECRYPTO_BUILT_FOR_TESTING 81 #define CC_BUILT_FOR_TESTING 1 82 #else 83 #define CC_BUILT_FOR_TESTING 0 84 #endif 85 86 // This macro can be used to enable prints when a condition in the macro "cc_require" 87 // is false. This is especially useful to confirm that negative testing fails 88 // at the intended location 89 #define CORECRYPTO_DEBUG_ENABLE_CC_REQUIRE_PRINTS 0 90 91 #ifndef CC_TXM 92 #if defined(TXM) && (TXM) 93 #define CC_TXM 1 94 #else 95 #define CC_TXM 0 96 #endif 97 #endif 98 99 #ifndef CC_SPTM 100 #if defined(SPTM) && (SPTM) 101 #define CC_SPTM 1 102 #else 103 #define CC_SPTM 0 104 #endif 105 #endif 106 107 #if defined(KERNEL) && (KERNEL) 108 #define CC_KERNEL 1 // KEXT, XNU repo or kernel components such as AppleKeyStore 109 #else 110 #define CC_KERNEL 0 111 #endif 112 113 #if defined(LINUX_SGX) && (LINUX_SGX) 114 #define CC_SGX 1 115 #else 116 #define CC_SGX 0 117 #endif 118 119 #if (defined(__linux__) && !(CC_SGX)) || CORECRYPTO_SIMULATE_POSIX_ENVIRONMENT 120 #define CC_LINUX 1 121 #else 122 #define CC_LINUX 0 123 #endif 124 125 #if defined(USE_L4) && (USE_L4) 126 #define CC_USE_L4 1 127 #else 128 #define CC_USE_L4 0 129 #endif 130 131 #if defined(RTKIT) && (RTKIT) 132 #define CC_RTKIT 1 133 #else 134 #define CC_RTKIT 0 135 #endif 136 137 #if defined(RTKITROM) && (RTKITROM) 138 #define CC_RTKITROM 1 139 #else 140 #define CC_RTKITROM 0 141 #endif 142 143 #if defined(USE_SEPROM) && (USE_SEPROM) 144 #define CC_USE_SEPROM 1 145 #else 146 #define CC_USE_SEPROM 0 147 #endif 148 149 #if (defined(ICE_FEATURES_ENABLED)) || (defined(MAVERICK) && (MAVERICK)) 150 #define CC_BASEBAND 1 151 #else 152 #define CC_BASEBAND 0 153 #endif 154 155 #if defined(EFI) && (EFI) 156 #define CC_EFI 1 157 #else 158 #define CC_EFI 0 159 #endif 160 161 #if defined(IBOOT) && (IBOOT) 162 #define CC_IBOOT 1 163 #else 164 #define CC_IBOOT 0 165 #endif 166 167 // Include target conditionals if available. 168 #if defined(__has_include) /* portability */ 169 #if __has_include(<TargetConditionals.h>) 170 #include <TargetConditionals.h> 171 #endif /* __has_include(<TargetConditionals.h>) */ 172 #endif /* defined(__has_include) */ 173 174 #if defined(TARGET_OS_DRIVERKIT) 175 #define CC_DRIVERKIT TARGET_OS_DRIVERKIT 176 #else 177 #define CC_DRIVERKIT 0 178 #endif 179 180 #if defined(TARGET_OS_BRIDGE) 181 #define CC_BRIDGE TARGET_OS_BRIDGE 182 #else 183 #define CC_BRIDGE 0 184 #endif 185 186 // TARGET_OS_EXCLAVECORE && TARGET_OS_EXCLAVEKIT 187 #if defined(TARGET_OS_EXCLAVECORE) && TARGET_OS_EXCLAVECORE 188 #define CC_EXCLAVE 1 189 #define CC_EXCLAVECORE 1 190 #define CC_EXCLAVEKIT 0 191 #elif defined(TARGET_OS_EXCLAVEKIT) && TARGET_OS_EXCLAVEKIT 192 #define CC_EXCLAVE 1 193 #define CC_EXCLAVECORE 0 194 #define CC_EXCLAVEKIT 1 195 #else 196 #define CC_EXCLAVE 0 197 #define CC_EXCLAVECORE 0 198 #define CC_EXCLAVEKIT 0 199 #endif 200 201 // ARMv6-M 202 #if defined(__arm__) && (defined(__ARM_ARCH_6M__) || defined(__TARGET_ARCH_6S_M) || defined (__armv6m__)) 203 #define CC_ARM_ARCH_6M 1 204 #else 205 #define CC_ARM_ARCH_6M 0 206 #endif 207 208 // ARMv7 209 #if defined(__arm__) && (defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7S__) || defined (__ARM_ARCH_7F__) || defined (__ARM_ARCH_7K__) || defined(__ARM_ARCH_7EM__)) 210 #define CC_ARM_ARCH_7 1 211 #else 212 #define CC_ARM_ARCH_7 0 213 #endif 214 215 // DSP is only available on aarch32 216 #if CC_ARM_ARCH_7 && defined(__ARM_FEATURE_DSP) && __ARM_FEATURE_DSP 217 #define CC_ARM_ARCH_7_DSP 1 218 #else 219 #define CC_ARM_ARCH_7_DSP 0 220 #endif 221 222 #if defined(__ARM_NEON) && __ARM_NEON 223 #define CC_ARM_NEON 1 224 #else 225 #define CC_ARM_NEON 0 226 #endif 227 228 #if defined(__ARM_FEATURE_AES) && __ARM_FEATURE_AES 229 #define CC_ARM_FEATURE_AES 1 230 #else 231 #define CC_ARM_FEATURE_AES 0 232 #endif 233 234 #if defined(__ARM_FEATURE_SHA2) && __ARM_FEATURE_SHA2 235 #define CC_ARM_FEATURE_SHA2 1 236 #else 237 #define CC_ARM_FEATURE_SHA2 0 238 #endif 239 240 #if defined(__ARM_FEATURE_SHA512) && __ARM_FEATURE_SHA512 241 #define CC_ARM_FEATURE_SHA512 1 242 #else 243 #define CC_ARM_FEATURE_SHA512 0 244 #endif 245 246 #if defined(__ARM_FEATURE_SHA3) && __ARM_FEATURE_SHA3 247 #define CC_ARM_FEATURE_SHA3 1 248 #else 249 #define CC_ARM_FEATURE_SHA3 0 250 #endif 251 252 // Check for open source builds 253 254 // Defined by the XNU build scripts 255 // Applies to code embedded in XNU but NOT to the kext 256 #if defined(XNU_KERNEL_PRIVATE) 257 #define CC_XNU_KERNEL_PRIVATE 1 258 #else 259 #define CC_XNU_KERNEL_PRIVATE 0 260 #endif 261 262 // Handle unaligned data, if the CPU cannot. (For Gladman AES.) 263 #define CC_HANDLE_UNALIGNED_DATA CC_BASEBAND 264 265 // BaseBand configuration 266 #if CC_BASEBAND 267 268 // -- ENDIANESS 269 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) 270 #if defined(ENDIAN_LITTLE) || (defined(__arm__) && !defined(__BIG_ENDIAN)) 271 #define __LITTLE_ENDIAN__ 272 #elif !defined(ENDIAN_BIG) && !defined(__BIG_ENDIAN) 273 #error Baseband endianess not defined. 274 #endif 275 #define AESOPT_ENDIAN_NO_FILE 276 #endif 277 278 #if !defined(__x86_64__) && !defined(__arm64__) 279 // -- Architecture 280 #define CCN_UNIT_SIZE 4 // 32 bits 281 #endif 282 283 // -- Warnings 284 // Ignore irrelevant warnings after verification 285 // #186-D: pointless comparison of unsigned integer with zero 286 // #546-D: transfer of control bypasses initialization of 287 #ifdef __arm__ 288 #pragma diag_suppress 186, 546 289 #endif // __arm__ 290 #define CC_SMALL_CODE 1 291 292 #endif // CC_BASEBAND 293 294 #if CC_RTKIT || CC_RTKITROM 295 #define CC_SMALL_CODE 1 296 #endif 297 298 299 #ifndef CC_SMALL_CODE 300 #define CC_SMALL_CODE 0 301 #endif 302 303 #ifndef CC_DARWIN 304 //CC_DARWIN indicates the availability of XNU kernel functions, 305 //like what we have on OSX, iOS, tvOS, Watch OS 306 #if (CC_USE_L4 || CC_RTKIT || CC_RTKITROM || CC_USE_SEPROM || CC_EFI || CC_LINUX || defined(_WIN32) || CC_BASEBAND || CC_SGX || CC_ARM_ARCH_6M) 307 #define CC_DARWIN 0 308 #elif CC_TXM 309 #define CC_DARWIN 0 310 #elif CC_SPTM 311 #define CC_DARWIN 0 312 #else 313 #define CC_DARWIN 1 314 #endif 315 #endif 316 317 //arm arch64 definition for gcc 318 #if defined(__GNUC__) && defined(__aarch64__) && !defined(__arm64__) 319 #define __arm64__ 320 #endif 321 322 #if !defined(CCN_UNIT_SIZE) 323 #if defined(__arm64__) || defined(__x86_64__) || defined(_WIN64) 324 #define CCN_UNIT_SIZE 8 325 #elif defined(__arm__) || defined(__i386__) || defined(_WIN32) 326 #define CCN_UNIT_SIZE 4 327 #else 328 #error undefined architecture 329 #endif 330 #endif /* !defined(CCN_UNIT_SIZE) */ 331 332 333 //this allows corecrypto Windows development using xcode 334 #if defined(CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT) 335 #if CORECRYPTO_SIMULATE_WINDOWS_ENVIRONMENT && CC_DARWIN && CORECRYPTO_DEBUG 336 #define CC_USE_ASM 0 337 #define CC_USE_HEAP_FOR_WORKSPACE 1 338 #if (CCN_UNIT_SIZE == 8) 339 #define CC_DUNIT_SUPPORTED 0 340 #else 341 #define CC_DUNIT_SUPPORTED 1 342 #endif 343 #endif 344 #endif 345 346 #if !defined(CC_DUNIT_SUPPORTED) 347 #if defined(_WIN64) && defined(_WIN32) && (CCN_UNIT_SIZE == 8) 348 #define CC_DUNIT_SUPPORTED 0 349 #else 350 #define CC_DUNIT_SUPPORTED 1 351 #endif 352 #endif 353 354 #if defined(_MSC_VER) 355 #if defined(__clang__) 356 #define CC_ALIGNED(x) __attribute__ ((aligned(x))) //clang compiler 357 #else 358 #define CC_ALIGNED(x) __declspec(align(x)) //MS complier 359 #endif 360 #else 361 #if defined(__clang__) || CCN_UNIT_SIZE==8 362 #define CC_ALIGNED(x) __attribute__ ((aligned(x))) 363 #else 364 #define CC_ALIGNED(x) __attribute__ ((aligned((x)>8?8:(x)))) 365 #endif 366 #endif 367 368 #if !defined(CC_USE_HEAP_FOR_WORKSPACE) 369 #if CC_USE_SEPROM || CC_RTKITROM || CC_EFI 370 #define CC_USE_HEAP_FOR_WORKSPACE 0 371 #else 372 #define CC_USE_HEAP_FOR_WORKSPACE 1 373 #endif 374 #endif 375 376 // Secure memory zeroization functions 377 #if !defined(__APPLE__) || CC_RTKIT || CC_RTKITROM || CC_USE_SEPROM || defined(__CC_ARM) || defined(__hexagon__) || CC_EFI 378 #define CC_HAS_MEMSET_S 0 379 #else 380 #define CC_HAS_MEMSET_S 1 381 #endif 382 383 #if defined(_WIN32) && !defined(__clang__) 384 // Clang with Microsoft CodeGen doesn't support SecureZeroMemory. 385 #define CC_HAS_SECUREZEROMEMORY 1 386 #else 387 #define CC_HAS_SECUREZEROMEMORY 0 388 #endif 389 390 #if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25)) 391 #define CC_HAS_EXPLICIT_BZERO 1 392 #else 393 #define CC_HAS_EXPLICIT_BZERO 0 394 #endif 395 396 // Disable RSA keygen on iBridge. 397 #if !defined(CC_DISABLE_RSAKEYGEN) 398 #if CC_BRIDGE && CC_KERNEL 399 #define CC_DISABLE_RSAKEYGEN 1 400 #else 401 #define CC_DISABLE_RSAKEYGEN 0 402 #endif 403 #endif 404 405 // Enable assembler in Linux if CC_LINUX_ASM is defined 406 #if (CC_LINUX || CC_SGX) && defined(CC_LINUX_ASM) && CC_LINUX_ASM 407 #define CC_USE_ASM 1 408 #endif 409 410 // Use this macro to strictly disable assembly regardless of cpu/os/compiler/etc. 411 // Our assembly code is not gcc compatible. Clang defines the __GNUC__ macro as well. 412 #if !defined(CC_USE_ASM) 413 #if defined(_WIN32) || CC_EFI || CC_BASEBAND || CC_XNU_KERNEL_PRIVATE || (defined(__GNUC__) && !defined(__clang__)) || CC_LINUX 414 #define CC_USE_ASM 0 415 #else 416 #define CC_USE_ASM 1 417 #endif 418 #endif 419 420 #ifndef CC_LOG 421 #define CC_LOG (CC_DARWIN && !CC_KERNEL && !CC_IBOOT && !CC_DRIVERKIT && !CC_EXCLAVE) 422 #endif 423 424 #ifndef CC_EXTERN_MALLOC 425 #if CC_TXM 426 #define CC_EXTERN_MALLOC 1 427 #else 428 #define CC_EXTERN_MALLOC 0 429 #endif 430 #endif 431 432 #ifndef CC_MALLOC_ABORT 433 #if CC_SPTM 434 #define CC_MALLOC_ABORT 1 435 #else 436 #define CC_MALLOC_ABORT 0 437 #endif 438 #endif 439 440 #define CC_CACHE_DESCRIPTORS CC_KERNEL 441 442 //-(1) ARM V7 443 #if CC_ARM_ARCH_7 && defined(__clang__) && CC_USE_ASM 444 #define CCN_ADD_ASM 1 445 #define CCN_SUB_ASM 1 446 #define CCN_MUL_ASM 0 447 #define CCN_ADDMUL1_ASM 1 448 #define CCN_MUL1_ASM 1 449 #define CCN_CMP_ASM 1 450 #define CCN_ADD1_ASM 1 451 #define CCN_SUB1_ASM 1 452 #define CCN_N_ASM 1 453 #define CCN_SET_ASM 1 454 #define CCN_SHIFT_RIGHT_ASM 1 455 #if defined(__ARM_NEON__) 456 #define CCN_SHIFT_LEFT_ASM 1 457 #else 458 #define CCN_SHIFT_LEFT_ASM 0 459 #endif 460 #define CCN_MULMOD_224_ASM CC_ARM_ARCH_7_DSP 461 #define CCN_MULMOD_256_ASM CC_ARM_ARCH_7_DSP 462 #define CCN_MULMOD_384_ASM CC_ARM_ARCH_7_DSP 463 #define CCN_MULMOD_25519_ASM 0 464 #define CCN_MULMOD_448_ASM 0 465 466 // Clang cross-compiling for ARMv7/Linux can't handle the indirect symbol 467 // directives we use to reference AES tables. Skip AES assembly for now. 468 #if CC_LINUX && CC_BUILT_FOR_TESTING 469 #define CCAES_ARM_ASM 0 470 #else 471 #define CCAES_ARM_ASM 1 472 #endif 473 474 #define CCAES_INTEL_ASM 0 475 #define CCSHA1_VNG_INTEL 0 476 #define CCSHA2_VNG_INTEL 0 477 #define CCSHA3_VNG_INTEL 0 478 #define CCSHA3_VNG_ARM 0 479 #define CCSHA256_ARMV6M_ASM 0 480 481 #if defined(__ARM_NEON__) || CC_KERNEL 482 #define CCSHA1_VNG_ARM 1 483 #define CCSHA2_VNG_ARM 1 484 #else /* !defined(__ARM_NEON__) */ 485 #define CCSHA1_VNG_ARM 0 486 #define CCSHA2_VNG_ARM 0 487 #endif /* !defined(__ARM_NEON__) */ 488 489 //-(2) ARM 64 490 #elif defined(__arm64__) && defined(__clang__) && CC_USE_ASM 491 #define CCN_ADD_ASM 1 492 #define CCN_SUB_ASM 1 493 #define CCN_MUL_ASM 1 494 #define CCN_ADDMUL1_ASM 1 495 #define CCN_MUL1_ASM 1 496 #define CCN_CMP_ASM 1 497 #define CCN_ADD1_ASM 1 498 #define CCN_SUB1_ASM 0 499 #define CCN_N_ASM 1 500 #define CCN_SET_ASM 0 501 #define CCN_SHIFT_RIGHT_ASM CC_ARM_NEON 502 #define CCN_SHIFT_LEFT_ASM CC_ARM_NEON 503 #define CCN_MULMOD_224_ASM 1 504 #define CCN_MULMOD_256_ASM 1 505 #define CCN_MULMOD_384_ASM 1 506 #define CCN_MULMOD_25519_ASM 1 507 #define CCN_MULMOD_448_ASM 1 508 #define CCAES_ARM_ASM (CC_ARM_NEON && CC_ARM_FEATURE_AES) 509 #define CCAES_INTEL_ASM 0 510 #define CCSHA1_VNG_INTEL 0 511 #define CCSHA2_VNG_INTEL 0 512 #define CCSHA3_VNG_INTEL 0 513 #define CCSHA1_VNG_ARM 1 514 #define CCSHA2_VNG_ARM (CC_ARM_NEON && CC_ARM_FEATURE_SHA2) 515 #define CCSHA256_ARMV6M_ASM 0 516 #if CC_USE_L4 || CC_KERNEL 517 #define CCSHA3_VNG_ARM 0 518 #else 519 #define CCSHA3_VNG_ARM 1 520 #endif 521 //-(3) Intel 32/64 522 #elif (defined(__x86_64__) || defined(__i386__)) && defined(__clang__) && CC_USE_ASM 523 /* These assembly routines only work for a single CCN_UNIT_SIZE. */ 524 #if (defined(__x86_64__) && CCN_UNIT_SIZE == 8) || (defined(__i386__) && CCN_UNIT_SIZE == 4) 525 #define CCN_ADD_ASM 1 526 #define CCN_SUB_ASM 1 527 #define CCN_MUL_ASM 1 528 #else 529 #define CCN_ADD_ASM 0 530 #define CCN_SUB_ASM 0 531 #define CCN_MUL_ASM 0 532 #endif 533 534 #if (defined(__x86_64__) && CCN_UNIT_SIZE == 8) 535 #define CCN_CMP_ASM 1 536 #define CCN_N_ASM 1 537 #define CCN_SHIFT_RIGHT_ASM 1 538 #define CCN_SHIFT_LEFT_ASM 1 539 #else 540 #define CCN_CMP_ASM 0 541 #define CCN_N_ASM 0 542 #define CCN_SHIFT_RIGHT_ASM 0 543 #define CCN_SHIFT_LEFT_ASM 0 544 #endif 545 546 #define CCN_MULMOD_384_ASM 0 547 #define CCN_MULMOD_448_ASM 0 548 #if defined(__x86_64__) && CCN_UNIT_SIZE == 8 && !CC_SGX 549 #define CCN_MULMOD_224_ASM 1 550 #define CCN_MULMOD_256_ASM 1 551 #define CCN_MULMOD_25519_ASM 1 552 #define CCN_ADDMUL1_ASM 1 553 #define CCN_MUL1_ASM 1 554 #else 555 #define CCN_MULMOD_224_ASM 0 556 #define CCN_MULMOD_256_ASM 0 557 #define CCN_MULMOD_25519_ASM 0 558 #define CCN_ADDMUL1_ASM 0 559 #define CCN_MUL1_ASM 0 560 #endif 561 #define CCN_ADD1_ASM 0 562 #define CCN_SUB1_ASM 0 563 #define CCN_SET_ASM 0 564 #define CCAES_ARM_ASM 0 565 #define CCAES_INTEL_ASM 1 566 #define CCSHA1_VNG_INTEL 1 567 #define CCSHA2_VNG_INTEL 1 568 #define CCSHA3_VNG_INTEL 1 569 #define CCSHA1_VNG_ARM 0 570 #define CCSHA2_VNG_ARM 0 571 #define CCSHA3_VNG_ARM 0 572 #define CCSHA256_ARMV6M_ASM 0 573 //-(4) ARMv6-M 574 #elif CC_ARM_ARCH_6M 575 #define CCN_ADD_ASM 0 576 #define CCN_SUB_ASM 0 577 #define CCN_MUL_ASM 0 578 #define CCN_ADDMUL1_ASM 0 579 #define CCN_MUL1_ASM 0 580 #define CCN_CMP_ASM 0 581 #define CCN_ADD1_ASM 0 582 #define CCN_SUB1_ASM 0 583 #define CCN_N_ASM 0 584 #define CCN_SET_ASM 0 585 #define CCN_SHIFT_RIGHT_ASM 0 586 #define CCN_SHIFT_LEFT_ASM 0 587 #define CCN_MULMOD_224_ASM 0 588 #define CCN_MULMOD_256_ASM 0 589 #define CCN_MULMOD_384_ASM 0 590 #define CCN_MULMOD_25519_ASM 0 591 #define CCN_MULMOD_448_ASM 0 592 #define CCAES_ARM_ASM 0 593 #define CCAES_INTEL_ASM 0 594 #define CCSHA1_VNG_INTEL 0 595 #define CCSHA2_VNG_INTEL 0 596 #define CCSHA3_VNG_INTEL 0 597 #define CCSHA1_VNG_ARM 0 598 #define CCSHA2_VNG_ARM 0 599 #define CCSHA3_VNG_ARM 0 600 #define CCSHA256_ARMV6M_ASM 1 601 //-(5) disable assembly 602 #else 603 #define CCN_ADD_ASM 0 604 #define CCN_SUB_ASM 0 605 #define CCN_MUL_ASM 0 606 #define CCN_ADDMUL1_ASM 0 607 #define CCN_MUL1_ASM 0 608 #define CCN_CMP_ASM 0 609 #define CCN_ADD1_ASM 0 610 #define CCN_SUB1_ASM 0 611 #define CCN_N_ASM 0 612 #define CCN_SET_ASM 0 613 #define CCN_SHIFT_RIGHT_ASM 0 614 #define CCN_SHIFT_LEFT_ASM 0 615 #define CCN_MULMOD_224_ASM 0 616 #define CCN_MULMOD_256_ASM 0 617 #define CCN_MULMOD_384_ASM 0 618 #define CCN_MULMOD_25519_ASM 0 619 #define CCN_MULMOD_448_ASM 0 620 #define CCAES_ARM_ASM 0 621 #define CCAES_INTEL_ASM 0 622 #define CCSHA1_VNG_INTEL 0 623 #define CCSHA2_VNG_INTEL 0 624 #define CCSHA3_VNG_INTEL 0 625 #define CCSHA1_VNG_ARM 0 626 #define CCSHA2_VNG_ARM 0 627 #define CCSHA3_VNG_ARM 0 628 #define CCSHA256_ARMV6M_ASM 0 629 #endif 630 631 #define CC_INLINE static inline 632 #define CC_NONNULL4 CC_NONNULL((4)) 633 634 #ifdef __GNUC__ 635 #define CC_NORETURN __attribute__((__noreturn__)) 636 #define CC_NOTHROW __attribute__((__nothrow__)) 637 #define CC_NONNULL(N) __attribute__((__nonnull__ N)) 638 #define CC_NONNULL_ALL __attribute__((__nonnull__)) 639 #define CC_SENTINEL __attribute__((__sentinel__)) 640 // Only apply the `CC_CONST` attribute to functions with no side-effects where the output is a strict function of pass by value input vars with no exterior side-effects. 641 // Specifically, do not apply CC_CONST if the function has any arguments that are pointers (directly, or indirectly) 642 #define CC_CONST __attribute__((__const__)) 643 #define CC_PURE __attribute__((__pure__)) 644 #define CC_NODISCARD __attribute__((warn_unused_result)) 645 #define CC_WARN_RESULT __attribute__((__warn_unused_result__)) 646 #define CC_MALLOC_CLEAR __attribute__((__malloc__)) 647 #define CC_UNUSED __attribute__((unused)) 648 #define CC_WEAK __attribute__((weak)) 649 #elif defined(__KEIL__) 650 #define CC_NORETURN __attribute__((noreturn)) 651 #define CC_NOTHROW __attribute__((nothrow)) 652 #define CC_NONNULL(N) __attribute__((nonnull N)) 653 #define CC_NONNULL_ALL __attribute__((nonnull)) 654 #define CC_SENTINEL __attribute__((sentinel)) 655 #define CC_CONST __attribute__((const)) 656 #define CC_PURE __attribute__((pure)) 657 #define CC_NODISCARD __attribute__((warn_unused_result)) 658 #define CC_WARN_RESULT __attribute__((warn_unused_result)) 659 #define CC_MALLOC_CLEAR __attribute__((malloc)) 660 #define CC_UNUSED __attribute__((unused)) 661 #define CC_WEAK __attribute__((weak)) 662 #else /* !__GNUC__ */ 663 /*! @parseOnly */ 664 #define CC_UNUSED 665 /*! @parseOnly */ 666 #define CC_NONNULL(N) 667 /*! @parseOnly */ 668 #define CC_NORETURN 669 /*! @parseOnly */ 670 #define CC_NOTHROW 671 /*! @parseOnly */ 672 #define CC_NONNULL_ALL 673 /*! @parseOnly */ 674 #define CC_SENTINEL 675 /*! @parseOnly */ 676 #define CC_CONST 677 /*! @parseOnly */ 678 #define CC_PURE 679 /*! @parseOnly */ 680 #define CC_NODISCARD 681 /*! @parseOnly */ 682 #define CC_WARN_RESULT 683 /*! @parseOnly */ 684 #define CC_MALLOC_CLEAR 685 /*! @parseOnly */ 686 #define CC_WEAK 687 #endif /* !__GNUC__ */ 688 689 // Use CC_WEAK_IF_SMALL_CODE to mark symbols as weak when compiling with 690 // CC_SMALL_CODE=1. This allows replacing faster but bigger code with smaller 691 // versions at link time. 692 #if CC_SMALL_CODE && !CC_BUILT_FOR_TESTING 693 #define CC_WEAK_IF_SMALL_CODE CC_WEAK 694 #else 695 #define CC_WEAK_IF_SMALL_CODE 696 #endif 697 698 // Bridge differences between MachO and ELF compiler/assemblers. */ 699 #if CC_LINUX || CC_SGX 700 #define CC_ASM_SECTION_CONST .rodata 701 #define CC_ASM_PRIVATE_EXTERN .hidden 702 #define CC_ASM_SUBSECTIONS_VIA_SYMBOLS 703 #if CC_LINUX 704 // We need to be sure that assembler can access relocated C 705 // symbols. Sad but this is the quickest way to do that, at least with 706 // our current linux compiler (clang-3.4). 707 #define CC_C_LABEL(_sym) _sym@PLT 708 #else /* CC_SGX */ 709 #define CC_C_LABEL(_sym) _sym 710 #endif 711 #define _IMM(x) $(x) 712 #else /* !CC_LINUX && !CC_SGX */ 713 #define CC_ASM_SECTION_CONST .const 714 #define CC_ASM_PRIVATE_EXTERN .private_extern 715 #define CC_ASM_SUBSECTIONS_VIA_SYMBOLS .subsections_via_symbols 716 #define CC_C_LABEL(_sym) _##_sym 717 #define _IMM(x) $$(x) 718 #endif /* !CC_LINUX && !CC_SGX */ 719 720 // Enable FIPSPOST function tracing only when supported. */ 721 #ifdef CORECRYPTO_POST_TRACE 722 #define CC_FIPSPOST_TRACE 1 723 #else 724 #define CC_FIPSPOST_TRACE 0 725 #endif 726 727 #ifndef CC_INTERNAL_SDK 728 #if __has_include(<System/i386/cpu_capabilities.h>) 729 #define CC_INTERNAL_SDK 1 730 #elif __has_include(<System/arm/cpu_capabilities.h>) 731 #define CC_INTERNAL_SDK 1 732 #else 733 #define CC_INTERNAL_SDK 0 734 #endif 735 #endif 736 737 #if __has_feature(address_sanitizer) 738 #define CC_ASAN 1 739 #else 740 #define CC_ASAN 0 741 #endif 742 743 #ifdef CORECRYPTO_COVERAGE 744 #define CC_COVERAGE 1 745 #else 746 #define CC_COVERAGE 0 747 #endif 748 749 // Currently thread sanitizer is only supported in local builds. 750 // Please edit your "corecrypto_test" scheme to build with thread 751 // sanitizer and then remove *all* variants of corecrypto_static 752 // besides "normal" 753 754 #if __has_feature(thread_sanitizer) 755 #define CC_TSAN 1 756 #else 757 #define CC_TSAN 0 758 #endif // __has_feature(thread_sanitizer) 759 760 #if __has_feature(bounds_attributes) 761 #define CC_PTRCHECK 1 762 #define CC_PTRCHECK_CAPABLE_HEADER() _Pragma("clang abi_ptr_attr set(single)") 763 #define cc_counted_by(x) __attribute__((counted_by(x))) 764 #define cc_sized_by(x) __attribute__((sized_by(x))) 765 #define cc_bidi_indexable __attribute__((bidi_indexable)) 766 #define cc_indexable __attribute__((indexable)) 767 #define cc_single __attribute__((single)) 768 #define cc_unsafe_indexable __attribute__((unsafe_indexable)) 769 #define cc_unsafe_forge_bidi_indexable(P, S) __builtin_unsafe_forge_bidi_indexable(P, S) 770 #define cc_unsafe_forge_single(P) __builtin_unsafe_forge_single(P) 771 #define cc_cstring cc_unsafe_indexable 772 #define CC_WIDE_NULL ((void *cc_bidi_indexable)NULL) 773 #define cc_ended_by(x) __attribute__((ended_by(x))) 774 #define cc_ptrcheck_unavailable_r(r) __ptrcheck_unavailable_r(r) 775 #else 776 #define CC_PTRCHECK 0 777 #define CC_PTRCHECK_CAPABLE_HEADER() 778 #define cc_counted_by(x) 779 #define cc_sized_by(x) 780 #define cc_bidi_indexable 781 #define cc_indexable 782 #define cc_single 783 #define cc_unsafe_indexable 784 #define cc_unsafe_forge_bidi_indexable(P, S) (P) 785 #define cc_unsafe_forge_single(P) (P) 786 #define cc_cstring 787 #define CC_WIDE_NULL NULL 788 #define cc_ended_by(x) 789 #define cc_ptrcheck_unavailable_r(r) 790 #endif // __has_feature(bounds_attributes) 791 792 // Define endianess for GCC, if needed and applicable. 793 #if defined(__GNUC__) && !defined(__LITTLE_ENDIAN__) 794 #if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) 795 #define __LITTLE_ENDIAN__ 1 796 #endif 797 #endif 798 799 #if defined(ENABLE_CRYPTOKIT_PRIVATE_DEFINITIONS) && ENABLE_CRYPTOKIT_PRIVATE_DEFINITIONS 800 #define CC_PRIVATE_CRYPTOKIT 1 801 #else 802 #define CC_PRIVATE_CRYPTOKIT 0 803 #endif 804 805 #if defined(__clang__) 806 #define CC_WORKSPACE_OVERRIDE_PRAGMA(x) _Pragma(#x) 807 #define CC_WORKSPACE_OVERRIDE(f, o) CC_WORKSPACE_OVERRIDE_PRAGMA(workspace-override f o) 808 #else 809 #define CC_WORKSPACE_OVERRIDE(f, o) 810 #endif 811 812 #ifndef CC_DIT_MAYBE_SUPPORTED 813 #if defined(__arm64__) && !CC_USE_L4 && !CC_USE_SEPROM && !CC_IBOOT 814 #define CC_DIT_MAYBE_SUPPORTED 1 815 #else 816 #define CC_DIT_MAYBE_SUPPORTED 0 817 #endif 818 #endif 819 820 #endif /* _CORECRYPTO_CC_CONFIG_H_ */ 821