-
Notifications
You must be signed in to change notification settings - Fork 771
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[dice,ctw] Add more cbor wrappers for auto-gen cwt template
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
- Loading branch information
1 parent
cea6a90
commit e6ba2ed
Showing
3 changed files
with
189 additions
and
90 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters