CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
fido2_storage.h
Go to the documentation of this file.
1// FIDO2 Storage Layer (TROPIC01 + NVS)
2// Handles credential storage in ECC slots and R-Memory
3
4#pragma once
5#include <stdint.h>
6#include <stdbool.h>
7#include <stddef.h>
8#include "mod_fido2/fido2.h"
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14// ============================================================================
15// Storage Layout
16// ============================================================================
17// ECC Slots: Private keys (P-256 or Ed25519 for WebAuthn/SSH)
18// R-Memory slots: Credential metadata (rp_id, user_id, sign_count, curve, etc.)
19// NVS "fido2": Global auth counter, PIN hash
20
21void fido2_storage_set_slot_range(uint8_t ecc_start, uint8_t ecc_end,
22 uint16_t rmem_start, uint16_t rmem_end);
23uint8_t fido2_storage_ecc_start(void);
24uint8_t fido2_storage_ecc_end(void);
25uint16_t fido2_storage_rmem_start(void);
26uint16_t fido2_storage_rmem_end(void);
27
28// ============================================================================
29// Initialization
30// ============================================================================
31
38uint8_t fido2_storage_init(void);
39
40// ============================================================================
41// Credential Operations
42// ============================================================================
43
61 const char *rp_id,
62 const uint8_t *rp_id_hash,
63 const uint8_t *user_id,
64 uint8_t user_id_len,
65 const char *user_name,
66 bool resident_key,
67 uint8_t cred_protect,
68 uint8_t curve,
69 uint8_t *out_slot,
70 uint8_t *out_cred_id,
71 uint8_t *out_pubkey
72);
73
80uint8_t fido2_storage_get_curve(uint8_t slot);
81
89bool fido2_storage_get_credential(uint8_t slot, fido2_credential_info_t *info);
90
97bool fido2_storage_delete_credential(uint8_t slot);
98
105uint32_t fido2_storage_increment_sign_count(uint8_t slot);
106
107// ============================================================================
108// Lookup Operations (use cache - no TROPIC01 access)
109// ============================================================================
110
114uint8_t fido2_storage_count(void);
115
119bool fido2_storage_slot_used(uint8_t slot);
120
127
136uint8_t fido2_storage_find_by_rp(const uint8_t *rp_id_hash,
137 uint8_t *out_slots, uint8_t max_slots);
138
147uint8_t fido2_storage_find_by_rp_resident(const uint8_t *rp_id_hash,
148 uint8_t *out_slots, uint8_t max_slots);
149
159int8_t fido2_storage_find_by_rp_user(const uint8_t *rp_id_hash,
160 const uint8_t *user_id,
161 uint8_t user_id_len);
162
166bool fido2_storage_is_resident(uint8_t slot);
167
175int8_t fido2_storage_find_slot_by_cred_id(const uint8_t *cred_id, uint16_t cred_id_len);
176
187bool fido2_storage_get_user(uint8_t slot,
188 uint8_t *user_id,
189 uint8_t *user_id_len,
190 char *user_name,
191 size_t user_name_max);
192
200bool fido2_storage_verify_cred_id(uint8_t slot, const uint8_t *cred_id);
201
209bool fido2_storage_get_cred_id(uint8_t slot, uint8_t *out_cred_id);
210
211// ============================================================================
212// Signing Operations (requires TROPIC01 access)
213// ============================================================================
214
226bool fido2_storage_sign(uint8_t slot, const uint8_t *msg, uint16_t msg_len,
227 uint8_t *signature, uint8_t *sig_len);
228
240bool fido2_storage_sign_raw(uint8_t slot, const uint8_t *msg, uint16_t msg_len,
241 uint8_t *signature, uint8_t *sig_len);
242
254bool fido2_storage_sign_der(uint8_t slot, const uint8_t *msg, uint16_t msg_len,
255 uint8_t *signature, uint8_t *sig_len);
256
264bool fido2_storage_get_pubkey(uint8_t slot, uint8_t *pubkey);
265
266// ============================================================================
267// NVS Counter Operations
268// ============================================================================
269
274
278uint32_t fido2_storage_counter_get(void);
279
286
293
294#ifdef __cplusplus
295}
296#endif
297
uint8_t cred_protect
uint8_t curve
uint8_t user_id_len
uint8_t user_id[FIDO2_USER_ID_MAX_LEN]
char rp_id[FIDO2_RP_ID_MAX_LEN]
uint8_t rp_id_hash[32]
char user_name[FIDO2_USER_NAME_MAX_LEN]
uint8_t fido2_storage_ecc_end(void)
Returns configured ECC end slot.
bool fido2_storage_counter_flush(void)
No-op flush retained for API stability; per-increment path commits.
uint16_t fido2_storage_rmem_start(void)
Returns configured RMEM start slot.
uint8_t fido2_storage_count(void)
Credential lookup operations using in-memory cache only.
bool fido2_storage_sign(uint8_t slot, const uint8_t *msg, uint16_t msg_len, uint8_t *signature, uint8_t *sig_len)
Signing operations requiring secure-element access.
bool fido2_storage_sign_raw(uint8_t slot, const uint8_t *msg, uint16_t msg_len, uint8_t *signature, uint8_t *sig_len)
Signs message and returns raw signature (EdDSA/ECDSA).
bool fido2_storage_get_user(uint8_t slot, uint8_t *user_id, uint8_t *user_id_len, char *user_name, size_t user_name_max)
Loads user handle and optional user name for a credential slot.
bool fido2_storage_sign_der(uint8_t slot, const uint8_t *msg, uint16_t msg_len, uint8_t *signature, uint8_t *sig_len)
Signs data and returns DER-encoded signature for U2F compatibility.
uint32_t fido2_storage_counter_get(void)
Returns current global authentication counter.
uint8_t fido2_storage_ecc_start(void)
Returns configured ECC start slot.
bool fido2_storage_get_credential(uint8_t slot, fido2_credential_info_t *info)
Credential create/read/delete operations.
bool fido2_storage_verify_cred_id(uint8_t slot, const uint8_t *cred_id)
Verifies credential-id for logical slot.
bool fido2_storage_delete_credential(uint8_t slot)
Deletes credential and associated slot data.
bool fido2_storage_counter_increment(void)
Increments and persists global authentication counter.
uint8_t fido2_storage_find_by_rp_resident(const uint8_t *rp_id_hash, uint8_t *out_slots, uint8_t max_slots)
Finds resident credentials matching RP hash.
bool fido2_storage_get_cred_id(uint8_t slot, uint8_t *out_cred_id)
Builds credential-id blob for logical slot.
int8_t fido2_storage_find_slot_by_cred_id(const uint8_t *cred_id, uint16_t cred_id_len)
Resolves and verifies logical slot from credential-id blob.
bool fido2_storage_get_pubkey(uint8_t slot, uint8_t *pubkey)
Reads public key from secure-element slot.
void fido2_storage_set_slot_range(uint8_t ecc_start, uint8_t ecc_end, uint16_t rmem_start, uint16_t rmem_end)
Configures FIDO2 storage slot ranges.
uint8_t fido2_storage_get_curve(uint8_t slot)
Returns stored curve identifier for slot.
bool fido2_storage_create_credential(const char *rp_id, const uint8_t *rp_id_hash, const uint8_t *user_id, uint8_t user_id_len, const char *user_name, bool resident_key, uint8_t cred_protect, uint8_t curve, uint8_t *out_slot, uint8_t *out_cred_id, uint8_t *out_pubkey)
Creates or replaces credential in secure-element storage.
uint16_t fido2_storage_rmem_end(void)
Returns configured RMEM end slot.
uint8_t fido2_storage_find_by_rp(const uint8_t *rp_id_hash, uint8_t *out_slots, uint8_t max_slots)
Finds credentials matching RP hash.
uint32_t fido2_storage_increment_sign_count(uint8_t slot)
Increments per-credential sign counter and persists metadata.
bool fido2_storage_slot_used(uint8_t slot)
Checks whether logical slot is occupied.
uint8_t fido2_storage_init(void)
Initialization and cache rebuild routines.
int8_t fido2_storage_find_free_slot(void)
Finds first unused logical slot.
bool fido2_storage_is_resident(uint8_t slot)
Returns resident-key flag for slot.
int8_t fido2_storage_find_by_rp_user(const uint8_t *rp_id_hash, const uint8_t *user_id, uint8_t user_id_len)
Finds credential by RP hash and user handle for replacement logic.
void fido2_storage_counter_load(void)
NVS-backed global authentication counter operations.