rewrote eeprom and added test

vtcsec_summit
Conor 2016-03-04 18:22:16 -05:00
rodzic c3569fde3d
commit a809d9dc37
9 zmienionych plików z 205 dodań i 143 usunięć

Wyświetl plik

@ -19,6 +19,9 @@ SI_SBIT (LED1, SFR_P1, 4); // LED green
#define DBG_MESSAGE_SIZE 30
#define DBG_MSG_COUNT 4
#define KEYHANDLES_START (EEPROM_DATA_START + 30)
#define KEYHANDLES_COUNT 14
typedef enum
{
APP_NOTHING = 0,
@ -61,13 +64,7 @@ struct debug_msg
void set_app_error(APP_ERROR_CODE ec);
#define DISABLE_INTERUPTS() (EIE1 = EIE1_EADC0__DISABLED | EIE1_EWADC0__DISABLED | EIE1_ECP0__DISABLED\
| EIE1_ECP1__DISABLED | EIE1_EMAT__DISABLED | EIE1_EPCA0__DISABLED\
| EIE1_ESMB0__ENABLED | EIE1_ET3__ENABLED)
#define ENABLE_INTERUPTS() (IE = IE_EA__ENABLED | IE_EX0__DISABLED | IE_EX1__DISABLED\
| IE_ESPI0__DISABLED | IE_ET0__DISABLED | IE_ET1__DISABLED\
| IE_ET2__ENABLED | IE_ES0__DISABLED)
#define FIFO_HEADER(NAME, TYPE)\

Wyświetl plik

@ -65,7 +65,8 @@ void u2f_printlx(const char * tag, uint8_t c, ...);
#else
#define u2f_print(x)
#define dump_hex(x)
// #define dump_hex(x)
void dump_hex(uint8_t* hex, uint8_t len);
#define flush_messages(x)
#endif

Wyświetl plik

@ -0,0 +1,20 @@
/*
* eeprom.h
*
* Created on: Mar 4, 2016
* Author: pp
*/
#ifndef EEPROM_H_
#define EEPROM_H_
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);
#define eeprom_write(a,b,l) _eeprom_write(a,b,l,0x1)
#define eeprom_erase(a) _eeprom_write(a,appdata.tmp,1,0x3)
#define EEPROM_DATA_START 0xF800
#endif /* EEPROM_H_ */

Wyświetl plik

@ -514,7 +514,9 @@ extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void) {
// ET3 (Timer 3 Interrupt Enable) = ENABLED (Enable interrupt requests
// generated by the TF3L or TF3H flags.)
*/
DISABLE_INTERUPTS();
EIE1 = EIE1_EADC0__DISABLED | EIE1_EWADC0__DISABLED | EIE1_ECP0__DISABLED\
| EIE1_ECP1__DISABLED | EIE1_EMAT__DISABLED | EIE1_EPCA0__DISABLED\
| EIE1_ESMB0__ENABLED | EIE1_ET3__ENABLED;
// [EIE1 - Extended Interrupt Enable 1]$
// $[EIE2 - Extended Interrupt Enable 2]
@ -550,7 +552,9 @@ extern void INTERRUPT_0_enter_DefaultMode_from_RESET(void) {
// generated by the TF2L or TF2H flags.)
// ES0 (UART0 Interrupt Enable) = DISABLED (Disable UART0 interrupt.)
*/
ENABLE_INTERUPTS();
IE = IE_EA__ENABLED | IE_EX0__DISABLED | IE_EX1__DISABLED\
| IE_ESPI0__DISABLED | IE_ET0__DISABLED | IE_ET1__DISABLED\
| IE_ET2__ENABLED | IE_ES0__DISABLED;
// [IE - Interrupt Enable]$
// $[IP - Interrupt Priority]

Wyświetl plik

@ -61,6 +61,18 @@ void flush_messages()
#endif
void dump_hex(uint8_t* hex, uint8_t len)
{
uint8_t i;
for (i=0 ; i < len ; i++)
{
u2f_putb(hex[i]);
}
u2f_prints("\r\n");
}
void putf(char c)
{
uint8_t i;

Wyświetl plik

@ -0,0 +1,53 @@
/*
* eeprom.c
*
* Created on: Mar 4, 2016
* Author: pp
*/
#include <SI_EFM8UB1_Register_Enums.h>
#include <stdint.h>
#include "eeprom.h"
void eeprom_read(uint16_t addr, uint8_t * buf, uint8_t len)
{
uint8_t code * eepaddr = (uint8_t code *) addr;
bit old_int;
while(len--)
{
old_int = IE_EA;
IE_EA = 0;
*buf++ = *eepaddr++;
IE_EA = old_int;
}
}
void _eeprom_write(uint16_t addr, uint8_t * buf, uint8_t len, uint8_t flags)
{
uint8_t xdata * data eepaddr = (uint8_t xdata *) addr;
bit old_int;// IE_EA;
while(len--)
{
old_int = IE_EA;
IE_EA = 0;
// Enable VDD monitor
VDM0CN = 0x80;
RSTSRC = 0x02;
// unlock key
FLKEY = 0xA5;
FLKEY = 0xF1;
PSCTL |= flags;
*eepaddr = *buf;
PSCTL &= ~flags;
IE_EA = old_int;
eepaddr++;
buf++;
}
}

Wyświetl plik

@ -6,6 +6,7 @@
#include "atecc508a.h"
#include "InitDevice.h"
#include "descriptors.h"
#include "eeprom.h"
#include "idle.h"
#include "bsp.h"
#include "app.h"
@ -14,7 +15,6 @@
#include "u2f.h"
#include "tests.h"
data struct APP_DATA appdata;
@ -45,134 +45,34 @@ void set_app_error(APP_ERROR_CODE ec)
appdata.error = ec;
}
uint8_t readByte (uint16_t addr)
{
//uint8_t readByte (uint16_t addr)
//{
//
// uint8_t code * pread; // FLASH read pointer
// uint8_t byte;
// DISABLE_INTERUPTS();
// pread = (uint8_t code *) addr;
//
// byte = *pread; // Read the byte
//
// ENABLE_INTERUPTS();
//
// return byte;
//}
uint8_t code * pread; // FLASH read pointer
uint8_t byte;
DISABLE_INTERUPTS();
pread = (uint8_t code *) addr;
byte = *pread; // Read the byte
ENABLE_INTERUPTS();
return byte;
}
void writeByte (uint16_t addr, uint8_t byte)
{
bit EA_SAVE = IE_EA; // Preserve IE_EA
uint8_t xdata * data pwrite; // Flash write pointer
IE_EA = 0; // Disable interrupts
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x02; // Enable VDD monitor as a reset source
pwrite = (uint8_t xdata *) addr;
FLKEY = 0xA5; // Key Sequence 1
FLKEY = 0xF1; // Key Sequence 2
PSCTL |= 0x01; // PSWE = 1 which enables writes
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x02; // Enable VDD monitor as a reset source
*pwrite = byte; // Write the byte
PSCTL &= ~0x01; // PSWE = 0 which disable writes
IE_EA = EA_SAVE; // Restore interrupts
}
void FLASH_PageErase (uint16_t addr)
{
bit EA_SAVE = IE_EA; // Preserve IE_EA
uint8_t xdata * data pwrite; // Flash write pointer
IE_EA = 0; // Disable interrupts
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x02; // Enable VDD monitor as a reset source
pwrite = (uint8_t xdata *) addr;
FLKEY = 0xA5; // Key Sequence 1
FLKEY = 0xF1; // Key Sequence 2
PSCTL |= 0x03; // PSWE = 1; PSEE = 1
VDM0CN = 0x80; // Enable VDD monitor
RSTSRC = 0x02; // Enable VDD monitor as a reset source
*pwrite = 0; // Initiate page erase
PSCTL &= ~0x03; // PSWE = 0; PSEE = 0
IE_EA = EA_SAVE; // Restore interrupts
}
#define EEPROM_DATA_START 0xF800
#define KEYHANDLES_START (EEPROM_DATA_START + 30)
#define KEYHANDLES_COUNT 14
void dump_eeprom()
{
// 0xF800 - 0xFB7F
uint16_t i = 0xF800;
uint8_t eep;
for (; i <= 0xFBFF; i++)
{
eep = readByte(i);
u2f_putb(eep);
}
for (i=0; i <= 0x100; i++)
{
eep = readByte(i);
u2f_putb(eep);
}
}
int8_t test_eeprom()
{
uint8_t secbyte;
uint16_t i;
// Enable flash erasing, then start a write cycle on the selected page
secbyte = readByte(0xFBFF);
u2f_printb("security_byte: ",1,secbyte);
// PSCTL |= PSCTL_PSEE__ERASE_ENABLED;
if (secbyte == 0xff)
{
FLASH_PageErase(0xFBC0);
writeByte(0xFBFF, -32);
}
else
{
writeByte(KEYHANDLES_START, 0x55);
for (i = 0; i < KEYHANDLES_COUNT ; i++)
{
writeByte(KEYHANDLES_START+(i<<2)+0, 0x55);
writeByte(KEYHANDLES_START+(i<<2)+1, 0x66);
writeByte(KEYHANDLES_START+(i<<2)+2, 0x77);
writeByte(KEYHANDLES_START+(i<<2)+3, 0x88);
}
}
// writeByte(0xFBFF, -32);
dump_eeprom();
return 0;
}
#define ms_since(ms,num) (((uint16_t)get_ms() - (ms)) >= num ? (1|(ms=(uint16_t)get_ms())):0)
int16_t main(void) {
data uint8_t secbyte = readByte(0xFBFF);
data uint8_t i = 0;
data uint16_t last_ms = get_ms();
data uint16_t ms_heart;
@ -203,7 +103,7 @@ int16_t main(void) {
u2f_printlx("lx:",1,l);
run_tests();
test_eeprom();
u2f_printb("security_byte: ",1,secbyte);
while (1) {
if (ms_since(ms_heart,500))

Wyświetl plik

@ -4,28 +4,24 @@
* Created on: Feb 14, 2016
* Author: Conor
*/
#include <stdarg.h>
#include <SI_EFM8UB1_Register_Enums.h>
#include <stdio.h>
#include <stdint.h>
#include "app.h"
#include "bsp.h"
#include "i2c.h"
#include "atecc508a.h"
#include "eeprom.h"
#include "tests.h"
#ifdef ENABLE_TESTS
static void PRINT(const char * fmt, ...)
static void PRINT(const char * s)
{
va_list args;
va_start(args,fmt);
vsprintf(appdata.hidmsgbuf, fmt, args);
va_end(args);
u2f_write_s(appdata.hidmsgbuf);
u2f_prints(s);
u2f_prints("\r\n");
}
@ -63,7 +59,7 @@ static int test_sha()
#define test_sha(x)
#endif
#ifdef TEST_EEPROM
#ifdef TEST_ATECC_EEPROM
static void slot_dump(void* slot)
{
@ -104,7 +100,7 @@ static void key_dump(void* slot)
flush_messages();
}
static int test_eeprom()
static int test_atecc_eeprom()
{
uint8_t buf[7];
uint16_t c1,c2,c3,c4;
@ -188,7 +184,7 @@ static int test_eeprom()
return 0;
}
#else
#define test_eeprom(x)
#define test_atecc_eeprom(x)
#endif
#ifdef TEST_KEY_SIGNING
@ -222,6 +218,74 @@ int test_key_signing()
#define test_key_signing(x)
#endif
#ifdef TEST_EFM8UB1_EEPROM
void dump_eeprom()
{
// 0xF800 - 0xFB7F
uint16_t i = 0xF800;
uint8_t eep;
for (; i <= 0xF800 + 300; i++)
{
eeprom_read(i,&eep,1);
u2f_putb(eep);
}
}
int8_t test_efm8ub1_eeprom()
{
uint16_t crc = 0;
uint8_t secbyte;
int8_t i;
char k[] = "\x55\x66\x77\x88";
char buf[4];
eeprom_read(0xFBFF,&secbyte,1);
u2f_printb("security_byte: ",1,secbyte);
if (secbyte == 0xff)
{
eeprom_erase(0xFBC0);
i = -32;
eeprom_write(0xFBFF, &i, 1);
u2f_prints("eeprom_write\r\n");
}
eeprom_write(KEYHANDLES_START + 0, k, 4);
eeprom_write(KEYHANDLES_START + 4, k, 4);
eeprom_write(KEYHANDLES_START + 8, k, 4);
eeprom_write(KEYHANDLES_START + 12, k, 4);
eeprom_read(KEYHANDLES_START + 0,buf,4);
for(i=0; i < 4; i++) crc = feed_crc(crc, buf[i]);
dump_hex(buf,4);
dump_hex(k,4);
eeprom_read(KEYHANDLES_START + 4,buf,4);
for(i=0; i < 4; i++) crc = feed_crc(crc, buf[i]);
dump_hex(buf,4);
dump_hex(k,4);
eeprom_read(KEYHANDLES_START + 8,buf,4);
for(i=0; i < 4; i++) crc = feed_crc(crc, buf[i]);
dump_hex(buf,4);
dump_hex(k,4);
eeprom_read(KEYHANDLES_START + 12,buf,4);
for(i=0; i < 4; i++) crc = feed_crc(crc, buf[i]);
dump_hex(buf,4);
dump_hex(k,4);
u2f_printx("crc: ", 1, crc);
if (crc == 0xd1e8)
return 0;
return -1;
}
#else
#define test_efm8ub1_eeprom(x)
#endif
void run_tests()
{
int rc;
@ -235,9 +299,9 @@ void run_tests()
PRINT("--- SHA TEST FAILED %d ---\r\n",rc);
#endif
#ifdef TEST_EEPROM
PRINT("--- STARTING EEPROM TEST ---\r\n");
rc = test_eeprom();
#ifdef TEST_ATECC_EEPROM
PRINT("--- STARTING ATECC EEPROM TEST ---\r\n");
rc = test_atecc_eeprom();
if (rc == 0)
PRINT("--- EEPROM TEST SUCCESS ---\r\n");
else
@ -253,6 +317,16 @@ void run_tests()
PRINT("--- KEY SIGNING FAILED %d ---\r\n",rc);
#endif
#ifdef TEST_EFM8UB1_EEPROM
PRINT("--- STARTING EFM8UB1 EEPROM TEST ---\r\n");
rc = test_efm8ub1_eeprom();
if (rc == 0)
PRINT("--- EFM8UB1 EEPROM SUCCESS ---\r\n");
else
PRINT("--- EFM8UB1 EEPROM FAILED ---\r\n");
#endif
}

Wyświetl plik

@ -8,10 +8,11 @@
#ifndef TESTS_H_
#define TESTS_H_
//#define ENABLE_TESTS
#define ENABLE_TESTS
//#define TEST_SHA
//#define TEST_EEPROM
//#define TEST_ATECC_EEPROM
#define TEST_EFM8UB1_EEPROM
//#define TEST_KEY_SIGNING // requires key and locked eeprom
#ifdef ENABLE_TESTS