diff --git a/firmware/.cproject b/firmware/.cproject
index cae4312..551971f 100644
--- a/firmware/.cproject
+++ b/firmware/.cproject
@@ -141,6 +141,7 @@
+
diff --git a/firmware/inc/app.h b/firmware/inc/app.h
index 9e9e7fb..eeb93af 100644
--- a/firmware/inc/app.h
+++ b/firmware/inc/app.h
@@ -32,11 +32,15 @@ struct APP_DATA
uint8_t state;
};
+extern data struct APP_DATA appdata;
+
struct debug_msg
{
char buf[40];
};
+
+
#define FIFO_HEADER(NAME, TYPE)\
void NAME##_fifo_init();\
int NAME##_fifo_append(TYPE* _data);\
diff --git a/firmware/inc/bsp.h b/firmware/inc/bsp.h
index 95f1f06..eafa821 100644
--- a/firmware/inc/bsp.h
+++ b/firmware/inc/bsp.h
@@ -38,7 +38,10 @@ void u2f_write_n(char* buf, uint32_t val, int base);
void qu2f_write_s(char* d);
void qu2f_write_n(char* buf, uint32_t val, int base);
-extern SI_SEGMENT_VARIABLE(appdata, struct APP_DATA, SI_SEG_DATA);
+// not reentrant
+void dump_hex(uint8_t* hex, uint8_t len);
+
+
#ifdef U2F_PRINT
void u2f_print(char* fmt, ...);
@@ -46,7 +49,7 @@ void u2f_print(char* fmt, ...);
#define u2f_print(x)
#endif
-int hid_u2f_request(struct u2f_hid_msg* req, struct u2f_hid_msg* res);
+
#endif /* BSP_H_ */
diff --git a/firmware/src/Interrupts.c b/firmware/src/Interrupts.c
index a83b503..395326a 100644
--- a/firmware/src/Interrupts.c
+++ b/firmware/src/Interrupts.c
@@ -73,10 +73,7 @@ SI_INTERRUPT (SMBUS0_ISR, SMBUS0_IRQn)
switch (SMB0CN0 & SMB_STATE_MASK)
{
case SMB_STATUS_START:
- SMB0DAT = SMB.addr;
- SMB0DAT &= 0xFE;
-
- SMB0DAT |= SMB_FLAGS & SMB_READ;
+ SMB0DAT = SMB.addr | (SMB_FLAGS & SMB_READ);
SMB0CN0_STA = 0;
break;
diff --git a/firmware/src/bsp.c b/firmware/src/bsp.c
index 4cafcf3..5aeddcb 100644
--- a/firmware/src/bsp.c
+++ b/firmware/src/bsp.c
@@ -54,5 +54,19 @@ void u2f_write_s(char* d)
}
}
+// not reentrant
+void dump_hex(uint8_t* hex, uint8_t len)
+{
+ uint8_t i;
+ flush_messages();
+ for (i=0 ; i < len ; i++)
+ {
+ u2f_print(" %02bx",hex[i]);
+ flush_messages();
+ }
+ u2f_print("\r\n");
+ flush_messages();
+}
+
diff --git a/firmware/src/callback.c b/firmware/src/callback.c
index 6669a01..c51e3d0 100644
--- a/firmware/src/callback.c
+++ b/firmware/src/callback.c
@@ -23,7 +23,6 @@
#include "u2f_hid.h"
#define HID_INTERFACE_INDEX 0
-extern SI_SEGMENT_VARIABLE(appdata, struct APP_DATA, SI_SEG_DATA);
uint8_t tmpBuffer;
diff --git a/firmware/src/i2c.c b/firmware/src/i2c.c
index 645b4a9..8de7ec2 100644
--- a/firmware/src/i2c.c
+++ b/firmware/src/i2c.c
@@ -15,8 +15,6 @@
-
-
uint8_t smb_read (uint8_t addr, uint8_t* dest, uint8_t count)
{
while(SMB_IS_BUSY());
diff --git a/firmware/src/main.c b/firmware/src/main.c
index 52c0538..6096882 100644
--- a/firmware/src/main.c
+++ b/firmware/src/main.c
@@ -11,6 +11,7 @@
#include "app.h"
#include "i2c.h"
#include "u2f_hid.h"
+#include "tests.h"
data struct APP_DATA appdata;
@@ -55,19 +56,7 @@ static void listen_for_pkt(struct APP_DATA* ap)
-// not reentrant
-static void dump_hex(uint8_t* hex, uint8_t len)
-{
- uint8_t i;
- flush_messages();
- for (i=0 ; i < len ; i++)
- {
- u2f_print(" %02bx",hex[i]);
- flush_messages();
- }
- u2f_print("\r\n");
- flush_messages();
-}
+
void test_ecc508a()
{
@@ -84,29 +73,8 @@ void test_ecc508a()
// ATECC_RNG_P1,
// ATECC_RNG_P2,NULL,0);
// }while((len = atecc_recv(buf,sizeof(buf))) < 0);
- char pw[] = "2pckJ4IkT3PwdGMwuCygPpxD6+lObNGORiLGPQxM4ef4YoNvx9/k0xskZl84rCd3TllCvitepe+B";
- do{
- atecc_send(ATECC_CMD_SHA,
- ATECC_SHA_START,
- 0,NULL,0);
- }while((len = atecc_recv(buf,sizeof(buf))) < 0);
- dump_hex(buf,len);
- do{
- atecc_send(ATECC_CMD_SHA,
- ATECC_SHA_UPDATE,
- 64,pw,64);
- }while((len = atecc_recv(buf,sizeof(buf))) < 0);
- dump_hex(buf,len);
- do{
- atecc_send(ATECC_CMD_SHA,
- ATECC_SHA_END,
- sizeof(pw)-65,pw+64,sizeof(pw)-65);
- }while((len = atecc_recv(buf,sizeof(buf))) < 0);
- dump_hex(buf,len);
-
- // sha256 sum should be bcddd71b48f8a31d1374ad51c2e4138a871cb7f1eb3f2bdab49bc9bc60afc3a5
}
@@ -139,9 +107,7 @@ int16_t main(void) {
if (!test)
{
- test_ecc508a();
- test_ecc508a();
- test_ecc508a();
+ run_tests();
test = 1;
}
diff --git a/firmware/tests/tests.c b/firmware/tests/tests.c
new file mode 100644
index 0000000..7f1769b
--- /dev/null
+++ b/firmware/tests/tests.c
@@ -0,0 +1,82 @@
+/*
+ * tests.c
+ *
+ * Created on: Feb 14, 2016
+ * Author: Conor
+ */
+
+#include
+#include
+#include "app.h"
+#include "bsp.h"
+#include "i2c.h"
+#include "atecc508a.h"
+#include "tests.h"
+
+
+#ifdef ENABLE_TESTS
+#define TEST_SHA
+
+static void PRINT(const char * fmt, ...)
+{
+ va_list args;
+
+ va_start(args,fmt);
+ vsprintf(appdata.hidmsgbuf, fmt, args);
+ va_end(args);
+
+ u2f_write_s(appdata.hidmsgbuf);
+}
+
+
+#ifdef TEST_SHA
+static int test_sha()
+{
+ uint8_t buf[40];
+ uint8_t len;
+ char pw[] = "2pckJ4IkT3PwdGMwuCygPpxD6+lObNGORiLGPQxM4ef4YoNvx9/k0xskZl84rCd3TllCvitepe+B";
+ do{
+ atecc_send(ATECC_CMD_SHA,
+ ATECC_SHA_START,
+ 0,NULL,0);
+ }while((len = atecc_recv(buf,sizeof(buf))) < 0);
+ dump_hex(buf,len);
+
+ do{
+ atecc_send(ATECC_CMD_SHA,
+ ATECC_SHA_UPDATE,
+ 64,pw,64);
+ } while ((len = atecc_recv(buf,sizeof(buf))) < 0);
+ dump_hex(buf,len);
+
+ do{
+ atecc_send(ATECC_CMD_SHA,
+ ATECC_SHA_END,
+ sizeof(pw)-65,pw+64,sizeof(pw)-65);
+ }while((len = atecc_recv(buf,sizeof(buf))) < 0);
+ dump_hex(buf,len);
+
+ // sha256 sum should be bcddd71b48f8a31d1374ad51c2e4138a871cb7f1eb3f2bdab49bc9bc60afc3a5
+ return (SMB.crc == 0x9768) ? 0 : -1;
+}
+#else
+#define test_sha(x)
+#endif
+
+
+
+void run_tests()
+{
+ int rc;
+
+ PRINT("--- STARTING SHA TEST ---\r\n");
+ rc = test_sha();
+ if (rc == 0)
+ PRINT("--- SHA TEST SUCCESS ---\r\n");
+ else
+ PRINT("--- SHA TEST FAILED %d ---\r\n",rc);
+}
+
+
+
+#endif
diff --git a/firmware/tests/tests.h b/firmware/tests/tests.h
new file mode 100644
index 0000000..d316988
--- /dev/null
+++ b/firmware/tests/tests.h
@@ -0,0 +1,23 @@
+/*
+ * tests.h
+ *
+ * Created on: Feb 14, 2016
+ * Author: Conor
+ */
+
+#ifndef TESTS_H_
+#define TESTS_H_
+
+#define ENABLE_TESTS
+
+#ifdef ENABLE_TESTS
+
+ void run_tests();
+
+#else
+
+ #define run_tests(x)
+
+#endif
+
+#endif /* TESTS_H_ */