Coverage Report

Created: 2021-10-21 13:35

/libfido2/src/extern.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2018-2021 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
 */
6
7
#ifndef _EXTERN_H
8
#define _EXTERN_H
9
10
#ifdef __MINGW32__
11
#include <sys/types.h>
12
#endif
13
14
#ifdef HAVE_SIGNAL_H
15
#include <signal.h>
16
#endif
17
18
#include <stdint.h>
19
20
#include "fido/types.h"
21
#include "blob.h"
22
23
#ifdef __cplusplus
24
extern "C" {
25
#endif /* __cplusplus */
26
27
/* aes256 */
28
int aes256_cbc_dec(const fido_dev_t *dev, const fido_blob_t *,
29
    const fido_blob_t *, fido_blob_t *);
30
int aes256_cbc_enc(const fido_dev_t *dev, const fido_blob_t *,
31
    const fido_blob_t *, fido_blob_t *);
32
int aes256_gcm_dec(const fido_blob_t *, const fido_blob_t *,
33
    const fido_blob_t *, const fido_blob_t *, fido_blob_t *);
34
int aes256_gcm_enc(const fido_blob_t *, const fido_blob_t *,
35
    const fido_blob_t *, const fido_blob_t *, fido_blob_t *);
36
37
/* cbor encoding functions */
38
cbor_item_t *cbor_build_uint(const uint64_t);
39
cbor_item_t *cbor_flatten_vector(cbor_item_t **, size_t);
40
cbor_item_t *cbor_encode_assert_opt(fido_opt_t, fido_opt_t);
41
cbor_item_t *cbor_encode_change_pin_auth(const fido_dev_t *,
42
    const fido_blob_t *, const fido_blob_t *, const fido_blob_t *);
43
cbor_item_t *cbor_encode_cred_ext(const fido_cred_ext_t *, const fido_blob_t *);
44
cbor_item_t *cbor_encode_assert_ext(fido_dev_t *,
45
    const fido_assert_ext_t *, const fido_blob_t *, const es256_pk_t *);
46
cbor_item_t *cbor_encode_cred_opt(fido_opt_t, fido_opt_t);
47
cbor_item_t *cbor_encode_pin_auth(const fido_dev_t *, const fido_blob_t *,
48
    const fido_blob_t *);
49
cbor_item_t *cbor_encode_pin_opt(const fido_dev_t *);
50
cbor_item_t *cbor_encode_pubkey(const fido_blob_t *);
51
cbor_item_t *cbor_encode_pubkey_list(const fido_blob_array_t *);
52
cbor_item_t *cbor_encode_pubkey_param(int);
53
cbor_item_t *cbor_encode_rp_entity(const fido_rp_t *);
54
cbor_item_t *cbor_encode_str_array(const fido_str_array_t *);
55
cbor_item_t *cbor_encode_user_entity(const fido_user_t *);
56
cbor_item_t *es256_pk_encode(const es256_pk_t *, int);
57
58
/* cbor decoding functions */
59
int cbor_decode_attstmt(const cbor_item_t *, fido_attstmt_t *);
60
int cbor_decode_cred_authdata(const cbor_item_t *, int, fido_blob_t *,
61
    fido_authdata_t *, fido_attcred_t *, fido_cred_ext_t *);
62
int cbor_decode_assert_authdata(const cbor_item_t *, fido_blob_t *,
63
    fido_authdata_t *, fido_assert_extattr_t *);
64
int cbor_decode_cred_id(const cbor_item_t *, fido_blob_t *);
65
int cbor_decode_fmt(const cbor_item_t *, char **);
66
int cbor_decode_pubkey(const cbor_item_t *, int *, void *);
67
int cbor_decode_rp_entity(const cbor_item_t *, fido_rp_t *);
68
int cbor_decode_uint64(const cbor_item_t *, uint64_t *);
69
int cbor_decode_user(const cbor_item_t *, fido_user_t *);
70
int es256_pk_decode(const cbor_item_t *, es256_pk_t *);
71
int rs256_pk_decode(const cbor_item_t *, rs256_pk_t *);
72
int eddsa_pk_decode(const cbor_item_t *, eddsa_pk_t *);
73
74
/* auxiliary cbor routines */
75
int cbor_add_bool(cbor_item_t *, const char *, fido_opt_t);
76
int cbor_add_bytestring(cbor_item_t *, const char *, const unsigned char *,
77
    size_t);
78
int cbor_add_string(cbor_item_t *, const char *, const char *);
79
int cbor_array_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
80
    void *));
81
int cbor_build_frame(uint8_t, cbor_item_t *[], size_t, fido_blob_t *);
82
int cbor_bytestring_copy(const cbor_item_t *, unsigned char **, size_t *);
83
int cbor_map_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
84
    const cbor_item_t *, void *));
85
int cbor_string_copy(const cbor_item_t *, char **);
86
int cbor_parse_reply(const unsigned char *, size_t, void *,
87
    int(*)(const cbor_item_t *, const cbor_item_t *, void *));
88
int cbor_add_uv_params(fido_dev_t *, uint8_t, const fido_blob_t *,
89
    const es256_pk_t *, const fido_blob_t *, const char *, const char *,
90
    cbor_item_t **, cbor_item_t **, int *);
91
void cbor_vector_free(cbor_item_t **, size_t);
92
int cbor_array_append(cbor_item_t **, cbor_item_t *);
93
int cbor_array_drop(cbor_item_t **, size_t);
94
95
/* deflate */
96
int fido_compress(fido_blob_t *, const fido_blob_t *);
97
int fido_uncompress(fido_blob_t *, const fido_blob_t *, size_t);
98
99
#ifndef nitems
100
52.6k
#define nitems(_a)      (sizeof((_a)) / sizeof((_a)[0]))
101
#endif
102
103
/* buf */
104
int fido_buf_read(const unsigned char **, size_t *, void *, size_t);
105
int fido_buf_write(unsigned char **, size_t *, const void *, size_t);
106
107
/* hid i/o */
108
void *fido_hid_open(const char *);
109
void  fido_hid_close(void *);
110
int fido_hid_read(void *, unsigned char *, size_t, int);
111
int fido_hid_write(void *, const unsigned char *, size_t);
112
int fido_hid_get_usage(const uint8_t *, size_t, uint32_t *);
113
int fido_hid_get_report_len(const uint8_t *, size_t, size_t *, size_t *);
114
int fido_hid_unix_open(const char *);
115
int fido_hid_unix_wait(int, int, const fido_sigset_t *);
116
int fido_hid_set_sigmask(void *, const fido_sigset_t *);
117
size_t fido_hid_report_in_len(void *);
118
size_t fido_hid_report_out_len(void *);
119
120
/* nfc i/o */
121
void *fido_nfc_open(const char *);
122
void  fido_nfc_close(void *);
123
int fido_nfc_read(void *, unsigned char *, size_t, int);
124
int fido_nfc_write(void *, const unsigned char *, size_t);
125
int fido_nfc_rx(fido_dev_t *, uint8_t, unsigned char *, size_t, int);
126
int fido_nfc_tx(fido_dev_t *, uint8_t, const unsigned char *, size_t);
127
int fido_nfc_set_sigmask(void *, const fido_sigset_t *);
128
129
/* windows hello */
130
int fido_winhello_manifest(fido_dev_info_t *, size_t, size_t *);
131
int fido_winhello_open(fido_dev_t *);
132
int fido_winhello_close(fido_dev_t *);
133
int fido_winhello_cancel(fido_dev_t *);
134
int fido_winhello_get_assert(fido_dev_t *, fido_assert_t *, const char *, int);
135
int fido_winhello_get_cbor_info(fido_dev_t *, fido_cbor_info_t *);
136
int fido_winhello_make_cred(fido_dev_t *, fido_cred_t *, const char *, int);
137
138
/* generic i/o */
139
int fido_rx_cbor_status(fido_dev_t *, int *);
140
int fido_rx(fido_dev_t *, uint8_t, void *, size_t, int *);
141
int fido_tx(fido_dev_t *, uint8_t, const void *, size_t, int *);
142
143
/* log */
144
#ifdef FIDO_NO_DIAGNOSTIC
145
#define fido_log_init(...)      do { /* nothing */ } while (0)
146
#define fido_log_debug(...)     do { /* nothing */ } while (0)
147
#define fido_log_xxd(...)       do { /* nothing */ } while (0)
148
#define fido_log_error(...)     do { /* nothing */ } while (0)
149
#else
150
#ifdef __GNUC__
151
void fido_log_init(void);
152
void fido_log_debug(const char *, ...)
153
    __attribute__((__format__ (printf, 1, 2)));
154
void fido_log_xxd(const void *, size_t, const char *, ...)
155
    __attribute__((__format__ (printf, 3, 4)));
156
void fido_log_error(int, const char *, ...)
157
    __attribute__((__format__ (printf, 2, 3)));
158
#else
159
void fido_log_init(void);
160
void fido_log_debug(const char *, ...);
161
void fido_log_xxd(const void *, size_t, const char *, ...);
162
void fido_log_error(int, const char *, ...);
163
#endif /* __GNUC__ */
164
#endif /* FIDO_NO_DIAGNOSTIC */
165
166
/* u2f */
167
int u2f_register(fido_dev_t *, fido_cred_t *, int *);
168
int u2f_authenticate(fido_dev_t *, fido_assert_t *, int *);
169
int u2f_get_touch_begin(fido_dev_t *, int *);
170
int u2f_get_touch_status(fido_dev_t *, int *, int *);
171
172
/* unexposed fido ops */
173
uint8_t fido_dev_get_pin_protocol(const fido_dev_t *);
174
int fido_dev_authkey(fido_dev_t *, es256_pk_t *, int *);
175
int fido_dev_get_cbor_info_wait(fido_dev_t *, fido_cbor_info_t *, int *);
176
int fido_dev_get_uv_token(fido_dev_t *, uint8_t, const char *,
177
    const fido_blob_t *, const es256_pk_t *, const char *, fido_blob_t *,
178
    int *);
179
uint64_t fido_dev_maxmsgsize(const fido_dev_t *);
180
int fido_do_ecdh(fido_dev_t *, es256_pk_t **, fido_blob_t **, int *);
181
bool fido_dev_supports_permissions(const fido_dev_t *);
182
183
/* types */
184
void fido_algo_array_free(fido_algo_array_t *);
185
void fido_byte_array_free(fido_byte_array_t *);
186
void fido_opt_array_free(fido_opt_array_t *);
187
void fido_str_array_free(fido_str_array_t *);
188
void fido_algo_free(fido_algo_t *);
189
int fido_str_array_pack(fido_str_array_t *, const char * const *, size_t);
190
191
/* misc */
192
void fido_assert_reset_rx(fido_assert_t *);
193
void fido_assert_reset_tx(fido_assert_t *);
194
void fido_cred_reset_rx(fido_cred_t *);
195
void fido_cred_reset_tx(fido_cred_t *);
196
void fido_cbor_info_reset(fido_cbor_info_t *);
197
int fido_blob_serialise(fido_blob_t *, const cbor_item_t *);
198
int fido_check_flags(uint8_t, fido_opt_t, fido_opt_t);
199
int fido_check_rp_id(const char *, const unsigned char *);
200
int fido_get_random(void *, size_t);
201
int fido_sha256(fido_blob_t *, const u_char *, size_t);
202
int fido_time_now(struct timespec *);
203
int fido_time_delta(const struct timespec *, int *);
204
205
/* crypto */
206
int es256_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
207
int rs256_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
208
int eddsa_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
209
int rs1_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
210
int es256_pk_verify_sig(const fido_blob_t *, const es256_pk_t *,
211
    const fido_blob_t *);
212
int rs256_pk_verify_sig(const fido_blob_t *, const rs256_pk_t *,
213
    const fido_blob_t *);
214
int eddsa_pk_verify_sig(const fido_blob_t *, const eddsa_pk_t *,
215
    const fido_blob_t *);
216
int fido_get_signed_hash(int, fido_blob_t *, const fido_blob_t *,
217
    const fido_blob_t *);
218
int fido_get_signed_hash_tpm(fido_blob_t *, const fido_blob_t *,
219
    const fido_blob_t *, const fido_attstmt_t *, const fido_attcred_t *);
220
221
/* device manifest functions */
222
int fido_hid_manifest(fido_dev_info_t *, size_t, size_t *);
223
int fido_nfc_manifest(fido_dev_info_t *, size_t, size_t *);
224
225
/* device manifest registration */
226
typedef int (*dev_manifest_func_t)(fido_dev_info_t *, size_t, size_t *);
227
int fido_dev_register_manifest_func(const dev_manifest_func_t);
228
void fido_dev_unregister_manifest_func(const dev_manifest_func_t);
229
230
/* fuzzing instrumentation */
231
#ifdef FIDO_FUZZ
232
uint32_t uniform_random(uint32_t);
233
#endif
234
235
/* internal device capability flags */
236
7.16k
#define FIDO_DEV_PIN_SET        0x001
237
10.5k
#define FIDO_DEV_PIN_UNSET      0x002
238
7.75k
#define FIDO_DEV_CRED_PROT      0x004
239
7.11k
#define FIDO_DEV_CREDMAN        0x008
240
30.8k
#define FIDO_DEV_PIN_PROTOCOL1  0x010
241
26.4k
#define FIDO_DEV_PIN_PROTOCOL2  0x020
242
7.28k
#define FIDO_DEV_UV_SET         0x040
243
3.88k
#define FIDO_DEV_UV_UNSET       0x080
244
6.08k
#define FIDO_DEV_TOKEN_PERMS    0x100
245
0
#define FIDO_DEV_WINHELLO       0x200
246
247
/* miscellanea */
248
4.31k
#define FIDO_DUMMY_CLIENTDATA   ""
249
2.24k
#define FIDO_DUMMY_RP_ID        "localhost"
250
170
#define FIDO_DUMMY_USER_NAME    "dummy"
251
2.23k
#define FIDO_DUMMY_USER_ID      1
252
#define FIDO_WINHELLO_PATH      "windows://hello"
253
2.30M
#define FIDO_NFC_PREFIX         "nfc:"
254
255
#ifdef __cplusplus
256
} /* extern "C" */
257
#endif /* __cplusplus */
258
259
#endif /* !_EXTERN_H */