ctap.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Freie Universität Berlin
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
25 #ifndef FIDO2_CTAP_CTAP_H
26 #define FIDO2_CTAP_CTAP_H
27 
28 #include <stdint.h>
29 
30 #include "mutex.h"
31 #include "cbor.h"
32 #include "assert.h"
33 #include "crypto/modes/ccm.h"
34 #include "timex.h"
35 #include "board.h"
36 
37 #include "fido2/ctap.h"
38 #include "fido2/ctap/ctap_crypto.h"
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
51 #define CTAP_PIN_AUTH_SZ 16
52 
58 #define CTAP_AUTH_DATA_FLAG_UP (1 << 0)
59 #define CTAP_AUTH_DATA_FLAG_UV (1 << 2)
60 #define CTAP_AUTH_DATA_FLAG_AT (1 << 6)
61 #define CTAP_AUTH_DATA_FLAG_ED (1 << 7)
69 #define CTAP_VERSION_FLAG_FIDO_PRE 0x01
70 #define CTAP_VERSION_FLAG_FIDO 0x02
71 #define CTAP_VERSION_FLAG_U2F_V2 0x04
81 #define CTAP_GET_INFO_RESP_OPTIONS_ID_PLAT "plat"
82 #define CTAP_GET_INFO_RESP_OPTIONS_ID_RK "rk"
83 #define CTAP_GET_INFO_RESP_OPTIONS_ID_CLIENT_PIN "clientPin"
84 #define CTAP_GET_INFO_RESP_OPTIONS_ID_UP "up"
85 #define CTAP_GET_INFO_RESP_OPTIONS_ID_UV "uv"
93 #define CTAP_INFO_OPTIONS_FLAG_PLAT (1 << 0)
94 #define CTAP_INFO_OPTIONS_FLAG_RK (1 << 1)
95 #define CTAP_INFO_OPTIONS_FLAG_CLIENT_PIN (1 << 2)
96 #define CTAP_INFO_OPTIONS_FLAG_UP (1 << 3)
97 #define CTAP_INFO_OPTIONS_FLAG_UV (1 << 4)
105 typedef enum {
110  CTAP_PIN_GET_PIN_TOKEN = 0x05
117 #ifdef CONFIG_FIDO2_CTAP_STACK_SIZE
118 #define CTAP_STACKSIZE CONFIG_FIDO2_CTAP_STACK_SIZE
119 #else
120 #define CTAP_STACKSIZE 15000
121 #endif
122 
126 #if defined(CONFIG_FIDO2_CTAP_UP_BUTTON_PORT) && defined(CONFIG_FIDO2_CTAP_UP_BUTTON_PIN) && \
127  (CONFIG_FIDO2_CTAP_UP_BUTTON_PORT >= 0) && (CONFIG_FIDO2_CTAP_UP_BUTTON_PIN >= 0)
128 #define CTAP_UP_BUTTON GPIO_PIN(CONFIG_FIDO2_CTAP_UP_BUTTON_PORT, CONFIG_FIDO2_CTAP_UP_BUTTON_PIN)
129 #else
130 /* set default button if no button is configured */
131 #ifdef BTN0_PIN
132 #define CTAP_UP_BUTTON BTN0_PIN
133 #else
134 #define CTAP_UP_BUTTON 0
138 #define CONFIG_FIDO2_CTAP_DISABLE_UP 1
139 #endif /* BTN0_PIN */
140 #endif
141 
145 #if IS_ACTIVE(CONFIG_FIDO2_CTAP_UP_BUTTON_MODE_IN_PU)
146 #define CTAP_UP_BUTTON_MODE GPIO_IN_PU
147 #elif IS_ACTIVE(CONFIG_FIDO2_CTAP_UP_BUTTON_MODE_IN_PD)
148 #define CTAP_UP_BUTTON_MODE GPIO_IN_PD
149 #elif IS_ACTIVE(CONFIG_FIDO2_CTAP_UP_BUTTON_MODE_IN)
150 #define CTAP_UP_BUTTON_MODE GPIO_IN
151 #else
152 #define CTAP_UP_BUTTON_MODE GPIO_IN_PU
153 #endif
154 
158 #if IS_ACTIVE(CONFIG_FIDO2_CTAP_UP_BUTTON_FLANK_FALLING)
159 #define CTAP_UP_BUTTON_FLANK GPIO_FALLING
160 #elif IS_ACTIVE(CONFIG_FIDO2_CTAP_UP_BUTTON_FLANK_RISING)
161 #define CTAP_UP_BUTTON_FLANK GPIO_RISING
162 #elif IS_ACTIVE(CONFIG_FIDO2_CTAP_UP_BUTTON_FLANK_BOTH)
163 #define CTAP_UP_BUTTON_FLANK GPIO_BOTH
164 #else
165 #define CTAP_UP_BUTTON_FLANK GPIO_FALLING
166 #endif
167 
171 #ifndef CONFIG_FIDO2_CTAP_DISABLE_UP
172 #define CONFIG_FIDO2_CTAP_DISABLE_UP 0
173 #endif
174 
178 #ifndef CONFIG_FIDO2_CTAP_DISABLE_LED
179 #define CONFIG_FIDO2_CTAP_DISABLE_LED 0
180 #endif
181 
185 #define CTAP_RP_MAX_NAME_SIZE 32
186 
190 #define CTAP_USER_MAX_NAME_SIZE 64 + 1
191 
195 #define CTAP_USER_ID_MAX_SIZE 64
196 
200 #define CTAP_DOMAIN_NAME_MAX_SIZE 253 + 1
201 
205 #define CTAP_ICON_MAX_SIZE 128 + 1
206 
210 #define CTAP_PIN_MIN_SIZE 4
211 
218 #define CTAP_PIN_ENC_MIN_SIZE 64
219 
224 #define CTAP_PIN_ENC_MAX_SIZE 256
225 
229 #define CTAP_PIN_MAX_SIZE 64
230 
234 #define CTAP_PIN_MAX_ATTS 8
235 
239 #define CTAP_PIN_MAX_ATTS_BOOT 3
240 
244 #define CTAP_PIN_PROT_VER 1
245 
249 #define CTAP_AMT_SUP_PIN_VER 1
250 
256 #define CTAP_PIN_TOKEN_SZ 16
257 
265 #define CTAP_CRED_KEY_LEN 16
266 
274 #define CTAP_AES_CCM_L 2
275 
279 #define CTAP_AES_CCM_NONCE_SIZE (15 - CTAP_AES_CCM_L)
280 
286 #define CTAP_CREDENTIAL_ID_ENC_SIZE (sizeof(struct ctap_resident_key) - \
287  sizeof(((struct ctap_resident_key *)0)-> \
288  cred_desc.cred_id) - \
289  sizeof(((struct ctap_resident_key *)0)-> \
290  cred_desc.has_nonce))
291 
295 #ifdef CONFIG_FIDO2_CTAP_UP_TIMEOUT
296 #define CTAP_UP_TIMEOUT (CONFIG_FIDO2_CTAP_UP_TIMEOUT * MS_PER_SEC)
297 #else
298 #define CTAP_UP_TIMEOUT (15 * MS_PER_SEC)
299 #endif
300 
305 #define CTAP_GET_NEXT_ASSERTION_TIMEOUT (30 * MS_PER_SEC)
306 
310 #ifdef CONFIG_FIDO2_CTAP_DEVICE_AAGUID
311 #define CTAP_AAGUID CONFIG_FIDO2_CTAP_DEVICE_AAGUID
312 #else
313 /* randomly generated fallback value */
314 #define CTAP_AAGUID "9c295865fa2c36b705a42320af9c8f16"
315 #endif
316 
322 #define CTAP_PUB_KEY_CRED_PUB_KEY 0x01
323 #define CTAP_PUB_KEY_CRED_UNKNOWN 0x02
331 #define CTAP_COSE_KEY_LABEL_KTY 1
332 #define CTAP_COSE_KEY_LABEL_ALG 3
333 #define CTAP_COSE_KEY_LABEL_CRV -1
334 #define CTAP_COSE_KEY_LABEL_X -2
335 #define CTAP_COSE_KEY_LABEL_Y -3
336 #define CTAP_COSE_KEY_KTY_EC2 2
337 #define CTAP_COSE_KEY_CRV_P256 1
343 #define CTAP_AAGUID_SIZE 16
344 
348 #define CTAP_COSE_ALG_ES256 -7
349 
353 #define CTAP_COSE_ALG_ECDH_ES_HKDF_256 -25
354 
359 #define CTAP_CREDENTIAL_ID_SIZE 16U
360 
367 #define CTAP_INITIALIZED_MARKER 0x4e
368 
372 #define CTAP_MAX_EXCLUDE_LIST_SIZE 0x14
373 
377 typedef struct ctap_cred_desc ctap_cred_desc_t;
378 
383 
388 
392 typedef struct {
393  uint8_t aaguid[CTAP_AAGUID_SIZE];
394  uint8_t options;
395 } ctap_config_t;
396 
402 typedef struct {
406  uint16_t rk_amount_stored;
408  uint8_t pin_hash[SHA256_DIGEST_LENGTH / 2];
409  uint8_t cred_key[CTAP_CRED_KEY_LEN];
411  bool pin_is_set;
412  uint32_t id_cnt;
413 } ctap_state_t;
414 
418 typedef struct {
419  int rk;
420  int uv;
421  int up;
423 
427 typedef struct {
428  uint8_t id[CTAP_USER_ID_MAX_SIZE];
429  uint8_t id_len;
430  uint8_t name[CTAP_USER_MAX_NAME_SIZE];
431  uint8_t display_name[CTAP_USER_MAX_NAME_SIZE];
434 
439 typedef struct {
440  uint8_t id[CTAP_DOMAIN_NAME_MAX_SIZE + 1];
441  uint8_t id_len;
443  uint8_t name[CTAP_RP_MAX_NAME_SIZE + 1];
445  uint8_t icon[CTAP_DOMAIN_NAME_MAX_SIZE + 1];
447 } ctap_rp_ent_t;
448 
454 typedef struct {
456  int kty;
457  int crv;
458  int32_t alg_type;
459  uint8_t cred_type;
461 
471  uint8_t cred_type;
472  union {
475  };
476  bool has_nonce;
478 };
479 
486 struct __attribute__((packed)) ctap_resident_key {
487  uint8_t rp_id_hash[SHA256_DIGEST_LENGTH];
488  uint8_t user_id[CTAP_USER_ID_MAX_SIZE];
489  uint8_t user_id_len;
490  uint8_t priv_key[CTAP_CRYPTO_KEY_SIZE];
491  uint16_t id;
492  uint32_t sign_count;
497 };
498 
505 typedef struct __attribute__((packed)) {
507  uint8_t mac[CCM_MAC_MAX_LEN];
508  uint8_t nonce[CTAP_AES_CCM_NONCE_SIZE];
510 
517  uint8_t cred_type;
519 };
520 
524 typedef struct {
530  uint8_t client_data_hash[SHA256_DIGEST_LENGTH];
531  uint8_t pin_auth[CTAP_PIN_AUTH_SZ];
532  size_t pin_auth_len;
533  int32_t alg_type;
535  uint8_t pin_protocol;
536  uint8_t cred_type;
538 
542 typedef struct {
545  uint8_t client_data_hash[SHA256_DIGEST_LENGTH];
546  uint8_t rp_id[CTAP_DOMAIN_NAME_MAX_SIZE + 1];
547  uint8_t rp_id_len;
548  uint8_t allow_list_len;
549  uint8_t pin_auth[CTAP_PIN_AUTH_SZ];
550  size_t pin_auth_len;
551  uint8_t pin_protocol;
554 
558 typedef struct {
560  uint16_t new_pin_enc_size;
561  uint8_t pin_auth[CTAP_PIN_AUTH_SZ];
562  uint8_t new_pin_enc[CTAP_PIN_ENC_MAX_SIZE];
563  uint8_t pin_hash_enc[SHA256_DIGEST_LENGTH / 2];
565  uint8_t pin_protocol;
570 
576 typedef struct __attribute__((packed)){
577  uint8_t aaguid[CTAP_AAGUID_SIZE];
578  uint8_t cred_len_h;
579  uint8_t cred_len_l;
582 
586 typedef struct {
590 
596 typedef struct __attribute__((packed)){
597  uint8_t rp_id_hash[SHA256_DIGEST_LENGTH];
598  uint8_t flags;
599  uint32_t sign_count;
601 
605 typedef struct {
609 
613 typedef struct {
614  uint16_t max_msg_size;
615  uint8_t aaguid[CTAP_AAGUID_SIZE];
616  uint8_t versions;
617  uint8_t options;
618  uint8_t pin_protocol;
619  bool pin_is_set;
620 } ctap_info_t;
621 
636 int fido2_ctap_get_sig(const uint8_t *auth_data, size_t auth_data_len,
637  const uint8_t *client_data_hash,
638  const ctap_resident_key_t *rk,
639  uint8_t *sig, size_t *sig_len);
640 
650 bool fido2_ctap_cred_params_supported(uint8_t cred_type, int32_t alg_type);
651 
663  size_t nonce_len, ctap_cred_id_t *id);
664 
672 
679 
680 #ifdef __cplusplus
681 }
682 #endif
683 #endif /* FIDO2_CTAP_CTAP_H */
POSIX.1-2008 compliant version of the assert macro.
Functionality for encoding SenML values as CBOR.
Counter with CBC-MAC mode of operation for block ciphers.
#define CCM_MAC_MAX_LEN
Maximum length for the appended MAC.
Definition: ccm.h:48
Public FIDO2 CTAP defines, structures and function declarations.
FIDO2 CTAP crypto helper defines, structures and function declarations.
#define CTAP_CRYPTO_KEY_SIZE
Size in bytes of cryptographic keys used.
Definition: ctap_crypto.h:38
bool fido2_ctap_cred_params_supported(uint8_t cred_type, int32_t alg_type)
Check if requested algorithm is supported.
#define CTAP_CREDENTIAL_ID_SIZE
CTAP size of credential id.
Definition: ctap.h:359
int fido2_ctap_encrypt_rk(ctap_resident_key_t *rk, uint8_t *nonce, size_t nonce_len, ctap_cred_id_t *id)
Encrypt resident key with AES CCM.
int fido2_ctap_get_sig(const uint8_t *auth_data, size_t auth_data_len, const uint8_t *client_data_hash, const ctap_resident_key_t *rk, uint8_t *sig, size_t *sig_len)
Create signature from authenticator data.
#define CTAP_CREDENTIAL_ID_ENC_SIZE
Total size of AES CCM credential id.
Definition: ctap.h:286
#define CTAP_PIN_AUTH_SZ
Size of pin auth.
Definition: ctap.h:51
ctap_state_t * fido2_ctap_get_state(void)
Get a pointer to the authenticator state.
#define CTAP_RP_MAX_NAME_SIZE
Max size of relying party name.
Definition: ctap.h:185
#define CTAP_PIN_ENC_MAX_SIZE
Encrypted newPin max size.
Definition: ctap.h:224
ctap_pin_subcommand_t
CTAP Client PIN request subCommand CBOR key values.
Definition: ctap.h:105
#define CTAP_AAGUID_SIZE
CTAP size of authenticator AAGUID in bytes.
Definition: ctap.h:343
#define CTAP_DOMAIN_NAME_MAX_SIZE
Max size of a domain name including null character.
Definition: ctap.h:200
#define CTAP_MAX_EXCLUDE_LIST_SIZE
Max size of allow list.
Definition: ctap.h:372
#define CTAP_USER_ID_MAX_SIZE
Max size of user id.
Definition: ctap.h:195
bool fido2_ctap_pin_is_set(void)
Check if PIN has been set on authenticator.
#define CTAP_AES_CCM_NONCE_SIZE
AES CCM nonce size.
Definition: ctap.h:279
#define CTAP_USER_MAX_NAME_SIZE
Max size of username including null character.
Definition: ctap.h:190
#define CTAP_CRED_KEY_LEN
Size of key used to encrypt credential.
Definition: ctap.h:265
@ CTAP_PIN_SET_PIN
setPIN subCommand
Definition: ctap.h:108
@ CTAP_PIN_GET_PIN_TOKEN
getPinToken subCommand
Definition: ctap.h:110
@ CTAP_PIN_CHANGE_PIN
changePIN subCommand
Definition: ctap.h:109
@ CTAP_PIN_GET_KEY_AGREEMENT
getKeyAgreement subCommand
Definition: ctap.h:107
@ CTAP_PIN_GET_RETRIES
getRetries subCommand
Definition: ctap.h:106
#define SHA256_DIGEST_LENGTH
Length of SHA256 digests in bytes.
Definition: sha256.h:62
Mutex for thread synchronization.
CTAP attested credential data header struct.
Definition: ctap.h:576
ctap_cred_id_t cred_id
credential id
Definition: ctap.h:580
uint8_t cred_len_l
lower byte of credential length
Definition: ctap.h:579
uint8_t cred_len_h
higher byte of credential length
Definition: ctap.h:578
CTAP attested credential data struct.
Definition: ctap.h:586
ctap_public_key_cose_t key
cose key
Definition: ctap.h:588
ctap_attested_cred_data_header_t header
attested credential data header
Definition: ctap.h:587
CTAP authenticator data header struct.
Definition: ctap.h:596
uint8_t flags
flags indicating result of user verification
Definition: ctap.h:598
uint32_t sign_count
sign count of credential
Definition: ctap.h:599
CTAP authenticator data struct.
Definition: ctap.h:605
ctap_attested_cred_data_t attested_cred_data
attested credential data
Definition: ctap.h:607
ctap_auth_data_header_t header
auth data header
Definition: ctap.h:606
CTAP client pin request struct.
Definition: ctap.h:558
bool key_agreement_present
indicate if key_agreement present
Definition: ctap.h:568
uint16_t new_pin_enc_size
size of encrypted new pin
Definition: ctap.h:560
ctap_pin_subcommand_t sub_command
ClientPIN sub command.
Definition: ctap.h:564
ctap_public_key_cose_t key_agreement
public key of platform_key_agreement_key
Definition: ctap.h:559
bool pin_auth_present
indicate if pin_auth present
Definition: ctap.h:567
uint8_t pin_protocol
PIN protocol version chosen by the client.
Definition: ctap.h:565
bool pin_hash_enc_present
indicate pin_hash_enc is present
Definition: ctap.h:566
CTAP authenticator config struct.
Definition: ctap.h:392
uint8_t options
options
Definition: ctap.h:394
CTAP credential description alternative struct.
Definition: ctap.h:516
uint8_t cred_type
type of credential
Definition: ctap.h:517
ctap_cred_id_t cred_id
credential id
Definition: ctap.h:518
CTAP credential description struct.
Definition: ctap.h:470
uint8_t cred_id[CTAP_CREDENTIAL_ID_SIZE]
credential identifier
Definition: ctap.h:473
uint8_t nonce[CTAP_AES_CCM_NONCE_SIZE]
CTAP AES CCM nonce.
Definition: ctap.h:474
uint8_t cred_type
type of credential
Definition: ctap.h:471
bool has_nonce
Indicate if nonce or cred_id
Definition: ctap.h:476
CTAP credential ID.
Definition: ctap.h:505
Elliptic curve public key.
Definition: ctap_crypto.h:48
CTAP get assertion request struct.
Definition: ctap.h:542
uint8_t pin_protocol
PIN protocol version.
Definition: ctap.h:551
bool pin_auth_present
indicate if pin_auth present
Definition: ctap.h:552
size_t pin_auth_len
pin_auth length
Definition: ctap.h:550
uint8_t rp_id_len
Actual Length of Relying Party Identifier.
Definition: ctap.h:547
uint8_t allow_list_len
length of CBOR allow list array
Definition: ctap.h:548
ctap_options_t options
parameters to influence authenticator operation
Definition: ctap.h:543
CTAP info struct.
Definition: ctap.h:613
bool pin_is_set
PIN is set or not.
Definition: ctap.h:619
uint8_t options
supported options
Definition: ctap.h:617
uint8_t pin_protocol
supported PIN protocol versions
Definition: ctap.h:618
uint8_t versions
supported versions of FIDO
Definition: ctap.h:616
uint16_t max_msg_size
max message size
Definition: ctap.h:614
CTAP make credential request struct.
Definition: ctap.h:524
ctap_user_ent_t user
user
Definition: ctap.h:528
bool pin_auth_present
pin_auth present
Definition: ctap.h:534
int32_t alg_type
cryptographic algorithm identifier
Definition: ctap.h:533
size_t exclude_list_len
length of CBOR exclude list array
Definition: ctap.h:526
ctap_rp_ent_t rp
relying party
Definition: ctap.h:527
size_t pin_auth_len
pin_auth len
Definition: ctap.h:532
uint8_t cred_type
type of credential
Definition: ctap.h:536
ctap_options_t options
parameters to influence authenticator operation
Definition: ctap.h:529
uint8_t pin_protocol
PIN protocol version.
Definition: ctap.h:535
CTAP options struct.
Definition: ctap.h:418
int up
user presence
Definition: ctap.h:421
int uv
user verification
Definition: ctap.h:420
int rk
resident key
Definition: ctap.h:419
CTAP cose key struct.
Definition: ctap.h:454
int crv
EC identifier.
Definition: ctap.h:457
int32_t alg_type
COSEAlgorithmIdentifier.
Definition: ctap.h:458
int kty
identification of key type
Definition: ctap.h:456
ctap_crypto_pub_key_t pubkey
public key
Definition: ctap.h:455
uint8_t cred_type
type of credential
Definition: ctap.h:459
CTAP resident key struct.
Definition: ctap.h:486
ctap_cred_desc_t cred_desc
credential descriptor
Definition: ctap.h:496
uint32_t sign_count
signature counter.
Definition: ctap.h:492
uint8_t user_id_len
length of the user id
Definition: ctap.h:489
uint16_t id
internal id of key
Definition: ctap.h:491
CTAP relying party entity struct.
Definition: ctap.h:439
uint8_t id_len
actual length of relying party identifier
Definition: ctap.h:441
CTAP state struct.
Definition: ctap.h:402
uint16_t rk_amount_stored
total number of resident keys stored on device
Definition: ctap.h:406
int rem_pin_att
remaining PIN tries
Definition: ctap.h:405
bool pin_is_set
PIN is set or not.
Definition: ctap.h:411
ctap_config_t config
configuration of authenticator
Definition: ctap.h:403
bool cred_key_is_initialized
AES CCM key initialized flag.
Definition: ctap.h:410
uint8_t initialized_marker
CTAP initialized marker.
Definition: ctap.h:407
ctap_crypto_key_agreement_key_t ag_key
Platform key agreement key.
Definition: ctap.h:404
uint32_t id_cnt
id counter for credential id
Definition: ctap.h:412
CTAP user entity struct.
Definition: ctap.h:427
uint8_t id_len
actual length of user id
Definition: ctap.h:429
Utility library for comparing and computing timestamps.