From 1e55381f9749902d297eaa597c7ef3f30c5c1f4a Mon Sep 17 00:00:00 2001 From: Stephanie Stroka Date: Sat, 15 Dec 2018 14:14:12 +0100 Subject: [PATCH] zeroing struct before memcpy in U2F init and packing U2F init response struct --- src/u2f/u2f.h | 2 +- src/u2f/u2f_hid.h | 10 ++++++++-- src/u2f_device.c | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/u2f/u2f.h b/src/u2f/u2f.h index bb06d361..96bc188c 100644 --- a/src/u2f/u2f.h +++ b/src/u2f/u2f.h @@ -46,6 +46,7 @@ typedef struct { uint8_t appId[U2F_APPID_SIZE]; } U2F_REGISTER_REQ; + typedef struct { uint8_t registerId;// U2F_REGISTER_ID_V2 U2F_EC_POINT pubKey; @@ -53,7 +54,6 @@ typedef struct { uint8_t keyHandleCertSig[U2F_MAX_KH_SIZE + U2F_MAX_ATT_CERT_SIZE + U2F_MAX_EC_SIG_SIZE]; } U2F_REGISTER_RESP; - // U2F_AUTHENTICATE instruction defines #define U2F_AUTH_ENFORCE 0x03// Enforce user presence and sign #define U2F_AUTH_CHECK_ONLY 0x07 diff --git a/src/u2f/u2f_hid.h b/src/u2f/u2f_hid.h index 735847f2..7c1c24d2 100644 --- a/src/u2f/u2f_hid.h +++ b/src/u2f/u2f_hid.h @@ -66,7 +66,11 @@ typedef struct { } U2FHID_INIT_REQ; -typedef struct { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" +typedef struct __attribute__((__packed__)) +{ uint8_t nonce[U2FHID_INIT_NONCE_SIZE]; uint32_t cid; uint8_t versionInterface; @@ -74,7 +78,9 @@ typedef struct { uint8_t versionMinor; uint8_t versionBuild; uint8_t capFlags;// Capabilities flags -} U2FHID_INIT_RESP; +} +U2FHID_INIT_RESP; +#pragma GCC diagnostic pop #define U2FHID_INIT_RESP_SIZE 17 diff --git a/src/u2f_device.c b/src/u2f_device.c index 69f9fe46..264376c5 100644 --- a/src/u2f_device.c +++ b/src/u2f_device.c @@ -52,7 +52,7 @@ #define APDU_LEN(A) (uint32_t)(((A).lc1 << 16) + ((A).lc2 << 8) + ((A).lc3)) #define U2F_TIMEOUT 500// [msec] #define U2F_KEYHANDLE_LEN (U2F_NONCE_LENGTH + SHA256_DIGEST_LENGTH) -#define U2F_READBUF_MAX_LEN COMMANDER_REPORT_SIZE// Max allowed by U2F specification = (57 + 128 * 59) = 7609. +#define U2F_READBUF_MAX_LEN COMMANDER_REPORT_SIZE// Max allowed by U2F specification = (57 + 128 * 59) = 7609. // In practice, U2F commands do not need this much space. // Therefore, reduce to save MCU memory. @@ -452,6 +452,7 @@ static void u2f_device_init(const USB_FRAME *in) f.init.bcnth = 0; f.init.bcntl = U2FHID_INIT_RESP_SIZE; + utils_zero(&resp, sizeof(resp)); memcpy(resp.nonce, init_req->nonce, sizeof(init_req->nonce)); resp.cid = in->cid == U2FHID_CID_BROADCAST ? next_cid() : in->cid; resp.versionInterface = U2FHID_IF_VERSION;