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-2023 NXP */
3/* */
4/* NXP Proprietary. This software is owned or controlled by NXP and may */
5/* only be used strictly in accordance with the applicable license terms. */
6/* By expressly accepting such terms or by downloading, installing, */
7/* activating and/or otherwise using the software, you are agreeing that */
8/* you have read, and that you agree to comply with and are bound by, such */
9/* license terms. If you do not agree to be bound by the applicable */
10/* license terms, then you may not retain, install, activate or otherwise */
11/* use the software. */
12/*--------------------------------------------------------------------------*/
13
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
63#define MCUX_CSSL_FP_DECL_NAME(type, id) \
64 MCUX_CSSL_CPP_CAT4(mcuxCsslFlowProtection_, type, _, id)
65
75#define MCUX_CSSL_FP_DECL_IMPL(type, id) \
76 MCUX_CSSL_SC_VALUE_TYPE MCUX_CSSL_FP_DECL_NAME(type, id) = \
77 MCUX_CSSL_CPP_CAT3(MCUX_CSSL_FP_, type, _ID)(id)
78
86#define MCUX_CSSL_FP_ID_IMPL() \
87 MCUX_CSSL_CPP_CAT(__LINE__, u)
88
89
90
106#define MCUX_CSSL_FP_EXPECTATIONS(...) \
107 ((uint32_t) 0u + (MCUX_CSSL_CPP_MAP(MCUX_CSSL_CPP_ADD, __VA_ARGS__)))
108
121#define MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement) \
122 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
123 statement \
124 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
125
137#define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \
138 (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0)))
139
150#define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \
151 (0u)
152
166#define MCUX_CSSL_FP_EXPECT_IMPL(...) \
167 MCUX_CSSL_SC_SUB( \
168 MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
169 )
170
171
172
190#define MCUX_CSSL_FP_FUNCTION_ID(id) \
191 MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id)
192
198#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \
199 (0x5A5A5A5Au)
200
208#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \
209 (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK)
210
218#define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
219 (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id))
220
232#define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \
233 /* Intentionally empty */
234
243#define MCUX_CSSL_FP_FUNCTION_VALUE(id) \
244 ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id))
245
256#define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \
257 /* Intentionally empty. */
258
267#define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \
268 definition
269
275#define MCUX_CSSL_FP_RESULT_OFFSET \
276 (0u)
277
283#define MCUX_CSSL_FP_RESULT_MASK \
284 (0xFFFFFFFFuLL)
285
293#define MCUX_CSSL_FP_RESULT_VALUE(result) \
294 (((uint64_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET)
295
304#define MCUX_CSSL_FP_RESULT_IMPL2(type, return) \
305 ((type)(((return) >> MCUX_CSSL_FP_RESULT_OFFSET) & MCUX_CSSL_FP_RESULT_MASK))
306
314#define MCUX_CSSL_FP_RESULT_IMPL1(return) \
315 MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)
316
325#define MCUX_CSSL_FP_RESULT_IMPL(...) \
326 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)
327
333#define MCUX_CSSL_FP_PROTECTION_OFFSET \
334 (32u)
335
341#define MCUX_CSSL_FP_PROTECTION_MASK \
342 ((uint64_t) 0xFFFFFFFFuLL)
343
354#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \
355 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)
356
367#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \
368 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)
369
376#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \
377 MCUX_CSSL_SC_VALUE()
378
379
393#define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \
394 MCUX_CSSL_FP_FUNCTION_VALUE(id)
395
396
410#define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \
411 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)
412
413
432#define MCUX_CSSL_FP_LOOP_ID(id) \
433 MCUX_CSSL_FP_ID_IMPL()
434
442#define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \
443 MCUX_CSSL_FP_DECL_IMPL(LOOP, id)
444
453#define MCUX_CSSL_FP_LOOP_VALUE(id) \
454 MCUX_CSSL_FP_DECL_NAME(LOOP, id)
455
467#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \
468 MCUX_CSSL_SC_ADD( \
469 MCUX_CSSL_FP_LOOP_VALUE(id) \
470 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
471 )
472
483#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \
484 MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u)
485
500#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \
501 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__)
502
511#define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \
512 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
513 ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \
514 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
515
516
517
536#define MCUX_CSSL_FP_BRANCH_ID(id) \
537 MCUX_CSSL_FP_ID_IMPL()
538
546#define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \
547 MCUX_CSSL_FP_DECL_IMPL(BRANCH, id)
548
557#define MCUX_CSSL_FP_BRANCH_VALUE(id) \
558 MCUX_CSSL_FP_DECL_NAME(BRANCH, id)
559
565#define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u
566
572#define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu
573
588#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \
589 MCUX_CSSL_SC_ADD( \
590 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
591 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
592 )
593
608#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \
609 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \
610 __VA_ARGS__)
611
624#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \
625 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u)
626
642#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \
643 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__)
644
659#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \
660 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \
661 __VA_ARGS__)
662
675#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \
676 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u)
677
693#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \
694 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__)
695
708#define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \
709 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
710 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
711 MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
712 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
713
726#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \
727 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition)
728
740#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \
741 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
742 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.") \
743 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
744 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \
745 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
746 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
747 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
748
762#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \
763 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__)
764
777#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \
778 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition)
779
791#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \
792 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
793 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.") \
794 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
795 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \
796 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
797 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
798 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
799
813#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \
814 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__)
815
816
817
836#define MCUX_CSSL_FP_SWITCH_ID(id) \
837 MCUX_CSSL_FP_ID_IMPL()
838
846#define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \
847 MCUX_CSSL_FP_DECL_IMPL(SWITCH, id)
848
857#define MCUX_CSSL_FP_SWITCH_VALUE(id) \
858 MCUX_CSSL_FP_DECL_NAME(SWITCH, id)
859
873#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \
874 MCUX_CSSL_SC_ADD( \
875 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
876 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
877 )
878
890#define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \
891 MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u)
892
908#define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \
909 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__)
910
916#define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \
917 (0xDEFAu)
918
931#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \
932 MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \
933 id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__)
934
945#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \
946 MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u) \
947
962#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \
963 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__)
964
978#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \
979 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
980 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
981 MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
982 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
983
995#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \
996 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
997 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.") \
998 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
999 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \
1000 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
1001 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
1002 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
1003
1019#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \
1020 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__)
1021
1033#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \
1034 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition)
1035
1046#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \
1047 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
1048 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.") \
1049 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
1050 MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \
1051 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
1052 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
1053 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
1054
1068#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \
1069 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__)
1070
1088#ifndef MCUX_CSSL_FP_ASSERT_CALLBACK
1089 #define MCUX_CSSL_FP_ASSERT_CALLBACK() \
1090 return 1/0 /* Fallback ASSERT callback is used, please provide your own. */
1091#endif
1092
1093#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.