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