Coverage Report

Created: 2021-03-26 11:35

/libfido2/src/extern.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2018 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_user_entity(const fido_user_t *);
55
cbor_item_t *es256_pk_encode(const es256_pk_t *, int);
56
57
/* cbor decoding functions */
58
int cbor_decode_attstmt(const cbor_item_t *, fido_attstmt_t *);
59
int cbor_decode_cred_authdata(const cbor_item_t *, int, fido_blob_t *,
60
    fido_authdata_t *, fido_attcred_t *, fido_cred_ext_t *);
61
int cbor_decode_assert_authdata(const cbor_item_t *, fido_blob_t *,
62
    fido_authdata_t *, fido_assert_extattr_t *);
63
int cbor_decode_cred_id(const cbor_item_t *, fido_blob_t *);
64
int cbor_decode_fmt(const cbor_item_t *, char **);
65
int cbor_decode_pubkey(const cbor_item_t *, int *, void *);
66
int cbor_decode_rp_entity(const cbor_item_t *, fido_rp_t *);
67
int cbor_decode_uint64(const cbor_item_t *, uint64_t *);
68
int cbor_decode_user(const cbor_item_t *, fido_user_t *);
69
int es256_pk_decode(const cbor_item_t *, es256_pk_t *);
70
int rs256_pk_decode(const cbor_item_t *, rs256_pk_t *);
71
int eddsa_pk_decode(const cbor_item_t *, eddsa_pk_t *);
72
73
/* auxiliary cbor routines */
74
int cbor_add_bool(cbor_item_t *, const char *, fido_opt_t);
75
int cbor_add_bytestring(cbor_item_t *, const char *, const unsigned char *,
76
    size_t);
77
int cbor_add_string(cbor_item_t *, const char *, const char *);
78
int cbor_array_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
79
    void *));
80
int cbor_build_frame(uint8_t, cbor_item_t *[], size_t, fido_blob_t *);
81
int cbor_bytestring_copy(const cbor_item_t *, unsigned char **, size_t *);
82
int cbor_map_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
83
    const cbor_item_t *, void *));
84
int cbor_string_copy(const cbor_item_t *, char **);
85
int cbor_parse_reply(const unsigned char *, size_t, void *,
86
    int(*)(const cbor_item_t *, const cbor_item_t *, void *));
87
int cbor_add_uv_params(fido_dev_t *, uint8_t, const fido_blob_t *,
88
    const es256_pk_t *, const fido_blob_t *, const char *, const char *,
89
    cbor_item_t **, cbor_item_t **);
90
void cbor_vector_free(cbor_item_t **, size_t);
91
int cbor_array_append(cbor_item_t **, cbor_item_t *);
92
int cbor_array_drop(cbor_item_t **, size_t);
93
94
/* deflate */
95
int fido_compress(fido_blob_t *, const fido_blob_t *);
96
int fido_uncompress(fido_blob_t *, const fido_blob_t *, size_t);
97
98
#ifndef nitems
99
36.7k
#define nitems(_a)      (sizeof((_a)) / sizeof((_a)[0]))
100
#endif
101
102
/* buf */
103
int fido_buf_read(const unsigned char **, size_t *, void *, size_t);
104
int fido_buf_write(unsigned char **, size_t *, const void *, size_t);
105
106
/* hid i/o */
107
void *fido_hid_open(const char *);
108
void  fido_hid_close(void *);
109
int fido_hid_read(void *, unsigned char *, size_t, int);
110
int fido_hid_write(void *, const unsigned char *, size_t);
111
int fido_hid_get_usage(const uint8_t *, size_t, uint32_t *);
112
int fido_hid_get_report_len(const uint8_t *, size_t, size_t *, size_t *);
113
int fido_hid_unix_open(const char *);
114
int fido_hid_unix_wait(int, int, const fido_sigset_t *);
115
int fido_hid_set_sigmask(void *, const fido_sigset_t *);
116
size_t fido_hid_report_in_len(void *);
117
size_t fido_hid_report_out_len(void *);
118
119
/* nfc i/o */
120
void *fido_nfc_open(const char *);
121
void  fido_nfc_close(void *);
122
int fido_nfc_read(void *, unsigned char *, size_t, int);
123
int fido_nfc_write(void *, const unsigned char *, size_t);
124
int fido_nfc_rx(fido_dev_t *, uint8_t, unsigned char *, size_t, int);
125
int fido_nfc_tx(fido_dev_t *, uint8_t, const unsigned char *, size_t);
126
int fido_nfc_set_sigmask(void *, const fido_sigset_t *);
127
128
/* generic i/o */
129
int fido_rx_cbor_status(fido_dev_t *, int);
130
int fido_rx(fido_dev_t *, uint8_t, void *, size_t, int);
131
int fido_tx(fido_dev_t *, uint8_t, const void *, size_t);
132
133
/* log */
134
#ifdef FIDO_NO_DIAGNOSTIC
135
#define fido_log_init(...)      do { /* nothing */ } while (0)
136
#define fido_log_debug(...)     do { /* nothing */ } while (0)
137
#define fido_log_xxd(...)       do { /* nothing */ } while (0)
138
#define fido_log_error(...)     do { /* nothing */ } while (0)
139
#else
140
#ifdef __GNUC__
141
void fido_log_init(void);
142
void fido_log_debug(const char *, ...)
143
    __attribute__((__format__ (printf, 1, 2)));
144
void fido_log_xxd(const void *, size_t, const char *, ...)
145
    __attribute__((__format__ (printf, 3, 4)));
146
void fido_log_error(int, const char *, ...)
147
    __attribute__((__format__ (printf, 2, 3)));
148
#else
149
void fido_log_init(void);
150
void fido_log_debug(const char *, ...);
151
void fido_log_xxd(const void *, size_t, const char *, ...);
152
void fido_log_error(int, const char *, ...);
153
#endif /* __GNUC__ */
154
#endif /* FIDO_NO_DIAGNOSTIC */
155
156
/* u2f */
157
int u2f_register(fido_dev_t *, fido_cred_t *, int);
158
int u2f_authenticate(fido_dev_t *, fido_assert_t *, int);
159
int u2f_get_touch_begin(fido_dev_t *);
160
int u2f_get_touch_status(fido_dev_t *, int *, int);
161
162
/* unexposed fido ops */
163
uint8_t fido_dev_get_pin_protocol(const fido_dev_t *);
164
int fido_dev_authkey(fido_dev_t *, es256_pk_t *);
165
int fido_dev_get_cbor_info_wait(fido_dev_t *, fido_cbor_info_t *, int);
166
int fido_dev_get_uv_token(fido_dev_t *, uint8_t, const char *,
167
    const fido_blob_t *, const es256_pk_t *, const char *, fido_blob_t *);
168
uint64_t fido_dev_maxmsgsize(const fido_dev_t *);
169
int fido_do_ecdh(fido_dev_t *, es256_pk_t **, fido_blob_t **);
170
bool fido_dev_supports_permissions(const fido_dev_t *);
171
bool fido_dev_can_get_uv_token(const fido_dev_t *, const char *, fido_opt_t);
172
173
/* misc */
174
void fido_assert_reset_rx(fido_assert_t *);
175
void fido_assert_reset_tx(fido_assert_t *);
176
void fido_cred_reset_rx(fido_cred_t *);
177
void fido_cred_reset_tx(fido_cred_t *);
178
int fido_check_rp_id(const char *, const unsigned char *);
179
int fido_check_flags(uint8_t, fido_opt_t, fido_opt_t);
180
int fido_get_random(void *, size_t);
181
int fido_blob_serialise(fido_blob_t *, const cbor_item_t *);
182
183
/* crypto */
184
int fido_verify_sig_es256(const fido_blob_t *, const es256_pk_t *,
185
    const fido_blob_t *);
186
int fido_verify_sig_rs256(const fido_blob_t *, const rs256_pk_t *,
187
    const fido_blob_t *);
188
int fido_verify_sig_eddsa(const fido_blob_t *, const eddsa_pk_t *,
189
    const fido_blob_t *);
190
int fido_get_signed_hash(int, fido_blob_t *, const fido_blob_t *,
191
    const fido_blob_t *);
192
193
/* device manifest functions */
194
int fido_hid_manifest(fido_dev_info_t *, size_t, size_t *);
195
int fido_nfc_manifest(fido_dev_info_t *, size_t, size_t *);
196
197
/* device manifest registration */
198
typedef int (*dev_manifest_func_t)(fido_dev_info_t *, size_t, size_t *);
199
int fido_dev_register_manifest_func(const dev_manifest_func_t);
200
void fido_dev_unregister_manifest_func(const dev_manifest_func_t);
201
202
/* fuzzing instrumentation */
203
#ifdef FIDO_FUZZ
204
uint32_t uniform_random(uint32_t);
205
#endif
206
207
/* internal device capability flags */
208
5.05k
#define FIDO_DEV_PIN_SET        0x001
209
8.27k
#define FIDO_DEV_PIN_UNSET      0x002
210
5.45k
#define FIDO_DEV_CRED_PROT      0x004
211
4.85k
#define FIDO_DEV_CREDMAN        0x008
212
26.1k
#define FIDO_DEV_PIN_PROTOCOL1  0x010
213
22.9k
#define FIDO_DEV_PIN_PROTOCOL2  0x020
214
4.91k
#define FIDO_DEV_UV_SET         0x040
215
2.61k
#define FIDO_DEV_UV_UNSET       0x080
216
5.41k
#define FIDO_DEV_TOKEN_PERMS    0x100
217
218
/* miscellanea */
219
2.99k
#define FIDO_DUMMY_CLIENTDATA   ""
220
1.57k
#define FIDO_DUMMY_RP_ID        "localhost"
221
133
#define FIDO_DUMMY_USER_NAME    "dummy"
222
1.55k
#define FIDO_DUMMY_USER_ID      1
223
224
#ifdef __cplusplus
225
} /* extern "C" */
226
#endif /* __cplusplus */
227
228
#endif /* !_EXTERN_H */