mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-27 02:12:35 +00:00
Removed more magic numbers.
`KEY_PATH_LEN`: length of the derivation path in the key handle `KEY_PATH_ENTRIES`: number of entries in derivation path including initial BIP-43 selector. `KEY_HANDLE_LEN`: length of key handle (derivation path + HMAC checksum)
This commit is contained in:
parent
041eaa5e4b
commit
a0571e02a7
@ -56,7 +56,11 @@ static uint32_t u2f_out_end = 0;
|
|||||||
static uint8_t u2f_out_packets[U2F_OUT_PKT_BUFFER_LEN][HID_RPT_SIZE];
|
static uint8_t u2f_out_packets[U2F_OUT_PKT_BUFFER_LEN][HID_RPT_SIZE];
|
||||||
|
|
||||||
#define U2F_PUBKEY_LEN 65
|
#define U2F_PUBKEY_LEN 65
|
||||||
#define KEY_HANDLE_LEN 64
|
#define KEY_PATH_LEN 32
|
||||||
|
#define KEY_HANDLE_LEN (KEY_PATH_LEN + SHA256_DIGEST_LENGTH)
|
||||||
|
|
||||||
|
// Derivation path is m/U2F'/r'/r'/r'/r'/r'/r'/r'/r'
|
||||||
|
#define KEY_PATH_ENTRIES (1 + KEY_PATH_LEN / sizeof(uint32_t))
|
||||||
|
|
||||||
// Auth/Register request state machine
|
// Auth/Register request state machine
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -487,29 +491,28 @@ const HDNode *getDerivedNode(uint32_t *address_n, size_t address_n_count)
|
|||||||
|
|
||||||
const HDNode *generateKeyHandle(const uint8_t app_id[], uint8_t key_handle[])
|
const HDNode *generateKeyHandle(const uint8_t app_id[], uint8_t key_handle[])
|
||||||
{
|
{
|
||||||
uint8_t keybase[64];
|
uint8_t keybase[U2F_APPID_SIZE + KEY_PATH_LEN];
|
||||||
|
|
||||||
// Derivation path is m/'U2F/'r/'r/'r/'r/'r/'r/'r/'r
|
// Derivation path is m/U2F'/r'/r'/r'/r'/r'/r'/r'/r'
|
||||||
uint32_t i, key_path[9];
|
uint32_t i, key_path[KEY_PATH_ENTRIES];
|
||||||
key_path[0] = U2F_KEY_PATH;
|
key_path[0] = U2F_KEY_PATH;
|
||||||
for (i = 1; i < 9; i++) {
|
for (i = 1; i < KEY_PATH_ENTRIES; i++) {
|
||||||
// high bit for hardened keys
|
// high bit for hardened keys
|
||||||
key_path[i]= 0x80000000 | random32();
|
key_path[i]= 0x80000000 | random32();
|
||||||
}
|
}
|
||||||
|
|
||||||
// First half of keyhandle is key_path
|
// First half of keyhandle is key_path
|
||||||
memcpy(key_handle, &key_path[1], 32);
|
memcpy(key_handle, &key_path[1], KEY_PATH_LEN);
|
||||||
|
|
||||||
// prepare keypair from /random data
|
// prepare keypair from /random data
|
||||||
const HDNode *node =
|
const HDNode *node = getDerivedNode(key_path, KEY_PATH_ENTRIES);
|
||||||
getDerivedNode(key_path, sizeof(key_path) / sizeof(uint32_t));
|
|
||||||
|
|
||||||
// For second half of keyhandle
|
// For second half of keyhandle
|
||||||
// Signature of app_id and random data
|
// Signature of app_id and random data
|
||||||
memcpy(&keybase[0], app_id, 32);
|
memcpy(&keybase[0], app_id, U2F_APPID_SIZE);
|
||||||
memcpy(&keybase[32], key_handle, 32);
|
memcpy(&keybase[U2F_APPID_SIZE], key_handle, KEY_PATH_LEN);
|
||||||
hmac_sha256(node->private_key, sizeof(node->private_key),
|
hmac_sha256(node->private_key, sizeof(node->private_key),
|
||||||
keybase, sizeof(keybase), &key_handle[32]);
|
keybase, sizeof(keybase), &key_handle[KEY_PATH_LEN]);
|
||||||
|
|
||||||
// Done!
|
// Done!
|
||||||
return node;
|
return node;
|
||||||
@ -518,23 +521,22 @@ const HDNode *generateKeyHandle(const uint8_t app_id[], uint8_t key_handle[])
|
|||||||
|
|
||||||
const HDNode *validateKeyHandle(const uint8_t app_id[], const uint8_t key_handle[])
|
const HDNode *validateKeyHandle(const uint8_t app_id[], const uint8_t key_handle[])
|
||||||
{
|
{
|
||||||
uint32_t key_path[9];
|
uint32_t key_path[KEY_PATH_ENTRIES];
|
||||||
key_path[0] = U2F_KEY_PATH;
|
key_path[0] = U2F_KEY_PATH;
|
||||||
memcpy(&key_path[1], key_handle, 32);
|
memcpy(&key_path[1], key_handle, KEY_PATH_LEN);
|
||||||
|
|
||||||
const HDNode *node =
|
const HDNode *node = getDerivedNode(key_path, KEY_PATH_ENTRIES);
|
||||||
getDerivedNode(key_path, sizeof(key_path) / sizeof(uint32_t));
|
|
||||||
|
|
||||||
uint8_t keybase[64];
|
uint8_t keybase[U2F_APPID_SIZE + KEY_PATH_LEN];
|
||||||
memcpy(&keybase[0], app_id, 32);
|
memcpy(&keybase[0], app_id, U2F_APPID_SIZE);
|
||||||
memcpy(&keybase[32], key_handle, 32);
|
memcpy(&keybase[U2F_APPID_SIZE], key_handle, KEY_PATH_LEN);
|
||||||
|
|
||||||
|
|
||||||
uint8_t hmac[32];
|
uint8_t hmac[SHA256_DIGEST_LENGTH];
|
||||||
hmac_sha256(node->private_key, sizeof(node->private_key),
|
hmac_sha256(node->private_key, sizeof(node->private_key),
|
||||||
keybase, sizeof(keybase), hmac);
|
keybase, sizeof(keybase), hmac);
|
||||||
|
|
||||||
if (memcmp(&key_handle[32], hmac, 32) != 0)
|
if (memcmp(&key_handle[KEY_PATH_LEN], hmac, SHA256_DIGEST_LENGTH) != 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// Done!
|
// Done!
|
||||||
|
@ -21,9 +21,10 @@
|
|||||||
#define __U2F_KNOWNAPPS_H_INCLUDED__
|
#define __U2F_KNOWNAPPS_H_INCLUDED__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "u2f/u2f.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t appid[32];
|
uint8_t appid[U2F_APPID_SIZE];
|
||||||
const char *appname;
|
const char *appname;
|
||||||
} U2FWellKnown;
|
} U2FWellKnown;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user