From b51bd20c4de8f836889eacf7c35e4e25503c43d8 Mon Sep 17 00:00:00 2001 From: Conor Date: Fri, 4 Mar 2016 20:30:13 -0500 Subject: [PATCH] initialize keys at init if needed --- firmware/inc/app.h | 11 +++++---- firmware/inc/eeprom.h | 4 ++++ firmware/src/callback.c | 11 +++++---- firmware/src/eeprom.c | 12 +++++++++- firmware/src/main.c | 22 ++++++++++++++++- firmware/src/u2f-atecc.c | 52 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 101 insertions(+), 11 deletions(-) diff --git a/firmware/inc/app.h b/firmware/inc/app.h index 99bba67..e992a1d 100644 --- a/firmware/inc/app.h +++ b/firmware/inc/app.h @@ -17,8 +17,6 @@ SI_SBIT (LED1, SFR_P1, 4); // LED green // debug options #define U2F_PRINT -#define KEYHANDLES_START (EEPROM_DATA_START + 30) -#define KEYHANDLES_COUNT 14 typedef enum { @@ -47,17 +45,22 @@ APP_ERROR_CODE; struct APP_DATA { - uint8_t hidmsgbuf[64]; - uint8_t tmp[10]; + // must be at least 37 bytes + uint8_t tmp[40]; uint8_t state; uint8_t error; }; +extern uint8_t hidmsgbuf[64]; + extern data struct APP_DATA appdata; void set_app_error(APP_ERROR_CODE ec); +// should be called after initializing eeprom +void u2f_init(); + diff --git a/firmware/inc/eeprom.h b/firmware/inc/eeprom.h index 4be4a23..be8f952 100644 --- a/firmware/inc/eeprom.h +++ b/firmware/inc/eeprom.h @@ -8,6 +8,10 @@ #ifndef EEPROM_H_ #define EEPROM_H_ +#include "app.h" + +void eeprom_init(); + void eeprom_read(uint16_t addr, uint8_t * buf, uint8_t len); void _eeprom_write(uint16_t addr, uint8_t * buf, uint8_t len, uint8_t flags); diff --git a/firmware/src/callback.c b/firmware/src/callback.c index 182773c..36d57d0 100644 --- a/firmware/src/callback.c +++ b/firmware/src/callback.c @@ -26,7 +26,7 @@ uint8_t tmpBuffer; -#define PRINT_EVENTS +//#define PRINT_EVENTS #ifdef PRINT_EVENTS @@ -144,21 +144,24 @@ USB_Status_TypeDef USBD_SetupCmdCb( } +uint8_t hidmsgbuf[64]; + uint16_t USBD_XferCompleteCb(uint8_t epAddr, USB_Status_TypeDef status, uint16_t xferred, uint16_t remaining) { + if (epAddr == EP1OUT) { #ifdef U2F_PRINT int i = 0; - for (i=0; i < sizeof(appdata.hidmsgbuf); i++) + for (i=0; i < sizeof(hidmsgbuf); i++) { - uint8_t l = (uint8_t)appdata.hidmsgbuf[i]; + uint8_t l = (uint8_t)hidmsgbuf[i]; u2f_putb(l); } u2f_prints("\r\n"); #endif - u2f_hid_request((struct u2f_hid_msg*)appdata.hidmsgbuf); + u2f_hid_request((struct u2f_hid_msg*)hidmsgbuf); } diff --git a/firmware/src/eeprom.c b/firmware/src/eeprom.c index 9455667..134e941 100644 --- a/firmware/src/eeprom.c +++ b/firmware/src/eeprom.c @@ -9,7 +9,17 @@ #include "eeprom.h" - +void eeprom_init() +{ + uint8_t secbyte; + eeprom_read(0xFBFF,&secbyte,1); + if (secbyte == 0xff) + { + eeprom_erase(0xFBC0); + secbyte = -32; + eeprom_write(0xFBFF, &secbyte, 1); + } +} void eeprom_read(uint16_t addr, uint8_t * buf, uint8_t len) { diff --git a/firmware/src/main.c b/firmware/src/main.c index bbd391c..5d35de8 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -24,6 +24,8 @@ static void init(struct APP_DATA* ap) u2f_hid_init(); smb_init(); atecc_idle(); + eeprom_init(); + u2f_init(); } void set_app_error(APP_ERROR_CODE ec) @@ -32,9 +34,27 @@ void set_app_error(APP_ERROR_CODE ec) appdata.error = ec; } + +void dump_eeprom() +{ + // 0xF800 - 0xFB7F + uint16_t i = 0xF800; + uint8_t eep; + for (; i <= 0xF800 + 196; i++) + { + eeprom_read(i,&eep,1); + u2f_putb(eep); + u2f_prints(" "); + } + u2f_prints("\r\n"); +} + int8_t test_eeprom() { + + dump_eeprom(); + return 0; } #define ms_since(ms,num) (((uint16_t)get_ms() - (ms)) >= num ? (1|(ms=(uint16_t)get_ms())):0) @@ -74,7 +94,7 @@ int16_t main(void) { { if (!USBD_EpIsBusy(EP1OUT) && !USBD_EpIsBusy(EP1IN)) { - USBD_Read(EP1OUT, appdata.hidmsgbuf, sizeof(appdata.hidmsgbuf), true); + USBD_Read(EP1OUT, hidmsgbuf, sizeof(hidmsgbuf), true); u2f_prints("read added\r\n"); } diff --git a/firmware/src/u2f-atecc.c b/firmware/src/u2f-atecc.c index 26abc4f..d332b29 100644 --- a/firmware/src/u2f-atecc.c +++ b/firmware/src/u2f-atecc.c @@ -8,19 +8,69 @@ #include "bsp.h" #include "u2f.h" #include "u2f_hid.h" +#include "eeprom.h" #include "atecc508a.h" + + struct key_handle { uint8_t index; uint8_t entropy[3]; }; +struct key_storage_header +{ + uint8_t num_keys; + uint16_t valid_keys; + uint8_t num_issued; +} key_store; + +#define U2F_NUM_KEYS 14 +#define U2F_KEY_HEADER_ADDR 0xF800 +#define U2F_KEYS_ADDR (0xF800 + sizeof(struct key_storage_header)) + +#define IS_KEY_VALID(mask,key) ((~mask) & (1<