clean up and mostly implemented and not tested u2f hid

vtcsec_summit
Conor 2016-01-30 00:41:33 -05:00
rodzic 14e3634262
commit 5a09a0584c
6 zmienionych plików z 146 dodań i 12 usunięć

Wyświetl plik

@ -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_ */

Wyświetl plik

@ -8,8 +8,11 @@
#ifndef _U2F_H_
#define _U2F_H_
#include <stdint.h>
struct u2f_message
{
uint8_t hihuht[8];
int wat;
};

Wyświetl plik

@ -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);

Wyświetl plik

@ -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)
{

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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);