1*4f2df630SAndroid Build Coastguard Worker // Common U2F raw message format header - Review Draft 2*4f2df630SAndroid Build Coastguard Worker // 2014-10-08 3*4f2df630SAndroid Build Coastguard Worker // Editor: Jakob Ehrensvard, Yubico, [email protected] 4*4f2df630SAndroid Build Coastguard Worker 5*4f2df630SAndroid Build Coastguard Worker #ifndef __U2F_H_INCLUDED__ 6*4f2df630SAndroid Build Coastguard Worker #define __U2F_H_INCLUDED__ 7*4f2df630SAndroid Build Coastguard Worker 8*4f2df630SAndroid Build Coastguard Worker /** 9*4f2df630SAndroid Build Coastguard Worker * Note: This header file should be self-sufficient as it is shared 10*4f2df630SAndroid Build Coastguard Worker * with other boards and with userland daemons (u2fd). 11*4f2df630SAndroid Build Coastguard Worker * 12*4f2df630SAndroid Build Coastguard Worker * chromeos-ec-headers package installs it in ChromeOS development environment. 13*4f2df630SAndroid Build Coastguard Worker * 14*4f2df630SAndroid Build Coastguard Worker */ 15*4f2df630SAndroid Build Coastguard Worker 16*4f2df630SAndroid Build Coastguard Worker #ifdef _MSC_VER /* Windows */ 17*4f2df630SAndroid Build Coastguard Worker typedef unsigned char uint8_t; 18*4f2df630SAndroid Build Coastguard Worker typedef unsigned short uint16_t; 19*4f2df630SAndroid Build Coastguard Worker typedef unsigned int uint32_t; 20*4f2df630SAndroid Build Coastguard Worker typedef unsigned long int uint64_t; 21*4f2df630SAndroid Build Coastguard Worker #else 22*4f2df630SAndroid Build Coastguard Worker #include <stdint.h> 23*4f2df630SAndroid Build Coastguard Worker #endif 24*4f2df630SAndroid Build Coastguard Worker 25*4f2df630SAndroid Build Coastguard Worker #ifdef __cplusplus 26*4f2df630SAndroid Build Coastguard Worker extern "C" { 27*4f2df630SAndroid Build Coastguard Worker #endif 28*4f2df630SAndroid Build Coastguard Worker 29*4f2df630SAndroid Build Coastguard Worker /* General constants */ 30*4f2df630SAndroid Build Coastguard Worker 31*4f2df630SAndroid Build Coastguard Worker #define U2F_EC_KEY_SIZE 32 /* EC key size in bytes, NIST P-256 Curve */ 32*4f2df630SAndroid Build Coastguard Worker #define U2F_EC_POINT_SIZE ((U2F_EC_KEY_SIZE * 2) + 1) /* Size of EC point */ 33*4f2df630SAndroid Build Coastguard Worker #define U2F_MAX_KH_SIZE 128 /* Max size of key handle */ 34*4f2df630SAndroid Build Coastguard Worker #define U2F_MAX_ATT_CERT_SIZE 2048 /* Max size of attestation certificate */ 35*4f2df630SAndroid Build Coastguard Worker #define U2F_MAX_EC_SIG_SIZE 72 /* Max size of DER coded EC signature */ 36*4f2df630SAndroid Build Coastguard Worker #define U2F_CTR_SIZE 4 /* Size of counter field */ 37*4f2df630SAndroid Build Coastguard Worker #define U2F_APPID_SIZE 32 /* Size of application id */ 38*4f2df630SAndroid Build Coastguard Worker #define U2F_CHAL_SIZE 32 /* Size of challenge */ 39*4f2df630SAndroid Build Coastguard Worker #define U2F_MAX_ATTEST_SIZE 256 /* Size of largest blob to sign */ 40*4f2df630SAndroid Build Coastguard Worker #define U2F_P256_SIZE 32 41*4f2df630SAndroid Build Coastguard Worker /* Origin seed is a random nonce generated during key handle creation. */ 42*4f2df630SAndroid Build Coastguard Worker #define U2F_ORIGIN_SEED_SIZE 32 43*4f2df630SAndroid Build Coastguard Worker #define U2F_USER_SECRET_SIZE 32 /* Size of user secret */ 44*4f2df630SAndroid Build Coastguard Worker 45*4f2df630SAndroid Build Coastguard Worker #define U2F_AUTH_TIME_SECRET_SIZE 32 46*4f2df630SAndroid Build Coastguard Worker 47*4f2df630SAndroid Build Coastguard Worker #define SHA256_DIGEST_SIZE 32 48*4f2df630SAndroid Build Coastguard Worker #define U2F_MESSAGE_DIGEST_SIZE SHA256_DIGEST_SIZE 49*4f2df630SAndroid Build Coastguard Worker 50*4f2df630SAndroid Build Coastguard Worker #define CORP_CHAL_SIZE 16 51*4f2df630SAndroid Build Coastguard Worker #define CORP_SALT_SIZE 65 52*4f2df630SAndroid Build Coastguard Worker 53*4f2df630SAndroid Build Coastguard Worker #define ENC_SIZE(x) ((x + 7) & 0xfff8) 54*4f2df630SAndroid Build Coastguard Worker 55*4f2df630SAndroid Build Coastguard Worker /* EC (uncompressed) point */ 56*4f2df630SAndroid Build Coastguard Worker 57*4f2df630SAndroid Build Coastguard Worker #define U2F_POINT_UNCOMPRESSED 0x04 /* Uncompressed point format */ 58*4f2df630SAndroid Build Coastguard Worker 59*4f2df630SAndroid Build Coastguard Worker struct u2f_ec_point { 60*4f2df630SAndroid Build Coastguard Worker uint8_t pointFormat; /* Point type */ 61*4f2df630SAndroid Build Coastguard Worker uint8_t x[U2F_EC_KEY_SIZE]; /* X-value */ 62*4f2df630SAndroid Build Coastguard Worker uint8_t y[U2F_EC_KEY_SIZE]; /* Y-value */ 63*4f2df630SAndroid Build Coastguard Worker }; 64*4f2df630SAndroid Build Coastguard Worker 65*4f2df630SAndroid Build Coastguard Worker /* Request Flags. */ 66*4f2df630SAndroid Build Coastguard Worker 67*4f2df630SAndroid Build Coastguard Worker #define U2F_AUTH_ENFORCE 0x03 /* Enforce user presence and sign */ 68*4f2df630SAndroid Build Coastguard Worker #define U2F_AUTH_CHECK_ONLY 0x07 /* Check only */ 69*4f2df630SAndroid Build Coastguard Worker #define U2F_AUTH_FLAG_TUP 0x01 /* Test of user presence set */ 70*4f2df630SAndroid Build Coastguard Worker /* The key handle can be used with fingerprint or PIN. */ 71*4f2df630SAndroid Build Coastguard Worker #define U2F_UV_ENABLED_KH 0x08 72*4f2df630SAndroid Build Coastguard Worker 73*4f2df630SAndroid Build Coastguard Worker /* Request v2 key handle. Should be used with U2F_UV_ENABLED_KH */ 74*4f2df630SAndroid Build Coastguard Worker #define U2F_V2_KH 0x10 75*4f2df630SAndroid Build Coastguard Worker #define U2F_V2_KH_MASK (U2F_V2_KH | U2F_UV_ENABLED_KH) 76*4f2df630SAndroid Build Coastguard Worker 77*4f2df630SAndroid Build Coastguard Worker #define U2F_KH_VERSION_1 0x01 78*4f2df630SAndroid Build Coastguard Worker #define U2F_KH_VERSION_2 0x02 79*4f2df630SAndroid Build Coastguard Worker 80*4f2df630SAndroid Build Coastguard Worker #define U2F_AUTHORIZATION_SALT_SIZE 16 81*4f2df630SAndroid Build Coastguard Worker #define U2F_V0_KH_SIZE 64 82*4f2df630SAndroid Build Coastguard Worker 83*4f2df630SAndroid Build Coastguard Worker /** 84*4f2df630SAndroid Build Coastguard Worker * Key handle version = 1 for WebAuthn, bound to device and user. 85*4f2df630SAndroid Build Coastguard Worker */ 86*4f2df630SAndroid Build Coastguard Worker #define U2F_V1_KH_SIZE 113 87*4f2df630SAndroid Build Coastguard Worker 88*4f2df630SAndroid Build Coastguard Worker /* Header is composed of version || origin_seed || kh_hmac */ 89*4f2df630SAndroid Build Coastguard Worker #define U2F_V1_KH_HEADER_SIZE (U2F_ORIGIN_SEED_SIZE + SHA256_DIGEST_SIZE + 1) 90*4f2df630SAndroid Build Coastguard Worker 91*4f2df630SAndroid Build Coastguard Worker /** 92*4f2df630SAndroid Build Coastguard Worker * Key handle version = 2 for WebAuthn, bound to device and user. 93*4f2df630SAndroid Build Coastguard Worker */ 94*4f2df630SAndroid Build Coastguard Worker #define U2F_V2_KH_SIZE 81 95*4f2df630SAndroid Build Coastguard Worker 96*4f2df630SAndroid Build Coastguard Worker /* Header is composed of version || origin_seed */ 97*4f2df630SAndroid Build Coastguard Worker #define U2F_V2_KH_HEADER_SIZE (U2F_ORIGIN_SEED_SIZE + 1) 98*4f2df630SAndroid Build Coastguard Worker 99*4f2df630SAndroid Build Coastguard Worker struct u2f_signature { 100*4f2df630SAndroid Build Coastguard Worker uint8_t sig_r[U2F_EC_KEY_SIZE]; /* Signature */ 101*4f2df630SAndroid Build Coastguard Worker uint8_t sig_s[U2F_EC_KEY_SIZE]; /* Signature */ 102*4f2df630SAndroid Build Coastguard Worker }; 103*4f2df630SAndroid Build Coastguard Worker 104*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle { 105*4f2df630SAndroid Build Coastguard Worker uint8_t origin_seed[U2F_ORIGIN_SEED_SIZE]; 106*4f2df630SAndroid Build Coastguard Worker uint8_t hmac[SHA256_DIGEST_SIZE]; 107*4f2df630SAndroid Build Coastguard Worker }; 108*4f2df630SAndroid Build Coastguard Worker 109*4f2df630SAndroid Build Coastguard Worker struct u2f_versioned_key_handle_header { 110*4f2df630SAndroid Build Coastguard Worker uint8_t version; 111*4f2df630SAndroid Build Coastguard Worker uint8_t origin_seed[U2F_ORIGIN_SEED_SIZE]; 112*4f2df630SAndroid Build Coastguard Worker uint8_t kh_hmac[SHA256_DIGEST_SIZE]; 113*4f2df630SAndroid Build Coastguard Worker }; 114*4f2df630SAndroid Build Coastguard Worker 115*4f2df630SAndroid Build Coastguard Worker struct u2f_versioned_key_handle { 116*4f2df630SAndroid Build Coastguard Worker struct u2f_versioned_key_handle_header header; 117*4f2df630SAndroid Build Coastguard Worker /* Optionally checked in u2f_sign. */ 118*4f2df630SAndroid Build Coastguard Worker uint8_t authorization_salt[U2F_AUTHORIZATION_SALT_SIZE]; 119*4f2df630SAndroid Build Coastguard Worker uint8_t authorization_hmac[SHA256_DIGEST_SIZE]; 120*4f2df630SAndroid Build Coastguard Worker }; 121*4f2df630SAndroid Build Coastguard Worker 122*4f2df630SAndroid Build Coastguard Worker /** 123*4f2df630SAndroid Build Coastguard Worker * Alternative definitions of key handles. 124*4f2df630SAndroid Build Coastguard Worker * 125*4f2df630SAndroid Build Coastguard Worker * struct u2f_key_handle_v0 == struct u2f_key_handle 126*4f2df630SAndroid Build Coastguard Worker * struct u2f_key_handle_v1 == struct u2f_versioned_key_handle 127*4f2df630SAndroid Build Coastguard Worker * 128*4f2df630SAndroid Build Coastguard Worker */ 129*4f2df630SAndroid Build Coastguard Worker 130*4f2df630SAndroid Build Coastguard Worker /* Key handle version = 0, only bound to device. */ 131*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v0 { 132*4f2df630SAndroid Build Coastguard Worker uint8_t origin_seed[U2F_ORIGIN_SEED_SIZE]; 133*4f2df630SAndroid Build Coastguard Worker uint8_t hmac[SHA256_DIGEST_SIZE]; 134*4f2df630SAndroid Build Coastguard Worker }; 135*4f2df630SAndroid Build Coastguard Worker 136*4f2df630SAndroid Build Coastguard Worker /* Key handle version = 1, bound to device and user. */ 137*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v1 { 138*4f2df630SAndroid Build Coastguard Worker uint8_t version; 139*4f2df630SAndroid Build Coastguard Worker uint8_t origin_seed[U2F_ORIGIN_SEED_SIZE]; 140*4f2df630SAndroid Build Coastguard Worker /* HMAC(u2f_hmac_key, origin || user || origin seed || version) */ 141*4f2df630SAndroid Build Coastguard Worker uint8_t kh_hmac[SHA256_DIGEST_SIZE]; 142*4f2df630SAndroid Build Coastguard Worker /* Optionally checked in u2f_sign. */ 143*4f2df630SAndroid Build Coastguard Worker uint8_t authorization_salt[U2F_AUTHORIZATION_SALT_SIZE]; 144*4f2df630SAndroid Build Coastguard Worker /** 145*4f2df630SAndroid Build Coastguard Worker * HMAC(u2f_hmac_key, 146*4f2df630SAndroid Build Coastguard Worker * auth_salt || version || origin_seed 147*4f2df630SAndroid Build Coastguard Worker * || kh_hmac || authTimeSecretHash) 148*4f2df630SAndroid Build Coastguard Worker */ 149*4f2df630SAndroid Build Coastguard Worker uint8_t authorization_hmac[SHA256_DIGEST_SIZE]; 150*4f2df630SAndroid Build Coastguard Worker }; 151*4f2df630SAndroid Build Coastguard Worker 152*4f2df630SAndroid Build Coastguard Worker /* Key handle version = 2, bound to device and user. */ 153*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v2 { 154*4f2df630SAndroid Build Coastguard Worker uint8_t version; 155*4f2df630SAndroid Build Coastguard Worker uint8_t origin_seed[U2F_ORIGIN_SEED_SIZE]; 156*4f2df630SAndroid Build Coastguard Worker /* Always checked in u2f_sign. */ 157*4f2df630SAndroid Build Coastguard Worker uint8_t authorization_salt[U2F_AUTHORIZATION_SALT_SIZE]; 158*4f2df630SAndroid Build Coastguard Worker /** 159*4f2df630SAndroid Build Coastguard Worker * HMAC(u2f_hmac_key, 160*4f2df630SAndroid Build Coastguard Worker * auth_salt || version || origin_seed || origin || 161*4f2df630SAndroid Build Coastguard Worker * user || authTimeSecretHash) 162*4f2df630SAndroid Build Coastguard Worker */ 163*4f2df630SAndroid Build Coastguard Worker uint8_t authorization_hmac[SHA256_DIGEST_SIZE]; 164*4f2df630SAndroid Build Coastguard Worker }; 165*4f2df630SAndroid Build Coastguard Worker 166*4f2df630SAndroid Build Coastguard Worker union u2f_key_handle_variant { 167*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v0 v0; 168*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v1 v1; 169*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v2 v2; 170*4f2df630SAndroid Build Coastguard Worker }; 171*4f2df630SAndroid Build Coastguard Worker 172*4f2df630SAndroid Build Coastguard Worker /* TODO(louiscollard): Add Descriptions. */ 173*4f2df630SAndroid Build Coastguard Worker 174*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_req { 175*4f2df630SAndroid Build Coastguard Worker uint8_t appId[U2F_APPID_SIZE]; /* Application id */ 176*4f2df630SAndroid Build Coastguard Worker uint8_t userSecret[U2F_USER_SECRET_SIZE]; 177*4f2df630SAndroid Build Coastguard Worker uint8_t flags; 178*4f2df630SAndroid Build Coastguard Worker /* 179*4f2df630SAndroid Build Coastguard Worker * If generating versioned KH, derive an hmac from it and append to 180*4f2df630SAndroid Build Coastguard Worker * the key handle. Otherwise unused. 181*4f2df630SAndroid Build Coastguard Worker */ 182*4f2df630SAndroid Build Coastguard Worker uint8_t authTimeSecretHash[SHA256_DIGEST_SIZE]; 183*4f2df630SAndroid Build Coastguard Worker }; 184*4f2df630SAndroid Build Coastguard Worker 185*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_resp { 186*4f2df630SAndroid Build Coastguard Worker struct u2f_ec_point pubKey; /* Generated public key */ 187*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle keyHandle; 188*4f2df630SAndroid Build Coastguard Worker }; 189*4f2df630SAndroid Build Coastguard Worker 190*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_versioned_resp { 191*4f2df630SAndroid Build Coastguard Worker struct u2f_ec_point pubKey; /* Generated public key */ 192*4f2df630SAndroid Build Coastguard Worker struct u2f_versioned_key_handle keyHandle; 193*4f2df630SAndroid Build Coastguard Worker }; 194*4f2df630SAndroid Build Coastguard Worker 195*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_versioned_resp_v2 { 196*4f2df630SAndroid Build Coastguard Worker struct u2f_ec_point pubKey; /* Generated public key */ 197*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v2 keyHandle; 198*4f2df630SAndroid Build Coastguard Worker }; 199*4f2df630SAndroid Build Coastguard Worker 200*4f2df630SAndroid Build Coastguard Worker /** 201*4f2df630SAndroid Build Coastguard Worker * Combined type for U2F_GENERATE response. Length of response size 202*4f2df630SAndroid Build Coastguard Worker * should be used to determine which version of key handle is generated. 203*4f2df630SAndroid Build Coastguard Worker * Caller may check that response matches request flags. 204*4f2df630SAndroid Build Coastguard Worker */ 205*4f2df630SAndroid Build Coastguard Worker union u2f_generate_response { 206*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_resp v0; 207*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_versioned_resp v1; 208*4f2df630SAndroid Build Coastguard Worker struct u2f_generate_versioned_resp_v2 v2; 209*4f2df630SAndroid Build Coastguard Worker }; 210*4f2df630SAndroid Build Coastguard Worker 211*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_req { 212*4f2df630SAndroid Build Coastguard Worker uint8_t appId[U2F_APPID_SIZE]; /* Application id */ 213*4f2df630SAndroid Build Coastguard Worker uint8_t userSecret[U2F_USER_SECRET_SIZE]; 214*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle keyHandle; 215*4f2df630SAndroid Build Coastguard Worker uint8_t hash[U2F_P256_SIZE]; 216*4f2df630SAndroid Build Coastguard Worker uint8_t flags; 217*4f2df630SAndroid Build Coastguard Worker }; 218*4f2df630SAndroid Build Coastguard Worker 219*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_versioned_req { 220*4f2df630SAndroid Build Coastguard Worker uint8_t appId[U2F_APPID_SIZE]; /* Application id */ 221*4f2df630SAndroid Build Coastguard Worker uint8_t userSecret[U2F_USER_SECRET_SIZE]; 222*4f2df630SAndroid Build Coastguard Worker uint8_t authTimeSecret[U2F_AUTH_TIME_SECRET_SIZE]; 223*4f2df630SAndroid Build Coastguard Worker uint8_t hash[U2F_P256_SIZE]; 224*4f2df630SAndroid Build Coastguard Worker uint8_t flags; 225*4f2df630SAndroid Build Coastguard Worker struct u2f_versioned_key_handle keyHandle; 226*4f2df630SAndroid Build Coastguard Worker }; 227*4f2df630SAndroid Build Coastguard Worker 228*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_versioned_req_v2 { 229*4f2df630SAndroid Build Coastguard Worker uint8_t appId[U2F_APPID_SIZE]; /* Application id */ 230*4f2df630SAndroid Build Coastguard Worker uint8_t userSecret[U2F_USER_SECRET_SIZE]; 231*4f2df630SAndroid Build Coastguard Worker uint8_t authTimeSecret[U2F_AUTH_TIME_SECRET_SIZE]; 232*4f2df630SAndroid Build Coastguard Worker uint8_t hash[U2F_P256_SIZE]; 233*4f2df630SAndroid Build Coastguard Worker uint8_t flags; 234*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v2 keyHandle; 235*4f2df630SAndroid Build Coastguard Worker }; 236*4f2df630SAndroid Build Coastguard Worker 237*4f2df630SAndroid Build Coastguard Worker /** 238*4f2df630SAndroid Build Coastguard Worker * Combined type for U2F_SIGN request. Length of request size 239*4f2df630SAndroid Build Coastguard Worker * is used to determine which version of key handle is provided. 240*4f2df630SAndroid Build Coastguard Worker */ 241*4f2df630SAndroid Build Coastguard Worker union u2f_sign_request { 242*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_req v0; 243*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_versioned_req v1; 244*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_versioned_req_v2 v2; 245*4f2df630SAndroid Build Coastguard Worker }; 246*4f2df630SAndroid Build Coastguard Worker 247*4f2df630SAndroid Build Coastguard Worker struct u2f_sign_resp { 248*4f2df630SAndroid Build Coastguard Worker uint8_t sig_r[U2F_P256_SIZE]; /* Signature */ 249*4f2df630SAndroid Build Coastguard Worker uint8_t sig_s[U2F_P256_SIZE]; /* Signature */ 250*4f2df630SAndroid Build Coastguard Worker }; 251*4f2df630SAndroid Build Coastguard Worker 252*4f2df630SAndroid Build Coastguard Worker struct u2f_attest_req { 253*4f2df630SAndroid Build Coastguard Worker uint8_t userSecret[U2F_USER_SECRET_SIZE]; 254*4f2df630SAndroid Build Coastguard Worker uint8_t format; 255*4f2df630SAndroid Build Coastguard Worker uint8_t dataLen; 256*4f2df630SAndroid Build Coastguard Worker /* struct g2f_register_msg_vX or corp_register_msg_vX */ 257*4f2df630SAndroid Build Coastguard Worker uint8_t data[U2F_MAX_ATTEST_SIZE]; 258*4f2df630SAndroid Build Coastguard Worker }; 259*4f2df630SAndroid Build Coastguard Worker 260*4f2df630SAndroid Build Coastguard Worker struct g2f_register_msg_v0 { 261*4f2df630SAndroid Build Coastguard Worker uint8_t reserved; 262*4f2df630SAndroid Build Coastguard Worker uint8_t app_id[U2F_APPID_SIZE]; 263*4f2df630SAndroid Build Coastguard Worker uint8_t challenge[U2F_CHAL_SIZE]; 264*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v0 key_handle; 265*4f2df630SAndroid Build Coastguard Worker struct u2f_ec_point public_key; 266*4f2df630SAndroid Build Coastguard Worker }; 267*4f2df630SAndroid Build Coastguard Worker 268*4f2df630SAndroid Build Coastguard Worker struct corp_attest_data { 269*4f2df630SAndroid Build Coastguard Worker uint8_t challenge[CORP_CHAL_SIZE]; 270*4f2df630SAndroid Build Coastguard Worker struct u2f_ec_point public_key; 271*4f2df630SAndroid Build Coastguard Worker uint8_t salt[CORP_SALT_SIZE]; 272*4f2df630SAndroid Build Coastguard Worker }; 273*4f2df630SAndroid Build Coastguard Worker 274*4f2df630SAndroid Build Coastguard Worker struct corp_register_msg_v0 { 275*4f2df630SAndroid Build Coastguard Worker struct corp_attest_data data; 276*4f2df630SAndroid Build Coastguard Worker uint8_t app_id[U2F_APPID_SIZE]; 277*4f2df630SAndroid Build Coastguard Worker struct u2f_key_handle_v0 key_handle; 278*4f2df630SAndroid Build Coastguard Worker }; 279*4f2df630SAndroid Build Coastguard Worker 280*4f2df630SAndroid Build Coastguard Worker union u2f_attest_msg_variant { 281*4f2df630SAndroid Build Coastguard Worker struct g2f_register_msg_v0 g2f; 282*4f2df630SAndroid Build Coastguard Worker struct corp_register_msg_v0 corp; 283*4f2df630SAndroid Build Coastguard Worker }; 284*4f2df630SAndroid Build Coastguard Worker 285*4f2df630SAndroid Build Coastguard Worker struct u2f_attest_resp { 286*4f2df630SAndroid Build Coastguard Worker uint8_t sig_r[U2F_P256_SIZE]; 287*4f2df630SAndroid Build Coastguard Worker uint8_t sig_s[U2F_P256_SIZE]; 288*4f2df630SAndroid Build Coastguard Worker }; 289*4f2df630SAndroid Build Coastguard Worker 290*4f2df630SAndroid Build Coastguard Worker /* Command status responses */ 291*4f2df630SAndroid Build Coastguard Worker 292*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_NO_ERROR 0x9000 /* SW_NO_ERROR */ 293*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_WRONG_DATA 0x6A80 /* SW_WRONG_DATA */ 294*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_CONDITIONS_NOT_SATISFIED \ 295*4f2df630SAndroid Build Coastguard Worker 0x6985 /* SW_CONDITIONS_NOT_SATISFIED \ 296*4f2df630SAndroid Build Coastguard Worker */ 297*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_COMMAND_NOT_ALLOWED 0x6986 /* SW_COMMAND_NOT_ALLOWED */ 298*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_INS_NOT_SUPPORTED 0x6D00 /* SW_INS_NOT_SUPPORTED */ 299*4f2df630SAndroid Build Coastguard Worker 300*4f2df630SAndroid Build Coastguard Worker /* Protocol extensions */ 301*4f2df630SAndroid Build Coastguard Worker 302*4f2df630SAndroid Build Coastguard Worker /* Non-standardized command status responses */ 303*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_CLA_NOT_SUPPORTED 0x6E00 304*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_WRONG_LENGTH 0x6700 305*4f2df630SAndroid Build Coastguard Worker #define U2F_SW_WTF 0x6f00 306*4f2df630SAndroid Build Coastguard Worker 307*4f2df630SAndroid Build Coastguard Worker /* Additional flags for P1 field */ 308*4f2df630SAndroid Build Coastguard Worker #define G2F_ATTEST 0x80 /* Fixed attestation key */ 309*4f2df630SAndroid Build Coastguard Worker #define G2F_CONSUME 0x02 /* Consume presence */ 310*4f2df630SAndroid Build Coastguard Worker 311*4f2df630SAndroid Build Coastguard Worker /* 312*4f2df630SAndroid Build Coastguard Worker * The key handle format was changed when support for user secrets was added. 313*4f2df630SAndroid Build Coastguard Worker * U2F_SIGN requests that specify this flag will first try to validate the key 314*4f2df630SAndroid Build Coastguard Worker * handle as a new format key handle, and if that fails, will fall back to 315*4f2df630SAndroid Build Coastguard Worker * treating it as a legacy key handle (without user secrets). 316*4f2df630SAndroid Build Coastguard Worker */ 317*4f2df630SAndroid Build Coastguard Worker #define SIGN_LEGACY_KH 0x40 318*4f2df630SAndroid Build Coastguard Worker 319*4f2df630SAndroid Build Coastguard Worker /* U2F Attest format for U2F Register Response. */ 320*4f2df630SAndroid Build Coastguard Worker #define U2F_ATTEST_FORMAT_REG_RESP 0 321*4f2df630SAndroid Build Coastguard Worker 322*4f2df630SAndroid Build Coastguard Worker /* Corp Attest format for U2F Register Response. */ 323*4f2df630SAndroid Build Coastguard Worker #define CORP_ATTEST_FORMAT_REG_RESP 1 324*4f2df630SAndroid Build Coastguard Worker 325*4f2df630SAndroid Build Coastguard Worker /* Vendor command to enable/disable the extensions */ 326*4f2df630SAndroid Build Coastguard Worker #define U2F_VENDOR_MODE U2F_VENDOR_LAST 327*4f2df630SAndroid Build Coastguard Worker 328*4f2df630SAndroid Build Coastguard Worker #ifdef __cplusplus 329*4f2df630SAndroid Build Coastguard Worker } 330*4f2df630SAndroid Build Coastguard Worker #endif 331*4f2df630SAndroid Build Coastguard Worker 332*4f2df630SAndroid Build Coastguard Worker #endif /* __U2F_H_INCLUDED__ */ 333