From 3ccd6e827f2814e13cba85d4c5f85642a72b4803 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 1 Jun 2026 01:43:25 +0200 Subject: [PATCH] Add cancel button event. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/fido/cbor_reset.c | 2 +- src/fido/cbor_selection.c | 9 ++++++++- src/fido/cmd_authenticate.c | 2 +- src/fido/cmd_register.c | 2 +- src/fido/fido.c | 14 ++++++++++---- src/fido/fido.h | 2 +- 7 files changed, 23 insertions(+), 10 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index eb26a96..49edef1 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit eb26a96d3b50decb52833a646de34e2fe042d300 +Subproject commit 49edef1d3f222ab93535a5c29095d96f1e6b0e35 diff --git a/src/fido/cbor_reset.c b/src/fido/cbor_reset.c index bca2fa1..8e7ece1 100644 --- a/src/fido/cbor_reset.c +++ b/src/fido/cbor_reset.c @@ -35,7 +35,7 @@ int cbor_reset(void) { return CTAP2_ERR_NOT_ALLOWED; } #endif - if (wait_button_pressed() == true) { + if (wait_button_pressed() > 0) { return CTAP2_ERR_USER_ACTION_TIMEOUT; } #endif diff --git a/src/fido/cbor_selection.c b/src/fido/cbor_selection.c index 9a3a073..3540e80 100644 --- a/src/fido/cbor_selection.c +++ b/src/fido/cbor_selection.c @@ -20,9 +20,16 @@ #include "ctap2_cbor.h" #include "ctap.h" +extern char *rp_id, *user_name, *display_name; + int cbor_selection(void) { - if (wait_button_pressed() == true) { + rp_id = user_name = display_name = NULL; + int ret = wait_button_pressed() ; + if (ret == 1) { return CTAP2_ERR_USER_ACTION_TIMEOUT; } + else if (ret == 2) { + return CTAP2_ERR_OPERATION_DENIED; + } return CTAP2_OK; } diff --git a/src/fido/cmd_authenticate.c b/src/fido/cmd_authenticate.c index 5fee89b..2063bc2 100644 --- a/src/fido/cmd_authenticate.c +++ b/src/fido/cmd_authenticate.c @@ -34,7 +34,7 @@ int cmd_authenticate(void) { if (req->keyHandleLen < KEY_HANDLE_LEN) { return SW_INCORRECT_PARAMS(); } - if (P1(apdu) == CTAP_AUTH_ENFORCE && wait_button_pressed() == true) { + if (P1(apdu) == CTAP_AUTH_ENFORCE && wait_button_pressed() > 0) { return SW_CONDITIONS_NOT_SATISFIED(); } diff --git a/src/fido/cmd_register.c b/src/fido/cmd_register.c index 8b3156a..06e0026 100644 --- a/src/fido/cmd_register.c +++ b/src/fido/cmd_register.c @@ -63,7 +63,7 @@ int cmd_register(void) { if (apdu.nc != CTAP_APPID_SIZE + CTAP_CHAL_SIZE) { return SW_WRONG_LENGTH(); } - if (wait_button_pressed() == true) { + if (wait_button_pressed() > 0) { return SW_CONDITIONS_NOT_SATISFIED(); } if (memcmp(req->appId, bogus_firefox, diff --git a/src/fido/fido.c b/src/fido/fido.c index 0b000d0..b72878a 100644 --- a/src/fido/fido.c +++ b/src/fido/fido.c @@ -498,22 +498,28 @@ void init_fido(void) { needs_power_cycle = false; } -bool wait_button_pressed(void) { +int wait_button_pressed(void) { uint32_t val = EV_PRESS_BUTTON; #if defined(PICO_PLATFORM) || defined(ESP_PLATFORM) queue_try_add(&card_to_usb_q, &val); do { queue_remove_blocking(&usb_to_card_q, &val); - } while (val != EV_BUTTON_PRESSED && val != EV_BUTTON_TIMEOUT); + } while (val != EV_BUTTON_PRESSED && val != EV_BUTTON_TIMEOUT && val != EV_BUTTON_CANCELLED); #endif - return val == EV_BUTTON_TIMEOUT; + if (val == EV_BUTTON_TIMEOUT) { + return 1; + } + else if (val == EV_BUTTON_CANCELLED) { + return 2; + } + return 0; } uint32_t user_present_time_limit = 0; bool check_user_presence(void) { if (user_present_time_limit == 0 || user_present_time_limit + TRANSPORT_TIME_LIMIT < board_millis()) { - if (wait_button_pressed() == true) { //timeout + if (wait_button_pressed() > 0) { //timeout return false; } //user_present_time_limit = board_millis(); diff --git a/src/fido/fido.h b/src/fido/fido.h index 68d36b3..a395eb2 100644 --- a/src/fido/fido.h +++ b/src/fido/fido.h @@ -41,7 +41,7 @@ extern int derive_key(const uint8_t *app_id, int, mbedtls_ecp_keypair *key); extern int verify_key(const uint8_t *appId, const uint8_t *keyHandle, mbedtls_ecp_keypair *); -extern bool wait_button_pressed(void); +extern int wait_button_pressed(void); extern void init_fido(void); extern void init_otp(void); extern void scan_all(void);