CDC Badge OS
Firmware for the CDC Badge v1.0 hardware security key
Loading...
Searching...
No Matches
ISecureElement.h
Go to the documentation of this file.
1#pragma once
2
3#include "cdc_core/IService.h"
4#include <cstdint>
5#include <cstddef>
6
7namespace cdc::hal {
8
12enum class EccCurve : uint8_t {
13 P256, // NIST P-256 (secp256r1)
14 ED25519 // Ed25519
15};
16
22inline uint8_t curveByte(EccCurve c) {
23 return (c == EccCurve::ED25519) ? 0 : 1;
24}
25
31inline EccCurve curveFromByte(uint8_t b) {
32 return (b == 0) ? EccCurve::ED25519 : EccCurve::P256;
33}
34
38enum class SeResult : uint8_t {
39 OK, // Success
40 ERROR, // Generic error
41 SESSION_REQUIRED, // No active session
42 SLOT_EMPTY, // Key slot is empty
43 SLOT_OCCUPIED, // Slot already has a key
44 INVALID_PARAM, // Invalid parameter
45 ALARM_MODE, // Chip in alarm mode (tamper detected)
46 NOT_SUPPORTED // Operation not supported
47};
48
59public:
60 // Slot limits
61 static constexpr uint8_t ECC_SLOT_COUNT = 32;
62 static constexpr uint16_t RMEM_SLOT_COUNT = 512;
63 // Minimum guaranteed slot size across all supported TROPIC01 Application
64 // FW versions. Use for static layouts that must remain stable when the
65 // chip is reflashed with older FW; query getRmemSlotSize() for the actual
66 // runtime capability.
67 static constexpr uint16_t RMEM_SLOT_SIZE = 444;
68 // Stack-buffer ceiling sized for the largest known FW (>= 2.0 reports 475).
69 static constexpr uint16_t RMEM_SLOT_SIZE_MAX = 475;
70 static constexpr uint8_t RMEM_NAME_LEN = 16;
71
72 virtual ~ISecureElement() = default;
73
74 // === Session Management ===
75
79 virtual bool sessionStart() = 0;
80
84 virtual void sessionEnd() = 0;
85
89 virtual bool isSessionActive() const = 0;
90
94 virtual void sleep() = 0;
95
96 // === ECC Key Operations ===
97
103 virtual SeResult eccGenerate(uint8_t slot, EccCurve curve) = 0;
104
111 virtual SeResult eccImport(uint8_t slot, const uint8_t* privKey, EccCurve curve) = 0;
112
119 virtual SeResult eccGetPublicKey(uint8_t slot, uint8_t* pubKey, EccCurve* curve = nullptr) = 0;
120
124 virtual SeResult eccDelete(uint8_t slot) = 0;
125
129 virtual bool eccSlotUsed(uint8_t slot) const = 0;
130
131 // === Signing Operations ===
132
142 virtual SeResult ecdsaSign(uint8_t slot, const uint8_t* msg, size_t msgLen,
143 uint8_t* sig, size_t* sigLen) = 0;
144
152 virtual SeResult eddsaSign(uint8_t slot, const uint8_t* msg, size_t msgLen,
153 uint8_t* sig) = 0;
154
155 // === R-Memory Operations ===
156
164 virtual SeResult rmemRead(uint16_t slot, uint8_t* data, uint16_t maxLen,
165 uint16_t* actualLen) = 0;
166
173 virtual SeResult rmemWrite(uint16_t slot, const uint8_t* data, uint16_t len) = 0;
174
178 virtual SeResult rmemErase(uint16_t slot) = 0;
179
183 virtual bool rmemSlotUsed(uint16_t slot) const = 0;
184
185 // === R-Memory Header Helpers ===
186
187 struct __attribute__((packed)) RMemHeader {
188 uint8_t magic;
189 uint8_t checksum;
190 uint8_t moduleId;
191 uint8_t flags;
192 char name[RMEM_NAME_LEN];
193 uint16_t payloadLen;
194 };
195
199 virtual SeResult rmemWriteWithHeader(uint16_t slot, uint8_t moduleId,
200 const char* name, uint8_t flags,
201 const uint8_t* payload, uint16_t payloadLen) = 0;
202
206 virtual SeResult rmemReadWithHeader(uint16_t slot, RMemHeader* headerOut,
207 uint8_t* payloadOut, uint16_t payloadMax,
208 uint16_t* payloadLenOut) = 0;
209
210 // === Random Number Generator ===
211
219 virtual bool getRandom(uint8_t* buffer, uint16_t size) = 0;
220
229 virtual bool getRandomStrict(uint8_t* buffer, uint16_t size) = 0;
230
231 // === Diagnostics ===
232
236 virtual bool getChipId(uint8_t* serialNum, uint8_t size) = 0;
237
242 virtual bool getFwVersion(uint8_t riscvVer[4], uint8_t spectVer[4]) = 0;
243
249 virtual uint16_t getRmemSlotSize() const = 0;
250};
251
252// Factory function to get secure element instance
254
255} // namespace cdc::hal
char name[cdc::hal::ISecureElement::RMEM_NAME_LEN]
uint8_t flags
uint8_t moduleId
virtual SeResult eccGenerate(uint8_t slot, EccCurve curve)=0
virtual void sessionEnd()=0
virtual bool rmemSlotUsed(uint16_t slot) const =0
virtual bool getRandom(uint8_t *buffer, uint16_t size)=0
virtual SeResult rmemWriteWithHeader(uint16_t slot, uint8_t moduleId, const char *name, uint8_t flags, const uint8_t *payload, uint16_t payloadLen)=0
static constexpr uint16_t RMEM_SLOT_SIZE_MAX
struct __attribute__((packed)) RMemHeader
virtual SeResult ecdsaSign(uint8_t slot, const uint8_t *msg, size_t msgLen, uint8_t *sig, size_t *sigLen)=0
virtual bool getRandomStrict(uint8_t *buffer, uint16_t size)=0
virtual bool eccSlotUsed(uint8_t slot) const =0
static constexpr uint16_t RMEM_SLOT_COUNT
virtual SeResult eccGetPublicKey(uint8_t slot, uint8_t *pubKey, EccCurve *curve=nullptr)=0
virtual SeResult eccImport(uint8_t slot, const uint8_t *privKey, EccCurve curve)=0
virtual bool getFwVersion(uint8_t riscvVer[4], uint8_t spectVer[4])=0
virtual bool getChipId(uint8_t *serialNum, uint8_t size)=0
virtual bool sessionStart()=0
virtual SeResult eccDelete(uint8_t slot)=0
virtual uint16_t getRmemSlotSize() const =0
static constexpr uint8_t RMEM_NAME_LEN
static constexpr uint16_t RMEM_SLOT_SIZE
virtual SeResult rmemWrite(uint16_t slot, const uint8_t *data, uint16_t len)=0
static constexpr uint8_t ECC_SLOT_COUNT
virtual SeResult eddsaSign(uint8_t slot, const uint8_t *msg, size_t msgLen, uint8_t *sig)=0
virtual SeResult rmemErase(uint16_t slot)=0
virtual bool isSessionActive() const =0
virtual ~ISecureElement()=default
virtual SeResult rmemRead(uint16_t slot, uint8_t *data, uint16_t maxLen, uint16_t *actualLen)=0
virtual void sleep()=0
virtual SeResult rmemReadWithHeader(uint16_t slot, RMemHeader *headerOut, uint8_t *payloadOut, uint16_t payloadMax, uint16_t *payloadLenOut)=0
uint8_t curve
uint8_t curveByte(EccCurve c)
Maps an EccCurve to the module-level curve byte.
EccCurve curveFromByte(uint8_t b)
Maps a curve byte to its EccCurve enum.
ISecureElement * getSecureElementInstance()
Returns singleton secure-element stub instance.