19#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
20#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
49#define MCUX_CSSL_FP_RESULT_OFFSET \
57#define MCUX_CSSL_FP_RESULT_MASK \
67#define MCUX_CSSL_FP_RESULT_VALUE(result) \
68 (((uint64_t)((uint32_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET))
75#define MCUX_CSSL_FP_PROTECTION_OFFSET \
83#define MCUX_CSSL_FP_PROTECTION_MASK \
84 ((uint64_t) 0xFFFFFFFFuLL)
96#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \
97 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)
105#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \
122#define MCUX_CSSL_FP_PROTECTED_TYPE_IMPL(resultType) \
133#define MCUX_CSSL_FP_RESULT_IMPL2(type, return) \
134 MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA("Loss of precision intended") \
135 MCUX_CSSL_ANALYSIS_START_PATTERN_REINTERPRET_MEMORY_OF_OPAQUE_TYPES() \
136 MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER("Proper alignment is ensured during type cast") \
137 ((type)((uint32_t)(((return) >> MCUX_CSSL_FP_RESULT_OFFSET) & MCUX_CSSL_FP_RESULT_MASK))) \
138 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER() \
139 MCUX_CSSL_ANALYSIS_STOP_PATTERN_REINTERPRET_MEMORY_OF_OPAQUE_TYPES() \
140 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA()
149#define MCUX_CSSL_FP_RESULT_IMPL1(return) \
150 MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)
160#define MCUX_CSSL_FP_RESULT_IMPL(...) \
161 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)
173#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \
174 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)
190#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, ...) \
192 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(function) \
193 - (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)) \
208#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1(function) \
209 MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, 0u)
228#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL(...) \
229 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL, __VA_ARGS__)
250#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, ...) \
252 MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
253 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
255 return (MCUX_CSSL_FP_RESULT_VALUE(result) \
256 | MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()))
272#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1(id) \
273 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, 0u, 0u)
291#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2(id, result) \
292 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, 0u)
316#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(...) \
317 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_FUNCTION_EXIT_IMPL, __VA_ARGS__)
344#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn(id, pass, fail, ...) \
345 MCUX_CSSL_SC_ADD(MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)); \
346 return (MCUX_CSSL_FP_RESULT_VALUE((MCUX_CSSL_SC_CHECK_PASSED == MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_FUNCTION_VALUE(id))) \
349 MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()));
372#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL3(id, pass, fail) \
373 MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn(id, pass, fail, 0u)
402#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL(...) \
403 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL, __VA_ARGS__)
414#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL1(id) \
415 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U)
428#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPLn(id, ...) \
429 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U, __VA_ARGS__)
442#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL(...) \
443 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL, __VA_ARGS__)
454#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(type, result, call) \
455 const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \
456 MCUX_CSSL_SC_ADD_ON_CALL( \
457 MCUX_CSSL_FP_PROTECTION_TOKEN(MCUX_CSSL_CPP_CAT(result, _protected))); \
458 type const result = MCUX_CSSL_FP_RESULT(type, \
459 MCUX_CSSL_CPP_CAT(result, _protected))
469#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL2(result, call) \
470 MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(uint32_t, result, call)
484#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL(...) \
485 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
486 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_FUNCTION_CALL_IMPL, __VA_ARGS__) \
487 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
499#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_IMPL(call) \
500 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
502 const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \
503 MCUX_CSSL_SC_ADD_ON_CALL( \
504 MCUX_CSSL_FP_PROTECTION_TOKEN(MCUX_CSSL_CPP_CAT(result, _protected))); \
506 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
519#define MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call) \
520 const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \
521 const uint32_t token = MCUX_CSSL_FP_PROTECTION_TOKEN( \
522 MCUX_CSSL_CPP_CAT(result, _protected)); \
523 const uint32_t result = MCUX_CSSL_FP_RESULT( \
524 MCUX_CSSL_CPP_CAT(result, _protected))
536#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call) \
537 const uint64_t MCUX_CSSL_CPP_CAT(token, _protected) = (call); \
538 const uint32_t token = MCUX_CSSL_FP_PROTECTION_TOKEN( \
539 MCUX_CSSL_CPP_CAT(token, _protected))
553#define MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL(result, token, call) \
556 MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call)
564#define MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL() \
565MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
567MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
580#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL(token, call) \
583 MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call)
591#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL() \
592MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
594MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
608#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \
610 MCUX_CSSL_FP_LOOP_VALUE(id) \
611 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
628#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \
630 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
631 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
647#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \
649 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
650 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
672#define MCUX_CSSL_FP_ASSERT_IMPL(...) \
673 if (MCUX_CSSL_SC_CHECK_PASSED != \
674 MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \
676 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
678 else if (MCUX_CSSL_SC_CHECK_PASSED != \
679 MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \
681 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
The default implementation is based on standard C preprocessor functionality.
Provides the API for the CSSL secure counter mechanism.