14 #include "q_useful_buf.h"
15 #include "qcbor_util.h"
46 #define CLAIM_PRESENT_BIT(item_index) (0x01U << (item_index))
66 struct q_useful_buf_c *claim)
73 *claim = NULL_Q_USEFUL_BUF_C;
77 return_value = qcbor_util_get_top_level_item_in_map(me->
payload,
79 QCBOR_TYPE_BYTE_STRING,
85 *claim = item.val.string;
98 struct q_useful_buf_c *claim)
105 *claim = NULL_Q_USEFUL_BUF_C;
109 return_value = qcbor_util_get_top_level_item_in_map(me->
payload,
111 QCBOR_TYPE_TEXT_STRING,
117 *claim = item.val.string;
134 QCBORDecodeContext decode_context;
142 QCBORDecode_Init(&decode_context, me->
payload, QCBOR_DECODE_MODE_NORMAL);
144 return_value = qcbor_util_get_item_in_map(&decode_context,
151 if(QCBORDecode_Finish(&decode_context)) {
155 if(item.uDataType == QCBOR_TYPE_INT64) {
156 *integer = item.val.int64;
157 }
else if(item.uDataType == QCBOR_TYPE_UINT64) {
158 if(item.val.uint64 < INT64_MAX) {
159 *integer = (int64_t)item.val.uint64;
182 QCBORDecodeContext decode_context;
190 QCBORDecode_Init(&decode_context, me->
payload, QCBOR_DECODE_MODE_NORMAL);
192 return_value = qcbor_util_get_item_in_map(&decode_context,
195 if(return_value != 0) {
199 if(QCBORDecode_Finish(&decode_context)) {
203 if(item.uDataType == QCBOR_TYPE_UINT64) {
204 *integer = item.val.uint64;
205 }
else if(item.uDataType == QCBOR_TYPE_INT64) {
206 if(item.val.int64 >= 0) {
207 *integer = (uint64_t)item.val.int64;
225 struct q_useful_buf_c *payload)
231 *payload = NULL_Q_USEFUL_BUF_C;
235 if(q_useful_buf_c_is_null_or_empty(me->
payload)) {
255 struct qcbor_util_items_to_get_t list[NUMBER_OF_ITEMS+1];
256 QCBORDecodeContext decode_context;
257 int64_t client_id_64;
280 QCBORDecode_Init(&decode_context, me->
payload, QCBOR_DECODE_MODE_NORMAL);
282 return_value = qcbor_util_get_items_in_map(&decode_context,
289 if(list[
NONCE_FLAG].item.uDataType == QCBOR_TYPE_BYTE_STRING) {
295 if(list[
UEID_FLAG].item.uDataType == QCBOR_TYPE_BYTE_STRING) {
301 if(list[
BOOT_SEED_FLAG].item.uDataType == QCBOR_TYPE_BYTE_STRING) {
322 if(client_id_64 < INT32_MAX || client_id_64 > INT32_MIN) {
323 items->
client_id = (int32_t)client_id_64;
359 uint32_t *num_sw_components)
369 return_value = qcbor_util_get_top_level_item_in_map(me->
payload,
379 return_value = qcbor_util_get_top_level_item_in_map(me->
payload,
387 *num_sw_components = 0;
399 if(item.val.uCount == 0) {
405 *num_sw_components = item.val.uCount;
426 decode_sw_component(QCBORDecodeContext *decode_context,
427 const QCBORItem *sw_component_item,
431 QCBORItem claim_item;
432 QCBORError cbor_error;
433 uint_fast8_t next_nest_level;
436 if(sw_component_item->uDataType != QCBOR_TYPE_MAP) {
448 cbor_error = QCBORDecode_GetNext(decode_context, &claim_item);
449 if(cbor_error != QCBOR_SUCCESS) {
455 if(claim_item.uLabelType == QCBOR_TYPE_INT64) {
456 switch(claim_item.label.int64) {
458 if(claim_item.uDataType != QCBOR_TYPE_TEXT_STRING) {
469 if(claim_item.uDataType != QCBOR_TYPE_BYTE_STRING) {
479 if(claim_item.uDataType != QCBOR_TYPE_TEXT_STRING) {
483 sw_component->
version = claim_item.val.string;
489 if(claim_item.uDataType != QCBOR_TYPE_BYTE_STRING) {
493 sw_component->
signer_id = claim_item.val.string;
499 if(claim_item.uDataType != QCBOR_TYPE_TEXT_STRING) {
510 if(qcbor_util_consume_item(decode_context,
516 if(next_nest_level < sw_component_item->uNextNestLevel) {
532 uint32_t requested_index,
536 QCBORItem sw_components_array_item;
537 QCBORDecodeContext decode_context;
538 QCBORItem sw_component_item;
539 QCBORError qcbor_error;
540 uint_fast8_t exit_array_level;
547 QCBORDecode_Init(&decode_context, me->
payload, QCBOR_DECODE_MODE_NORMAL);
550 return_value = qcbor_util_decode_to_labeled_item(&decode_context,
552 &sw_components_array_item);
557 if(sw_components_array_item.uDataType != QCBOR_TYPE_ARRAY) {
562 exit_array_level = sw_components_array_item.uNextNestLevel;
566 qcbor_error = QCBORDecode_GetNext(&decode_context, &sw_component_item);
573 if(sw_component_item.uNextNestLevel <= exit_array_level) {
581 if(requested_index == 0) {
583 return_value = decode_sw_component(&decode_context,
593 if(qcbor_util_consume_item(&decode_context, &sw_component_item, NULL)) {
enum attest_token_err_t last_error
struct q_useful_buf_c implementation_id
enum attest_token_err_t attest_token_get_num_sw_components(struct attest_token_decode_context *me, uint32_t *num_sw_components)
Get the number of SW components in the token.
uint32_t security_lifecycle
#define EAT_CBOR_ARM_LABEL_SECURITY_LIFECYCLE
#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_VALUE
#define EAT_CBOR_ARM_LABEL_NO_SW_COMPONENTS
Attestation Token Decoding Interface.
enum attest_token_err_t attest_token_decode_get_payload(struct attest_token_decode_context *me, struct q_useful_buf_c *payload)
Get undecoded CBOR payload from the token.
#define NO_SW_COMPONENT_FIXED_VALUE
struct q_useful_buf_c measurement_type
struct q_useful_buf_c version
#define EAT_CBOR_ARM_LABEL_UEID
enum attest_token_err_t attest_token_decode_get_iat_simple(struct attest_token_decode_context *me, struct attest_token_iat_simple_t *items)
Batch fetch of all simple data items in a token.
struct q_useful_buf_c hw_version
struct q_useful_buf_c origination
#define EAT_CBOR_SW_COMPONENT_SIGNER_ID
#define EAT_CBOR_ARM_LABEL_CLIENT_ID
#define EAT_CBOR_ARM_LABEL_ORIGINATION
#define EAT_CBOR_ARM_LABEL_SW_COMPONENTS
enum attest_token_err_t attest_token_decode_get_bstr(struct attest_token_decode_context *me, int32_t label, struct q_useful_buf_c *claim)
Get a top-level claim, by integer label that is a byte string.
#define EAT_CBOR_ARM_LABEL_IMPLEMENTATION_ID
#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_TYPE
enum attest_token_err_t attest_token_decode_get_uint(struct attest_token_decode_context *me, int32_t label, uint64_t *integer)
Get a top-level claim by integer label who's value is an unsigned integer.
enum attest_token_err_t attest_token_get_sw_component(struct attest_token_decode_context *me, uint32_t requested_index, struct attest_token_sw_component_t *sw_components)
Get the nth SW component.
#define CLAIM_PRESENT_BIT(item_index)
struct q_useful_buf_c signer_id
struct q_useful_buf_c measurement_val
struct q_useful_buf_c nonce
#define EAT_CBOR_SW_COMPONENT_VERSION
struct q_useful_buf_c payload
enum attest_token_err_t attest_token_decode_get_int(struct attest_token_decode_context *me, int32_t label, int64_t *integer)
Get a top-level claim by integer label who's value is a signed integer.
struct q_useful_buf_c ueid
struct q_useful_buf_c boot_seed
#define EAT_CBOR_ARM_LABEL_PROFILE_DEFINITION
struct q_useful_buf_c measurement_desc
#define EAT_CBOR_ARM_LABEL_HW_VERSION
#define EAT_CBOR_ARM_LABEL_CHALLENGE
#define EAT_CBOR_SW_COMPONENT_MEASUREMENT_DESC
void attest_token_decode_init(struct attest_token_decode_context *me, uint32_t options)
Initialize token decoder.
void * memset(void *s, int c, size_t n)
enum attest_token_err_t attest_token_decode_get_tstr(struct attest_token_decode_context *me, int32_t label, struct q_useful_buf_c *claim)
Get a top-level claim, by integer label that is a text string.
struct q_useful_buf_c profile_definition
#define EAT_CBOR_ARM_LABEL_BOOT_SEED