summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/u2f.h33
-rw-r--r--include/u2f_impl.h34
2 files changed, 55 insertions, 12 deletions
diff --git a/include/u2f.h b/include/u2f.h
index 5af23bc773..61b9677185 100644
--- a/include/u2f.h
+++ b/include/u2f.h
@@ -30,7 +30,6 @@ extern "C" {
#define U2F_CHAL_SIZE 32 /* Size of challenge */
#define U2F_MAX_ATTEST_SIZE 256 /* Size of largest blob to sign */
#define U2F_P256_SIZE 32
-#define U2F_FIXED_KH_SIZE 64 /* Size of fixed size key handles */
#define ENC_SIZE(x) ((x + 7) & 0xfff8)
@@ -49,6 +48,21 @@ struct u2f_ec_point {
#define U2F_AUTH_ENFORCE 0x03 /* Enforce user presence and sign */
#define U2F_AUTH_CHECK_ONLY 0x07 /* Check only */
#define U2F_AUTH_FLAG_TUP 0x01 /* Test of user presence set */
+/* The key handle can be used with fingerprint or PIN. */
+#define U2F_UV_ENABLED_KH 0x08
+
+#define U2F_KH_VERSION_1 0x01
+
+struct u2f_key_handle {
+ uint8_t origin_seed[U2F_P256_SIZE];
+ uint8_t hmac[U2F_P256_SIZE];
+};
+
+struct u2f_versioned_key_handle {
+ uint8_t version;
+ uint8_t origin_seed[U2F_P256_SIZE];
+ uint8_t hmac[U2F_P256_SIZE];
+};
/* TODO(louiscollard): Add Descriptions. */
@@ -60,15 +74,28 @@ struct u2f_generate_req {
struct u2f_generate_resp {
struct u2f_ec_point pubKey; /* Generated public key */
- uint8_t keyHandle[U2F_FIXED_KH_SIZE]; /* Key handle */
+ struct u2f_key_handle keyHandle;
+};
+
+struct u2f_generate_versioned_resp {
+ struct u2f_ec_point pubKey; /* Generated public key */
+ struct u2f_versioned_key_handle keyHandle;
};
struct u2f_sign_req {
uint8_t appId[U2F_APPID_SIZE]; /* Application id */
uint8_t userSecret[U2F_P256_SIZE];
- uint8_t keyHandle[U2F_FIXED_KH_SIZE]; /* Key handle */
+ struct u2f_key_handle keyHandle;
+ uint8_t hash[U2F_P256_SIZE];
+ uint8_t flags;
+};
+
+struct u2f_sign_versioned_req {
+ uint8_t appId[U2F_APPID_SIZE]; /* Application id */
+ uint8_t userSecret[U2F_P256_SIZE];
uint8_t hash[U2F_P256_SIZE];
uint8_t flags;
+ struct u2f_versioned_key_handle keyHandle;
};
struct u2f_sign_resp {
diff --git a/include/u2f_impl.h b/include/u2f_impl.h
index 0732a1b72d..5bd69309c6 100644
--- a/include/u2f_impl.h
+++ b/include/u2f_impl.h
@@ -10,6 +10,7 @@
#include "common.h"
#include "cryptoc/p256.h"
+#include "u2f.h"
/* ---- Physical presence ---- */
@@ -58,14 +59,30 @@ int u2f_origin_key(const uint8_t *seed, p256_int *d);
*
* @param origin pointer to origin id
* @param user pointer to user secret
- * @param pointer to origin-specific random seed
+ * @param seed pointer to origin-specific random seed
+ * @param key_handle buffer to hold the output key handle
*
* @return EC_SUCCESS if a valid keypair was created.
*/
-int u2f_origin_user_keyhandle(const uint8_t *origin,
- const uint8_t *user,
+int u2f_origin_user_keyhandle(const uint8_t *origin, const uint8_t *user,
const uint8_t *seed,
- uint8_t *key_handle);
+ struct u2f_key_handle *key_handle);
+
+/**
+ * Pack the specified origin, user secret, origin-specific seed and version
+ * byte into a key handle.
+ *
+ * @param origin pointer to origin id
+ * @param user pointer to user secret
+ * @param seed pointer to origin-specific random seed
+ * @param version the version byte to pack; should be greater than 0.
+ * @param key_handle buffer to hold the output key handle
+ *
+ * @return EC_SUCCESS if a valid keypair was created.
+ */
+int u2f_origin_user_versioned_keyhandle(
+ const uint8_t *origin, const uint8_t *user, const uint8_t *seed,
+ uint8_t version, struct u2f_versioned_key_handle *key_handle);
/**
* Generate an origin and user-specific ECDSA keypair from the specified
@@ -73,17 +90,16 @@ int u2f_origin_user_keyhandle(const uint8_t *origin,
*
* If pk_x and pk_y are NULL, public key generation will be skipped.
*
- * @param key_handle pointer to the 64 byte key handle
+ * @param key_handle pointer to the key handle
+ * @param key_handle_size size of the key handle in bytes
* @param d pointer to ECDSA private key
* @param pk_x pointer to public key point
* @param pk_y pointer to public key point
*
* @return EC_SUCCESS if a valid keypair was created.
*/
-int u2f_origin_user_keypair(const uint8_t *key_handle,
- p256_int *d,
- p256_int *pk_x,
- p256_int *pk_y);
+int u2f_origin_user_keypair(const uint8_t *key_handle, size_t key_handle_size,
+ p256_int *d, p256_int *pk_x, p256_int *pk_y);
/***
* Generate a hardware derived 256b private key.