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 Confidential. 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 license */
10/* terms, then you may not retain, install, activate or otherwise use the */
11/* 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 statement
123
135#define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \
136 (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0)))
137
148#define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \
149 (0u)
150
164#define MCUX_CSSL_FP_EXPECT_IMPL(...) \
165 MCUX_CSSL_SC_SUB( \
166 MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
167 )
168
169
170
188#define MCUX_CSSL_FP_FUNCTION_ID(id) \
189 MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id)
190
196#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \
197 (0x5A5A5A5Au)
198
206#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \
207 (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK)
208
216#define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
217 (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id))
218
230#define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \
231 /* Intentionally empty */
232
241#define MCUX_CSSL_FP_FUNCTION_VALUE(id) \
242 ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id))
243
254#define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \
255 /* Intentionally empty. */
256
265#define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \
266 definition
267
273#define MCUX_CSSL_FP_RESULT_OFFSET \
274 (0u)
275
281#define MCUX_CSSL_FP_RESULT_MASK \
282 (0xFFFFFFFFuLL)
283
291#define MCUX_CSSL_FP_RESULT_VALUE(result) \
292 (((uint64_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET)
293
302#define MCUX_CSSL_FP_RESULT_IMPL2(type, return) \
303 ((type)(((return) >> MCUX_CSSL_FP_RESULT_OFFSET) & MCUX_CSSL_FP_RESULT_MASK))
304
312#define MCUX_CSSL_FP_RESULT_IMPL1(return) \
313 MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)
314
323#define MCUX_CSSL_FP_RESULT_IMPL(...) \
324 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)
325
331#define MCUX_CSSL_FP_PROTECTION_OFFSET \
332 (32u)
333
339#define MCUX_CSSL_FP_PROTECTION_MASK \
340 ((uint64_t) 0xFFFFFFFFuLL)
341
352#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \
353 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)
354
365#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \
366 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)
367
374#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \
375 MCUX_CSSL_SC_VALUE()
376
377
391#define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \
392 MCUX_CSSL_FP_FUNCTION_VALUE(id)
393
394
408#define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \
409 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)
410
411
430#define MCUX_CSSL_FP_LOOP_ID(id) \
431 MCUX_CSSL_FP_ID_IMPL()
432
440#define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \
441 MCUX_CSSL_FP_DECL_IMPL(LOOP, id)
442
451#define MCUX_CSSL_FP_LOOP_VALUE(id) \
452 MCUX_CSSL_FP_DECL_NAME(LOOP, id)
453
465#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \
466 MCUX_CSSL_SC_ADD( \
467 MCUX_CSSL_FP_LOOP_VALUE(id) \
468 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
469 )
470
481#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \
482 MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u)
483
498#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \
499 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__)
500
509#define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \
510 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
511 ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \
512 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
513
514
515
534#define MCUX_CSSL_FP_BRANCH_ID(id) \
535 MCUX_CSSL_FP_ID_IMPL()
536
544#define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \
545 MCUX_CSSL_FP_DECL_IMPL(BRANCH, id)
546
555#define MCUX_CSSL_FP_BRANCH_VALUE(id) \
556 MCUX_CSSL_FP_DECL_NAME(BRANCH, id)
557
563#define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u
564
570#define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu
571
586#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \
587 MCUX_CSSL_SC_ADD( \
588 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
589 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
590 )
591
606#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \
607 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \
608 __VA_ARGS__)
609
622#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \
623 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u)
624
640#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \
641 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__)
642
657#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \
658 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \
659 __VA_ARGS__)
660
673#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \
674 MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u)
675
691#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \
692 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__)
693
706#define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \
707 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
708 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
709 MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
710 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
711
724#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \
725 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition)
726
738#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \
739 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
740 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.") \
741 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
742 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \
743 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
744 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
745 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
746
760#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \
761 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__)
762
775#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \
776 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition)
777
789#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \
790 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
791 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.") \
792 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
793 MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \
794 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
795 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
796 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
797
811#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \
812 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__)
813
814
815
834#define MCUX_CSSL_FP_SWITCH_ID(id) \
835 MCUX_CSSL_FP_ID_IMPL()
836
844#define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \
845 MCUX_CSSL_FP_DECL_IMPL(SWITCH, id)
846
855#define MCUX_CSSL_FP_SWITCH_VALUE(id) \
856 MCUX_CSSL_FP_DECL_NAME(SWITCH, id)
857
871#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \
872 MCUX_CSSL_SC_ADD( \
873 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
874 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
875 )
876
888#define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \
889 MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u)
890
906#define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \
907 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__)
908
914#define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \
915 (0xDEFAu)
916
929#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \
930 MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \
931 id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__)
932
943#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \
944 MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u) \
945
960#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \
961 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__)
962
976#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \
977 MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \
978 MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \
979 MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
980 MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()
981
993#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \
994 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
995 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.") \
996 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
997 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \
998 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
999 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
1000 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
1001
1017#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \
1018 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__)
1019
1031#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \
1032 MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition)
1033
1044#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \
1045 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, "The macro does not contain a composite expression.") \
1046 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.") \
1047 MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, "True is of boolean type.") \
1048 MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \
1049 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \
1050 MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \
1051 MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)
1052
1066#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \
1067 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__)
1068
1086#ifndef MCUX_CSSL_FP_ASSERT_CALLBACK
1087 #define MCUX_CSSL_FP_ASSERT_CALLBACK() \
1088 return 1/0 /* Fallback ASSERT callback is used, please provide your own. */
1089#endif
1090
1091#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.