diff --git a/src/fido/cmd_authenticate.c b/src/fido/cmd_authenticate.c index a03c830..4b48842 100644 --- a/src/fido/cmd_authenticate.c +++ b/src/fido/cmd_authenticate.c @@ -62,9 +62,13 @@ int cmd_authenticate() { return SW_WRONG_DATA(); return SW_CONDITIONS_NOT_SATISFIED(); } - resp->flags = 0x1; - resp->ctr[0] = 0; - uint8_t hash[32], sig_base[U2F_APPID_SIZE+1+4+U2F_CHAL_SIZE]; + resp->flags = P1(apdu) == 0x03 ? 0x1 : 0x0; + uint32_t ctr = *(uint32_t *)file_get_data(ef_counter); + resp->ctr[0] = ctr >> 24; + resp->ctr[1] = ctr >> 16; + resp->ctr[2] = ctr >> 8; + resp->ctr[3] = ctr & 0xff; + uint8_t hash[32], sig_base[U2F_APPID_SIZE + 1 + 4 + U2F_CHAL_SIZE]; memcpy(sig_base, req->appId, U2F_APPID_SIZE); memcpy(sig_base+U2F_APPID_SIZE, &resp->flags, sizeof(uint8_t)); memcpy(sig_base + U2F_APPID_SIZE + 1, resp->ctr, 4); @@ -80,5 +84,9 @@ int cmd_authenticate() { if (ret != 0) return SW_EXEC_ERROR(); res_APDU_size = 1 + 4 + olen; + + ctr++; + flash_write_data_to_file(ef_counter, (uint8_t *)&ctr, sizeof(ctr)); + low_flash_available(); return SW_OK(); } diff --git a/src/fido/fido.c b/src/fido/fido.c index c5498aa..433e4ee 100644 --- a/src/fido/fido.c +++ b/src/fido/fido.c @@ -183,6 +183,16 @@ int scan_files() { else { printf("FATAL ERROR: CERT DEV not found in memory!\r\n"); } + ef_counter = search_by_fid(EF_COUNTER, NULL, SPECIFY_EF); + if (ef_counter) { + if (file_get_size(ef_counter) == 0 || !ef_counter->data) { + uint32_t v = 0; + flash_write_data_to_file(ef_counter, (uint8_t *)&v, sizeof(v)); + } + } + else { + printf("FATAL ERROR: Global counter not found in memory!\r\n"); + } low_flash_available(); return CCID_OK; } diff --git a/src/fido/files.c b/src/fido/files.c index 8072c83..4c031c8 100644 --- a/src/fido/files.c +++ b/src/fido/files.c @@ -22,6 +22,7 @@ file_t file_entries[] = { {.fid = 0x3f00, .parent = 0xff, .name = NULL, .type = FILE_TYPE_DF, .data = NULL, .ef_structure = 0, .acl = {0}}, // MF {.fid = EF_KEY_DEV, .parent = 0, .name = NULL, .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH | FILE_PERSISTENT, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0xff}}, // Device Key {.fid = EF_EE_DEV, .parent = 0, .name = NULL, .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH | FILE_PERSISTENT, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0xff}}, // End Entity Certificate Device + {.fid = EF_COUNTER, .parent = 0, .name = NULL, .type = FILE_TYPE_INTERNAL_EF | FILE_DATA_FLASH, .data = NULL, .ef_structure = FILE_EF_TRANSPARENT, .acl = {0xff}}, // Global counter { .fid = 0x0000, .parent = 0xff, .name = NULL, .type = FILE_TYPE_UNKNOWN, .data = NULL, .ef_structure = 0, .acl = {0} } //end }; @@ -29,3 +30,4 @@ const file_t *MF = &file_entries[0]; const file_t *file_last = &file_entries[sizeof(file_entries)/sizeof(file_t)-1]; file_t *ef_keydev = NULL; file_t *ef_certdev = NULL; +file_t *ef_counter = NULL; diff --git a/src/fido/files.h b/src/fido/files.h index d59904a..950cec7 100644 --- a/src/fido/files.h +++ b/src/fido/files.h @@ -22,8 +22,10 @@ #define EF_KEY_DEV 0xCC00 #define EF_EE_DEV 0xCE00 +#define EF_COUNTER 0xC000 extern file_t *ef_keydev; extern file_t *ef_certdev; +extern file_t *ef_counter; #endif //_FILES_H_