diff --git a/firmware/inc/atecc508a.h b/firmware/inc/atecc508a.h index e363f44..992d1dd 100644 --- a/firmware/inc/atecc508a.h +++ b/firmware/inc/atecc508a.h @@ -8,73 +8,73 @@ #ifndef ATECC508A_H_ #define ATECC508A_H_ -#define ATECC508A_ADDR 0xc0 +#define ATECC508A_ADDR 0xc0 -#define ATECC_CMD_COUNTER 0x24 - #define ATECC_COUNTER0 0 - #define ATECC_COUNTER1 1 - #define ATECC_COUNTER_READ 0 - #define ATECC_COUNTER_INC 1 +#define ATECC_CMD_COUNTER 0x24 + #define ATECC_COUNTER0 0 + #define ATECC_COUNTER1 1 + #define ATECC_COUNTER_READ 0 + #define ATECC_COUNTER_INC 1 -#define ATECC_CMD_RNG 0x1B - #define ATECC_RNG_P1 0 - #define ATECC_RNG_P2 0 +#define ATECC_CMD_RNG 0x1B + #define ATECC_RNG_P1 0 + #define ATECC_RNG_P2 0 -#define ATECC_CMD_SHA 0x47 +#define ATECC_CMD_SHA 0x47 // P1 - #define ATECC_SHA_START 0x0 - #define ATECC_SHA_UPDATE 0x1 - #define ATECC_SHA_END 0x2 + #define ATECC_SHA_START 0x0 + #define ATECC_SHA_UPDATE 0x1 + #define ATECC_SHA_END 0x2 -#define ATECC_CMD_READ 0x02 +#define ATECC_CMD_READ 0x02 // P1 - #define ATECC_RW_CONFIG 0x00 - #define ATECC_RW_OTP 0x01 - #define ATECC_RW_DATA 0x02 - #define ATECC_RW_EXT 0x80 + #define ATECC_RW_CONFIG 0x00 + #define ATECC_RW_OTP 0x01 + #define ATECC_RW_DATA 0x02 + #define ATECC_RW_EXT 0x80 // P2 read addr -#define ATECC_CMD_WRITE 0x12 +#define ATECC_CMD_WRITE 0x12 // P1 same for read // P2 write addr - #define ATECC_EEPROM_SLOT(x) (0x5 + ((x)>>1)) + #define ATECC_EEPROM_SLOT(x) (0x5 + ((x)>>1)) #define ATECC_EEPROM_SLOT_OFFSET(x) ( (x) & 1 ? 2 : 0 ) - #define ATECC_EEPROM_SLOT_SIZE 0x2 + #define ATECC_EEPROM_SLOT_SIZE 0x2 - #define ATECC_EEPROM_KEY(x) (24 + ((x)>>1)) - #define ATECC_EEPROM_KEY_OFFSET(x) ( (x) & 1 ? 2 : 0 ) + #define ATECC_EEPROM_KEY(x) (24 + ((x)>>1)) + #define ATECC_EEPROM_KEY_OFFSET(x) ( (x) & 1 ? 2 : 0 ) #define ATECC_EEPROM_KEY_SIZE 0x2 - #define ATECC_EEPROM_B2A(b) ((b)>>2) - #define ATECC_EEPROM_B2O(b) ((b)&0x3) + #define ATECC_EEPROM_B2A(b) ((b)>>2) + #define ATECC_EEPROM_B2O(b) ((b)&0x3) -#define ATECC_CMD_LOCK 0x17 +#define ATECC_CMD_LOCK 0x17 // P1 flags - #define ATECC_LOCK_CONFIG 0x00 - #define ATECC_LOCK_DATA_OTP 0x01 - #define ATECC_LOCK_SLOT 0x02 - #define ATECC_LOCK_SLOTNUM(x) (((x)&0xf)<<2) - #define ATECC_LOCK_IGNORE_SUMMARY 0x08 + #define ATECC_LOCK_CONFIG 0x00 + #define ATECC_LOCK_DATA_OTP 0x01 + #define ATECC_LOCK_SLOT 0x02 + #define ATECC_LOCK_SLOTNUM(x) (((x)&0xf)<<2) + #define ATECC_LOCK_IGNORE_SUMMARY 0x08 // P2 is CRC or 0 -#define ATECC_CMD_GENKEY 0x40 +#define ATECC_CMD_GENKEY 0x40 // P1 - #define ATECC_GENKEY_PRIVATE 0x04 - #define ATECC_GENKEY_PUBDIGEST 0x08 - #define ATECC_GENKEY_PUBDIGEST2 0x10 + #define ATECC_GENKEY_PRIVATE 0x04 + #define ATECC_GENKEY_PUBDIGEST 0x08 + #define ATECC_GENKEY_PUBDIGEST2 0x10 // P2 is keyid -#define ATECC_CMD_NONCE 0x16 +#define ATECC_CMD_NONCE 0x16 // P1 - #define ATECC_NONCE_RNG_UPDATE 0x0 - #define ATECC_NONCE_TEMP_UPDATE 0x3 + #define ATECC_NONCE_RNG_UPDATE 0x0 + #define ATECC_NONCE_TEMP_UPDATE 0x3 // P2 is 0 -#define ATECC_CMD_SIGN 0x41 +#define ATECC_CMD_SIGN 0x41 // P1 - #define ATECC_SIGN_INTERNAL 0x00 - #define ATECC_SIGN_EXTERNAL 0x80 + #define ATECC_SIGN_INTERNAL 0x00 + #define ATECC_SIGN_EXTERNAL 0x80 // P2 is keyid struct atecc_response diff --git a/firmware/inc/u2f.h b/firmware/inc/u2f.h index c1213f3..f642d9f 100644 --- a/firmware/inc/u2f.h +++ b/firmware/inc/u2f.h @@ -10,12 +10,46 @@ #include +#define SW_NO_ERROR 0x00 +#define SW_CONDITIONS_NOT_SATISFIED 0x01 +#define SW_WRONG_DATA 0x02 + +#define U2F_EC_FMT_UNCOMPRESSED 0x04 + +#define U2F_EC_POINT_SIZE 32 +#define U2F_EC_PUBKEY_SIZE 65 + +// U2F native commands +#define U2F_REGISTER 0x01 +#define U2F_AUTHENTICATE 0x02 +#define U2F_VERSION 0x03 +#define U2F_VENDOR_FIRST 0xc0 +#define U2F_VENDOR_LAST 0xff + +// U2F_CMD_REGISTER command defines +#define U2F_REGISTER_ID 0x05 +#define U2F_REGISTER_HASH_ID 0x00 + struct u2f_message { - uint8_t hihuht[8]; - int wat; + uint8_t cla; + uint8_t ins; + uint8_t p1; + uint8_t p2; + uint8_t LC1; + uint8_t LC2; + uint8_t LC3; }; +struct u2f_ec_point +{ + uint8_t fmt; + uint8_t x[U2F_EC_POINT_SIZE]; + uint8_t y[U2F_EC_POINT_SIZE]; +}; + + + int u2f_request(struct u2f_message* req, struct u2f_message* res); diff --git a/firmware/src/main.c b/firmware/src/main.c index 1364725..d868503 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -76,7 +76,6 @@ int8_t test_ecc508a() int16_t main(void) { - uint8_t zeros[] = {0,0,0,0}; data uint8_t i = 0; data uint16_t last_ms = get_ms(); data uint16_t ms_heart;