Skip to content

Commit

Permalink
[dice,ctw] Add more cbor wrappers for auto-gen cwt template
Browse files Browse the repository at this point in the history
The autogen source from templates needs some more APIs to utilize the
Cbor structure, including
- calculate the size of a given cbor argument
- add a bstr/tstr header with size, and rewind the cursor
- copy the war data from input pointer to the CborOut buffer

Signed-off-by: Tommy Chiu <[email protected]>
  • Loading branch information
tommychiu-github committed Nov 6, 2024
1 parent 02addf8 commit 3567df4
Show file tree
Hide file tree
Showing 3 changed files with 189 additions and 90 deletions.
1 change: 1 addition & 0 deletions sw/device/silicon_creator/lib/cert/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ cc_library(

cc_library(
name = "cbor",
srcs = ["cbor.c"],
hdrs = ["cbor.h"],
deps = [
"//sw/device/lib/base:status",
Expand Down
146 changes: 146 additions & 0 deletions sw/device/silicon_creator/lib/cert/cbor.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
// Copyright lowRISC contributors (OpenTitan project).
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/silicon_creator/lib/cert/cbor.h"

#include <string.h>

#include "include/dice/cbor_writer.h"
#include "sw/device/lib/base/macros.h"
#include "sw/device/lib/runtime/log.h"
#include "sw/device/silicon_creator/lib/error.h"

#define CBOR_RETURN_IF_OVERFLOWED(p) \
do { \
if (CborOutOverflowed(p)) { \
LOG_ERROR("CborOutOverflowed!!"); \
return kErrorCertInvalidSize; \
} \
} while (0)

#define CBOR_CHECK_OVERFLOWED_AND_RETURN(p) \
do { \
CBOR_RETURN_IF_OVERFLOWED(p); \
return kErrorOk; \
} while (0)

inline rom_error_t cbor_write_out_init(struct CborOut *p, void *buf,
const size_t buf_size) {
CborOutInit(buf, buf_size, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_map_init(struct CborOut *p, const size_t num_pairs) {
CborWriteMap(num_pairs, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_array_init(struct CborOut *p,
const size_t num_elements) {
CborWriteArray(num_elements, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_string(struct CborOut *p, const char *str) {
CborWriteTstr(str, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_bytes(struct CborOut *p, const uint8_t *data,
const size_t data_size) {
CborWriteBstr(data_size, data, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

// Wrappers to encode a pair of data for cbor-map
inline rom_error_t cbor_write_pair_uint_uint(struct CborOut *p, uint64_t key,
uint64_t value) {
CborWriteUint(key, p);
CborWriteUint(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_pair_int_uint(struct CborOut *p, int64_t key,
uint64_t value) {
CborWriteInt(key, p);
CborWriteUint(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_pair_uint_int(struct CborOut *p, uint64_t key,
int64_t value) {
CborWriteUint(key, p);
CborWriteInt(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_pair_int_bytes(struct CborOut *p, int64_t key,
const uint8_t *value,
const size_t value_size) {
CborWriteInt(key, p);
CborWriteBstr(value_size, value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_pair_uint_tstr(struct CborOut *p, uint64_t key,
const char *value) {
CborWriteUint(key, p);
CborWriteTstr(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

inline rom_error_t cbor_write_pair_int_tstr(struct CborOut *p, int64_t key,
const char *value) {
CborWriteInt(key, p);
CborWriteTstr(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

// Helpers for the auto-gen template, to
// - calculate the size of a given cbor argument
// - add a bstr/tstr header with size, and rewind the cursor
// - copy the war data from input pointer to the CborOut buffer
size_t cbor_calc_arg_size(uint64_t value) {
if (value <= 23) {
return 0;
} else if (value <= 0xff) {
return 1;
} else if (value <= 0xffff) {
return 2;
} else if (value <= 0xffffffff) {
return 4;
} else {
return 8;
};
}

size_t cbor_calc_int_size(int64_t value) {
if (value < 0)
return cbor_calc_arg_size((uint64_t)(-(value + 1)));

return cbor_calc_arg_size((uint64_t)value);
}

rom_error_t cbor_write_bstr_header(struct CborOut *p, const size_t bstr_size) {
if (NULL == CborAllocBstr(bstr_size, p))
return kErrorCertInvalidSize;
p->cursor -= bstr_size;
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

rom_error_t cbor_write_tstr_header(struct CborOut *p, const size_t tstr_size) {
if (NULL == CborAllocTstr(tstr_size, p))
return kErrorCertInvalidSize;
p->cursor -= tstr_size;
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

rom_error_t cbor_write_raw_bytes(struct CborOut *p, const uint8_t *raw,
const size_t raw_size) {
if (p->cursor + raw_size > p->buffer_size)
return kErrorCertInvalidSize;
memcpy(&p->buffer[p->cursor], raw, raw_size);
p->cursor += raw_size;
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}
132 changes: 42 additions & 90 deletions sw/device/silicon_creator/lib/cert/cbor.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,100 +6,52 @@
#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_CERT_CBOR_H_

#include "include/dice/cbor_writer.h"
#include "sw/device/lib/runtime/log.h"
#include "sw/device/silicon_creator/lib/error.h"

#define CBOR_CHECK_OVERFLOWED_AND_RETURN(p) \
do { \
if (CborOutOverflowed(p)) { \
LOG_ERROR("CborOutOverflowed!!"); \
return kErrorCertInvalidSize; \
} \
return kErrorOk; \
} while (0)

// Wrappers for each CBOR type and CBOR handle initialization
static inline rom_error_t cbor_write_out_init(struct CborOut *p, void *buf,
const size_t buf_size) {
CborOutInit(buf, buf_size, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_map_init(struct CborOut *p,
const size_t num_pairs) {
CborWriteMap(num_pairs, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_array_init(struct CborOut *p,
const size_t num_elements) {
CborWriteArray(num_elements, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_string(struct CborOut *p,
const char *str) {
CborWriteTstr(str, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_bytes(struct CborOut *p,
const uint8_t *data,
const size_t data_size) {
CborWriteBstr(data_size, data, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}
rom_error_t cbor_write_out_init(struct CborOut *p, void *buf,
const size_t buf_size);

rom_error_t cbor_map_init(struct CborOut *p, const size_t num_pairs);

rom_error_t cbor_array_init(struct CborOut *p, const size_t num_elements);

rom_error_t cbor_write_string(struct CborOut *p, const char *str);

rom_error_t cbor_write_bytes(struct CborOut *p, const uint8_t *data,
const size_t data_size);

// Wrappers to encode a pair of data for cbor-map
static inline rom_error_t cbor_write_pair_uint_uint(struct CborOut *p,
uint64_t key,
uint64_t value) {
CborWriteUint(key, p);
CborWriteUint(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_pair_int_uint(struct CborOut *p,
int64_t key,
uint64_t value) {
CborWriteInt(key, p);
CborWriteUint(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_pair_uint_int(struct CborOut *p,
uint64_t key,
int64_t value) {
CborWriteUint(key, p);
CborWriteInt(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_pair_int_bytes(struct CborOut *p,
int64_t key,
const uint8_t *value,
const size_t value_size) {
CborWriteInt(key, p);
CborWriteBstr(value_size, value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_pair_uint_tstr(struct CborOut *p,
uint64_t key,
const char *value) {
CborWriteUint(key, p);
CborWriteTstr(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

static inline rom_error_t cbor_write_pair_int_tstr(struct CborOut *p,
int64_t key,
const char *value) {
CborWriteInt(key, p);
CborWriteTstr(value, p);
CBOR_CHECK_OVERFLOWED_AND_RETURN(p);
}

#undef CBOR_CHECK_OVERFLOWED_AND_RETURN
rom_error_t cbor_write_pair_uint_uint(struct CborOut *p, uint64_t key,
uint64_t value);

rom_error_t cbor_write_pair_int_uint(struct CborOut *p, int64_t key,
uint64_t value);

rom_error_t cbor_write_pair_uint_int(struct CborOut *p, uint64_t key,
int64_t value);

rom_error_t cbor_write_pair_int_bytes(struct CborOut *p, int64_t key,
const uint8_t *value,
const size_t value_size);

rom_error_t cbor_write_pair_uint_tstr(struct CborOut *p, uint64_t key,
const char *value);

rom_error_t cbor_write_pair_int_tstr(struct CborOut *p, int64_t key,
const char *value);

// Helpers for the auto-gen template
// Calculate the size of a given cbor argument, in int64 or uint64
size_t cbor_calc_arg_size(uint64_t value);
size_t cbor_calc_int_size(int64_t value);

// Add a bstr/tstr header with size, and rewind the cursor
rom_error_t cbor_write_bstr_header(struct CborOut *p, const size_t bstr_size);
rom_error_t cbor_write_tstr_header(struct CborOut *p, const size_t tstr_size);

// Copy the rwa data from input pointer to the CborOut buffer
rom_error_t cbor_write_raw_bytes(struct CborOut *p, const uint8_t *raw,
const size_t raw_size);

#endif // OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_CERT_CBOR_H_

0 comments on commit 3567df4

Please sign in to comment.