/* * (c) danielinux 2019 * * GPLv.2 * * See LICENSE for details */ #include #include "system.h" #include "display.h" #include "systick.h" #include "button.h" #include #include #include "usecfs.h" #include "usb.h" /* Uncomment for device initialization */ //#define DEVICE_INITIALIZATION static const char welcome_message0[]= " There is no "; static const char welcome_message1[]= "knowledge that "; static const char welcome_message2[]= " is not power. "; static const uint8_t uuid[UUID_LEN] = { 0xb4, 0x6b, 0x82, 0x05, 0xb6, 0xcd, 0x28, 0xaa, 0xc7, 0x81, 0x2e, 0x2d, 0xfd, 0xdd, 0x5e, 0x70, 0x3f, 0xbf, 0x09, 0x03, 0x1b, 0x5f, 0xbe, 0xc6, 0x09, 0x62, 0xa8, 0x23, 0xe9, 0x99, 0x5e, 0xcb, 0xb4, 0xab, 0x28, 0xdc, 0x14, 0xcb, 0x35, 0xb4, 0x7d, 0xfe, 0x26, 0x81, 0x33, 0xd0, 0x4b, 0xc2, 0x49, 0x53, 0x05, 0xc3, 0xe7, 0xbd, 0x9a, 0x50, 0xb8, 0x01, 0x30, 0x0b, 0x62, 0x58, 0xad, 0xba }; static uint32_t last_action = 0; static uint32_t offset = 0; #define ST_LOCKED 0 #define ST_PIN_ENTRY 1 #define ST_UNLOCKED 2 #define MAX_PASSWORD 32 static int fsm_state = ST_LOCKED; static int sleeping = 0; static char password[MAX_PASSWORD] = {}; static int pin_idx = 0; #define SLEEP_TIME (5000) static void ui_sleep(void) { display_scroll(NULL, 0); display_clear(NULL); sleeping = 1; } static int ui_wakeup(void) { last_action = jiffies; if (sleeping) { sleeping = 0; return 1; } return 0; } void ui_msg(const char *txt) { ui_wakeup(); display_scroll(NULL, 0); display_clear(NULL); display_text(6, txt); } static int ui_vault_on(void) { ui_msg("Activating Vault"); bridge_init(); return 0; } void lock(void) { //led_on(RED_LED); ui_msg("Device is Locked"); fsm_state = ST_LOCKED; } static void pwdrst(void) { memset(password, 0, MAX_PASSWORD); pin_idx = 0; } int unlock(void) { uint8_t stored_uuid[UUID_LEN]; if (pin_idx < 6) { display_scroll(NULL, 0); display_clear(NULL); display_text(5, "Failed."); display_text(6, "Insert pin:"); pwdrst(); return -1; } display_scroll(NULL, 0); display_clear(NULL); display_text(6, " "); display_text(5, "Unlocking secret"); if ((usecfs_init(password, 0, stored_uuid) == 0) && (memcmp(stored_uuid, uuid, UUID_LEN) == 0)) { pwdrst(); fsm_state = ST_UNLOCKED; ui_msg("Device UNLOCKED"); return 0; } else { #ifdef DEVICE_INITIALIZATION if (usecfs_init(password, 1, uuid) == 0) { display_text(6, "DEVICE INITIALIZED."); fsm_state = ST_UNLOCKED; return 0; } #endif display_scroll(NULL, 0); display_clear(NULL); display_text(5, "Failed."); display_text(6, "Insert pin:"); pwdrst(); fsm_state = ST_LOCKED; return -1; } } void ui_button_hold(uint16_t button) { ui_wakeup(); } void ui_status(void) { display_scroll(NULL, 0); display_clear(NULL); display_text(5, "Status Report "); display_text(6, " - UART2 ON "); display_text(7, " - SPI OK "); display_text(0, " - SDCARD OK "); display_text(1, " - USB VAULT ON "); } void ui_sdcard_insert(void) { ui_wakeup(); ui_msg("SD Card detected"); } void ui_menu(char in) { static uint8_t menu_scroll = 0; if (menu_scroll == 0) { display_scroll(NULL, 0); display_clear(NULL); } display_text(7, "1. Status "); display_text(6, "0. Lockdown "); display_text(5, "Main Menu "); display_text(2, "4. UART menu "); display_text(1, "3. SD format "); display_text(0, "2. USB vault ON "); switch (in) { case ' ': menu_scroll += 4; menu_scroll %= 0x40; display_scroll(NULL, menu_scroll); break; case '\r': menu_scroll -= 4; menu_scroll %= 0x40; display_scroll(NULL, menu_scroll); break; case '1': ui_status(); break; case '2': ui_vault_on(); break; case '0': reboot(); panic(); break; } } void ui_button_press(uint16_t button) { int i; char c; if (ui_wakeup()) c = 0; else c = bu2c(button); if (fsm_state == ST_LOCKED) { pwdrst(); ui_msg("Insert pin:"); fsm_state = ST_PIN_ENTRY; return; } if (fsm_state == ST_PIN_ENTRY) { char line[17] = " "; for (i = 0; i < pin_idx; i++) { line[i] = '*'; } if ((c >= '0') && (c <='9')) { if (pin_idx < 16) { line[pin_idx] = 'X'; } password[pin_idx++] = bu2c(button); } if (c == '\r') { unlock(); } else { display_text(7, line); } } if (fsm_state == ST_UNLOCKED) { ui_menu(bu2c(button)); } } void ui_init(void) { uint32_t now; int i; display_scroll(NULL, 0x3f); display_text(0, welcome_message0); display_text(1, welcome_message1); display_text(2, welcome_message2); now = jiffies; for (i = 0x3f; i >= 0x20; i--) { display_scroll(NULL, i); while ((jiffies - now) < 50) WFI(); now = jiffies; } for (i = display_getcontrast(NULL); i >= 0; i--) { display_setcontrast(NULL, i); while ((jiffies - now) < 10) WFI(); now = jiffies; } display_scroll(NULL, 0); display_clear(NULL); display_setcontrast(NULL, 0xcf); lock(); } void ui_keepalive(uint32_t timeslice) { if ((jiffies - last_action) > SLEEP_TIME) { ui_sleep(); if (fsm_state == ST_PIN_ENTRY) lock(); } }