xref: /aosp_15_r20/external/gsc-utils/boot_param/cbor_basic.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
1*4f2df630SAndroid Build Coastguard Worker /*
2*4f2df630SAndroid Build Coastguard Worker  * Copyright 2024 The ChromiumOS Authors
3*4f2df630SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
4*4f2df630SAndroid Build Coastguard Worker  * found in the LICENSE file.
5*4f2df630SAndroid Build Coastguard Worker  */
6*4f2df630SAndroid Build Coastguard Worker 
7*4f2df630SAndroid Build Coastguard Worker #ifndef __GSC_UTILS_BOOT_PARAM_CBOR_BASIC_H
8*4f2df630SAndroid Build Coastguard Worker #define __GSC_UTILS_BOOT_PARAM_CBOR_BASIC_H
9*4f2df630SAndroid Build Coastguard Worker 
10*4f2df630SAndroid Build Coastguard Worker #include <stdbool.h>
11*4f2df630SAndroid Build Coastguard Worker #include <stddef.h>
12*4f2df630SAndroid Build Coastguard Worker #include <stdint.h>
13*4f2df630SAndroid Build Coastguard Worker 
14*4f2df630SAndroid Build Coastguard Worker #ifdef __cplusplus
15*4f2df630SAndroid Build Coastguard Worker extern "C" {
16*4f2df630SAndroid Build Coastguard Worker #endif
17*4f2df630SAndroid Build Coastguard Worker 
18*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_UINT         ((uint8_t)(0 << 5))
19*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_NINT         ((uint8_t)(1 << 5))
20*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_BSTR         ((uint8_t)(2 << 5))
21*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_TSTR         ((uint8_t)(3 << 5))
22*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_ARR          ((uint8_t)(4 << 5))
23*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_MAP          ((uint8_t)(5 << 5))
24*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_TAG          ((uint8_t)(6 << 5))
25*4f2df630SAndroid Build Coastguard Worker #define CBOR_MAJOR_SIMPLE       ((uint8_t)(7 << 5))
26*4f2df630SAndroid Build Coastguard Worker 
27*4f2df630SAndroid Build Coastguard Worker #define CBOR_HDR1(major, value) ((uint8_t)(major) | (uint8_t)((value) & 0x1f))
28*4f2df630SAndroid Build Coastguard Worker 
29*4f2df630SAndroid Build Coastguard Worker #define CBOR_FALSE CBOR_HDR1(CBOR_MAJOR_SIMPLE, 20)
30*4f2df630SAndroid Build Coastguard Worker #define CBOR_TRUE  CBOR_HDR1(CBOR_MAJOR_SIMPLE, 21)
31*4f2df630SAndroid Build Coastguard Worker #define CBOR_NULL  CBOR_HDR1(CBOR_MAJOR_SIMPLE, 22)
32*4f2df630SAndroid Build Coastguard Worker 
33*4f2df630SAndroid Build Coastguard Worker #define CBOR_BYTES1 24
34*4f2df630SAndroid Build Coastguard Worker #define CBOR_BYTES2 25
35*4f2df630SAndroid Build Coastguard Worker #define CBOR_BYTES4 26
36*4f2df630SAndroid Build Coastguard Worker #define CBOR_BYTES8 27
37*4f2df630SAndroid Build Coastguard Worker 
38*4f2df630SAndroid Build Coastguard Worker /* NINTs in [-24..-1] range ("0 bytes") */
39*4f2df630SAndroid Build Coastguard Worker #define CBOR_NINT0_LEN	  1
40*4f2df630SAndroid Build Coastguard Worker #define CBOR_NINT0(label) CBOR_HDR1(CBOR_MAJOR_NINT, -(label) - 1)
41*4f2df630SAndroid Build Coastguard Worker 
42*4f2df630SAndroid Build Coastguard Worker /* UINTs in [0..23] range ("0 bytes") */
43*4f2df630SAndroid Build Coastguard Worker #define CBOR_UINT0_LEN	  1
44*4f2df630SAndroid Build Coastguard Worker #define CBOR_UINT0(label) CBOR_HDR1(CBOR_MAJOR_UINT, (label))
45*4f2df630SAndroid Build Coastguard Worker 
46*4f2df630SAndroid Build Coastguard Worker /* Building block for 32 bit (4 bytes) integer representations */
47*4f2df630SAndroid Build Coastguard Worker #define CBOR_INT32_LEN (1 + 4)
48*4f2df630SAndroid Build Coastguard Worker #define CBOR_INT32(major, value)                         \
49*4f2df630SAndroid Build Coastguard Worker 	{                                                \
50*4f2df630SAndroid Build Coastguard Worker 		CBOR_HDR1(major, CBOR_BYTES4),           \
51*4f2df630SAndroid Build Coastguard Worker 		(uint8_t)(((value) & 0xFF000000) >> 24), \
52*4f2df630SAndroid Build Coastguard Worker 		(uint8_t)(((value) & 0x00FF0000) >> 16), \
53*4f2df630SAndroid Build Coastguard Worker 		(uint8_t)(((value) & 0x0000FF00) >> 8),  \
54*4f2df630SAndroid Build Coastguard Worker 		(uint8_t)((value) & 0x000000FF)          \
55*4f2df630SAndroid Build Coastguard Worker 	}
56*4f2df630SAndroid Build Coastguard Worker 
57*4f2df630SAndroid Build Coastguard Worker /* 32 bit (4 bytes) negative integers */
58*4f2df630SAndroid Build Coastguard Worker #define CBOR_NINT32_LEN	   CBOR_INT32_LEN
59*4f2df630SAndroid Build Coastguard Worker #define CBOR_NINT32(value) CBOR_INT32(CBOR_MAJOR_NINT, (-(value) - 1))
60*4f2df630SAndroid Build Coastguard Worker 
61*4f2df630SAndroid Build Coastguard Worker /* 32 bit (4 bytes) positive integers */
62*4f2df630SAndroid Build Coastguard Worker #define CBOR_UINT32_LEN	   CBOR_INT32_LEN
63*4f2df630SAndroid Build Coastguard Worker #define CBOR_UINT32(value) CBOR_INT32(CBOR_MAJOR_UINT, value)
64*4f2df630SAndroid Build Coastguard Worker 
65*4f2df630SAndroid Build Coastguard Worker /* BSTR with 1 byte size */
66*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR_HDR8(size)                              \
67*4f2df630SAndroid Build Coastguard Worker 	{ CBOR_HDR1(CBOR_MAJOR_BSTR, CBOR_BYTES1), size }
68*4f2df630SAndroid Build Coastguard Worker 
69*4f2df630SAndroid Build Coastguard Worker /* TSTR with 1 byte size */
70*4f2df630SAndroid Build Coastguard Worker #define CBOR_TSTR_HDR8(size)                              \
71*4f2df630SAndroid Build Coastguard Worker 	{ CBOR_HDR1(CBOR_MAJOR_TSTR, CBOR_BYTES1), size }
72*4f2df630SAndroid Build Coastguard Worker 
73*4f2df630SAndroid Build Coastguard Worker /* BSTR with 2 byte size */
74*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR_HDR16(size)                            \
75*4f2df630SAndroid Build Coastguard Worker 	{                                                \
76*4f2df630SAndroid Build Coastguard Worker 		CBOR_HDR1(CBOR_MAJOR_BSTR, CBOR_BYTES2), \
77*4f2df630SAndroid Build Coastguard Worker 		(uint8_t)(((size) & 0xFF00) >> 8),       \
78*4f2df630SAndroid Build Coastguard Worker 		(uint8_t)((size) & 0x00FF)               \
79*4f2df630SAndroid Build Coastguard Worker 	}
80*4f2df630SAndroid Build Coastguard Worker 
81*4f2df630SAndroid Build Coastguard Worker /* BSTR of length 1 */
82*4f2df630SAndroid Build Coastguard Worker struct cbor_bstr1_s {
83*4f2df630SAndroid Build Coastguard Worker 	uint8_t cbor_hdr;
84*4f2df630SAndroid Build Coastguard Worker 	uint8_t value;
85*4f2df630SAndroid Build Coastguard Worker };
86*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR1_HDR CBOR_HDR1(CBOR_MAJOR_BSTR, 1)
87*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR1_EMPTY { CBOR_BSTR1_HDR, 0 }
88*4f2df630SAndroid Build Coastguard Worker 
89*4f2df630SAndroid Build Coastguard Worker /* BSTR of length 32: UDS, CDI, digest, key seeds */
90*4f2df630SAndroid Build Coastguard Worker struct cbor_bstr32_s {
91*4f2df630SAndroid Build Coastguard Worker 	uint8_t cbor_hdr[2];
92*4f2df630SAndroid Build Coastguard Worker 	uint8_t value[32];
93*4f2df630SAndroid Build Coastguard Worker };
94*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR32_HDR CBOR_BSTR_HDR8(32)
95*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR32_EMPTY                       \
96*4f2df630SAndroid Build Coastguard Worker 	{                                       \
97*4f2df630SAndroid Build Coastguard Worker 		CBOR_BSTR32_HDR,                \
98*4f2df630SAndroid Build Coastguard Worker 		{                               \
99*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
100*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
101*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
102*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0  \
103*4f2df630SAndroid Build Coastguard Worker 		}                               \
104*4f2df630SAndroid Build Coastguard Worker 	}
105*4f2df630SAndroid Build Coastguard Worker 
106*4f2df630SAndroid Build Coastguard Worker /* TSTR of length 2*20 = 40: UDS_ID, CDI_ID as hex */
107*4f2df630SAndroid Build Coastguard Worker struct cbor_tstr40_s {
108*4f2df630SAndroid Build Coastguard Worker 	uint8_t cbor_hdr[2];
109*4f2df630SAndroid Build Coastguard Worker 	uint8_t value[40];
110*4f2df630SAndroid Build Coastguard Worker };
111*4f2df630SAndroid Build Coastguard Worker #define CBOR_TSTR40_HDR CBOR_TSTR_HDR8(40)
112*4f2df630SAndroid Build Coastguard Worker #define CBOR_TSTR40_EMPTY                       \
113*4f2df630SAndroid Build Coastguard Worker 	{                                       \
114*4f2df630SAndroid Build Coastguard Worker 		CBOR_TSTR40_HDR,                \
115*4f2df630SAndroid Build Coastguard Worker 		{                               \
116*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
117*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
118*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
119*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
120*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0  \
121*4f2df630SAndroid Build Coastguard Worker 		}                               \
122*4f2df630SAndroid Build Coastguard Worker 	}
123*4f2df630SAndroid Build Coastguard Worker 
124*4f2df630SAndroid Build Coastguard Worker /* BSTR of length 64: signature, entropy */
125*4f2df630SAndroid Build Coastguard Worker struct cbor_bstr64_s {
126*4f2df630SAndroid Build Coastguard Worker 	uint8_t cbor_hdr[2];
127*4f2df630SAndroid Build Coastguard Worker 	uint8_t value[64];
128*4f2df630SAndroid Build Coastguard Worker };
129*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR64_HDR CBOR_BSTR_HDR8(64)
130*4f2df630SAndroid Build Coastguard Worker #define CBOR_BSTR64_EMPTY                       \
131*4f2df630SAndroid Build Coastguard Worker 	{                                       \
132*4f2df630SAndroid Build Coastguard Worker 		CBOR_BSTR64_HDR,                \
133*4f2df630SAndroid Build Coastguard Worker 		{                               \
134*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
135*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
136*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
137*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
138*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
139*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
140*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0, \
141*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0, 0, 0, 0, 0  \
142*4f2df630SAndroid Build Coastguard Worker 		}                               \
143*4f2df630SAndroid Build Coastguard Worker 	}
144*4f2df630SAndroid Build Coastguard Worker 
145*4f2df630SAndroid Build Coastguard Worker /* UINT32 */
146*4f2df630SAndroid Build Coastguard Worker struct cbor_uint32_s {
147*4f2df630SAndroid Build Coastguard Worker 	uint8_t cbor_hdr;
148*4f2df630SAndroid Build Coastguard Worker 	uint8_t value[4];
149*4f2df630SAndroid Build Coastguard Worker };
150*4f2df630SAndroid Build Coastguard Worker #define CBOR_UINT32_HDR CBOR_HDR1(CBOR_MAJOR_UINT, CBOR_BYTES4)
151*4f2df630SAndroid Build Coastguard Worker #define CBOR_UINT32_ZERO           \
152*4f2df630SAndroid Build Coastguard Worker 	{                          \
153*4f2df630SAndroid Build Coastguard Worker 		CBOR_UINT32_HDR,   \
154*4f2df630SAndroid Build Coastguard Worker 		{                  \
155*4f2df630SAndroid Build Coastguard Worker 			0, 0, 0, 0 \
156*4f2df630SAndroid Build Coastguard Worker 		}                  \
157*4f2df630SAndroid Build Coastguard Worker 	}
158*4f2df630SAndroid Build Coastguard Worker 
159*4f2df630SAndroid Build Coastguard Worker #ifdef __cplusplus
160*4f2df630SAndroid Build Coastguard Worker } /* extern "C" */
161*4f2df630SAndroid Build Coastguard Worker #endif
162*4f2df630SAndroid Build Coastguard Worker 
163*4f2df630SAndroid Build Coastguard Worker #endif /* __CGSC_UTILS_BOOT_PARAM_CBOR_BASIC_H */
164