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