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