From 5a09a0584c7138c5e548fe9940feb1b15ddac88b Mon Sep 17 00:00:00 2001 From: Conor Date: Sat, 30 Jan 2016 00:41:33 -0500 Subject: [PATCH] clean up and mostly implemented and not tested u2f hid --- firmware/inc/app.h | 67 ++++++++++++++++++++++++++++++-- firmware/inc/u2f.h | 3 ++ firmware/src/callback.c | 4 +- firmware/src/u2f-firmware_main.c | 37 ++++++++++++++++-- firmware/src/u2f.c | 4 +- firmware/src/u2f_hid.c | 43 +++++++++++++++++++- 6 files changed, 146 insertions(+), 12 deletions(-) diff --git a/firmware/inc/app.h b/firmware/inc/app.h index 7f5e6ba..a77115a 100644 --- a/firmware/inc/app.h +++ b/firmware/inc/app.h @@ -17,15 +17,16 @@ typedef enum { - EP_BUSY = 0, - EP_FREE, + APP_NOTHING = 0, + APP_WINK, + _APP_WINK, } -ENDPOINT_STATE; - +APP_STATE; struct APP_DATA { uint8_t hidmsgbuf[64]; + uint8_t state; }; struct debug_msg @@ -33,4 +34,62 @@ struct debug_msg char buf[40]; }; +#define FIFO_HEADER(NAME, TYPE)\ +void NAME##_fifo_init();\ +int NAME##_fifo_append(TYPE* _data);\ +int NAME##_fifo_get(TYPE* _data) + + +#ifdef U2F_PRINT +FIFO_HEADER(debug, struct debug_msg); +#else +#define debug_fifo_init(x) +#define debug_fifo_get(x) +#define debug_fifo_append(x) +#endif + +#define FIFO_CREATE(NAME, TYPE, SIZE) \ +static SI_SEGMENT_VARIABLE(NAME##MEM[SIZE],TYPE,SI_SEG_XDATA);\ +volatile TYPE* NAME##WP;\ +volatile TYPE* NAME##RP;\ +void NAME##_fifo_init()\ +{\ + NAME##WP = NAME##MEM;\ + NAME##RP = NAME##MEM;\ +}\ +int NAME##_fifo_append(TYPE* _data)\ +{\ + volatile TYPE* next = 0;\ + next = NAME##WP + 1;\ + if (next == (NAME##MEM + SIZE))\ + {\ + next = NAME##MEM;\ + }\ + if (next == NAME##RP)\ + {\ + return -1;\ + }\ + else\ + {\ + *(NAME##WP) = *_data;\ + NAME##WP = next;\ + return 0;\ + }\ +}\ +int NAME##_fifo_get(TYPE* _data)\ +{\ + if (NAME##RP == NAME##WP)\ + {\ + return -1;\ + }\ + *_data = *(NAME##RP);\ + NAME##RP = NAME##RP + 1;\ + if (NAME##RP == &NAME##MEM[SIZE])\ + {\ + NAME##RP = NAME##MEM;\ + }\ + return 0;\ +} + + #endif /* APP_H_ */ diff --git a/firmware/inc/u2f.h b/firmware/inc/u2f.h index b5a773e..c1213f3 100644 --- a/firmware/inc/u2f.h +++ b/firmware/inc/u2f.h @@ -8,8 +8,11 @@ #ifndef _U2F_H_ #define _U2F_H_ +#include + struct u2f_message { + uint8_t hihuht[8]; int wat; }; diff --git a/firmware/src/callback.c b/firmware/src/callback.c index ec62c42..9d6123d 100644 --- a/firmware/src/callback.c +++ b/firmware/src/callback.c @@ -149,7 +149,7 @@ uint16_t USBD_XferCompleteCb(uint8_t epAddr, USB_Status_TypeDef status, uint16_t xferred, uint16_t remaining) { int i = 0; - char buf[4]; + char buf[6]; // struct u2f_hid_msg res; SI_SEGMENT_VARIABLE(res, struct u2f_hid_msg, SI_SEG_XDATA); uint8_t* resbuf = (uint8_t*)&res; @@ -166,7 +166,7 @@ uint16_t USBD_XferCompleteCb(uint8_t epAddr, USB_Status_TypeDef status, u2f_write_s(buf); //u2f_print("%x",l); } - u2f_write_s("\n"); + u2f_write_s("\r\n"); i = hid_u2f_request((struct u2f_hid_msg*)appdata.hidmsgbuf, &res); diff --git a/firmware/src/u2f-firmware_main.c b/firmware/src/u2f-firmware_main.c index ad4e42e..587f20c 100644 --- a/firmware/src/u2f-firmware_main.c +++ b/firmware/src/u2f-firmware_main.c @@ -19,11 +19,15 @@ bool readpacket = 1; data struct APP_DATA appdata; +#ifdef U2F_PRINT +FIFO_CREATE(debug,struct debug_msg, 5) +#endif static void init(struct APP_DATA* ap) { memset(ap,0, sizeof(struct APP_DATA)); + ap->state = APP_NOTHING; debug_fifo_init(); u2f_hid_init(); } @@ -33,12 +37,15 @@ void listen_for_pkt(struct APP_DATA* ap) USBD_Read(EP1OUT, ap->hidmsgbuf, sizeof(ap->hidmsgbuf), true); } +#define ms_since(ms,num) ((get_ms() - (ms)) >= num ? (1|(ms=get_ms())):0) int16_t main(void) { data uint8_t i = 0; data uint16_t last_ms = get_ms(); - data uint16_t ms_since; + data uint16_t ms_heart; + data uint16_t ms_wink; + uint8_t winks = 0; #ifdef U2F_PRINT xdata struct debug_msg dbg; @@ -57,12 +64,10 @@ int16_t main(void) { u2f_print("U2F ZERO\r\n"); while (1) { - ms_since = get_ms() - last_ms; - if (ms_since > 499) + if (ms_since(ms_heart,500)) { u2f_print("ms %u\r\n", get_ms()); - last_ms = get_ms(); LED_G = !LED_G; } @@ -77,6 +82,30 @@ int16_t main(void) { } + switch(appdata.state) + { + case APP_NOTHING: + break; + case APP_WINK: + LED_B = 0; + ms_wink = get_ms(); + appdata.state = _APP_WINK; + break; + case _APP_WINK: + if (ms_since(ms_wink,150)) + { + LED_B = !LED_B; + winks++; + } + if (winks == 5) + { + winks = 0; + appdata.state = APP_NOTHING; + } + + break; + } + #ifdef U2F_PRINT while(debug_fifo_get(&dbg) == 0) { diff --git a/firmware/src/u2f.c b/firmware/src/u2f.c index 0c0d634..c962670 100644 --- a/firmware/src/u2f.c +++ b/firmware/src/u2f.c @@ -8,8 +8,10 @@ #include "u2f.h" #include "bsp.h" +static uint8_t count = 1; + int u2f_request(struct u2f_message* req, struct u2f_message* res) { - u2f_print("U2F REQUEST\r\n"); + u2f_print("U2F REQUEST %bd\r\n", count++); return 0; } diff --git a/firmware/src/u2f_hid.c b/firmware/src/u2f_hid.c index 77b47f0..3f5a2b8 100644 --- a/firmware/src/u2f_hid.c +++ b/firmware/src/u2f_hid.c @@ -157,6 +157,14 @@ static void hid_u2f_parse(struct u2f_hid_msg* req, struct u2f_hid_msg* res, { case U2FHID_INIT: u2f_print("got init packet %lx\r\n",req->cid); + appdata.state = APP_WINK; + if (U2FHID_LEN(req) != 8) + { + stamp_error(res, ERR_INVALID_LEN); + u2f_print("invalid len init\r\n"); + goto fail; + } + memmove(init_res->nonce.nonce, payload, 8); init_res->cid = get_new_cid(); if (init_res->cid == 0) @@ -173,13 +181,46 @@ static void hid_u2f_parse(struct u2f_hid_msg* req, struct u2f_hid_msg* res, break; case U2FHID_MSG: + if (U2FHID_LEN(req) < 4) + { + stamp_error(res, ERR_INVALID_LEN); + u2f_print("invalid len msg\r\n"); + goto fail; + } + u2f_request((struct u2f_message*)payload, (struct u2f_message*)res->pkt.init.payload); break; + case U2FHID_PING: + u2f_print("U2F PING\r\n"); + if (U2FHID_LEN(req) > U2FHID_INIT_PAYLOAD_SIZE) + { + stamp_error(res, ERR_INVALID_LEN); + u2f_print("invalid len ping\r\n"); + goto fail; + } + + len = U2FHID_LEN(req); + memmove(res->pkt.init.payload, req->pkt.init.payload, len); + break; + + case U2FHID_WINK: + u2f_print("U2F WINK\r\n"); + if (U2FHID_LEN(req) != 0) + { + stamp_error(res, ERR_INVALID_LEN); + u2f_print("invalid len wink but who cares\r\n"); + } + + appdata.state = APP_WINK; + + break; + default: u2f_print("invalid cmd: %bx\r\n", cmd); - break; + stamp_error(res, ERR_INVALID_CMD); + goto fail; } U2FHID_SET_LEN(res, len);