diff --git a/fido2/device.h b/fido2/device.h index dfb95ec..0c11fe8 100644 --- a/fido2/device.h +++ b/fido2/device.h @@ -105,6 +105,8 @@ void device_set_clock_rate(DEVICE_CLOCK_RATE param); #define NFC_IS_AVAILABLE 2 int device_is_nfc(); +void request_from_nfc(bool request_active); + void device_init_button(); #endif diff --git a/fido2/u2f.c b/fido2/u2f.c index 14cb848..7999ab2 100644 --- a/fido2/u2f.c +++ b/fido2/u2f.c @@ -113,14 +113,14 @@ end: printf1(TAG_U2F,"u2f resp: "); dump_hex1(TAG_U2F, _u2f_resp->data, _u2f_resp->length); } -void u2f_request_nfc(uint8_t * req, int len, CTAP_RESPONSE * resp) +void u2f_request_nfc(uint8_t * header, uint8_t * data, int datalen, CTAP_RESPONSE * resp) { - if (len < 5 || !req) + if (!header) return; - uint32_t alen = req[4]; - - u2f_request_ex((APDU_HEADER *)req, &req[5], alen, resp); + request_from_nfc(true); // disable presence test + u2f_request_ex((APDU_HEADER *)header, data, datalen, resp); + request_from_nfc(false); // enable presence test } void u2f_request(struct u2f_request_apdu* req, CTAP_RESPONSE * resp) diff --git a/fido2/u2f.h b/fido2/u2f.h index 9055b36..ad73cc9 100644 --- a/fido2/u2f.h +++ b/fido2/u2f.h @@ -101,7 +101,7 @@ void u2f_request(struct u2f_request_apdu* req, CTAP_RESPONSE * resp); // u2f_request send a U2F message to NFC protocol // @req data with iso7816 apdu message // @len data length -void u2f_request_nfc(uint8_t * req, int len, CTAP_RESPONSE * resp); +void u2f_request_nfc(uint8_t * header, uint8_t * data, int datalen, CTAP_RESPONSE * resp); int8_t u2f_authenticate_credential(struct u2f_key_handle * kh, uint8_t * appid); diff --git a/targets/stm32l432/src/device.c b/targets/stm32l432/src/device.c index ae441fc..6289189 100644 --- a/targets/stm32l432/src/device.c +++ b/targets/stm32l432/src/device.c @@ -43,6 +43,7 @@ uint32_t __last_update = 0; extern PCD_HandleTypeDef hpcd; static int _NFC_status = 0; static bool isLowFreq = 0; +static bool _RequestComeFromNFC = false; // #define IS_BUTTON_PRESSED() (0 == (LL_GPIO_ReadInputPort(SOLO_BUTTON_PORT) & SOLO_BUTTON_PIN)) static int is_physical_button_pressed() @@ -57,6 +58,10 @@ static int is_touch_button_pressed() int (*IS_BUTTON_PRESSED)() = is_physical_button_pressed; +void request_from_nfc(bool request_active) { + _RequestComeFromNFC = request_active; +} + // Timer6 overflow handler. happens every ~90ms. void TIM6_DAC_IRQHandler() { @@ -491,7 +496,7 @@ static int handle_packets() int ctap_user_presence_test(uint32_t up_delay) { int ret; - if (device_is_nfc() == NFC_IS_ACTIVE) + if (device_is_nfc() == NFC_IS_ACTIVE || _RequestComeFromNFC) { return 1; } diff --git a/targets/stm32l432/src/nfc.c b/targets/stm32l432/src/nfc.c index 16d41aa..2c1b34d 100644 --- a/targets/stm32l432/src/nfc.c +++ b/targets/stm32l432/src/nfc.c @@ -555,7 +555,7 @@ void nfc_process_iblock(uint8_t * buf, int len) // SystemClock_Config_LF32(); // delay(300); if (device_is_nfc() == NFC_IS_ACTIVE) device_set_clock_rate(DEVICE_LOW_POWER_FAST); - u2f_request_nfc(&buf[block_offset], len - block_offset, &ctap_resp); + u2f_request_nfc(&buf[block_offset], apdu.data, apdu.lc, &ctap_resp); if (device_is_nfc() == NFC_IS_ACTIVE) device_set_clock_rate(DEVICE_LOW_POWER_IDLE); // if (!WTX_off()) // return; @@ -585,7 +585,7 @@ void nfc_process_iblock(uint8_t * buf, int len) timestamp(); // WTX_on(WTX_TIME_DEFAULT); - u2f_request_nfc(&buf[block_offset], len - block_offset, &ctap_resp); + u2f_request_nfc(&buf[block_offset], apdu.data, apdu.lc, &ctap_resp); // if (!WTX_off()) // return; @@ -604,8 +604,10 @@ void nfc_process_iblock(uint8_t * buf, int len) printf1(TAG_NFC, "FIDO2 CTAP message. %d\r\n", timestamp()); WTX_on(WTX_TIME_DEFAULT); + request_from_nfc(true); ctap_response_init(&ctap_resp); status = ctap_request(apdu.data, apdu.lc, &ctap_resp); + request_from_nfc(false); if (!WTX_off()) return;