39#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
40#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
69#define MCUX_CSSL_FP_RESULT_OFFSET \
77#define MCUX_CSSL_FP_RESULT_MASK \
87#define MCUX_CSSL_FP_RESULT_VALUE(result) \
88 (((uint64_t)((uint32_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET))
95#define MCUX_CSSL_FP_PROTECTION_OFFSET \
103#define MCUX_CSSL_FP_PROTECTION_MASK \
104 ((uint64_t) 0xFFFFFFFFuLL)
116#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \
117 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)
125#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \
142#define MCUX_CSSL_FP_PROTECTED_TYPE_IMPL(resultType) \
153#define MCUX_CSSL_FP_RESULT_IMPL2(type, return) \
154 MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA("Loss of precision intended") \
155 MCUX_CSSL_ANALYSIS_START_PATTERN_REINTERPRET_MEMORY_OF_OPAQUE_TYPES() \
156 MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER("Proper alignment is ensured during type cast") \
157 ((type)((uint32_t)(((return) >> MCUX_CSSL_FP_RESULT_OFFSET) & MCUX_CSSL_FP_RESULT_MASK))) \
158 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER() \
159 MCUX_CSSL_ANALYSIS_STOP_PATTERN_REINTERPRET_MEMORY_OF_OPAQUE_TYPES() \
160 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA()
169#define MCUX_CSSL_FP_RESULT_IMPL1(return) \
170 MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)
180#define MCUX_CSSL_FP_RESULT_IMPL(...) \
181 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)
193#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \
194 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)
210#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, ...) \
212 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(function) \
213 - (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)) \
228#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1(function) \
229 MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, 0u)
248#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL(...) \
249 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL, __VA_ARGS__)
270#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, ...) \
272 MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
273 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
275 return (MCUX_CSSL_FP_RESULT_VALUE(result) \
276 | MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()))
292#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1(id) \
293 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, 0u, 0u)
311#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2(id, result) \
312 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, 0u)
336#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(...) \
337 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_FUNCTION_EXIT_IMPL, __VA_ARGS__)
364#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn(id, pass, fail, ...) \
365 MCUX_CSSL_SC_ADD(MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)); \
366 return (MCUX_CSSL_FP_RESULT_VALUE((MCUX_CSSL_SC_CHECK_PASSED == MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_FUNCTION_VALUE(id))) \
369 MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()));
392#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL3(id, pass, fail) \
393 MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn(id, pass, fail, 0u)
422#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL(...) \
423 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL, __VA_ARGS__)
434#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL1(id) \
435 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U)
448#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPLn(id, ...) \
449 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U, __VA_ARGS__)
462#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL(...) \
463 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL, __VA_ARGS__)
474#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(type, result, call) \
475 const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \
476 MCUX_CSSL_SC_ADD_ON_CALL( \
477 MCUX_CSSL_FP_PROTECTION_TOKEN(MCUX_CSSL_CPP_CAT(result, _protected))); \
478 type const result = MCUX_CSSL_FP_RESULT(type, \
479 MCUX_CSSL_CPP_CAT(result, _protected))
489#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL2(result, call) \
490 MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(uint32_t, result, call)
504#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL(...) \
505 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
506 MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_FUNCTION_CALL_IMPL, __VA_ARGS__) \
507 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
519#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_IMPL(call) \
520 MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT("False positive, due to macro expansion, any usage of NULL is considered as 0 by Coverity") \
522 const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \
523 MCUX_CSSL_SC_ADD_ON_CALL( \
524 MCUX_CSSL_FP_PROTECTION_TOKEN(MCUX_CSSL_CPP_CAT(result, _protected))); \
526 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
539#define MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call) \
540 const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \
541 const uint32_t token = MCUX_CSSL_FP_PROTECTION_TOKEN( \
542 MCUX_CSSL_CPP_CAT(result, _protected)); \
543 const uint32_t result = MCUX_CSSL_FP_RESULT( \
544 MCUX_CSSL_CPP_CAT(result, _protected))
556#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call) \
557 const uint64_t MCUX_CSSL_CPP_CAT(token, _protected) = (call); \
558 const uint32_t token = MCUX_CSSL_FP_PROTECTION_TOKEN( \
559 MCUX_CSSL_CPP_CAT(token, _protected))
573#define MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL(result, token, call) \
576 MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call)
584#define MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL() \
585MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
587MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
600#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL(token, call) \
603 MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call)
611#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL() \
612MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
614MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
628#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \
630 MCUX_CSSL_FP_LOOP_VALUE(id) \
631 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
648#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \
650 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
651 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
667#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \
669 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
670 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
692#define MCUX_CSSL_FP_ASSERT_IMPL(...) \
693 if (MCUX_CSSL_SC_CHECK_PASSED != \
694 MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \
696 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
698 else if (MCUX_CSSL_SC_CHECK_PASSED != \
699 MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \
701 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
The default implementation is based on standard C preprocessor functionality.
Provides the API for the CSSL secure counter mechanism.