From 4a8a6728c79f9a6ef5500ea6c1fa889a8e49ba69 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Sat, 29 Oct 2022 19:41:00 +0200 Subject: [PATCH] Adding support for specific vendor HID command (0x41). It is a self implementation, based on CBOR command. data[0] conveys the command and the contents mapped in CBOR encoding. The map uses the authConfig template, where the fist item in the map is the subcommand (enable/disable at this moment), the second is a map of the parameters, the third and fourth are the pinUvParam and pinUvProtocol. With this format only a single vendor HID command is necessary (0x41), which will be used for all my own commands, by using the command id in data[0] like with CBOR. Signed-off-by: Pol Henarejos --- src/usb/hid/ctap_hid.h | 1 - src/usb/hid/hid.c | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/usb/hid/ctap_hid.h b/src/usb/hid/ctap_hid.h index 0f8a368..a74433b 100644 --- a/src/usb/hid/ctap_hid.h +++ b/src/usb/hid/ctap_hid.h @@ -91,7 +91,6 @@ typedef struct { #define CTAPHID_ERROR (TYPE_INIT | 0x3F) // Error response #define CTAPHID_VENDOR_FIRST (TYPE_INIT | 0x40) // First vendor defined command -#define CTAPHID_VD_PROTECT (TYPE_INIT | 0x41) // #define CTAPHID_VENDOR_LAST (TYPE_INIT | 0x7F) // Last vendor defined command // CTAP_KEEPALIVE command defines diff --git a/src/usb/hid/hid.c b/src/usb/hid/hid.c index 002a02f..eccf7ad 100644 --- a/src/usb/hid/hid.c +++ b/src/usb/hid/hid.c @@ -24,7 +24,7 @@ #include "bsp/board.h" static bool mounted = false; -extern int cbor_process(const uint8_t *, size_t); +extern int cbor_process(uint8_t, const uint8_t *, size_t); extern void init_fido(bool); typedef struct msg_packet { @@ -293,15 +293,15 @@ int driver_process_usb_packet(uint16_t read) { msg_packet.len = msg_packet.current_len = 0; last_packet_time = 0; } - else if (last_cmd == CTAPHID_CBOR && (msg_packet.len == 0 || (msg_packet.len == msg_packet.current_len && msg_packet.len > 0))) { + else if ((last_cmd == CTAPHID_CBOR || (last_cmd >= CTAPHID_VENDOR_FIRST && last_cmd <= CTAPHID_VENDOR_LAST)) && (msg_packet.len == 0 || (msg_packet.len == msg_packet.current_len && msg_packet.len > 0))) { if (thread_type != 2) card_start(cbor_thread); thread_type = 2; if (msg_packet.current_len == msg_packet.len && msg_packet.len > 0) - apdu_sent = cbor_process(msg_packet.data, msg_packet.len); + apdu_sent = cbor_process(last_cmd, msg_packet.data, msg_packet.len); else - apdu_sent = cbor_process(ctap_req->init.data, MSG_LEN(ctap_req)); + apdu_sent = cbor_process(last_cmd, ctap_req->init.data, MSG_LEN(ctap_req)); msg_packet.len = msg_packet.current_len = 0; last_packet_time = 0; if (apdu_sent < 0)