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