MCUX CLNS
MCUX Crypto Library Normal Secure
Loading...
Searching...
No Matches
mcuxCsslFlowProtection_SecureCounter_Local.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------------*/
2/* Copyright 2020-2023, 2025 NXP */
3/* */
4/* NXP Confidential and Proprietary. This software is owned or controlled */
5/* by NXP and may only be used strictly in accordance with the applicable */
6/* license terms. By expressly accepting such terms or by downloading, */
7/* installing, activating and/or otherwise using the software, you are */
8/* agreeing that you have read, and that you agree to comply with and are */
9/* bound by, such license terms. If you do not agree to be bound by the */
10/* applicable license terms, then you may not retain, install, activate or */
11/* otherwise use the software. */
12/*--------------------------------------------------------------------------*/
13
18
19#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
20#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
21
22/* Include the CSSL C pre-processor support functionality. */
24
25/* Include the CSSL secure counter mechanism as basic building block. */
27
28/* Include Core macros for return type class checks */
29#include <mcuxClCore_Macros.h>
30
31/* Include the C99 standard integer types. */
32#include <stdint.h>
33
34/* Include standard boolean types */
35#include <stdbool.h>
36
37/***********************************************************************/
38/* Helper Macros specific to the SC Local backend. */
39/* Since the security counter is encoded in return values, these */
40/* act as getter and setter for the counter and result within the */
41/* encoded return code. */
42/***********************************************************************/
43
49#define MCUX_CSSL_FP_RESULT_OFFSET \
50 (0u)
51
57#define MCUX_CSSL_FP_RESULT_MASK \
58 (0xFFFFFFFFuLL)
59
67#define MCUX_CSSL_FP_RESULT_VALUE(result) \
68 (((uint64_t)((uint32_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET))
69
75#define MCUX_CSSL_FP_PROTECTION_OFFSET \
76 (32u)
77
83#define MCUX_CSSL_FP_PROTECTION_MASK \
84 ((uint64_t) 0xFFFFFFFFuLL)
85
96#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \
97 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)
98
105#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \
106 MCUX_CSSL_SC_VALUE()
107
108/***********************************************************************/
109/* SC Local backend implementations of top-level FP macros. */
110/***********************************************************************/
111
122#define MCUX_CSSL_FP_PROTECTED_TYPE_IMPL(resultType) \
123 uint64_t
124
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()
141
149#define MCUX_CSSL_FP_RESULT_IMPL1(return) \
150 MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)
151
160#define MCUX_CSSL_FP_RESULT_IMPL(...) \
161 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)
162
173#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \
174 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)
175
190#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, ...) \
191 MCUX_CSSL_SC_INIT( \
192 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(function) \
193 - (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)) \
194 )
195
208#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1(function) \
209 MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, 0u)
210
228#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL(...) \
229 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL, __VA_ARGS__)
230
231
250#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, ...) \
251 MCUX_CSSL_SC_ADD( \
252 MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
253 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
254 ); \
255 return (MCUX_CSSL_FP_RESULT_VALUE(result) \
256 | MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()))
257
272#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1(id) \
273 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, 0u, 0u)
274
291#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2(id, result) \
292 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, 0u)
293
316#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(...) \
317 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_FUNCTION_EXIT_IMPL, __VA_ARGS__)
318
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))) \
347 ? pass \
348 : fail) | \
349 MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()));
350
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)
374
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__)
404
414#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL1(id) \
415 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U)
416
428#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPLn(id, ...) \
429 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U, __VA_ARGS__)
430
442#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL(...) \
443 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL, __VA_ARGS__)
444
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))
460
469#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL2(result, call) \
470 MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(uint32_t, result, call)
471
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()
488
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") \
501 { \
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))); \
505 } \
506 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
507
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))
525
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))
540
553#define MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL(result, token, call) \
554do \
555{ \
556 MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call)
557
564#define MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL() \
565MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
566} while (false) \
567MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
568
580#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL(token, call) \
581do \
582{ \
583 MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call)
584
591#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL() \
592MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
593} while (false) \
594MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
595
608#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \
609 MCUX_CSSL_SC_ADD( \
610 MCUX_CSSL_FP_LOOP_VALUE(id) \
611 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
612 )
613
628#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \
629 MCUX_CSSL_SC_ADD( \
630 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
631 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
632 )
633
647#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \
648 MCUX_CSSL_SC_ADD( \
649 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
650 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
651 )
652
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__))) \
675 { \
676 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
677 } \
678 else if (MCUX_CSSL_SC_CHECK_PASSED != \
679 MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \
680 { \
681 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
682 } \
683 else {/*empty*/}
684
685#endif /* MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_ */
Definition of macros.
The default implementation is based on standard C preprocessor functionality.
Provides the API for the CSSL secure counter mechanism.