## Coverage Report

#### Created: 2025-03-01 02:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)

    /libfido2/src/extern.h

    Line
    Count
    Source
    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
    616k
    #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
    97.6k
    #define FIDO_DEV_PIN_SET        0x0001
    254
    107k
    #define FIDO_DEV_PIN_UNSET      0x0002
    255
    76.3k
    #define FIDO_DEV_CRED_PROT      0x0004
    256
    103k
    #define FIDO_DEV_CREDMAN        0x0008
    257
    275k
    #define FIDO_DEV_PIN_PROTOCOL1  0x0010
    258
    233k
    #define FIDO_DEV_PIN_PROTOCOL2  0x0020
    259
    100k
    #define FIDO_DEV_UV_SET         0x0040
    260
    53.4k
    #define FIDO_DEV_UV_UNSET       0x0080
    261
    44.6k
    #define FIDO_DEV_TOKEN_PERMS    0x0100
    262
    0
    #define FIDO_DEV_WINHELLO       0x0200
    263
    62.8k
    #define FIDO_DEV_CREDMAN_PRE    0x0400
    264
    32.9k
    #define FIDO_DEV_BIO_SET        0x0800
    265
    33.9k
    #define FIDO_DEV_BIO_UNSET      0x1000
    266
    267
    /* miscellanea */
    268
    22.2k
    #define FIDO_DUMMY_CLIENTDATA   ""
    269
    11.6k
    #define FIDO_DUMMY_RP_ID        "localhost"
    270
    871
    #define FIDO_DUMMY_USER_NAME    "dummy"
    271
    11.5k
    #define FIDO_DUMMY_USER_ID      1
    272
    #define FIDO_WINHELLO_PATH      "windows://hello"
    273
    16.6M
    #define FIDO_NFC_PREFIX         "nfc:"
    274
    6.75M
    #define FIDO_PCSC_PREFIX        "pcsc:"
    275
    276
    #ifdef __cplusplus
    277
    } /* extern "C" */
    278
    #endif /* __cplusplus */
    279
    280
    #endif /* !_EXTERN_H */