u2f works with extended apdu and now user presence not needs if request come from nfc and power from usb
This commit is contained in:
parent
4d9285085f
commit
315b6564ab
@ -105,6 +105,8 @@ void device_set_clock_rate(DEVICE_CLOCK_RATE param);
|
|||||||
#define NFC_IS_AVAILABLE 2
|
#define NFC_IS_AVAILABLE 2
|
||||||
int device_is_nfc();
|
int device_is_nfc();
|
||||||
|
|
||||||
|
void request_from_nfc(bool request_active);
|
||||||
|
|
||||||
void device_init_button();
|
void device_init_button();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
10
fido2/u2f.c
10
fido2/u2f.c
@ -113,14 +113,14 @@ end:
|
|||||||
printf1(TAG_U2F,"u2f resp: "); dump_hex1(TAG_U2F, _u2f_resp->data, _u2f_resp->length);
|
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;
|
return;
|
||||||
|
|
||||||
uint32_t alen = req[4];
|
request_from_nfc(true); // disable presence test
|
||||||
|
u2f_request_ex((APDU_HEADER *)header, data, datalen, resp);
|
||||||
u2f_request_ex((APDU_HEADER *)req, &req[5], alen, resp);
|
request_from_nfc(false); // enable presence test
|
||||||
}
|
}
|
||||||
|
|
||||||
void u2f_request(struct u2f_request_apdu* req, CTAP_RESPONSE * resp)
|
void u2f_request(struct u2f_request_apdu* req, CTAP_RESPONSE * resp)
|
||||||
|
@ -101,7 +101,7 @@ void u2f_request(struct u2f_request_apdu* req, CTAP_RESPONSE * resp);
|
|||||||
// u2f_request send a U2F message to NFC protocol
|
// u2f_request send a U2F message to NFC protocol
|
||||||
// @req data with iso7816 apdu message
|
// @req data with iso7816 apdu message
|
||||||
// @len data length
|
// @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);
|
int8_t u2f_authenticate_credential(struct u2f_key_handle * kh, uint8_t * appid);
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ uint32_t __last_update = 0;
|
|||||||
extern PCD_HandleTypeDef hpcd;
|
extern PCD_HandleTypeDef hpcd;
|
||||||
static int _NFC_status = 0;
|
static int _NFC_status = 0;
|
||||||
static bool isLowFreq = 0;
|
static bool isLowFreq = 0;
|
||||||
|
static bool _RequestComeFromNFC = false;
|
||||||
|
|
||||||
// #define IS_BUTTON_PRESSED() (0 == (LL_GPIO_ReadInputPort(SOLO_BUTTON_PORT) & SOLO_BUTTON_PIN))
|
// #define IS_BUTTON_PRESSED() (0 == (LL_GPIO_ReadInputPort(SOLO_BUTTON_PORT) & SOLO_BUTTON_PIN))
|
||||||
static int is_physical_button_pressed()
|
static int is_physical_button_pressed()
|
||||||
@ -57,6 +58,10 @@ static int is_touch_button_pressed()
|
|||||||
|
|
||||||
int (*IS_BUTTON_PRESSED)() = is_physical_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.
|
// Timer6 overflow handler. happens every ~90ms.
|
||||||
void TIM6_DAC_IRQHandler()
|
void TIM6_DAC_IRQHandler()
|
||||||
{
|
{
|
||||||
@ -491,7 +496,7 @@ static int handle_packets()
|
|||||||
int ctap_user_presence_test(uint32_t up_delay)
|
int ctap_user_presence_test(uint32_t up_delay)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
if (device_is_nfc() == NFC_IS_ACTIVE)
|
if (device_is_nfc() == NFC_IS_ACTIVE || _RequestComeFromNFC)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -555,7 +555,7 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
// SystemClock_Config_LF32();
|
// SystemClock_Config_LF32();
|
||||||
// delay(300);
|
// delay(300);
|
||||||
if (device_is_nfc() == NFC_IS_ACTIVE) device_set_clock_rate(DEVICE_LOW_POWER_FAST);
|
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 (device_is_nfc() == NFC_IS_ACTIVE) device_set_clock_rate(DEVICE_LOW_POWER_IDLE);
|
||||||
// if (!WTX_off())
|
// if (!WTX_off())
|
||||||
// return;
|
// return;
|
||||||
@ -585,7 +585,7 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
|
|
||||||
timestamp();
|
timestamp();
|
||||||
// WTX_on(WTX_TIME_DEFAULT);
|
// 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())
|
// if (!WTX_off())
|
||||||
// return;
|
// return;
|
||||||
|
|
||||||
@ -604,8 +604,10 @@ void nfc_process_iblock(uint8_t * buf, int len)
|
|||||||
printf1(TAG_NFC, "FIDO2 CTAP message. %d\r\n", timestamp());
|
printf1(TAG_NFC, "FIDO2 CTAP message. %d\r\n", timestamp());
|
||||||
|
|
||||||
WTX_on(WTX_TIME_DEFAULT);
|
WTX_on(WTX_TIME_DEFAULT);
|
||||||
|
request_from_nfc(true);
|
||||||
ctap_response_init(&ctap_resp);
|
ctap_response_init(&ctap_resp);
|
||||||
status = ctap_request(apdu.data, apdu.lc, &ctap_resp);
|
status = ctap_request(apdu.data, apdu.lc, &ctap_resp);
|
||||||
|
request_from_nfc(false);
|
||||||
if (!WTX_off())
|
if (!WTX_off())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user