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 () |
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 | |