u2f: check files before register/login (#980)
This commit is contained in:
parent
8cfd0eab9e
commit
40479e1761
@ -28,6 +28,8 @@ static void u2f_scene_main_event_callback(U2fNotifyEvent evt, void* context) {
|
|||||||
view_dispatcher_send_custom_event(app->view_dispatcher, U2fCustomEventConnect);
|
view_dispatcher_send_custom_event(app->view_dispatcher, U2fCustomEventConnect);
|
||||||
else if(evt == U2fNotifyDisconnect)
|
else if(evt == U2fNotifyDisconnect)
|
||||||
view_dispatcher_send_custom_event(app->view_dispatcher, U2fCustomEventDisconnect);
|
view_dispatcher_send_custom_event(app->view_dispatcher, U2fCustomEventDisconnect);
|
||||||
|
else if(evt == U2fNotifyError)
|
||||||
|
view_dispatcher_send_custom_event(app->view_dispatcher, U2fCustomEventDataError);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void u2f_scene_main_timer_callback(void* context) {
|
static void u2f_scene_main_timer_callback(void* context) {
|
||||||
@ -75,10 +77,13 @@ bool u2f_scene_main_on_event(void* context, SceneManagerEvent event) {
|
|||||||
if(app->event_cur != U2fCustomEventNone) {
|
if(app->event_cur != U2fCustomEventNone) {
|
||||||
u2f_confirm_user_present(app->u2f_instance);
|
u2f_confirm_user_present(app->u2f_instance);
|
||||||
}
|
}
|
||||||
|
} else if(event.event == U2fCustomEventDataError) {
|
||||||
|
osTimerStop(app->timer);
|
||||||
|
u2f_view_set_state(app->u2f_view, U2fMsgError);
|
||||||
}
|
}
|
||||||
consumed = true;
|
consumed = true;
|
||||||
} else if(event.type == SceneManagerEventTypeTick) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return consumed;
|
return consumed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +186,13 @@ static uint16_t u2f_register(U2fData* U2F, uint8_t* buf) {
|
|||||||
uint8_t hash[32];
|
uint8_t hash[32];
|
||||||
uint8_t signature[64];
|
uint8_t signature[64];
|
||||||
|
|
||||||
|
if(u2f_data_check(false) == false) {
|
||||||
|
U2F->ready = false;
|
||||||
|
if(U2F->callback != NULL) U2F->callback(U2fNotifyError, U2F->context);
|
||||||
|
memcpy(&buf[0], state_not_supported, 2);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
if(U2F->callback != NULL) U2F->callback(U2fNotifyRegister, U2F->context);
|
if(U2F->callback != NULL) U2F->callback(U2fNotifyRegister, U2F->context);
|
||||||
if(U2F->user_present == false) {
|
if(U2F->user_present == false) {
|
||||||
memcpy(&buf[0], state_user_missing, 2);
|
memcpy(&buf[0], state_user_missing, 2);
|
||||||
@ -250,6 +257,13 @@ static uint16_t u2f_authenticate(U2fData* U2F, uint8_t* buf) {
|
|||||||
uint8_t hash[32];
|
uint8_t hash[32];
|
||||||
uint8_t signature[64];
|
uint8_t signature[64];
|
||||||
|
|
||||||
|
if(u2f_data_check(false) == false) {
|
||||||
|
U2F->ready = false;
|
||||||
|
if(U2F->callback != NULL) U2F->callback(U2fNotifyError, U2F->context);
|
||||||
|
memcpy(&buf[0], state_not_supported, 2);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
if(U2F->callback != NULL) U2F->callback(U2fNotifyAuth, U2F->context);
|
if(U2F->callback != NULL) U2F->callback(U2fNotifyAuth, U2F->context);
|
||||||
if(U2F->user_present == true) {
|
if(U2F->user_present == true) {
|
||||||
flags |= 1;
|
flags |= 1;
|
||||||
|
@ -13,6 +13,7 @@ typedef enum {
|
|||||||
U2fNotifyWink,
|
U2fNotifyWink,
|
||||||
U2fNotifyConnect,
|
U2fNotifyConnect,
|
||||||
U2fNotifyDisconnect,
|
U2fNotifyDisconnect,
|
||||||
|
U2fNotifyError,
|
||||||
} U2fNotifyEvent;
|
} U2fNotifyEvent;
|
||||||
|
|
||||||
typedef struct U2fData U2fData;
|
typedef struct U2fData U2fData;
|
||||||
|
@ -48,7 +48,7 @@ U2fApp* u2f_app_alloc() {
|
|||||||
view_dispatcher_add_view(
|
view_dispatcher_add_view(
|
||||||
app->view_dispatcher, U2fAppViewMain, u2f_view_get_view(app->u2f_view));
|
app->view_dispatcher, U2fAppViewMain, u2f_view_get_view(app->u2f_view));
|
||||||
|
|
||||||
if(u2f_data_check()) {
|
if(u2f_data_check(true)) {
|
||||||
scene_manager_next_scene(app->scene_manager, U2fSceneMain);
|
scene_manager_next_scene(app->scene_manager, U2fSceneMain);
|
||||||
} else {
|
} else {
|
||||||
scene_manager_next_scene(app->scene_manager, U2fSceneError);
|
scene_manager_next_scene(app->scene_manager, U2fSceneError);
|
||||||
|
@ -20,6 +20,7 @@ typedef enum {
|
|||||||
|
|
||||||
U2fCustomEventConnect,
|
U2fCustomEventConnect,
|
||||||
U2fCustomEventDisconnect,
|
U2fCustomEventDisconnect,
|
||||||
|
U2fCustomEventDataError,
|
||||||
|
|
||||||
U2fCustomEventRegister,
|
U2fCustomEventRegister,
|
||||||
U2fCustomEventAuth,
|
U2fCustomEventAuth,
|
||||||
|
@ -38,17 +38,25 @@ typedef struct {
|
|||||||
uint32_t control;
|
uint32_t control;
|
||||||
} __attribute__((packed)) U2fCounterData;
|
} __attribute__((packed)) U2fCounterData;
|
||||||
|
|
||||||
bool u2f_data_check() {
|
bool u2f_data_check(bool cert_only) {
|
||||||
bool state = false;
|
bool state = false;
|
||||||
Storage* fs_api = furi_record_open("storage");
|
Storage* fs_api = furi_record_open("storage");
|
||||||
File* file = storage_file_alloc(fs_api);
|
File* file = storage_file_alloc(fs_api);
|
||||||
|
|
||||||
if(storage_file_open(file, U2F_CERT_FILE, FSAM_READ, FSOM_OPEN_EXISTING)) {
|
do {
|
||||||
|
if(!storage_file_open(file, U2F_CERT_FILE, FSAM_READ, FSOM_OPEN_EXISTING)) break;
|
||||||
storage_file_close(file);
|
storage_file_close(file);
|
||||||
if(storage_file_open(file, U2F_CERT_KEY_FILE, FSAM_READ, FSOM_OPEN_EXISTING)) {
|
if(!storage_file_open(file, U2F_CERT_KEY_FILE, FSAM_READ, FSOM_OPEN_EXISTING)) break;
|
||||||
|
if(cert_only) {
|
||||||
state = true;
|
state = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
storage_file_close(file);
|
||||||
|
if(!storage_file_open(file, U2F_KEY_FILE, FSAM_READ, FSOM_OPEN_EXISTING)) break;
|
||||||
|
storage_file_close(file);
|
||||||
|
if(!storage_file_open(file, U2F_CNT_FILE, FSAM_READ, FSOM_OPEN_EXISTING)) break;
|
||||||
|
state = true;
|
||||||
|
} while(0);
|
||||||
|
|
||||||
storage_file_close(file);
|
storage_file_close(file);
|
||||||
storage_file_free(file);
|
storage_file_free(file);
|
||||||
|
@ -6,7 +6,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
|
|
||||||
bool u2f_data_check();
|
bool u2f_data_check(bool cert_only);
|
||||||
|
|
||||||
bool u2f_data_cert_check();
|
bool u2f_data_cert_check();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user