xref: /optee_os/lib/libmbedtls/mbedtls/library/common.h (revision 039e02df2716a0ed886b56e1e07b7ac1d8597228)
17901324dSJerome Forissier /**
27901324dSJerome Forissier  * \file common.h
37901324dSJerome Forissier  *
47901324dSJerome Forissier  * \brief Utility macros for internal use in the library
57901324dSJerome Forissier  */
67901324dSJerome Forissier /*
77901324dSJerome Forissier  *  Copyright The Mbed TLS Contributors
87901324dSJerome Forissier  *  SPDX-License-Identifier: Apache-2.0
97901324dSJerome Forissier  *
107901324dSJerome Forissier  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
117901324dSJerome Forissier  *  not use this file except in compliance with the License.
127901324dSJerome Forissier  *  You may obtain a copy of the License at
137901324dSJerome Forissier  *
147901324dSJerome Forissier  *  http://www.apache.org/licenses/LICENSE-2.0
157901324dSJerome Forissier  *
167901324dSJerome Forissier  *  Unless required by applicable law or agreed to in writing, software
177901324dSJerome Forissier  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
187901324dSJerome Forissier  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
197901324dSJerome Forissier  *  See the License for the specific language governing permissions and
207901324dSJerome Forissier  *  limitations under the License.
217901324dSJerome Forissier  */
227901324dSJerome Forissier 
237901324dSJerome Forissier #ifndef MBEDTLS_LIBRARY_COMMON_H
247901324dSJerome Forissier #define MBEDTLS_LIBRARY_COMMON_H
257901324dSJerome Forissier 
267901324dSJerome Forissier #if defined(MBEDTLS_CONFIG_FILE)
277901324dSJerome Forissier #include MBEDTLS_CONFIG_FILE
287901324dSJerome Forissier #else
297901324dSJerome Forissier #include "mbedtls/config.h"
307901324dSJerome Forissier #endif
317901324dSJerome Forissier 
32*039e02dfSJerome Forissier #include <stdint.h>
33*039e02dfSJerome Forissier 
347901324dSJerome Forissier /** Helper to define a function as static except when building invasive tests.
357901324dSJerome Forissier  *
367901324dSJerome Forissier  * If a function is only used inside its own source file and should be
377901324dSJerome Forissier  * declared `static` to allow the compiler to optimize for code size,
387901324dSJerome Forissier  * but that function has unit tests, define it with
397901324dSJerome Forissier  * ```
407901324dSJerome Forissier  * MBEDTLS_STATIC_TESTABLE int mbedtls_foo(...) { ... }
417901324dSJerome Forissier  * ```
427901324dSJerome Forissier  * and declare it in a header in the `library/` directory with
437901324dSJerome Forissier  * ```
447901324dSJerome Forissier  * #if defined(MBEDTLS_TEST_HOOKS)
457901324dSJerome Forissier  * int mbedtls_foo(...);
467901324dSJerome Forissier  * #endif
477901324dSJerome Forissier  * ```
487901324dSJerome Forissier  */
497901324dSJerome Forissier #if defined(MBEDTLS_TEST_HOOKS)
507901324dSJerome Forissier #define MBEDTLS_STATIC_TESTABLE
517901324dSJerome Forissier #else
527901324dSJerome Forissier #define MBEDTLS_STATIC_TESTABLE static
537901324dSJerome Forissier #endif
547901324dSJerome Forissier 
55*039e02dfSJerome Forissier /** Byte Reading Macros
56*039e02dfSJerome Forissier  *
57*039e02dfSJerome Forissier  * Given a multi-byte integer \p x, MBEDTLS_BYTE_n retrieves the n-th
58*039e02dfSJerome Forissier  * byte from x, where byte 0 is the least significant byte.
59*039e02dfSJerome Forissier  */
60*039e02dfSJerome Forissier #define MBEDTLS_BYTE_0( x ) ( (uint8_t) (   ( x )         & 0xff ) )
61*039e02dfSJerome Forissier #define MBEDTLS_BYTE_1( x ) ( (uint8_t) ( ( ( x ) >> 8  ) & 0xff ) )
62*039e02dfSJerome Forissier #define MBEDTLS_BYTE_2( x ) ( (uint8_t) ( ( ( x ) >> 16 ) & 0xff ) )
63*039e02dfSJerome Forissier #define MBEDTLS_BYTE_3( x ) ( (uint8_t) ( ( ( x ) >> 24 ) & 0xff ) )
64*039e02dfSJerome Forissier #define MBEDTLS_BYTE_4( x ) ( (uint8_t) ( ( ( x ) >> 32 ) & 0xff ) )
65*039e02dfSJerome Forissier #define MBEDTLS_BYTE_5( x ) ( (uint8_t) ( ( ( x ) >> 40 ) & 0xff ) )
66*039e02dfSJerome Forissier #define MBEDTLS_BYTE_6( x ) ( (uint8_t) ( ( ( x ) >> 48 ) & 0xff ) )
67*039e02dfSJerome Forissier #define MBEDTLS_BYTE_7( x ) ( (uint8_t) ( ( ( x ) >> 56 ) & 0xff ) )
68*039e02dfSJerome Forissier 
69*039e02dfSJerome Forissier /**
70*039e02dfSJerome Forissier  * Get the unsigned 32 bits integer corresponding to four bytes in
71*039e02dfSJerome Forissier  * big-endian order (MSB first).
72*039e02dfSJerome Forissier  *
73*039e02dfSJerome Forissier  * \param   data    Base address of the memory to get the four bytes from.
74*039e02dfSJerome Forissier  * \param   offset  Offset from \p base of the first and most significant
75*039e02dfSJerome Forissier  *                  byte of the four bytes to build the 32 bits unsigned
76*039e02dfSJerome Forissier  *                  integer from.
77*039e02dfSJerome Forissier  */
78*039e02dfSJerome Forissier #ifndef MBEDTLS_GET_UINT32_BE
79*039e02dfSJerome Forissier #define MBEDTLS_GET_UINT32_BE( data , offset )                  \
80*039e02dfSJerome Forissier     (                                                           \
81*039e02dfSJerome Forissier           ( (uint32_t) ( data )[( offset )    ] << 24 )         \
82*039e02dfSJerome Forissier         | ( (uint32_t) ( data )[( offset ) + 1] << 16 )         \
83*039e02dfSJerome Forissier         | ( (uint32_t) ( data )[( offset ) + 2] <<  8 )         \
84*039e02dfSJerome Forissier         | ( (uint32_t) ( data )[( offset ) + 3]       )         \
85*039e02dfSJerome Forissier     )
86*039e02dfSJerome Forissier #endif
87*039e02dfSJerome Forissier 
88*039e02dfSJerome Forissier /**
89*039e02dfSJerome Forissier  * Put in memory a 32 bits unsigned integer in big-endian order.
90*039e02dfSJerome Forissier  *
91*039e02dfSJerome Forissier  * \param   n       32 bits unsigned integer to put in memory.
92*039e02dfSJerome Forissier  * \param   data    Base address of the memory where to put the 32
93*039e02dfSJerome Forissier  *                  bits unsigned integer in.
94*039e02dfSJerome Forissier  * \param   offset  Offset from \p base where to put the most significant
95*039e02dfSJerome Forissier  *                  byte of the 32 bits unsigned integer \p n.
96*039e02dfSJerome Forissier  */
97*039e02dfSJerome Forissier #ifndef MBEDTLS_PUT_UINT32_BE
98*039e02dfSJerome Forissier #define MBEDTLS_PUT_UINT32_BE( n, data, offset )                \
99*039e02dfSJerome Forissier {                                                               \
100*039e02dfSJerome Forissier     ( data )[( offset )    ] = MBEDTLS_BYTE_3( n );             \
101*039e02dfSJerome Forissier     ( data )[( offset ) + 1] = MBEDTLS_BYTE_2( n );             \
102*039e02dfSJerome Forissier     ( data )[( offset ) + 2] = MBEDTLS_BYTE_1( n );             \
103*039e02dfSJerome Forissier     ( data )[( offset ) + 3] = MBEDTLS_BYTE_0( n );             \
104*039e02dfSJerome Forissier }
105*039e02dfSJerome Forissier #endif
106*039e02dfSJerome Forissier 
107*039e02dfSJerome Forissier /**
108*039e02dfSJerome Forissier  * Get the unsigned 32 bits integer corresponding to four bytes in
109*039e02dfSJerome Forissier  * little-endian order (LSB first).
110*039e02dfSJerome Forissier  *
111*039e02dfSJerome Forissier  * \param   data    Base address of the memory to get the four bytes from.
112*039e02dfSJerome Forissier  * \param   offset  Offset from \p base of the first and least significant
113*039e02dfSJerome Forissier  *                  byte of the four bytes to build the 32 bits unsigned
114*039e02dfSJerome Forissier  *                  integer from.
115*039e02dfSJerome Forissier  */
116*039e02dfSJerome Forissier #ifndef MBEDTLS_GET_UINT32_LE
117*039e02dfSJerome Forissier #define MBEDTLS_GET_UINT32_LE( data, offset )                   \
118*039e02dfSJerome Forissier     (                                                           \
119*039e02dfSJerome Forissier           ( (uint32_t) ( data )[( offset )    ]       )         \
120*039e02dfSJerome Forissier         | ( (uint32_t) ( data )[( offset ) + 1] <<  8 )         \
121*039e02dfSJerome Forissier         | ( (uint32_t) ( data )[( offset ) + 2] << 16 )         \
122*039e02dfSJerome Forissier         | ( (uint32_t) ( data )[( offset ) + 3] << 24 )         \
123*039e02dfSJerome Forissier     )
124*039e02dfSJerome Forissier #endif
125*039e02dfSJerome Forissier 
126*039e02dfSJerome Forissier /**
127*039e02dfSJerome Forissier  * Put in memory a 32 bits unsigned integer in little-endian order.
128*039e02dfSJerome Forissier  *
129*039e02dfSJerome Forissier  * \param   n       32 bits unsigned integer to put in memory.
130*039e02dfSJerome Forissier  * \param   data    Base address of the memory where to put the 32
131*039e02dfSJerome Forissier  *                  bits unsigned integer in.
132*039e02dfSJerome Forissier  * \param   offset  Offset from \p base where to put the least significant
133*039e02dfSJerome Forissier  *                  byte of the 32 bits unsigned integer \p n.
134*039e02dfSJerome Forissier  */
135*039e02dfSJerome Forissier #ifndef MBEDTLS_PUT_UINT32_LE
136*039e02dfSJerome Forissier #define MBEDTLS_PUT_UINT32_LE( n, data, offset )                \
137*039e02dfSJerome Forissier {                                                               \
138*039e02dfSJerome Forissier     ( data )[( offset )    ] = MBEDTLS_BYTE_0( n );             \
139*039e02dfSJerome Forissier     ( data )[( offset ) + 1] = MBEDTLS_BYTE_1( n );             \
140*039e02dfSJerome Forissier     ( data )[( offset ) + 2] = MBEDTLS_BYTE_2( n );             \
141*039e02dfSJerome Forissier     ( data )[( offset ) + 3] = MBEDTLS_BYTE_3( n );             \
142*039e02dfSJerome Forissier }
143*039e02dfSJerome Forissier #endif
144*039e02dfSJerome Forissier 
145*039e02dfSJerome Forissier /**
146*039e02dfSJerome Forissier  * Get the unsigned 16 bits integer corresponding to two bytes in
147*039e02dfSJerome Forissier  * little-endian order (LSB first).
148*039e02dfSJerome Forissier  *
149*039e02dfSJerome Forissier  * \param   data    Base address of the memory to get the two bytes from.
150*039e02dfSJerome Forissier  * \param   offset  Offset from \p base of the first and least significant
151*039e02dfSJerome Forissier  *                  byte of the two bytes to build the 16 bits unsigned
152*039e02dfSJerome Forissier  *                  integer from.
153*039e02dfSJerome Forissier  */
154*039e02dfSJerome Forissier #ifndef MBEDTLS_GET_UINT16_LE
155*039e02dfSJerome Forissier #define MBEDTLS_GET_UINT16_LE( data, offset )                   \
156*039e02dfSJerome Forissier     (                                                           \
157*039e02dfSJerome Forissier           ( (uint16_t) ( data )[( offset )    ]       )         \
158*039e02dfSJerome Forissier         | ( (uint16_t) ( data )[( offset ) + 1] <<  8 )         \
159*039e02dfSJerome Forissier     )
160*039e02dfSJerome Forissier #endif
161*039e02dfSJerome Forissier 
162*039e02dfSJerome Forissier /**
163*039e02dfSJerome Forissier  * Put in memory a 16 bits unsigned integer in little-endian order.
164*039e02dfSJerome Forissier  *
165*039e02dfSJerome Forissier  * \param   n       16 bits unsigned integer to put in memory.
166*039e02dfSJerome Forissier  * \param   data    Base address of the memory where to put the 16
167*039e02dfSJerome Forissier  *                  bits unsigned integer in.
168*039e02dfSJerome Forissier  * \param   offset  Offset from \p base where to put the least significant
169*039e02dfSJerome Forissier  *                  byte of the 16 bits unsigned integer \p n.
170*039e02dfSJerome Forissier  */
171*039e02dfSJerome Forissier #ifndef MBEDTLS_PUT_UINT16_LE
172*039e02dfSJerome Forissier #define MBEDTLS_PUT_UINT16_LE( n, data, offset )                \
173*039e02dfSJerome Forissier {                                                               \
174*039e02dfSJerome Forissier     ( data )[( offset )    ] = MBEDTLS_BYTE_0( n );             \
175*039e02dfSJerome Forissier     ( data )[( offset ) + 1] = MBEDTLS_BYTE_1( n );             \
176*039e02dfSJerome Forissier }
177*039e02dfSJerome Forissier #endif
178*039e02dfSJerome Forissier 
179*039e02dfSJerome Forissier /**
180*039e02dfSJerome Forissier  * Get the unsigned 16 bits integer corresponding to two bytes in
181*039e02dfSJerome Forissier  * big-endian order (MSB first).
182*039e02dfSJerome Forissier  *
183*039e02dfSJerome Forissier  * \param   data    Base address of the memory to get the two bytes from.
184*039e02dfSJerome Forissier  * \param   offset  Offset from \p base of the first and most significant
185*039e02dfSJerome Forissier  *                  byte of the two bytes to build the 16 bits unsigned
186*039e02dfSJerome Forissier  *                  integer from.
187*039e02dfSJerome Forissier  */
188*039e02dfSJerome Forissier #ifndef MBEDTLS_GET_UINT16_BE
189*039e02dfSJerome Forissier #define MBEDTLS_GET_UINT16_BE( data, offset )                   \
190*039e02dfSJerome Forissier     (                                                           \
191*039e02dfSJerome Forissier           ( (uint16_t) ( data )[( offset )    ] << 8 )          \
192*039e02dfSJerome Forissier         | ( (uint16_t) ( data )[( offset ) + 1]      )          \
193*039e02dfSJerome Forissier     )
194*039e02dfSJerome Forissier #endif
195*039e02dfSJerome Forissier 
196*039e02dfSJerome Forissier /**
197*039e02dfSJerome Forissier  * Put in memory a 16 bits unsigned integer in big-endian order.
198*039e02dfSJerome Forissier  *
199*039e02dfSJerome Forissier  * \param   n       16 bits unsigned integer to put in memory.
200*039e02dfSJerome Forissier  * \param   data    Base address of the memory where to put the 16
201*039e02dfSJerome Forissier  *                  bits unsigned integer in.
202*039e02dfSJerome Forissier  * \param   offset  Offset from \p base where to put the most significant
203*039e02dfSJerome Forissier  *                  byte of the 16 bits unsigned integer \p n.
204*039e02dfSJerome Forissier  */
205*039e02dfSJerome Forissier #ifndef MBEDTLS_PUT_UINT16_BE
206*039e02dfSJerome Forissier #define MBEDTLS_PUT_UINT16_BE( n, data, offset )                \
207*039e02dfSJerome Forissier {                                                               \
208*039e02dfSJerome Forissier     ( data )[( offset )    ] = MBEDTLS_BYTE_1( n );             \
209*039e02dfSJerome Forissier     ( data )[( offset ) + 1] = MBEDTLS_BYTE_0( n );             \
210*039e02dfSJerome Forissier }
211*039e02dfSJerome Forissier #endif
212*039e02dfSJerome Forissier 
213*039e02dfSJerome Forissier /**
214*039e02dfSJerome Forissier  * Get the unsigned 64 bits integer corresponding to eight bytes in
215*039e02dfSJerome Forissier  * big-endian order (MSB first).
216*039e02dfSJerome Forissier  *
217*039e02dfSJerome Forissier  * \param   data    Base address of the memory to get the eight bytes from.
218*039e02dfSJerome Forissier  * \param   offset  Offset from \p base of the first and most significant
219*039e02dfSJerome Forissier  *                  byte of the eight bytes to build the 64 bits unsigned
220*039e02dfSJerome Forissier  *                  integer from.
221*039e02dfSJerome Forissier  */
222*039e02dfSJerome Forissier #ifndef MBEDTLS_GET_UINT64_BE
223*039e02dfSJerome Forissier #define MBEDTLS_GET_UINT64_BE( data, offset )                   \
224*039e02dfSJerome Forissier     (                                                           \
225*039e02dfSJerome Forissier           ( (uint64_t) ( data )[( offset )    ] << 56 )         \
226*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 1] << 48 )         \
227*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 2] << 40 )         \
228*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 3] << 32 )         \
229*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 4] << 24 )         \
230*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 5] << 16 )         \
231*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 6] <<  8 )         \
232*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 7]       )         \
233*039e02dfSJerome Forissier     )
234*039e02dfSJerome Forissier #endif
235*039e02dfSJerome Forissier 
236*039e02dfSJerome Forissier /**
237*039e02dfSJerome Forissier  * Put in memory a 64 bits unsigned integer in big-endian order.
238*039e02dfSJerome Forissier  *
239*039e02dfSJerome Forissier  * \param   n       64 bits unsigned integer to put in memory.
240*039e02dfSJerome Forissier  * \param   data    Base address of the memory where to put the 64
241*039e02dfSJerome Forissier  *                  bits unsigned integer in.
242*039e02dfSJerome Forissier  * \param   offset  Offset from \p base where to put the most significant
243*039e02dfSJerome Forissier  *                  byte of the 64 bits unsigned integer \p n.
244*039e02dfSJerome Forissier  */
245*039e02dfSJerome Forissier #ifndef MBEDTLS_PUT_UINT64_BE
246*039e02dfSJerome Forissier #define MBEDTLS_PUT_UINT64_BE( n, data, offset )                \
247*039e02dfSJerome Forissier {                                                               \
248*039e02dfSJerome Forissier     ( data )[( offset )    ] = MBEDTLS_BYTE_7( n );             \
249*039e02dfSJerome Forissier     ( data )[( offset ) + 1] = MBEDTLS_BYTE_6( n );             \
250*039e02dfSJerome Forissier     ( data )[( offset ) + 2] = MBEDTLS_BYTE_5( n );             \
251*039e02dfSJerome Forissier     ( data )[( offset ) + 3] = MBEDTLS_BYTE_4( n );             \
252*039e02dfSJerome Forissier     ( data )[( offset ) + 4] = MBEDTLS_BYTE_3( n );             \
253*039e02dfSJerome Forissier     ( data )[( offset ) + 5] = MBEDTLS_BYTE_2( n );             \
254*039e02dfSJerome Forissier     ( data )[( offset ) + 6] = MBEDTLS_BYTE_1( n );             \
255*039e02dfSJerome Forissier     ( data )[( offset ) + 7] = MBEDTLS_BYTE_0( n );             \
256*039e02dfSJerome Forissier }
257*039e02dfSJerome Forissier #endif
258*039e02dfSJerome Forissier 
259*039e02dfSJerome Forissier /**
260*039e02dfSJerome Forissier  * Get the unsigned 64 bits integer corresponding to eight bytes in
261*039e02dfSJerome Forissier  * little-endian order (LSB first).
262*039e02dfSJerome Forissier  *
263*039e02dfSJerome Forissier  * \param   data    Base address of the memory to get the eight bytes from.
264*039e02dfSJerome Forissier  * \param   offset  Offset from \p base of the first and least significant
265*039e02dfSJerome Forissier  *                  byte of the eight bytes to build the 64 bits unsigned
266*039e02dfSJerome Forissier  *                  integer from.
267*039e02dfSJerome Forissier  */
268*039e02dfSJerome Forissier #ifndef MBEDTLS_GET_UINT64_LE
269*039e02dfSJerome Forissier #define MBEDTLS_GET_UINT64_LE( data, offset )                   \
270*039e02dfSJerome Forissier     (                                                           \
271*039e02dfSJerome Forissier           ( (uint64_t) ( data )[( offset ) + 7] << 56 )         \
272*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 6] << 48 )         \
273*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 5] << 40 )         \
274*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 4] << 32 )         \
275*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 3] << 24 )         \
276*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 2] << 16 )         \
277*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset ) + 1] <<  8 )         \
278*039e02dfSJerome Forissier         | ( (uint64_t) ( data )[( offset )    ]       )         \
279*039e02dfSJerome Forissier     )
280*039e02dfSJerome Forissier #endif
281*039e02dfSJerome Forissier 
282*039e02dfSJerome Forissier /**
283*039e02dfSJerome Forissier  * Put in memory a 64 bits unsigned integer in little-endian order.
284*039e02dfSJerome Forissier  *
285*039e02dfSJerome Forissier  * \param   n       64 bits unsigned integer to put in memory.
286*039e02dfSJerome Forissier  * \param   data    Base address of the memory where to put the 64
287*039e02dfSJerome Forissier  *                  bits unsigned integer in.
288*039e02dfSJerome Forissier  * \param   offset  Offset from \p base where to put the least significant
289*039e02dfSJerome Forissier  *                  byte of the 64 bits unsigned integer \p n.
290*039e02dfSJerome Forissier  */
291*039e02dfSJerome Forissier #ifndef MBEDTLS_PUT_UINT64_LE
292*039e02dfSJerome Forissier #define MBEDTLS_PUT_UINT64_LE( n, data, offset )                \
293*039e02dfSJerome Forissier {                                                               \
294*039e02dfSJerome Forissier     ( data )[( offset )    ] = MBEDTLS_BYTE_0( n );             \
295*039e02dfSJerome Forissier     ( data )[( offset ) + 1] = MBEDTLS_BYTE_1( n );             \
296*039e02dfSJerome Forissier     ( data )[( offset ) + 2] = MBEDTLS_BYTE_2( n );             \
297*039e02dfSJerome Forissier     ( data )[( offset ) + 3] = MBEDTLS_BYTE_3( n );             \
298*039e02dfSJerome Forissier     ( data )[( offset ) + 4] = MBEDTLS_BYTE_4( n );             \
299*039e02dfSJerome Forissier     ( data )[( offset ) + 5] = MBEDTLS_BYTE_5( n );             \
300*039e02dfSJerome Forissier     ( data )[( offset ) + 6] = MBEDTLS_BYTE_6( n );             \
301*039e02dfSJerome Forissier     ( data )[( offset ) + 7] = MBEDTLS_BYTE_7( n );             \
302*039e02dfSJerome Forissier }
303*039e02dfSJerome Forissier #endif
304*039e02dfSJerome Forissier 
3057901324dSJerome Forissier #endif /* MBEDTLS_LIBRARY_COMMON_H */
306