| // Copyright 2021 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| #ifndef DICE_CBOR_WRITER_H_ |
| #define DICE_CBOR_WRITER_H_ |
| |
| #include <stdbool.h> |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| struct CborOut { |
| uint8_t* buffer; |
| size_t buffer_size; |
| size_t cursor; |
| }; |
| |
| // Initializes an output stream for writing CBOR tokens. |
| static inline void CborOutInit(uint8_t* buffer, size_t buffer_size, |
| struct CborOut* out) { |
| out->buffer = buffer; |
| out->buffer_size = buffer_size; |
| out->cursor = 0; |
| } |
| |
| // Returns the number of bytes of encoded data. If |CborOutOverflowed()| |
| // returns false, this number of bytes have been written, otherwise, this is the |
| // number of bytes that that would have been written had there been space. |
| static inline size_t CborOutSize(const struct CborOut* out) { |
| return out->cursor; |
| } |
| |
| // Returns whether the |out| buffer contains the encoded tokens written to it or |
| // whether the encoded tokens did not fit and the contents of the buffer should |
| // be considered invalid. |
| static inline bool CborOutOverflowed(const struct CborOut* out) { |
| return out->cursor == SIZE_MAX || out->cursor > out->buffer_size; |
| } |
| |
| // These functions write simple deterministically encoded CBOR tokens to an |
| // output buffer. The offset is always increased, even if there is not enough |
| // space in the output buffer to allow for measurement of the encoded data. |
| // Use |CborOutOverflowed()| to check whether or not the buffer successfully |
| // contains all of the of the encoded data. |
| // |
| // Complex types are constructed from these simple types, see RFC 8949. The |
| // caller is responsible for correct and deterministic encoding of complex |
| // types. |
| void CborWriteInt(int64_t val, struct CborOut* out); |
| void CborWriteUint(uint64_t val, struct CborOut* out); |
| void CborWriteBstr(size_t data_size, const uint8_t* data, struct CborOut* out); |
| void CborWriteTstr(const char* str, struct CborOut* out); |
| void CborWriteArray(size_t num_elements, struct CborOut* out); |
| void CborWriteMap(size_t num_pairs, struct CborOut* out); |
| void CborWriteTag(uint64_t tag, struct CborOut* out); |
| void CborWriteFalse(struct CborOut* out); |
| void CborWriteTrue(struct CborOut* out); |
| void CborWriteNull(struct CborOut* out); |
| |
| // These functions write the type header and reserve space for the caller to |
| // populate. The reserved space is left uninitialized. Returns NULL if space |
| // could not be reserved in the output buffer. |
| uint8_t* CborAllocBstr(size_t data_size, struct CborOut* out); |
| char* CborAllocTstr(size_t size, struct CborOut* out); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif // DICE_CBOR_WRITER_H_ |