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/* SPDX-License-Identifier: BSD-3-Clause */
5/* */
6/* Redistribution and use in source and binary forms, with or without */
7/* modification, are permitted provided that the following conditions are */
8/* met: */
9/* */
10/* 1. Redistributions of source code must retain the above copyright */
11/* notice, this list of conditions and the following disclaimer. */
12/* */
13/* 2. Redistributions in binary form must reproduce the above copyright */
14/* notice, this list of conditions and the following disclaimer in the */
15/* documentation and/or other materials provided with the distribution. */
16/* */
17/* 3. Neither the name of the copyright holder nor the names of its */
18/* contributors may be used to endorse or promote products derived from */
19/* this software without specific prior written permission. */
20/* */
21/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS */
22/* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
23/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */
24/* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
25/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
26/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
27/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR */
28/* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
29/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
30/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
31/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32/*--------------------------------------------------------------------------*/
33
38
39#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_
40#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_
41
42/* Include the CSSL C pre-processor support functionality. */
44#include <mcuxCsslAnalysis.h>
45
46/* Include the CSSL secure counter mechanism as basic building block. */
48
49/* Include the C99 standard integer types. */
50#include <stdint.h>
51
59
60
68
78#define MCUX_CSSL_FP_DECL_NAME(type, id) \
79 MCUX_CSSL_CPP_CAT4(mcuxCsslFlowProtection_, type, _, id)
80
90#define MCUX_CSSL_FP_DECL_IMPL(type, id) \
91 MCUX_CSSL_SC_VALUE_TYPE MCUX_CSSL_FP_DECL_NAME(type, id) = \
92 MCUX_CSSL_CPP_CAT3(MCUX_CSSL_FP_, type, _ID)(id)
93
101#define MCUX_CSSL_FP_ID_IMPL() \
102 MCUX_CSSL_CPP_CAT(__LINE__, u)
103
117#define MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement) \
118 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
119 statement \
120 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
121
122
123
129
139#define MCUX_CSSL_FP_EXPECTATIONS(...) \
140 ((uint32_t) 0u + (MCUX_CSSL_CPP_MAP(MCUX_CSSL_CPP_ADD, __VA_ARGS__)))
141
153#define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \
154 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
155 (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0))) \
156 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
157
167#define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \
168 (0u)
169
183#define MCUX_CSSL_FP_EXPECT_IMPL(...) \
184 MCUX_CSSL_SC_SUB( \
185 MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
186 )
187
204#ifndef MCUX_CSSL_FP_ASSERT_CALLBACK
205 #define MCUX_CSSL_FP_ASSERT_CALLBACK() \
206 return 1/0 /* Fallback ASSERT callback is used, please provide your own. */
207#endif
208
209
210
220
228#define MCUX_CSSL_FP_FUNCTION_ID(id) \
229 MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id)
230
236#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \
237 (0x5A5A5A5Au)
238
246#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \
247 (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK)
248
256#define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
257 (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id))
258
270#define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \
271 /* Intentionally empty */
272
281#define MCUX_CSSL_FP_FUNCTION_VALUE(id) \
282 ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id))
283
294#define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \
295 /* Intentionally empty. */
296
305#define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \
306 definition
307
321#define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \
322 MCUX_CSSL_FP_FUNCTION_VALUE(id)
323
337#define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \
338 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)
339
349
358#define MCUX_CSSL_FP_LOOP_ID(id) \
359 MCUX_CSSL_FP_ID_IMPL()
360
368#define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \
369 MCUX_CSSL_FP_DECL_IMPL(LOOP, id)
370
379#define MCUX_CSSL_FP_LOOP_VALUE(id) \
380 MCUX_CSSL_FP_DECL_NAME(LOOP, id)
381
392#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \
393 MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u)
394
409#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \
410 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__)
411
420#define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \
421 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
422 ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \
423 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
424
425
426
436
445#define MCUX_CSSL_FP_BRANCH_ID(id) \
446 MCUX_CSSL_FP_ID_IMPL()
447
455#define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \
456 MCUX_CSSL_FP_DECL_IMPL(BRANCH, id)
457
466#define MCUX_CSSL_FP_BRANCH_VALUE(id) \
467 MCUX_CSSL_FP_DECL_NAME(BRANCH, id)
468
474#define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u
475
481#define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu
482
497#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \
498 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \
499 __VA_ARGS__)
500
513#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \
514 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u)
515
531#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \
532 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__)
533
548#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \
549 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \
550 __VA_ARGS__)
551
564#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \
565 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u)
566
582#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \
583 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__)
584
597#define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \
598 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
599 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
600 MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
601 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
602
615#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \
616 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition)
617
629#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \
630 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
631 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.") \
632 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
633 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \
634 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
635 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
636 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
637
651#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \
652 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__)
653
666#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \
667 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition)
668
680#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \
681 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
682 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.") \
683 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
684 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \
685 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
686 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
687 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
688
702#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \
703 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__)
704
705
706
716
725#define MCUX_CSSL_FP_SWITCH_ID(id) \
726 MCUX_CSSL_FP_ID_IMPL()
727
735#define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \
736 MCUX_CSSL_FP_DECL_IMPL(SWITCH, id)
737
746#define MCUX_CSSL_FP_SWITCH_VALUE(id) \
747 MCUX_CSSL_FP_DECL_NAME(SWITCH, id)
748
760#define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \
761 MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u)
762
778#define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \
779 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__)
780
786#define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \
787 (0xDEFAu)
788
801#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \
802 MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \
803 id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__)
804
815#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \
816 MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u)
817
832#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \
833 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__)
834
848#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \
849 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
850 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
851 MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
852 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
853
865#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \
866 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
867 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.") \
868 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
869 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \
870 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
871 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
872 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
873
889#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \
890 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__)
891
903#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \
904 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition)
905
916#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \
917 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
918 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.") \
919 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
920 MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \
921 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
922 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
923 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
924
938#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \
939 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__)
940
941#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.