Formatting & New updated IR

This commit is contained in:
VerstreuteSeele
2023-01-14 08:44:32 +01:00
parent 7385a28ddd
commit 905bb23fdf
216 changed files with 6455 additions and 5877 deletions
@@ -29,7 +29,7 @@ void u2f_scene_error_on_enter(void* context) {
app->widget, GuiButtonTypeLeft, "Back", u2f_scene_error_event_callback, app);
} else if(app->error == U2fAppErrorCloseRpc) {
widget_add_icon_element(app->widget, 78, 0, &I_ActiveConnection_50x64);
if (settings->sfw_mode) {
if(settings->sfw_mode) {
widget_add_string_multiline_element(
app->widget, 3, 2, AlignLeft, AlignTop, FontPrimary, "Connection\nis active!");
widget_add_string_multiline_element(
@@ -40,8 +40,7 @@ void u2f_scene_error_on_enter(void* context) {
AlignTop,
FontSecondary,
"Disconnect from\nPC or phone to\nuse this function.");
}
else {
} else {
widget_add_string_multiline_element(
app->widget, 3, 2, AlignLeft, AlignTop, FontPrimary, "I am not\na whore!");
widget_add_string_multiline_element(
+19 -25
View File
@@ -64,13 +64,13 @@ typedef struct {
static const uint8_t ver_str[] = {"U2F_V2"};
// NFC applet selection fields
static const uint8_t rid_ac_ax[] = { 0xA0, 0x00, 0x00, 0x06, 0x47, 0x2F, 0x00, 0x01 };
static const uint8_t rid_ac_ax[] = {0xA0, 0x00, 0x00, 0x06, 0x47, 0x2F, 0x00, 0x01};
static const uint8_t state_no_error[] = {0x90, 0x00};
static const uint8_t state_not_supported[] = {0x6D, 0x00};
static const uint8_t state_user_missing[] = {0x69, 0x85};
static const uint8_t state_wrong_data[] = {0x6A, 0x80};
static const uint8_t state_app_not_found[] = { 0x6A, 0x82 };
static const uint8_t state_app_not_found[] = {0x6A, 0x82};
struct U2fData {
uint8_t device_key[32];
@@ -86,10 +86,9 @@ struct U2fData {
static void* apdu_command_data(U2fApduCommand* cmd) {
// Short encoding is a single byte.
// Extended length encoding is 0 byte followed by MSB and LSB bytes.
if (cmd->len[0] == 0) {
if(cmd->len[0] == 0) {
return cmd->len + 3;
}
else {
} else {
return cmd->len + 1;
}
}
@@ -278,7 +277,7 @@ static uint16_t u2f_authenticate(U2fData* U2F, const uint8_t* in_buf, uint8_t* o
if(U2F->user_present == true) {
flags |= 1;
} else {
if (cmd->p1 == U2fEnforce) {
if(cmd->p1 == U2fEnforce) {
memcpy(&out_buf[0], state_user_missing, 2);
return 2;
}
@@ -314,7 +313,7 @@ static uint16_t u2f_authenticate(U2fData* U2F, const uint8_t* in_buf, uint8_t* o
return 2;
}
if (cmd->p1 == U2fCheckOnly) { // Check-only: don't need to send full response
if(cmd->p1 == U2fCheckOnly) { // Check-only: don't need to send full response
memcpy(&out_buf[0], state_user_missing, 2);
return 2;
}
@@ -352,7 +351,7 @@ uint16_t u2f_applet_selection(const uint8_t* in_buf, uint8_t* out_buf) {
data[6],
data[7]);
if (cmd->len[0] != 8 || memcmp(rid_ac_ax, data, 8) != 0) {
if(cmd->len[0] != 8 || memcmp(rid_ac_ax, data, 8) != 0) {
memcpy(&out_buf[0], state_app_not_found, 2);
return 2;
}
@@ -364,24 +363,20 @@ uint16_t u2f_applet_selection(const uint8_t* in_buf, uint8_t* out_buf) {
uint16_t u2f_msg_parse(U2fData* U2F, const uint8_t* in_buf, uint16_t in_len, uint8_t* out_buf) {
furi_assert(U2F);
if (!U2F->ready) return 0;
if ((in_buf[0] != 0x00) && (in_len < 5)) return 0;
if(!U2F->ready) return 0;
if((in_buf[0] != 0x00) && (in_len < 5)) return 0;
FURI_LOG_D(TAG, "ins=0x%02x", in_buf[1]);
if (in_buf[1] == U2F_CMD_REGISTER) { // Register request
if(in_buf[1] == U2F_CMD_REGISTER) { // Register request
return u2f_register(U2F, in_buf, out_buf);
}
else if (in_buf[1] == U2F_CMD_AUTHENTICATE) { // Authenticate request
} else if(in_buf[1] == U2F_CMD_AUTHENTICATE) { // Authenticate request
return u2f_authenticate(U2F, in_buf, out_buf);
}
else if (in_buf[1] == U2F_CMD_VERSION) { // Get U2F version string
} else if(in_buf[1] == U2F_CMD_VERSION) { // Get U2F version string
memcpy(&out_buf[0], ver_str, 6);
memcpy(&out_buf[6], state_no_error, 2);
return 8;
}
else if (in_buf[1] == U2F_CMD_APPLET_SELECTION) {
} else if(in_buf[1] == U2F_CMD_APPLET_SELECTION) {
return u2f_applet_selection(in_buf, out_buf);
}
else {
} else {
memcpy(&out_buf[0], state_not_supported, 2);
return 2;
}
@@ -389,15 +384,14 @@ uint16_t u2f_msg_parse(U2fData* U2F, const uint8_t* in_buf, uint16_t in_len, uin
}
void u2f_wink(U2fData* U2F) {
if (U2F->callback != NULL) U2F->callback(U2fNotifyWink, U2F->context);
if(U2F->callback != NULL) U2F->callback(U2fNotifyWink, U2F->context);
}
void u2f_set_state(U2fData* U2F, uint8_t state) {
if (state == 0) {
if (U2F->callback != NULL) U2F->callback(U2fNotifyDisconnect, U2F->context);
}
else {
if (U2F->callback != NULL) U2F->callback(U2fNotifyConnect, U2F->context);
if(state == 0) {
if(U2F->callback != NULL) U2F->callback(U2fNotifyDisconnect, U2F->context);
} else {
if(U2F->callback != NULL) U2F->callback(U2fNotifyConnect, U2F->context);
}
U2F->user_present = false;
}
+25 -30
View File
@@ -18,10 +18,10 @@ struct U2fNfc {
};
static uint16_t
u2f_callback(U2fNfc* u2f_nfc, const uint8_t* buff_rx, uint16_t buff_rx_len, uint8_t* buff_tx) {
u2f_callback(U2fNfc* u2f_nfc, const uint8_t* buff_rx, uint16_t buff_rx_len, uint8_t* buff_tx) {
U2fApduCommand* cmd = (U2fApduCommand*)buff_rx;
if (cmd->ins == 0xC0) {
if (u2f_nfc->payload_len == 0) {
if(cmd->ins == 0xC0) {
if(u2f_nfc->payload_len == 0) {
FURI_LOG_E(TAG, "requested block but not chaining");
buff_tx[0] = 0x69;
buff_tx[1] = 0x00;
@@ -31,25 +31,23 @@ u2f_callback(U2fNfc* u2f_nfc, const uint8_t* buff_rx, uint16_t buff_rx_len, uint
FURI_LOG_T(TAG, "continued chaining %d/%d", u2f_nfc->payload_cursor, u2f_nfc->payload_len);
uint16_t max_resp_len = cmd->len[0];
if (max_resp_len == 0) {
if(max_resp_len == 0) {
max_resp_len = 256;
}
uint16_t remaining_len = (u2f_nfc->payload_len - 2) - u2f_nfc->payload_cursor;
if (remaining_len > max_resp_len) {
if(remaining_len > max_resp_len) {
memcpy(buff_tx, &u2f_nfc->payload[u2f_nfc->payload_cursor], max_resp_len);
remaining_len -= max_resp_len;
buff_tx[max_resp_len] = 0x61;
if (remaining_len >= 256) {
if(remaining_len >= 256) {
buff_tx[max_resp_len + 1] = 0x00;
}
else {
} else {
buff_tx[max_resp_len + 1] = remaining_len;
}
u2f_nfc->payload_cursor += max_resp_len;
return max_resp_len + 2;
}
else {
} else {
memcpy(
buff_tx,
&u2f_nfc->payload[u2f_nfc->payload_cursor],
@@ -66,7 +64,7 @@ u2f_callback(U2fNfc* u2f_nfc, const uint8_t* buff_rx, uint16_t buff_rx_len, uint
u2f_msg_parse(u2f_nfc->u2f_instance, buff_rx, buff_rx_len, u2f_nfc->payload);
// If this is extended format, send entire response at once
if (cmd->len[0] == 0) {
if(cmd->len[0] == 0) {
FURI_LOG_T(TAG, "single extended response");
memcpy(&buff_tx, u2f_nfc->payload, u2f_nfc->payload_len);
uint16_t len = u2f_nfc->payload_len;
@@ -78,21 +76,19 @@ u2f_callback(U2fNfc* u2f_nfc, const uint8_t* buff_rx, uint16_t buff_rx_len, uint
uint16_t max_resp_len = 256;
// If this message happens to be less than the chaining size, send it all at once.
if ((u2f_nfc->payload_len - 2) <= max_resp_len) {
if((u2f_nfc->payload_len - 2) <= max_resp_len) {
FURI_LOG_T(TAG, "single short response");
memcpy(buff_tx, u2f_nfc->payload, u2f_nfc->payload_len);
uint16_t len = u2f_nfc->payload_len;
u2f_nfc->payload_len = 0;
return len;
}
else {
} else {
memcpy(buff_tx, u2f_nfc->payload, max_resp_len);
buff_tx[max_resp_len] = 0x61;
uint16_t remaining_len = (u2f_nfc->payload_len - 2) - max_resp_len;
if (remaining_len >= max_resp_len) {
if(remaining_len >= max_resp_len) {
buff_tx[max_resp_len + 1] = 0x00;
}
else {
} else {
buff_tx[max_resp_len + 1] = remaining_len;
}
u2f_nfc->payload_cursor = max_resp_len;
@@ -105,7 +101,7 @@ u2f_callback(U2fNfc* u2f_nfc, const uint8_t* buff_rx, uint16_t buff_rx_len, uint
static int32_t u2f_nfc_worker(void* context) {
U2fNfc* u2f_nfc = context;
FURI_LOG_D(TAG, "Init");
while (furi_hal_nfc_is_busy()) {
while(furi_hal_nfc_is_busy()) {
furi_delay_ms(10);
}
FuriHalNfcDevData params = {
@@ -122,36 +118,35 @@ static int32_t u2f_nfc_worker(void* context) {
FURI_LOG_D(TAG, "Start");
while (1) {
while(1) {
uint32_t flags = furi_thread_flags_wait(WorkerEvtStop, FuriFlagWaitAny, 10);
if (flags != FuriFlagErrorTimeout) {
if(flags != FuriFlagErrorTimeout) {
furi_check((flags & FuriFlagError) == 0);
if (flags & WorkerEvtStop) break;
if(flags & WorkerEvtStop) break;
}
if (!furi_hal_nfc_listen(&params, false, 200)) {
if(!furi_hal_nfc_listen(&params, false, 200)) {
FURI_LOG_T(TAG, "wtf");
continue;
}
FuriHalNfcTxRxContext tx_rx = {};
tx_rx.tx_bits = 0;
tx_rx.tx_rx_type = FuriHalNfcTxRxTypeDefault;
if (!furi_hal_nfc_tx_rx(&tx_rx, 300)) continue;
if (tx_rx.rx_bits == 0) continue;
if(!furi_hal_nfc_tx_rx(&tx_rx, 300)) continue;
if(tx_rx.rx_bits == 0) continue;
u2f_nfc->payload_len = 0;
u2f_nfc->payload_cursor = 0;
while (true) {
while(true) {
uint16_t payload_len =
u2f_callback(u2f_nfc, tx_rx.rx_data, tx_rx.rx_bits / 8, tx_rx.tx_data);
tx_rx.rx_bits = 0;
FURI_LOG_T(TAG, "payload_len=%d", payload_len);
if (payload_len == 0) {
if(payload_len == 0) {
break;
}
else {
} else {
tx_rx.tx_bits = payload_len * 8;
tx_rx.tx_rx_type = FuriHalNfcTxRxTypeDefault;
if (!furi_hal_nfc_tx_rx(&tx_rx, 300)) break;
if (tx_rx.rx_bits == 0) break;
if(!furi_hal_nfc_tx_rx(&tx_rx, 300)) break;
if(tx_rx.rx_bits == 0) break;
}
}
}
+3 -3
View File
@@ -6,11 +6,11 @@ extern "C" {
#include "u2f.h"
typedef struct U2fNfc U2fNfc;
typedef struct U2fNfc U2fNfc;
U2fNfc* u2f_nfc_start(U2fData* u2f_inst);
U2fNfc* u2f_nfc_start(U2fData* u2f_inst);
void u2f_nfc_stop(U2fNfc* u2f_hid);
void u2f_nfc_stop(U2fNfc* u2f_hid);
#ifdef __cplusplus
}
+37 -41
View File
@@ -18,70 +18,66 @@ static void u2f_view_draw_callback(Canvas* canvas, void* _model) {
DesktopSettings* settings = malloc(sizeof(DesktopSettings));
DESKTOP_SETTINGS_LOAD(settings);
canvas_draw_icon(canvas, 8, 14, &I_Drive_112x35);
canvas_set_font(canvas, FontSecondary);
if (model->display_msg == U2fMsgNotConnected) {
if (settings->sfw_mode) {
if(model->display_msg == U2fMsgNotConnected) {
if(settings->sfw_mode) {
canvas_draw_icon(canvas, 22, 15, &I_Connect_me_62x31_sfw);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connect to a device");
}
else {
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connect to a device");
} else {
canvas_draw_icon(canvas, 22, 15, &I_Connect_me_62x31);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Plug me in d-daddy");
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Plug me in d-daddy");
}
}
else if (model->display_msg == U2fMsgIdle) {
if (settings->sfw_mode) {
} else if(model->display_msg == U2fMsgIdle) {
if(settings->sfw_mode) {
canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31_sfw);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connected!");
}
else {
} else {
canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connected!");
}
}
else if (model->display_msg == U2fMsgRegister) {
if (settings->sfw_mode) {
} else if(model->display_msg == U2fMsgRegister) {
if(settings->sfw_mode) {
elements_button_center(canvas, "OK");
canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31_sfw);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to register");
}
else {
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to register");
} else {
elements_button_center(canvas, "CUM");
canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press CUM to register");
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press CUM to register");
}
}
else if (model->display_msg == U2fMsgAuth) {
if (settings->sfw_mode) {
} else if(model->display_msg == U2fMsgAuth) {
if(settings->sfw_mode) {
elements_button_center(canvas, "OK");
canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31_sfw);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to authenticate");
}
else {
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to authenticate");
} else {
elements_button_center(canvas, "CUM");
canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press CUM to authenticate");
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press CUM to authenticate");
}
}
else if (model->display_msg == U2fMsgSuccess) {
if (settings->sfw_mode) {
} else if(model->display_msg == U2fMsgSuccess) {
if(settings->sfw_mode) {
canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31_sfw);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Authentication successful!");
}
else {
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Authentication successful!");
} else {
canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Cum released~");
}
}
else if (model->display_msg == U2fMsgError) {
if (settings->sfw_mode) {
} else if(model->display_msg == U2fMsgError) {
if(settings->sfw_mode) {
canvas_draw_icon(canvas, 22, 15, &I_Error_62x31_sfw);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Certificate error");
}
else {
canvas_draw_str_aligned(
canvas, 128 / 2, 3, AlignCenter, AlignTop, "Certificate error");
} else {
canvas_draw_icon(canvas, 22, 15, &I_Error_62x31);
canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Unable to cum");
}
@@ -94,10 +90,10 @@ static bool u2f_view_input_callback(InputEvent* event, void* context) {
U2fView* u2f = context;
bool consumed = false;
if (event->type == InputTypeShort) {
if (event->key == InputKeyOk) {
if(event->type == InputTypeShort) {
if(event->key == InputKeyOk) {
consumed = true;
if (u2f->callback != NULL) u2f->callback(InputTypeShort, u2f->context);
if(u2f->callback != NULL) u2f->callback(InputTypeShort, u2f->context);
}
}