xref: /aosp_15_r20/external/ms-tpm-20-ref/TPMCmd/tpm/include/swap.h (revision 5c591343844d1f9da7da26467c4bf7efc8a7a413)
1*5c591343SA. Cody Schuffelen /* Microsoft Reference Implementation for TPM 2.0
2*5c591343SA. Cody Schuffelen  *
3*5c591343SA. Cody Schuffelen  *  The copyright in this software is being made available under the BSD License,
4*5c591343SA. Cody Schuffelen  *  included below. This software may be subject to other third party and
5*5c591343SA. Cody Schuffelen  *  contributor rights, including patent rights, and no such rights are granted
6*5c591343SA. Cody Schuffelen  *  under this license.
7*5c591343SA. Cody Schuffelen  *
8*5c591343SA. Cody Schuffelen  *  Copyright (c) Microsoft Corporation
9*5c591343SA. Cody Schuffelen  *
10*5c591343SA. Cody Schuffelen  *  All rights reserved.
11*5c591343SA. Cody Schuffelen  *
12*5c591343SA. Cody Schuffelen  *  BSD License
13*5c591343SA. Cody Schuffelen  *
14*5c591343SA. Cody Schuffelen  *  Redistribution and use in source and binary forms, with or without modification,
15*5c591343SA. Cody Schuffelen  *  are permitted provided that the following conditions are met:
16*5c591343SA. Cody Schuffelen  *
17*5c591343SA. Cody Schuffelen  *  Redistributions of source code must retain the above copyright notice, this list
18*5c591343SA. Cody Schuffelen  *  of conditions and the following disclaimer.
19*5c591343SA. Cody Schuffelen  *
20*5c591343SA. Cody Schuffelen  *  Redistributions in binary form must reproduce the above copyright notice, this
21*5c591343SA. Cody Schuffelen  *  list of conditions and the following disclaimer in the documentation and/or
22*5c591343SA. Cody Schuffelen  *  other materials provided with the distribution.
23*5c591343SA. Cody Schuffelen  *
24*5c591343SA. Cody Schuffelen  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS""
25*5c591343SA. Cody Schuffelen  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26*5c591343SA. Cody Schuffelen  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27*5c591343SA. Cody Schuffelen  *  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
28*5c591343SA. Cody Schuffelen  *  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29*5c591343SA. Cody Schuffelen  *  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30*5c591343SA. Cody Schuffelen  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31*5c591343SA. Cody Schuffelen  *  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32*5c591343SA. Cody Schuffelen  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*5c591343SA. Cody Schuffelen  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*5c591343SA. Cody Schuffelen  */
35*5c591343SA. Cody Schuffelen #ifndef _SWAP_H
36*5c591343SA. Cody Schuffelen #define _SWAP_H
37*5c591343SA. Cody Schuffelen 
38*5c591343SA. Cody Schuffelen #if LITTLE_ENDIAN_TPM
39*5c591343SA. Cody Schuffelen #define TO_BIG_ENDIAN_UINT16(i)     REVERSE_ENDIAN_16(i)
40*5c591343SA. Cody Schuffelen #define FROM_BIG_ENDIAN_UINT16(i)   REVERSE_ENDIAN_16(i)
41*5c591343SA. Cody Schuffelen #define TO_BIG_ENDIAN_UINT32(i)     REVERSE_ENDIAN_32(i)
42*5c591343SA. Cody Schuffelen #define FROM_BIG_ENDIAN_UINT32(i)   REVERSE_ENDIAN_32(i)
43*5c591343SA. Cody Schuffelen #define TO_BIG_ENDIAN_UINT64(i)     REVERSE_ENDIAN_64(i)
44*5c591343SA. Cody Schuffelen #define FROM_BIG_ENDIAN_UINT64(i)   REVERSE_ENDIAN_64(i)
45*5c591343SA. Cody Schuffelen #else
46*5c591343SA. Cody Schuffelen #define TO_BIG_ENDIAN_UINT16(i)     (i)
47*5c591343SA. Cody Schuffelen #define FROM_BIG_ENDIAN_UINT16(i)   (i)
48*5c591343SA. Cody Schuffelen #define TO_BIG_ENDIAN_UINT32(i)     (i)
49*5c591343SA. Cody Schuffelen #define FROM_BIG_ENDIAN_UINT32(i)   (i)
50*5c591343SA. Cody Schuffelen #define TO_BIG_ENDIAN_UINT64(i)     (i)
51*5c591343SA. Cody Schuffelen #define FROM_BIG_ENDIAN_UINT64(i)   (i)
52*5c591343SA. Cody Schuffelen #endif
53*5c591343SA. Cody Schuffelen 
54*5c591343SA. Cody Schuffelen #if   AUTO_ALIGN == NO
55*5c591343SA. Cody Schuffelen 
56*5c591343SA. Cody Schuffelen // The aggregation macros for machines that do not allow unaligned access or for
57*5c591343SA. Cody Schuffelen // little-endian machines.
58*5c591343SA. Cody Schuffelen 
59*5c591343SA. Cody Schuffelen // Aggregate bytes into an UINT
60*5c591343SA. Cody Schuffelen 
61*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT8(b)  (uint8_t)((b)[0])
62*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT16(b) ByteArrayToUint16((BYTE *)(b))
63*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT32(b) ByteArrayToUint32((BYTE *)(b))
64*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT64(b) ByteArrayToUint64((BYTE *)(b))
65*5c591343SA. Cody Schuffelen #define UINT8_TO_BYTE_ARRAY(i, b) ((b)[0] = (uint8_t)(i))
66*5c591343SA. Cody Schuffelen #define UINT16_TO_BYTE_ARRAY(i, b)  Uint16ToByteArray((i), (BYTE *)(b))
67*5c591343SA. Cody Schuffelen #define UINT32_TO_BYTE_ARRAY(i, b)  Uint32ToByteArray((i), (BYTE *)(b))
68*5c591343SA. Cody Schuffelen #define UINT64_TO_BYTE_ARRAY(i, b)  Uint64ToByteArray((i), (BYTE *)(b))
69*5c591343SA. Cody Schuffelen 
70*5c591343SA. Cody Schuffelen 
71*5c591343SA. Cody Schuffelen #else // AUTO_ALIGN
72*5c591343SA. Cody Schuffelen 
73*5c591343SA. Cody Schuffelen #if BIG_ENDIAN_TPM
74*5c591343SA. Cody Schuffelen // the big-endian macros for machines that allow unaligned memory access
75*5c591343SA. Cody Schuffelen // Aggregate a byte array into a UINT
76*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT8(b)        *((uint8_t  *)(b))
77*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT16(b)       *((uint16_t *)(b))
78*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT32(b)       *((uint32_t *)(b))
79*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT64(b)       *((uint64_t *)(b))
80*5c591343SA. Cody Schuffelen 
81*5c591343SA. Cody Schuffelen // Disaggregate a UINT into a byte array
82*5c591343SA. Cody Schuffelen 
83*5c591343SA. Cody Schuffelen #define UINT8_TO_BYTE_ARRAY(i, b)   {*((uint8_t  *)(b)) = (i);}
84*5c591343SA. Cody Schuffelen #define UINT16_TO_BYTE_ARRAY(i, b)  {*((uint16_t *)(b)) = (i);}
85*5c591343SA. Cody Schuffelen #define UINT32_TO_BYTE_ARRAY(i, b)  {*((uint32_t *)(b)) = (i);}
86*5c591343SA. Cody Schuffelen #define UINT64_TO_BYTE_ARRAY(i, b)  {*((uint64_t *)(b)) = (i);}
87*5c591343SA. Cody Schuffelen #else
88*5c591343SA. Cody Schuffelen // the little endian macros for machines that allow unaligned memory access
89*5c591343SA. Cody Schuffelen // the big-endian macros for machines that allow unaligned memory access
90*5c591343SA. Cody Schuffelen // Aggregate a byte array into a UINT
91*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT8(b)        *((uint8_t  *)(b))
92*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT16(b)       REVERSE_ENDIAN_16(*((uint16_t *)(b)))
93*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT32(b)       REVERSE_ENDIAN_32(*((uint32_t *)(b)))
94*5c591343SA. Cody Schuffelen #define BYTE_ARRAY_TO_UINT64(b)       REVERSE_ENDIAN_64(*((uint64_t *)(b)))
95*5c591343SA. Cody Schuffelen 
96*5c591343SA. Cody Schuffelen // Disaggregate a UINT into a byte array
97*5c591343SA. Cody Schuffelen 
98*5c591343SA. Cody Schuffelen #define UINT8_TO_BYTE_ARRAY(i, b)   {*((uint8_t  *)(b)) = (i);}
99*5c591343SA. Cody Schuffelen #define UINT16_TO_BYTE_ARRAY(i, b)  {*((uint16_t *)(b)) = REVERSE_ENDIAN_16(i);}
100*5c591343SA. Cody Schuffelen #define UINT32_TO_BYTE_ARRAY(i, b)  {*((uint32_t *)(b)) = REVERSE_ENDIAN_32(i);}
101*5c591343SA. Cody Schuffelen #define UINT64_TO_BYTE_ARRAY(i, b)  {*((uint64_t *)(b)) = REVERSE_ENDIAN_64(i);}
102*5c591343SA. Cody Schuffelen #endif   // BIG_ENDIAN_TPM
103*5c591343SA. Cody Schuffelen 
104*5c591343SA. Cody Schuffelen #endif  // AUTO_ALIGN == NO
105*5c591343SA. Cody Schuffelen 
106*5c591343SA. Cody Schuffelen #endif  // _SWAP_H
107