xref: /openbsd-src/lib/libfido2/src/extern.h (revision 1a8dbaac879b9f3335ad7fb25429ce63ac1d6bac)
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 #include <stdint.h>
11 
12 #include "fido/types.h"
13 #include "blob.h"
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif /* __cplusplus */
18 
19 /* aes256 */
20 int aes256_cbc_dec(const fido_blob_t *, const fido_blob_t *, fido_blob_t *);
21 int aes256_cbc_enc(const fido_blob_t *, const fido_blob_t *, fido_blob_t *);
22 
23 /* cbor encoding functions */
24 cbor_item_t *cbor_flatten_vector(cbor_item_t **, size_t);
25 cbor_item_t *cbor_encode_assert_options(fido_opt_t, fido_opt_t);
26 cbor_item_t *cbor_encode_change_pin_auth(const fido_blob_t *,
27     const fido_blob_t *, const fido_blob_t *);
28 cbor_item_t *cbor_encode_extensions(const fido_cred_ext_t *);
29 cbor_item_t *cbor_encode_hmac_secret_param(const fido_blob_t *,
30     const es256_pk_t *, const fido_blob_t *);
31 cbor_item_t *cbor_encode_options(fido_opt_t, fido_opt_t);
32 cbor_item_t *cbor_encode_pin_auth(const fido_blob_t *, const fido_blob_t *);
33 cbor_item_t *cbor_encode_pin_enc(const fido_blob_t *, const fido_blob_t *);
34 cbor_item_t *cbor_encode_pin_hash_enc(const fido_blob_t *, const fido_blob_t *);
35 cbor_item_t *cbor_encode_pin_opt(void);
36 cbor_item_t *cbor_encode_pubkey(const fido_blob_t *);
37 cbor_item_t *cbor_encode_pubkey_list(const fido_blob_array_t *);
38 cbor_item_t *cbor_encode_pubkey_param(int);
39 cbor_item_t *cbor_encode_rp_entity(const fido_rp_t *);
40 cbor_item_t *cbor_encode_set_pin_auth(const fido_blob_t *, const fido_blob_t *);
41 cbor_item_t *cbor_encode_user_entity(const fido_user_t *);
42 cbor_item_t *es256_pk_encode(const es256_pk_t *, int);
43 
44 /* cbor decoding functions */
45 int cbor_decode_attstmt(const cbor_item_t *, fido_attstmt_t *);
46 int cbor_decode_cred_authdata(const cbor_item_t *, int, fido_blob_t *,
47     fido_authdata_t *, fido_attcred_t *, fido_cred_ext_t *);
48 int cbor_decode_assert_authdata(const cbor_item_t *, fido_blob_t *,
49     fido_authdata_t *, int *, fido_blob_t *);
50 int cbor_decode_cred_id(const cbor_item_t *, fido_blob_t *);
51 int cbor_decode_fmt(const cbor_item_t *, char **);
52 int cbor_decode_pubkey(const cbor_item_t *, int *, void *);
53 int cbor_decode_rp_entity(const cbor_item_t *, fido_rp_t *);
54 int cbor_decode_uint64(const cbor_item_t *, uint64_t *);
55 int cbor_decode_user(const cbor_item_t *, fido_user_t *);
56 int es256_pk_decode(const cbor_item_t *, es256_pk_t *);
57 int rs256_pk_decode(const cbor_item_t *, rs256_pk_t *);
58 int eddsa_pk_decode(const cbor_item_t *, eddsa_pk_t *);
59 
60 /* auxiliary cbor routines */
61 int cbor_add_bool(cbor_item_t *, const char *, fido_opt_t);
62 int cbor_add_bytestring(cbor_item_t *, const char *, const unsigned char *,
63     size_t);
64 int cbor_add_string(cbor_item_t *, const char *, const char *);
65 int cbor_array_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
66     void *));
67 int cbor_build_frame(uint8_t, cbor_item_t *[], size_t, fido_blob_t *);
68 int cbor_bytestring_copy(const cbor_item_t *, unsigned char **, size_t *);
69 int cbor_map_iter(const cbor_item_t *, void *, int(*)(const cbor_item_t *,
70     const cbor_item_t *, void *));
71 int cbor_string_copy(const cbor_item_t *, char **);
72 int cbor_parse_reply(const unsigned char *, size_t, void *,
73     int(*)(const cbor_item_t *, const cbor_item_t *, void *));
74 int cbor_add_pin_params(fido_dev_t *, const fido_blob_t *, const es256_pk_t *,
75     const fido_blob_t *,const char *, cbor_item_t **, cbor_item_t **);
76 void cbor_vector_free(cbor_item_t **, size_t);
77 
78 #ifndef nitems
79 #define nitems(_a)	(sizeof((_a)) / sizeof((_a)[0]))
80 #endif
81 
82 /* buf */
83 int fido_buf_read(const unsigned char **, size_t *, void *, size_t);
84 int fido_buf_write(unsigned char **, size_t *, const void *, size_t);
85 
86 /* hid i/o */
87 void *fido_hid_open(const char *);
88 void  fido_hid_close(void *);
89 int fido_hid_read(void *, unsigned char *, size_t, int);
90 int fido_hid_write(void *, const unsigned char *, size_t);
91 size_t fido_hid_report_in_len(void *);
92 size_t fido_hid_report_out_len(void *);
93 
94 /* generic i/o */
95 int fido_rx_cbor_status(fido_dev_t *, int);
96 int fido_rx(fido_dev_t *, uint8_t, void *, size_t, int);
97 int fido_tx(fido_dev_t *, uint8_t, const void *, size_t);
98 
99 /* log */
100 #ifdef FIDO_NO_DIAGNOSTIC
101 #define fido_log_init(...)	do { /* nothing */ } while (0)
102 #define fido_log_debug(...)	do { /* nothing */ } while (0)
103 #define fido_log_xxd(...)	do { /* nothing */ } while (0)
104 #else
105 #ifdef __GNUC__
106 void fido_log_init(void);
107 void fido_log_debug(const char *, ...)
108     __attribute__((__format__ (printf, 1, 2)));
109 void fido_log_xxd(const void *, size_t);
110 #else
111 void fido_log_init(void);
112 void fido_log_debug(const char *, ...);
113 void fido_log_xxd(const void *, size_t);
114 #endif /* __GNUC__ */
115 #endif /* FIDO_NO_DIAGNOSTIC */
116 
117 /* u2f */
118 int u2f_register(fido_dev_t *, fido_cred_t *, int);
119 int u2f_authenticate(fido_dev_t *, fido_assert_t *, int);
120 int u2f_get_touch_begin(fido_dev_t *);
121 int u2f_get_touch_status(fido_dev_t *, int *, int);
122 
123 /* unexposed fido ops */
124 int fido_dev_authkey(fido_dev_t *, es256_pk_t *);
125 int fido_dev_get_cbor_info_wait(fido_dev_t *, fido_cbor_info_t *, int);
126 int fido_dev_get_pin_token(fido_dev_t *, const char *, const fido_blob_t *,
127     const es256_pk_t *, fido_blob_t *);
128 int fido_do_ecdh(fido_dev_t *, es256_pk_t **, fido_blob_t **);
129 
130 /* misc */
131 void fido_assert_reset_rx(fido_assert_t *);
132 void fido_assert_reset_tx(fido_assert_t *);
133 void fido_cred_reset_rx(fido_cred_t *);
134 void fido_cred_reset_tx(fido_cred_t *);
135 int fido_check_rp_id(const char *, const unsigned char *);
136 int fido_check_flags(uint8_t, fido_opt_t, fido_opt_t);
137 
138 /* crypto */
139 int fido_verify_sig_es256(const fido_blob_t *, const es256_pk_t *,
140     const fido_blob_t *);
141 int fido_verify_sig_rs256(const fido_blob_t *, const rs256_pk_t *,
142     const fido_blob_t *);
143 int fido_verify_sig_eddsa(const fido_blob_t *, const eddsa_pk_t *,
144     const fido_blob_t *);
145 int fido_get_signed_hash(int, fido_blob_t *, const fido_blob_t *,
146     const fido_blob_t *);
147 
148 /* hid device manifest */
149 int fido_hid_manifest(fido_dev_info_t *, size_t, size_t *);
150 
151 /* device manifest registration */
152 typedef int (*dev_manifest_func_t)(fido_dev_info_t *, size_t, size_t *);
153 int fido_dev_register_manifest_func(const dev_manifest_func_t);
154 void fido_dev_unregister_manifest_func(const dev_manifest_func_t);
155 
156 /* fuzzing instrumentation */
157 #ifdef FIDO_FUZZ
158 uint32_t uniform_random(uint32_t);
159 #endif
160 
161 /* internal device capability flags */
162 #define FIDO_DEV_PIN_SET	0x01
163 #define FIDO_DEV_PIN_UNSET	0x02
164 #define FIDO_DEV_CRED_PROT	0x04
165 
166 /* miscellanea */
167 #define FIDO_DUMMY_CLIENTDATA	""
168 #define FIDO_DUMMY_RP_ID	"localhost"
169 #define FIDO_DUMMY_USER_NAME	"dummy"
170 #define FIDO_DUMMY_USER_ID	1
171 
172 #ifdef __cplusplus
173 } /* extern "C" */
174 #endif /* __cplusplus */
175 
176 #endif /* !_EXTERN_H */
177