xref: /aosp_15_r20/external/gsc-utils/include/u2f.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
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