12#include <freertos/FreeRTOS.h>
13#include <freertos/queue.h>
16static const char*
TAG =
"FIDO2";
61 uint8_t* buffer, uint16_t reqlen) {
77 uint8_t
const* buffer, uint16_t bufsize) {
89 if (xQueueSend(
s_rx_queue, &pkt, 0) != pdTRUE) {
90 LOG_W(
TAG,
"RX queue full, dropping packet");
109 static Fido2Module inst;
118 LOG_I(
TAG,
"Initializing FIDO2 module");
124 LOG_E(
TAG,
"Failed to create RX queue");
132 if (slotRange_.hasEcc && slotRange_.hasRmem) {
133 uint16_t eccCount =
static_cast<uint16_t
>(slotRange_.eccEnd - slotRange_.eccStart + 1);
134 uint16_t rmemCount =
static_cast<uint16_t
>(slotRange_.rmemEnd - slotRange_.rmemStart + 1);
135 if (rmemCount < eccCount) {
137 getName(),
"FIDO2 R-MEM range smaller than ECC range");
142 slotRange_.rmemStart, slotRange_.rmemEnd);
178 LOG_W(
TAG,
"Failed to register FIDO HID interface");
195 static bool sleepHandlerRegistered =
false;
196 if (!sleepHandlerRegistered) {
200 LOG_I(
TAG,
"Aborted active FIDO2 prompt before sleep");
203 sleepHandlerRegistered =
true;
246 if (!items || maxItems == 0)
return 0;
261 return uxQueueMessagesWaiting(
s_rx_queue) > 0;
281 if (xQueueReceive(
s_rx_queue, &pkt, 0) == pdTRUE) {
294 if (!buffer)
return false;
305 auto&
module = cdc::mod_fido2::Fido2Module::instance();
void mod_fido2_register()
Registers FIDO2 module initializer.
CDC Log: logging over TinyUSB CDC and UART.
#define LOG_W(tag, fmt,...)
#define LOG_I(tag, fmt,...)
#define LOG_E(tag, fmt,...)
static EventBus & instance()
Returns singleton event-bus instance.
static constexpr uint32_t eventMask(EventType type)
void reportModuleError(const char *name, const char *message)
Records and publishes an operational module error by module name.
bool registerModule(IModule *module)
Registers a module instance in the runtime registry.
static ModuleRegistry & instance()
Returns the singleton module registry instance.
void registerInitializer(ModuleInitFunc initFunc)
Registers a deferred module initializer callback.
void clearModuleErrorByName(const char *name)
Clears stored module error by module name.
static UsbManager & instance()
Returns singleton USB manager instance.
void unregisterInterface(UsbHidInterface type, const char *moduleName)
Unregisters a previously registered HID interface.
uint8_t getMenuItems(core::ModuleMenuItem *items, uint8_t maxItems) override
Provides main-menu entry for FIDO2 credential list.
core::IModule::SlotRequest getSlotRequest() const override
Declares slot requirements for FIDO2 module.
static Fido2Module & instance()
Returns the singleton instance of the FIDO2 module.
const char * getName() const override
void setSlotRange(const core::IModule::SlotRange &range) override
Stores slot range assignment.
bool start() override
Starts FIDO2 module, USB HID interface, and core stack.
bool init() override
Initializes FIDO2 module resources and slot mapping.
void stop() override
Stops FIDO2 module and unregisters USB interface.
#define CTAPHID_PACKET_SIZE
bool fido2_is_initialized(void)
Indicates whether FIDO2 subsystem is initialized.
bool fido2_init(void)
Initializes storage, CTAP layers, and starts the processing task.
void fido2_set_user_presence_callback(fido2_user_presence_cb_t cb)
Sets callback used to request user presence for CTAP operations.
bool fido2_storage_counter_flush(void)
No-op flush retained for API stability; per-increment path commits.
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.
cdc::ui::IView * fido2_ui_get_list_view()
Returns FIDO2 credential list view.
bool fido2_usb_available()
Indicates whether at least one USB HID packet is queued for FIDO2.
static uint16_t onFidoGetReport(uint8_t report_id, uint8_t report_type, uint8_t *buffer, uint16_t reqlen)
USB HID callbacks for FIDO transport.
bool fido2_ui_abort_prompt()
Forcibly denies any in-flight user-presence prompt.
static constexpr size_t FIDO_QUEUE_SIZE
Queue for incoming HID reports.
void fido2_ui_init()
Initializes FIDO2 UI resources and list views.
static void onFidoSetReport(uint8_t report_id, uint8_t report_type, uint8_t const *buffer, uint16_t bufsize)
HID SET_REPORT callback queuing incoming CTAPHID packets.
static void onFidoReportComplete(uint8_t const *report, uint16_t len)
HID transfer-complete callback (currently unused).
bool fido2_usb_ready()
Reports whether USB HID endpoint is ready for transmission.
static uint8_t s_hid_instance
HID interface instance index assigned at registration time.
uint16_t fido2_usb_read(uint8_t *buffer)
Reads one queued CTAPHID packet from USB RX queue.
static const uint8_t s_fido_report_desc[]
FIDO U2F HID report descriptor (CTAPHID standard).
static QueueHandle_t s_rx_queue
fido2_user_presence_result_t fido2_ui_user_presence_callback(const char *rp_id, fido2_action_t action, const char *user_name)
User-presence callback used by FIDO2 core for approval prompts.
const char * fido2_ui_get_label()
Returns localized module label for menus.
bool fido2_usb_write(const uint8_t *buffer)
Sends one CTAPHID packet over USB HID.
void(* onReportComplete)(uint8_t const *report, uint16_t len)
void(* onSetReport)(uint8_t report_id, uint8_t report_type, uint8_t const *buffer, uint16_t bufsize)
uint16_t(* onGetReport)(uint8_t report_id, uint8_t report_type, uint8_t *buffer, uint16_t reqlen)
const uint8_t * reportDesc
UsbHidCallbacks callbacks
uint8_t data[CTAPHID_PACKET_SIZE]
bool usb_hid_send_report(uint8_t instance, uint8_t report_id, const uint8_t *data, uint16_t len)
Sends one HID report on the selected interface instance.
bool usb_hid_instance_ready(uint8_t instance)
Returns whether a specific HID instance endpoint is ready.