xref: /openbsd/lib/libfido2/src/extern.h (revision ab19a69e)
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  */
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 #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 bool fido_is_nfc(const char *);
122 void *fido_nfc_open(const char *);
123 void  fido_nfc_close(void *);
124 int fido_nfc_read(void *, unsigned char *, size_t, int);
125 int fido_nfc_write(void *, const unsigned char *, size_t);
126 int fido_nfc_rx(fido_dev_t *, uint8_t, unsigned char *, size_t, int);
127 int fido_nfc_tx(fido_dev_t *, uint8_t, const unsigned char *, size_t);
128 int fido_nfc_set_sigmask(void *, const fido_sigset_t *);
129 int fido_dev_set_nfc(fido_dev_t *);
130 
131 /* pcsc i/o */
132 bool fido_is_pcsc(const char *);
133 void *fido_pcsc_open(const char *);
134 void  fido_pcsc_close(void *);
135 int fido_pcsc_read(void *, unsigned char *, size_t, int);
136 int fido_pcsc_write(void *, const unsigned char *, size_t);
137 int fido_pcsc_rx(fido_dev_t *, uint8_t, unsigned char *, size_t, int);
138 int fido_pcsc_tx(fido_dev_t *, uint8_t, const unsigned char *, size_t);
139 int fido_dev_set_pcsc(fido_dev_t *);
140 
141 /* windows hello */
142 int fido_winhello_manifest(fido_dev_info_t *, size_t, size_t *);
143 int fido_winhello_open(fido_dev_t *);
144 int fido_winhello_close(fido_dev_t *);
145 int fido_winhello_cancel(fido_dev_t *);
146 int fido_winhello_get_assert(fido_dev_t *, fido_assert_t *, const char *, int);
147 int fido_winhello_get_cbor_info(fido_dev_t *, fido_cbor_info_t *);
148 int fido_winhello_make_cred(fido_dev_t *, fido_cred_t *, const char *, int);
149 
150 /* generic i/o */
151 int fido_rx_cbor_status(fido_dev_t *, int *);
152 int fido_rx(fido_dev_t *, uint8_t, void *, size_t, int *);
153 int fido_tx(fido_dev_t *, uint8_t, const void *, size_t, int *);
154 
155 /* log */
156 #ifdef FIDO_NO_DIAGNOSTIC
157 #define fido_log_init(...)	do { /* nothing */ } while (0)
158 #define fido_log_debug(...)	do { /* nothing */ } while (0)
159 #define fido_log_xxd(...)	do { /* nothing */ } while (0)
160 #define fido_log_error(...)	do { /* nothing */ } while (0)
161 #else
162 #ifdef __GNUC__
163 void fido_log_init(void);
164 void fido_log_debug(const char *, ...)
165     __attribute__((__format__ (printf, 1, 2)));
166 void fido_log_xxd(const void *, size_t, const char *, ...)
167     __attribute__((__format__ (printf, 3, 4)));
168 void fido_log_error(int, const char *, ...)
169     __attribute__((__format__ (printf, 2, 3)));
170 #else
171 void fido_log_init(void);
172 void fido_log_debug(const char *, ...);
173 void fido_log_xxd(const void *, size_t, const char *, ...);
174 void fido_log_error(int, const char *, ...);
175 #endif /* __GNUC__ */
176 #endif /* FIDO_NO_DIAGNOSTIC */
177 
178 /* u2f */
179 int u2f_register(fido_dev_t *, fido_cred_t *, int *);
180 int u2f_authenticate(fido_dev_t *, fido_assert_t *, int *);
181 int u2f_get_touch_begin(fido_dev_t *, int *);
182 int u2f_get_touch_status(fido_dev_t *, int *, int *);
183 
184 /* unexposed fido ops */
185 uint8_t fido_dev_get_pin_protocol(const fido_dev_t *);
186 int fido_dev_authkey(fido_dev_t *, es256_pk_t *, int *);
187 int fido_dev_get_cbor_info_wait(fido_dev_t *, fido_cbor_info_t *, int *);
188 int fido_dev_get_uv_token(fido_dev_t *, uint8_t, const char *,
189     const fido_blob_t *, const es256_pk_t *, const char *, fido_blob_t *,
190     int *);
191 uint64_t fido_dev_maxmsgsize(const fido_dev_t *);
192 int fido_do_ecdh(fido_dev_t *, es256_pk_t **, fido_blob_t **, int *);
193 
194 /* types */
195 void fido_algo_array_free(fido_algo_array_t *);
196 void fido_byte_array_free(fido_byte_array_t *);
197 void fido_opt_array_free(fido_opt_array_t *);
198 void fido_str_array_free(fido_str_array_t *);
199 void fido_algo_free(fido_algo_t *);
200 int fido_str_array_pack(fido_str_array_t *, const char * const *, size_t);
201 
202 /* misc */
203 void fido_assert_reset_rx(fido_assert_t *);
204 void fido_assert_reset_tx(fido_assert_t *);
205 void fido_cred_reset_rx(fido_cred_t *);
206 void fido_cred_reset_tx(fido_cred_t *);
207 void fido_cbor_info_reset(fido_cbor_info_t *);
208 int fido_blob_serialise(fido_blob_t *, const cbor_item_t *);
209 int fido_check_flags(uint8_t, fido_opt_t, fido_opt_t);
210 int fido_check_rp_id(const char *, const unsigned char *);
211 int fido_get_random(void *, size_t);
212 int fido_sha256(fido_blob_t *, const u_char *, size_t);
213 int fido_time_now(struct timespec *);
214 int fido_time_delta(const struct timespec *, int *);
215 int fido_to_uint64(const char *, int, uint64_t *);
216 
217 /* crypto */
218 int es256_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
219 int rs256_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
220 int eddsa_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
221 int rs1_verify_sig(const fido_blob_t *, EVP_PKEY *, const fido_blob_t *);
222 int es256_pk_verify_sig(const fido_blob_t *, const es256_pk_t *,
223     const fido_blob_t *);
224 int rs256_pk_verify_sig(const fido_blob_t *, const rs256_pk_t *,
225     const fido_blob_t *);
226 int eddsa_pk_verify_sig(const fido_blob_t *, const eddsa_pk_t *,
227     const fido_blob_t *);
228 int fido_get_signed_hash(int, fido_blob_t *, const fido_blob_t *,
229     const fido_blob_t *);
230 int fido_get_signed_hash_tpm(fido_blob_t *, const fido_blob_t *,
231     const fido_blob_t *, const fido_attstmt_t *, const fido_attcred_t *);
232 
233 /* device manifest functions */
234 int fido_hid_manifest(fido_dev_info_t *, size_t, size_t *);
235 int fido_nfc_manifest(fido_dev_info_t *, size_t, size_t *);
236 int fido_pcsc_manifest(fido_dev_info_t *, size_t, size_t *);
237 
238 /* fuzzing instrumentation */
239 #ifdef FIDO_FUZZ
240 uint32_t uniform_random(uint32_t);
241 #endif
242 
243 /* internal device capability flags */
244 #define FIDO_DEV_PIN_SET	0x001
245 #define FIDO_DEV_PIN_UNSET	0x002
246 #define FIDO_DEV_CRED_PROT	0x004
247 #define FIDO_DEV_CREDMAN	0x008
248 #define FIDO_DEV_PIN_PROTOCOL1	0x010
249 #define FIDO_DEV_PIN_PROTOCOL2	0x020
250 #define FIDO_DEV_UV_SET 	0x040
251 #define FIDO_DEV_UV_UNSET	0x080
252 #define FIDO_DEV_TOKEN_PERMS	0x100
253 #define FIDO_DEV_WINHELLO	0x200
254 
255 /* miscellanea */
256 #define FIDO_DUMMY_CLIENTDATA	""
257 #define FIDO_DUMMY_RP_ID	"localhost"
258 #define FIDO_DUMMY_USER_NAME	"dummy"
259 #define FIDO_DUMMY_USER_ID	1
260 #define FIDO_WINHELLO_PATH	"windows://hello"
261 #define FIDO_NFC_PREFIX		"nfc:"
262 #define FIDO_PCSC_PREFIX	"pcsc:"
263 
264 #ifdef __cplusplus
265 } /* extern "C" */
266 #endif /* __cplusplus */
267 
268 #endif /* !_EXTERN_H */
269