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/* SPDX-License-Identifier: BSD-3-Clause */
5/* */
6/* Redistribution and use in source and binary forms, with or without */
7/* modification, are permitted provided that the following conditions are */
8/* met: */
9/* */
10/* 1. Redistributions of source code must retain the above copyright */
11/* notice, this list of conditions and the following disclaimer. */
12/* */
13/* 2. Redistributions in binary form must reproduce the above copyright */
14/* notice, this list of conditions and the following disclaimer in the */
15/* documentation and/or other materials provided with the distribution. */
16/* */
17/* 3. Neither the name of the copyright holder nor the names of its */
18/* contributors may be used to endorse or promote products derived from */
19/* this software without specific prior written permission. */
20/* */
21/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS */
22/* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
23/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */
24/* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
25/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
26/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
27/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR */
28/* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
29/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
30/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
31/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32/*--------------------------------------------------------------------------*/
33
38
39#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
40#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_
41
42/* Include the CSSL C pre-processor support functionality. */
44
45/* Include the CSSL secure counter mechanism as basic building block. */
47
48/* Include Core macros for return type class checks */
49#include <mcuxClCore_Macros.h>
50
51/* Include the C99 standard integer types. */
52#include <stdint.h>
53
54/* Include standard boolean types */
55#include <stdbool.h>
56
57/***********************************************************************/
58/* Helper Macros specific to the SC Local backend. */
59/* Since the security counter is encoded in return values, these */
60/* act as getter and setter for the counter and result within the */
61/* encoded return code. */
62/***********************************************************************/
63
69#define MCUX_CSSL_FP_RESULT_OFFSET \
70 (0u)
71
77#define MCUX_CSSL_FP_RESULT_MASK \
78 (0xFFFFFFFFuLL)
79
87#define MCUX_CSSL_FP_RESULT_VALUE(result) \
88 (((uint64_t)((uint32_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET))
89
95#define MCUX_CSSL_FP_PROTECTION_OFFSET \
96 (32u)
97
103#define MCUX_CSSL_FP_PROTECTION_MASK \
104 ((uint64_t) 0xFFFFFFFFuLL)
105
116#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \
117 ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)
118
125#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \
126 MCUX_CSSL_SC_VALUE()
127
128/***********************************************************************/
129/* SC Local backend implementations of top-level FP macros. */
130/***********************************************************************/
131
142#define MCUX_CSSL_FP_PROTECTED_TYPE_IMPL(resultType) \
143 uint64_t
144
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()
161
169#define MCUX_CSSL_FP_RESULT_IMPL1(return) \
170 MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)
171
180#define MCUX_CSSL_FP_RESULT_IMPL(...) \
181 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)
182
193#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \
194 (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)
195
210#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, ...) \
211 MCUX_CSSL_SC_INIT( \
212 MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(function) \
213 - (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)) \
214 )
215
228#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1(function) \
229 MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, 0u)
230
248#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL(...) \
249 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL, __VA_ARGS__)
250
251
270#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, ...) \
271 MCUX_CSSL_SC_ADD( \
272 MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \
273 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
274 ); \
275 return (MCUX_CSSL_FP_RESULT_VALUE(result) \
276 | MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()))
277
292#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1(id) \
293 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, 0u, 0u)
294
311#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2(id, result) \
312 MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, 0u)
313
336#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(...) \
337 MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_FUNCTION_EXIT_IMPL, __VA_ARGS__)
338
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))) \
367 ? pass \
368 : fail) | \
369 MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()));
370
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)
394
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__)
424
434#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL1(id) \
435 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U)
436
448#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPLn(id, ...) \
449 MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U, __VA_ARGS__)
450
462#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL(...) \
463 MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL, __VA_ARGS__)
464
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))
480
489#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL2(result, call) \
490 MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(uint32_t, result, call)
491
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()
508
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") \
521 { \
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))); \
525 } \
526 MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT()
527
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))
545
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))
560
573#define MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL(result, token, call) \
574do \
575{ \
576 MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call)
577
584#define MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL() \
585MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
586} while (false) \
587MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
588
600#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL(token, call) \
601do \
602{ \
603 MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call)
604
611#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL() \
612MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \
613} while (false) \
614MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()
615
628#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \
629 MCUX_CSSL_SC_ADD( \
630 MCUX_CSSL_FP_LOOP_VALUE(id) \
631 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
632 )
633
648#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \
649 MCUX_CSSL_SC_ADD( \
650 (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \
651 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
652 )
653
667#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \
668 MCUX_CSSL_SC_ADD( \
669 (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \
670 - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \
671 )
672
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__))) \
695 { \
696 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
697 } \
698 else if (MCUX_CSSL_SC_CHECK_PASSED != \
699 MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \
700 { \
701 MCUX_CSSL_FP_ASSERT_CALLBACK(); \
702 } \
703 else {/*empty*/}
704
705#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.