CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
cbor_helpers.h
Go to the documentation of this file.
1// CBOR Encoding/Decoding Helpers for CTAP2
2// Minimal CBOR implementation for FIDO2
3
4#pragma once
5#include <stdint.h>
6#include <stdbool.h>
7#include <stddef.h>
8
9#ifdef __cplusplus
10extern "C" {
11#endif
12
13// ============================================================================
14// CBOR Major Types
15// ============================================================================
16
17#define CBOR_UNSIGNED 0 // 0x00-0x1F
18#define CBOR_NEGATIVE 1 // 0x20-0x3F
19#define CBOR_BYTES 2 // 0x40-0x5F
20#define CBOR_TEXT 3 // 0x60-0x7F
21#define CBOR_ARRAY 4 // 0x80-0x9F
22#define CBOR_MAP 5 // 0xA0-0xBF
23#define CBOR_TAG 6 // 0xC0-0xDF
24#define CBOR_SIMPLE 7 // 0xE0-0xFF
25
26// Simple values
27#define CBOR_FALSE 0xF4
28#define CBOR_TRUE 0xF5
29#define CBOR_NULL 0xF6
30#define CBOR_UNDEFINED 0xF7
31
32// ============================================================================
33// CBOR Writer
34// ============================================================================
35
36#ifdef __DOXYGEN__
37namespace cdc::mod_fido2 {
38#endif
39
40typedef struct {
41 uint8_t *buffer;
42 size_t size;
43 size_t offset;
44 bool error;
46
54void cbor_writer_init(cbor_writer_t *w, uint8_t *buffer, size_t size);
55
60
65
66// Encode primitives
67void cbor_encode_uint(cbor_writer_t *w, uint64_t value);
68void cbor_encode_int(cbor_writer_t *w, int64_t value);
69void cbor_encode_bytes(cbor_writer_t *w, const uint8_t *data, size_t len);
70void cbor_encode_text(cbor_writer_t *w, const char *str);
71void cbor_encode_text_len(cbor_writer_t *w, const char *str, size_t len);
72void cbor_encode_bool(cbor_writer_t *w, bool value);
74
75// Encode containers (write header, then encode items)
76void cbor_encode_array(cbor_writer_t *w, size_t count);
77void cbor_encode_map(cbor_writer_t *w, size_t count);
78
79// Encode COSE key (P-256 public key)
80void cbor_encode_cose_key_p256(cbor_writer_t *w, const uint8_t *x, const uint8_t *y);
81
82// Encode COSE key (Ed25519 public key)
83// COSE_Key format for OKP (Octet Key Pair):
84// 1 (kty): 1 (OKP)
85// 3 (alg): -8 (EdDSA)
86// -1 (crv): 6 (Ed25519)
87// -2 (x): 32-byte public key
88void cbor_encode_cose_key_ed25519(cbor_writer_t *w, const uint8_t *pubkey);
89
90// ============================================================================
91// CBOR Reader
92// ============================================================================
93
94typedef struct {
95 const uint8_t *data;
96 size_t size;
97 size_t offset;
98 bool error;
100
101typedef struct {
102 uint8_t type; // Major type
103 uint64_t value; // Argument value (or length for containers)
104 const uint8_t *bytes; // Pointer to byte/text data
105 size_t length; // Length of byte/text data
107
108#ifdef __DOXYGEN__
109} // namespace cdc::mod_fido2
110#endif
111
119void cbor_reader_init(cbor_reader_t *r, const uint8_t *data, size_t size);
120
124bool cbor_reader_error(const cbor_reader_t *r);
125
129bool cbor_reader_available(const cbor_reader_t *r);
130
136int cbor_reader_peek_type(const cbor_reader_t *r);
137
145bool cbor_read_item(cbor_reader_t *r, cbor_item_t *item);
146
150bool cbor_read_uint(cbor_reader_t *r, uint64_t *value);
151
155bool cbor_read_int(cbor_reader_t *r, int64_t *value);
156
166bool cbor_read_bytes(cbor_reader_t *r, uint8_t *out, size_t max_len, size_t *out_len);
167
177bool cbor_read_text(cbor_reader_t *r, char *out, size_t max_len, size_t *out_len);
178
182bool cbor_read_bool(cbor_reader_t *r, bool *value);
183
189int cbor_read_map(cbor_reader_t *r);
190
196int cbor_read_array(cbor_reader_t *r);
197
201bool cbor_skip_item(cbor_reader_t *r);
202
203// ============================================================================
204// COSE Key Parsing
205// ============================================================================
206
217bool cbor_parse_cose_key(cbor_reader_t *r, int *kty, int *alg,
218 uint8_t *x, uint8_t *y);
219
220#ifdef __cplusplus
221}
222#endif
223
void cbor_reader_init(cbor_reader_t *r, const uint8_t *data, size_t size)
CBOR reader implementation.
bool cbor_read_text(cbor_reader_t *r, char *out, size_t max_len, size_t *out_len)
Reads CBOR text string into output buffer.
int cbor_read_map(cbor_reader_t *r)
Reads CBOR map header and returns pair count.
int cbor_read_array(cbor_reader_t *r)
Reads CBOR array header and returns element count.
bool cbor_skip_item(cbor_reader_t *r)
Skips one complete CBOR item including nested container content.
bool cbor_reader_error(const cbor_reader_t *r)
Returns whether reader is in error state.
int cbor_reader_peek_type(const cbor_reader_t *r)
Peeks major type of next CBOR item.
bool cbor_read_bool(cbor_reader_t *r, bool *value)
Reads CBOR boolean simple value.
bool cbor_read_item(cbor_reader_t *r, cbor_item_t *item)
Reads next CBOR item metadata and optional inline payload pointer.
bool cbor_parse_cose_key(cbor_reader_t *r, int *kty, int *alg, uint8_t *x, uint8_t *y)
Parses COSE key map and extracts key type, algorithm, and coordinates.
bool cbor_read_int(cbor_reader_t *r, int64_t *value)
Reads CBOR integer (positive or negative).
bool cbor_read_uint(cbor_reader_t *r, uint64_t *value)
Reads CBOR unsigned integer.
bool cbor_read_bytes(cbor_reader_t *r, uint8_t *out, size_t max_len, size_t *out_len)
Reads CBOR byte-string into optional output buffer.
bool cbor_reader_available(const cbor_reader_t *r)
Returns whether unread data remains.
void cbor_encode_bytes(cbor_writer_t *w, const uint8_t *data, size_t len)
void cbor_encode_text_len(cbor_writer_t *w, const char *str, size_t len)
size_t cbor_writer_length(const cbor_writer_t *w)
void cbor_encode_cose_key_ed25519(cbor_writer_t *w, const uint8_t *pubkey)
void cbor_encode_uint(cbor_writer_t *w, uint64_t value)
void cbor_encode_bool(cbor_writer_t *w, bool value)
void cbor_encode_text(cbor_writer_t *w, const char *str)
void cbor_encode_int(cbor_writer_t *w, int64_t value)
void cbor_writer_init(cbor_writer_t *w, uint8_t *buffer, size_t size)
void cbor_encode_map(cbor_writer_t *w, size_t count)
bool cbor_writer_error(const cbor_writer_t *w)
void cbor_encode_cose_key_p256(cbor_writer_t *w, const uint8_t *x, const uint8_t *y)
void cbor_encode_array(cbor_writer_t *w, size_t count)
void cbor_encode_null(cbor_writer_t *w)