kopia lustrzana https://github.com/conorpp/u2f-zero
clean up and mostly implemented and not tested u2f hid
rodzic
14e3634262
commit
5a09a0584c
|
@ -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_ */
|
||||
|
|
|
@ -8,8 +8,11 @@
|
|||
#ifndef _U2F_H_
|
||||
#define _U2F_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct u2f_message
|
||||
{
|
||||
uint8_t hihuht[8];
|
||||
int wat;
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Ładowanie…
Reference in New Issue