mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-07-30 02:18:11 -07:00
Formatting & New updated IR
This commit is contained in:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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(¶ms, false, 200)) {
|
||||
if(!furi_hal_nfc_listen(¶ms, 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user