MCUX CLNS
MCUX Crypto Library Normal Secure
Loading...
Searching...
No Matches
mcuxCsslFlowProtection_SecureCounter_Common.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------------*/
2/* Copyright 2020-2025 NXP */
3/* */
4/* NXP Confidential and Proprietary. This software is owned or controlled */
5/* by NXP and may only be used strictly in accordance with the applicable */
6/* license terms. By expressly accepting such terms or by downloading, */
7/* installing, activating and/or otherwise using the software, you are */
8/* agreeing that you have read, and that you agree to comply with and are */
9/* bound by, such license terms. If you do not agree to be bound by the */
10/* applicable license terms, then you may not retain, install, activate or */
11/* otherwise use the software. */
12/*--------------------------------------------------------------------------*/
13
18
19#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_
20#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_
21
22/* Include the CSSL C pre-processor support functionality. */
24#include <mcuxCsslAnalysis.h>
25
26/* Include the CSSL secure counter mechanism as basic building block. */
28
29/* Include the C99 standard integer types. */
30#include <stdint.h>
31
39
40
48
58#define MCUX_CSSL_FP_DECL_NAME(type, id) \
59 MCUX_CSSL_CPP_CAT4(mcuxCsslFlowProtection_, type, _, id)
60
70#define MCUX_CSSL_FP_DECL_IMPL(type, id) \
71 MCUX_CSSL_SC_VALUE_TYPE MCUX_CSSL_FP_DECL_NAME(type, id) = \
72 MCUX_CSSL_CPP_CAT3(MCUX_CSSL_FP_, type, _ID)(id)
73
81#define MCUX_CSSL_FP_ID_IMPL() \
82 MCUX_CSSL_CPP_CAT(__LINE__, u)
83
97#define MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement) \
98 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
99 statement \
100 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
101
102
103
109
119#define MCUX_CSSL_FP_EXPECTATIONS(...) \
120 ((uint32_t) 0u + (MCUX_CSSL_CPP_MAP(MCUX_CSSL_CPP_ADD, __VA_ARGS__)))
121
133#define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \
134 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
135 (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0))) \
136 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
137
147#define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \
148 (0u)
149
163#define MCUX_CSSL_FP_EXPECT_IMPL(...) \
164 MCUX_CSSL_SC_SUB( \
165 MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
166 )
167
184#ifndef MCUX_CSSL_FP_ASSERT_CALLBACK
185 #define MCUX_CSSL_FP_ASSERT_CALLBACK() \
186 return 1/0 /* Fallback ASSERT callback is used, please provide your own. */
187#endif
188
189
190
200
208#define MCUX_CSSL_FP_FUNCTION_ID(id) \
209 MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id)
210
216#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \
217 (0x5A5A5A5Au)
218
226#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \
227 (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK)
228
236#define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
237 (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id))
238
250#define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \
251 /* Intentionally empty */
252
261#define MCUX_CSSL_FP_FUNCTION_VALUE(id) \
262 ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id))
263
274#define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \
275 /* Intentionally empty. */
276
285#define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \
286 definition
287
301#define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \
302 MCUX_CSSL_FP_FUNCTION_VALUE(id)
303
317#define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \
318 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)
319
329
338#define MCUX_CSSL_FP_LOOP_ID(id) \
339 MCUX_CSSL_FP_ID_IMPL()
340
348#define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \
349 MCUX_CSSL_FP_DECL_IMPL(LOOP, id)
350
359#define MCUX_CSSL_FP_LOOP_VALUE(id) \
360 MCUX_CSSL_FP_DECL_NAME(LOOP, id)
361
372#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \
373 MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u)
374
389#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \
390 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__)
391
400#define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \
401 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
402 ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \
403 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
404
405
406
416
425#define MCUX_CSSL_FP_BRANCH_ID(id) \
426 MCUX_CSSL_FP_ID_IMPL()
427
435#define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \
436 MCUX_CSSL_FP_DECL_IMPL(BRANCH, id)
437
446#define MCUX_CSSL_FP_BRANCH_VALUE(id) \
447 MCUX_CSSL_FP_DECL_NAME(BRANCH, id)
448
454#define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u
455
461#define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu
462
477#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \
478 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \
479 __VA_ARGS__)
480
493#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \
494 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u)
495
511#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \
512 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__)
513
528#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \
529 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \
530 __VA_ARGS__)
531
544#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \
545 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u)
546
562#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \
563 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__)
564
577#define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \
578 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
579 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
580 MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
581 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
582
595#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \
596 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition)
597
609#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \
610 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
611 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
612 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
613 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \
614 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
615 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
616 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
617
631#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \
632 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__)
633
646#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \
647 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition)
648
660#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \
661 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
662 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
663 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
664 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \
665 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
666 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
667 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
668
682#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \
683 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__)
684
685
686
696
705#define MCUX_CSSL_FP_SWITCH_ID(id) \
706 MCUX_CSSL_FP_ID_IMPL()
707
715#define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \
716 MCUX_CSSL_FP_DECL_IMPL(SWITCH, id)
717
726#define MCUX_CSSL_FP_SWITCH_VALUE(id) \
727 MCUX_CSSL_FP_DECL_NAME(SWITCH, id)
728
740#define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \
741 MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u)
742
758#define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \
759 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__)
760
766#define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \
767 (0xDEFAu)
768
781#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \
782 MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \
783 id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__)
784
795#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \
796 MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u)
797
812#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \
813 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__)
814
828#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \
829 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
830 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
831 MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
832 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
833
845#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \
846 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
847 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
848 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
849 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \
850 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
851 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
852 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
853
869#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \
870 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__)
871
883#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \
884 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition)
885
896#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \
897 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
898 MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, "The usage of an invariant condition here is intended to keep the macro structures more clear.") \
899 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
900 MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \
901 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
902 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
903 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
904
918#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \
919 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__)
920
921#endif /* MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_ */
The default implementation is based on standard C preprocessor functionality.
Provides the API for the CSSL secure counter mechanism.