Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  * Copyright (c) 2018-2022 Yubico AB. All rights reserved.
      3  * Use of this source code is governed by a BSD-style
      4  * license that can be found in the LICENSE file.
      5  * SPDX-License-Identifier: BSD-2-Clause
      6  */
      7 
      8 #ifndef _EXTERN_H
      9 #define _EXTERN_H
     10 
     11 #ifdef __MINGW32__
     12 #include <sys/types.h>
     13 #endif
     14 
     15 #ifdef HAVE_SIGNAL_H
     16 #include <signal.h>
     17 #endif
     18 
     19 #include <stdint.h>
     20 
     21 #include "fido/types.h"
     22 #include "blob.h"
     23 
     24 #ifdef __cplusplus
     25 extern "C" {
     26 #endif /* __cplusplus */
     27 
     28 /* aes256 */
     29 int aes256_cbc_dec(const fido_dev_t *dev, const fido_blob_t *,
     30     const fido_blob_t *, fido_blob_t *);
     31 int aes256_cbc_enc(const fido_dev_t *dev, const fido_blob_t *,
     32     const fido_blob_t *, fido_blob_t *);
     33 int aes256_gcm_dec(const fido_blob_t *, const fido_blob_t *,
     34     const fido_blob_t *, const fido_blob_t *, fido_blob_t *);
     35 int aes256_gcm_enc(const fido_blob_t *, const fido_blob_t *,
     36     const fido_blob_t *, const fido_blob_t *, fido_blob_t *);
     37 
     38 /* cbor encoding functions */
     39 cbor_item_t *cbor_build_uint(const uint64_t);
     40 cbor_item_t *cbor_flatten_vector(cbor_item_t **, size_t);
     41 cbor_item_t *cbor_encode_assert_opt(fido_opt_t, fido_opt_t);
     42 cbor_item_t *cbor_encode_change_pin_auth(const fido_dev_t *,
     43     const fido_blob_t *, const fido_blob_t *, const fido_blob_t *);
     44 cbor_item_t *cbor_encode_cred_ext(const fido_cred_ext_t *, const fido_blob_t *);
     45 cbor_item_t *cbor_encode_assert_ext(fido_dev_t *,
     46     const fido_assert_ext_t *, const fido_blob_t *, const es256_pk_t *);
     47 cbor_item_t *cbor_encode_cred_opt(fido_opt_t, fido_opt_t);
     48 cbor_item_t *cbor_encode_pin_auth(const fido_dev_t *, const fido_blob_t *,
     49     const fido_blob_t *);
     50 cbor_item_t *cbor_encode_pin_opt(const fido_dev_t *);
     51 cbor_item_t *cbor_encode_pubkey(const fido_blob_t *);
     52 cbor_item_t *cbor_encode_pubkey_list(const fido_blob_array_t *);
     53 cbor_item_t *cbor_encode_pubkey_param(int);
     54 cbor_item_t *cbor_encode_rp_entity(const fido_rp_t *);
     55 cbor_item_t *cbor_encode_str_array(const fido_str_array_t *);
     56 cbor_item_t *cbor_encode_user_entity(const fido_user_t *);
     57 cbor_item_t *es256_pk_encode(const es256_pk_t *, int);
     58 
     59 /* cbor decoding functions */
     60 int cbor_decode_attstmt(const cbor_item_t *, fido_attstmt_t *);
     61 int cbor_decode_attobj(const cbor_item_t *, fido_cred_t *);
     62 int cbor_decode_bool(const cbor_item_t *, bool *);
     63 int cbor_decode_cred_authdata(const cbor_item_t *, int, fido_blob_t *,
     64     fido_authdata_t *, fido_attcred_t *, fido_cred_ext_t *);
     65 int cbor_decode_assert_authdata(const cbor_item_t *, fido_blob_t *,
     66     fido_authdata_t *, fido_assert_extattr_t *);
     67 int cbor_decode_cred_id(const cbor_item_t *, fido_blob_t *);
     68 int cbor_decode_fmt(const cbor_item_t *, char **);
     69 int cbor_decode_pubkey(const cbor_item_t *, int *, void *);
     70 int cbor_decode_rp_entity(const cbor_item_t *, fido_rp_t *);
     71 int cbor_decode_uint64(const cbor_item_t *, uint64_t *);
     72 int cbor_decode_user(const cbor_item_t *, fido_user_t *);
     73 int es256_pk_decode(const cbor_item_t *, es256_pk_t *);
     74 int es384_pk_decode(const cbor_item_t *, es384_pk_t *);
     75 int rs256_pk_decode(const cbor_item_t *, rs256_pk_t *);
     76 int eddsa_pk_decode(const cbor_item_t *, eddsa_pk_t *);
     77 
     78 /* auxiliary cbor routines */
     79 int cbor_add_bool(cbor_item_t *, const char *, fido_opt_t);
     80 int cbor_add_bytestring(cbor_item_t *, const char *, const unsigned char *,
     81     size_t);
     82 int cbor_add_string(cbor_item_t *, const char *, const char *);
     83 int cbor_array_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
     84     void *));
     85 int cbor_build_frame(uint8_t, cbor_item_t *[], size_t, fido_blob_t *);
     86 int cbor_bytestring_copy(const cbor_item_t *, unsigned char **, size_t *);
     87 int cbor_map_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
     88     const cbor_item_t *, void *));
     89 int cbor_string_copy(const cbor_item_t *, char **);
     90 int cbor_parse_reply(const unsigned char *, size_t, void *,
     91     int(*)(const cbor_item_t *, const cbor_item_t *, void *));
     92 int cbor_add_uv_params(fido_dev_t *, uint8_t, const fido_blob_t *,
     93     const es256_pk_t *, const fido_blob_t *, const char *, const char *,
     94     cbor_item_t **, cbor_item_t **, int *);
     95 void cbor_vector_free(cbor_item_t **, size_t);
     96 int cbor_array_append(cbor_item_t **, cbor_item_t *);
     97 int cbor_array_drop(cbor_item_t **, size_t);
     98 
     99 /* deflate */
    100 int fido_compress(fido_blob_t *, const fido_blob_t *);
    101 int fido_uncompress(fido_blob_t *, const fido_blob_t *, size_t);
    102 
    103 #ifndef nitems
    104 #define nitems(_a)	(sizeof((_a)) / sizeof((_a)[0]))
    105 #endif
    106 
    107 /* buf */
    108 int fido_buf_read(const unsigned char **, size_t *, void *, size_t);
    109 int fido_buf_write(unsigned char **, size_t *, const void *, size_t);
    110 
    111 /* hid i/o */
    112 void *fido_hid_open(const char *);
    113 void  fido_hid_close(void *);
    114 int fido_hid_read(void *, unsigned char *, size_t, int);
    115 int fido_hid_write(void *, const unsigned char *, size_t);
    116 int fido_hid_get_usage(const uint8_t *, size_t, uint32_t *);
    117 int fido_hid_get_report_len(const uint8_t *, size_t, size_t *, size_t *);
    118 int fido_hid_unix_open(const char *);
    119 int fido_hid_unix_wait(int, int, const fido_sigset_t *);
    120 int fido_hid_set_sigmask(void *, const fido_sigset_t *);
    121 size_t fido_hid_report_in_len(void *);
    122 size_t fido_hid_report_out_len(void *);
    123 
    124 /* nfc i/o */
    125 bool fido_is_nfc(const char *);
    126 bool nfc_is_fido(const char *);
    127 void *fido_nfc_open(const char *);
    128 void  fido_nfc_close(void *);
    129 int fido_nfc_read(void *, unsigned char *, size_t, int);
    130 int fido_nfc_write(void *, const unsigned char *, size_t);
    131 int fido_nfc_rx(fido_dev_t *, uint8_t, unsigned char *, size_t, int);
    132 int fido_nfc_tx(fido_dev_t *, uint8_t, const unsigned char *, size_t);
    133 int fido_nfc_set_sigmask(void *, const fido_sigset_t *);
    134 int fido_dev_set_nfc(fido_dev_t *);
    135 
    136 /* pcsc i/o */
    137 bool fido_is_pcsc(const char *);
    138 void *fido_pcsc_open(const char *);
    139 void  fido_pcsc_close(void *);
    140 int fido_pcsc_read(void *, unsigned char *, size_t, int);
    141 int fido_pcsc_write(void *, const unsigned char *, size_t);
    142 int fido_pcsc_rx(fido_dev_t *, uint8_t, unsigned char *, size_t, int);
    143 int fido_pcsc_tx(fido_dev_t *, uint8_t, const unsigned char *, size_t);
    144 int fido_dev_set_pcsc(fido_dev_t *);
    145 
    146 /* windows hello */
    147 int fido_winhello_manifest(fido_dev_info_t *, size_t, size_t *);
    148 int fido_winhello_open(fido_dev_t *);
    149 int fido_winhello_close(fido_dev_t *);
    150 int fido_winhello_cancel(fido_dev_t *);
    151 int fido_winhello_get_assert(fido_dev_t *, fido_assert_t *, const char *, int);
    152 int fido_winhello_get_cbor_info(fido_dev_t *, fido_cbor_info_t *);
    153 int fido_winhello_make_cred(fido_dev_t *, fido_cred_t *, const char *, int);
    154 
    155 /* generic i/o */
    156 int fido_rx_cbor_status(fido_dev_t *, int *);
    157 int fido_rx(fido_dev_t *, uint8_t, void *, size_t, int *);
    158 int fido_tx(fido_dev_t *, uint8_t, const void *, size_t, int *);
    159 
    160 /* log */
    161 #ifdef FIDO_NO_DIAGNOSTIC
    162 #define fido_log_init(...)	do { /* nothing */ } while (0)
    163 #define fido_log_debug(...)	do { /* nothing */ } while (0)
    164 #define fido_log_xxd(...)	do { /* nothing */ } while (0)
    165 #define fido_log_error(...)	do { /* nothing */ } while (0)
    166 #else
    167 #ifdef __GNUC__
    168 void fido_log_init(void);
    169 void fido_log_debug(const char *, ...)
    170     __attribute__((__format__ (printf, 1, 2)));
    171 void fido_log_xxd(const void *, size_t, const char *, ...)
    172     __attribute__((__format__ (printf, 3, 4)));
    173 void fido_log_error(int, const char *, ...)
    174     __attribute__((__format__ (printf, 2, 3)));
    175 #else
    176 void fido_log_init(void);
    177 void fido_log_debug(const char *, ...);
    178 void fido_log_xxd(const void *, size_t, const char *, ...);
    179 void fido_log_error(int, const char *, ...);
    180 #endif /* __GNUC__ */
    181 #endif /* FIDO_NO_DIAGNOSTIC */
    182 
    183 /* u2f */
    184 int u2f_register(fido_dev_t *, fido_cred_t *, int *);
    185 int u2f_authenticate(fido_dev_t *, fido_assert_t *, int *);
    186 int u2f_get_touch_begin(fido_dev_t *, int *);
    187 int u2f_get_touch_status(fido_dev_t *, int *, int *);
    188 
    189 /* unexposed fido ops */
    190 uint8_t fido_dev_get_pin_protocol(const fido_dev_t *);
    191 int fido_dev_authkey(fido_dev_t *, es256_pk_t *, int *);
    192 int fido_dev_get_cbor_info_wait(fido_dev_t *, fido_cbor_info_t *, int *);
    193 int fido_dev_get_uv_token(fido_dev_t *, uint8_t, const char *,
    194     const fido_blob_t *, const es256_pk_t *, const char *, fido_blob_t *,
    195     int *);
    196 uint64_t fido_dev_maxmsgsize(const fido_dev_t *);
    197 int fido_do_ecdh(fido_dev_t *, es256_pk_t **, fido_blob_t **, int *);
    198 
    199 /* types */
    200 void fido_algo_array_free(fido_algo_array_t *);
    201 void fido_byte_array_free(fido_byte_array_t *);
    202 void fido_cert_array_free(fido_cert_array_t *);
    203 void fido_opt_array_free(fido_opt_array_t *);
    204 void fido_str_array_free(fido_str_array_t *);
    205 void fido_algo_free(fido_algo_t *);
    206 int fido_str_array_pack(fido_str_array_t *, const char * const *, size_t);
    207 
    208 /* misc */
    209 void fido_assert_reset_rx(fido_assert_t *);
    210 void fido_assert_reset_tx(fido_assert_t *);
    211 void fido_cred_reset_rx(fido_cred_t *);
    212 void fido_cred_reset_tx(fido_cred_t *);
    213 void fido_cbor_info_reset(fido_cbor_info_t *);
    214 int fido_blob_serialise(fido_blob_t *, const cbor_item_t *);
    215 int fido_check_flags(uint8_t, fido_opt_t, fido_opt_t);
    216 int fido_check_rp_id(const char *, const unsigned char *);
    217 int fido_get_random(void *, size_t);
    218 int fido_sha256(fido_blob_t *, const u_char *, size_t);
    219 int fido_time_now(struct timespec *);
    220 int fido_time_delta(const struct timespec *, int *);
    221 int fido_to_uint64(const char *, int, uint64_t *);
    222 
    223 /* crypto */
    224 int es256_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
    225 int es384_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
    226 int rs256_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
    227 int eddsa_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
    228 int rs1_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
    229 int es256_pk_verify_sig(const fido_blob_t *, const es256_pk_t *,
    230     const fido_blob_t *);
    231 int es384_pk_verify_sig(const fido_blob_t *, const es384_pk_t *,
    232     const fido_blob_t *);
    233 int rs256_pk_verify_sig(const fido_blob_t *, const rs256_pk_t *,
    234     const fido_blob_t *);
    235 int eddsa_pk_verify_sig(const fido_blob_t *, const eddsa_pk_t *,
    236     const fido_blob_t *);
    237 int fido_get_signed_hash(int, fido_blob_t *, const fido_blob_t *,
    238     const fido_blob_t *);
    239 int fido_get_signed_hash_tpm(fido_blob_t *, const fido_blob_t *,
    240     const fido_blob_t *, const fido_attstmt_t *, const fido_attcred_t *);
    241 
    242 /* device manifest functions */
    243 int fido_hid_manifest(fido_dev_info_t *, size_t, size_t *);
    244 int fido_nfc_manifest(fido_dev_info_t *, size_t, size_t *);
    245 int fido_pcsc_manifest(fido_dev_info_t *, size_t, size_t *);
    246 
    247 /* fuzzing instrumentation */
    248 #ifdef FIDO_FUZZ
    249 uint32_t uniform_random(uint32_t);
    250 #endif
    251 
    252 /* internal device capability flags */
    253 #define FIDO_DEV_PIN_SET	0x0001
    254 #define FIDO_DEV_PIN_UNSET	0x0002
    255 #define FIDO_DEV_CRED_PROT	0x0004
    256 #define FIDO_DEV_CREDMAN	0x0008
    257 #define FIDO_DEV_PIN_PROTOCOL1	0x0010
    258 #define FIDO_DEV_PIN_PROTOCOL2	0x0020
    259 #define FIDO_DEV_UV_SET 	0x0040
    260 #define FIDO_DEV_UV_UNSET	0x0080
    261 #define FIDO_DEV_TOKEN_PERMS	0x0100
    262 #define FIDO_DEV_WINHELLO	0x0200
    263 #define FIDO_DEV_CREDMAN_PRE	0x0400
    264 #define FIDO_DEV_BIO_SET	0x0800
    265 #define FIDO_DEV_BIO_UNSET	0x1000
    266 
    267 /* miscellanea */
    268 #define FIDO_DUMMY_CLIENTDATA	""
    269 #define FIDO_DUMMY_RP_ID	"localhost"
    270 #define FIDO_DUMMY_USER_NAME	"dummy"
    271 #define FIDO_DUMMY_USER_ID	1
    272 #define FIDO_WINHELLO_PATH	"windows://hello"
    273 #define FIDO_NFC_PREFIX		"nfc:"
    274 #define FIDO_PCSC_PREFIX	"pcsc:"
    275 
    276 #ifdef __cplusplus
    277 } /* extern "C" */
    278 #endif /* __cplusplus */
    279 
    280 #endif /* !_EXTERN_H */
    281