diff --git a/fido2/ctaphid.c b/fido2/ctaphid.c index 46d5523..e67cbb0 100644 --- a/fido2/ctaphid.c +++ b/fido2/ctaphid.c @@ -223,7 +223,6 @@ static int buffer_packet(CTAPHID_PACKET * pkt) static void buffer_reset() { - ctap_buffer_bcnt = 0; ctap_buffer_offset = 0; ctap_packet_seq = 0; @@ -363,7 +362,12 @@ void ctaphid_check_timeouts() { printf1(TAG_HID, "TIMEOUT CID: %08x\n", CIDS[i].cid); ctaphid_send_error(CIDS[i].cid, CTAP1_ERR_TIMEOUT); - memset(CIDS + i, 0, sizeof(struct CID)); + CIDS[i].busy = 0; + if (CIDS[i].cid == buffer_cid()) + { + buffer_reset(); + } + // memset(CIDS + i, 0, sizeof(struct CID)); } } @@ -447,12 +451,20 @@ static int ctaphid_buffer_packet(uint8_t * pkt_raw, uint8_t * cmd, uint32_t * ci } else { - // Check if matches existing CID if (pkt->cid == CTAPHID_BROADCAST_CID) { *cmd = CTAP1_ERR_INVALID_CHANNEL; return HID_ERROR; } + + if (! cid_exists(pkt->cid) && ! is_cont_pkt(pkt)) + { + if (buffer_status() == EMPTY) + { + add_cid(pkt->cid); + } + } + if (cid_exists(pkt->cid)) { if (buffer_status() == BUFFERING) @@ -466,9 +478,17 @@ static int ctaphid_buffer_packet(uint8_t * pkt_raw, uint8_t * cmd, uint32_t * ci } else if (pkt->cid != buffer_cid()) { - printf2(TAG_ERR,"BUSY with %08x\n", buffer_cid()); - *cmd = CTAP1_ERR_CHANNEL_BUSY; - return HID_ERROR; + if (! is_cont_pkt(pkt)) + { + printf2(TAG_ERR,"BUSY with %08x\n", buffer_cid()); + *cmd = CTAP1_ERR_CHANNEL_BUSY; + return HID_ERROR; + } + else + { + printf2(TAG_ERR,"ignoring random cont packet from %04x\n",pkt->cid); + return HID_IGNORE; + } } } if (! is_cont_pkt(pkt)) @@ -484,10 +504,11 @@ static int ctaphid_buffer_packet(uint8_t * pkt_raw, uint8_t * cmd, uint32_t * ci { if (buffer_status() == EMPTY || pkt->cid != buffer_cid()) { - printf2(TAG_ERR,"ignoring random cont packet\n"); + printf2(TAG_ERR,"ignoring random cont packet from %04x\n",pkt->cid); return HID_IGNORE; } } + if (buffer_packet(pkt) == SEQUENCE_ERROR) { printf2(TAG_ERR,"Buffering sequence error\n"); @@ -544,7 +565,10 @@ uint8_t ctaphid_handle_packet(uint8_t * pkt_raw) if (bufstatus == HID_ERROR) { cid_del(cid); - buffer_reset(); + if (cmd == CTAP1_ERR_INVALID_SEQ) + { + buffer_reset(); + } ctaphid_send_error(cid, cmd); return 0; } diff --git a/targets/stm32l442/lib/usbd/usbd_hid.h b/targets/stm32l442/lib/usbd/usbd_hid.h index 4d61cb6..03dcb89 100644 --- a/targets/stm32l442/lib/usbd/usbd_hid.h +++ b/targets/stm32l442/lib/usbd/usbd_hid.h @@ -66,7 +66,7 @@ #define HID_DESCRIPTOR_TYPE 0x21U #define HID_REPORT_DESC 0x22U -#define HID_BINTERVAL 10 +#define HID_BINTERVAL 5 #define HID_REQ_SET_PROTOCOL 0x0BU #define HID_REQ_GET_PROTOCOL 0x03U diff --git a/targets/stm32l442/src/crypto.c b/targets/stm32l442/src/crypto.c index c2562a7..be437b8 100644 --- a/targets/stm32l442/src/crypto.c +++ b/targets/stm32l442/src/crypto.c @@ -68,7 +68,7 @@ void crypto_load_master_secret(uint8_t * key) void crypto_reset_master_secret() { memset(master_secret, 0, 64); - memset(transport_secret, 0, 64); + memset(transport_secret, 0, 32); ctap_generate_rng(master_secret, 64); ctap_generate_rng(transport_secret, 32); } diff --git a/targets/stm32l442/src/device.c b/targets/stm32l442/src/device.c index 2033b47..3f118ac 100644 --- a/targets/stm32l442/src/device.c +++ b/targets/stm32l442/src/device.c @@ -48,7 +48,7 @@ void TIM6_DAC_IRQHandler() // timer is only 16 bits, so roll it over here TIM6->SR = 0; __90_ms += 1; - if ((millis() - __last_update) > 5) + if ((millis() - __last_update) > 8) { if (__device_status != CTAPHID_STATUS_IDLE) { @@ -376,8 +376,6 @@ do { goto fail; } - if (! IS_BUTTON_PRESSED()) - continue; delay(1); ret = handle_packets(); if (ret) return ret;