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 <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos 2022-10-29 19:41:00 +02:00
parent 5bdc7ab202
commit 4a8a6728c7
No known key found for this signature in database
GPG key ID: C0095B7870A4CCD3
2 changed files with 4 additions and 5 deletions

View file

@ -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

View file

@ -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)