assert.c revision 1.1.1.4.2.1 1 1.1 christos /*
2 1.1.1.4.2.1 perseant * Copyright (c) 2018-2023 Yubico AB. All rights reserved.
3 1.1 christos * Use of this source code is governed by a BSD-style
4 1.1 christos * license that can be found in the LICENSE file.
5 1.1.1.4 christos * SPDX-License-Identifier: BSD-2-Clause
6 1.1 christos */
7 1.1 christos
8 1.1.1.4 christos #undef NDEBUG
9 1.1.1.4 christos
10 1.1 christos #include <assert.h>
11 1.1.1.4 christos #include <string.h>
12 1.1.1.4 christos
13 1.1.1.4 christos #define _FIDO_INTERNAL
14 1.1.1.4 christos
15 1.1 christos #include <fido.h>
16 1.1 christos #include <fido/es256.h>
17 1.1 christos #include <fido/rs256.h>
18 1.1.1.3 christos #include <fido/eddsa.h>
19 1.1 christos
20 1.1.1.4 christos static int fake_dev_handle;
21 1.1 christos
22 1.1 christos static const unsigned char es256_pk[64] = {
23 1.1 christos 0x34, 0xeb, 0x99, 0x77, 0x02, 0x9c, 0x36, 0x38,
24 1.1 christos 0xbb, 0xc2, 0xae, 0xa0, 0xa0, 0x18, 0xc6, 0x64,
25 1.1 christos 0xfc, 0xe8, 0x49, 0x92, 0xd7, 0x74, 0x9e, 0x0c,
26 1.1 christos 0x46, 0x8c, 0x9d, 0xa6, 0xdf, 0x46, 0xf7, 0x84,
27 1.1 christos 0x60, 0x1e, 0x0f, 0x8b, 0x23, 0x85, 0x4a, 0x9a,
28 1.1 christos 0xec, 0xc1, 0x08, 0x9f, 0x30, 0xd0, 0x0d, 0xd7,
29 1.1 christos 0x76, 0x7b, 0x55, 0x48, 0x91, 0x7c, 0x4f, 0x0f,
30 1.1 christos 0x64, 0x1a, 0x1d, 0xf8, 0xbe, 0x14, 0x90, 0x8a,
31 1.1 christos };
32 1.1 christos
33 1.1.1.4 christos static const unsigned char rs256_pk[259] = {
34 1.1.1.4 christos 0x9e, 0x54, 0x78, 0xb2, 0x51, 0xbe, 0x19, 0x7c,
35 1.1.1.4 christos 0xcb, 0x1a, 0x9a, 0xc3, 0x49, 0x2a, 0x2f, 0xfd,
36 1.1.1.4 christos 0x99, 0x64, 0x76, 0xc6, 0xdb, 0xca, 0x38, 0x3f,
37 1.1.1.4 christos 0xb0, 0x6a, 0xc9, 0xc0, 0x07, 0x9f, 0x5c, 0x4d,
38 1.1.1.4 christos 0xfc, 0xd1, 0x01, 0x7f, 0x69, 0x65, 0xab, 0x9c,
39 1.1.1.4 christos 0x2a, 0xc2, 0x95, 0xd9, 0x44, 0xf3, 0xea, 0x94,
40 1.1.1.4 christos 0x6b, 0x25, 0x66, 0x54, 0x81, 0xee, 0x24, 0x1d,
41 1.1.1.4 christos 0xe1, 0x7d, 0x7f, 0xbe, 0xea, 0x76, 0x90, 0x5c,
42 1.1.1.4 christos 0xbf, 0x59, 0x22, 0xd3, 0xa0, 0x68, 0x1a, 0x65,
43 1.1.1.4 christos 0x8b, 0x2f, 0xb6, 0xa8, 0x30, 0x2d, 0x26, 0x81,
44 1.1.1.4 christos 0xfa, 0x9e, 0x59, 0xec, 0x2f, 0xee, 0x59, 0x39,
45 1.1.1.4 christos 0xe2, 0x79, 0x19, 0x54, 0x54, 0xdf, 0x24, 0x83,
46 1.1.1.4 christos 0xee, 0x61, 0x5a, 0x66, 0x24, 0x2b, 0x7b, 0xfb,
47 1.1.1.4 christos 0x82, 0x66, 0xe4, 0x85, 0x18, 0x20, 0x76, 0xe5,
48 1.1.1.4 christos 0x4a, 0xb6, 0xcb, 0xec, 0x43, 0xbe, 0xfd, 0xb0,
49 1.1.1.4 christos 0x8f, 0xfd, 0x2f, 0x69, 0xda, 0x06, 0x9c, 0x09,
50 1.1.1.4 christos 0x68, 0x7a, 0x94, 0x6c, 0xb7, 0x51, 0x6d, 0x4c,
51 1.1.1.4 christos 0xf7, 0x13, 0xe8, 0xd5, 0x22, 0x6b, 0x1e, 0xba,
52 1.1.1.4 christos 0xb9, 0x85, 0xe8, 0x5f, 0xa1, 0x66, 0xe3, 0x20,
53 1.1.1.4 christos 0x75, 0x30, 0x11, 0xb5, 0xa3, 0xc3, 0xb0, 0x72,
54 1.1.1.4 christos 0x08, 0xff, 0xa3, 0xbb, 0xf1, 0x32, 0x0b, 0x06,
55 1.1.1.4 christos 0xc4, 0x12, 0xa3, 0x49, 0x30, 0x19, 0xb9, 0xfe,
56 1.1.1.4 christos 0x69, 0x0c, 0xd6, 0xe1, 0x58, 0x36, 0xe6, 0x41,
57 1.1.1.4 christos 0x22, 0x41, 0xbf, 0x96, 0x50, 0x35, 0x56, 0x0d,
58 1.1.1.4 christos 0x92, 0x8c, 0x34, 0xea, 0x28, 0x91, 0x88, 0x9e,
59 1.1.1.4 christos 0x8a, 0xaa, 0x36, 0xd0, 0x0f, 0xbe, 0x16, 0xde,
60 1.1.1.4 christos 0x9d, 0x5f, 0x7b, 0xda, 0x52, 0xf7, 0xf1, 0xb6,
61 1.1.1.4 christos 0x28, 0x10, 0x05, 0x8f, 0xb9, 0x19, 0x7a, 0xcf,
62 1.1.1.4 christos 0x18, 0x9b, 0x40, 0xcd, 0xff, 0x78, 0xea, 0x61,
63 1.1.1.4 christos 0x24, 0x3b, 0x80, 0x68, 0x04, 0x9b, 0x40, 0x07,
64 1.1.1.4 christos 0x98, 0xd4, 0x94, 0xd1, 0x18, 0x44, 0xa5, 0xed,
65 1.1.1.4 christos 0xee, 0x18, 0xc2, 0x25, 0x52, 0x66, 0x42, 0xdf,
66 1.1.1.4 christos 0x01, 0x00, 0x01,
67 1.1.1.4 christos };
68 1.1.1.4 christos
69 1.1 christos static const unsigned char cdh[32] = {
70 1.1 christos 0xec, 0x8d, 0x8f, 0x78, 0x42, 0x4a, 0x2b, 0xb7,
71 1.1 christos 0x82, 0x34, 0xaa, 0xca, 0x07, 0xa1, 0xf6, 0x56,
72 1.1 christos 0x42, 0x1c, 0xb6, 0xf6, 0xb3, 0x00, 0x86, 0x52,
73 1.1 christos 0x35, 0x2d, 0xa2, 0x62, 0x4a, 0xbe, 0x89, 0x76,
74 1.1 christos };
75 1.1 christos
76 1.1 christos static const unsigned char authdata[39] = {
77 1.1 christos 0x58, 0x25, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,
78 1.1 christos 0x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,
79 1.1 christos 0x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,
80 1.1 christos 0x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,
81 1.1 christos 0x97, 0x63, 0x00, 0x00, 0x00, 0x00, 0x03,
82 1.1 christos };
83 1.1 christos
84 1.1 christos static const unsigned char sig[72] = {
85 1.1 christos 0x30, 0x46, 0x02, 0x21, 0x00, 0xf6, 0xd1, 0xa3,
86 1.1 christos 0xd5, 0x24, 0x2b, 0xde, 0xee, 0xa0, 0x90, 0x89,
87 1.1 christos 0xcd, 0xf8, 0x9e, 0xbd, 0x6b, 0x4d, 0x55, 0x79,
88 1.1 christos 0xe4, 0xc1, 0x42, 0x27, 0xb7, 0x9b, 0x9b, 0xa4,
89 1.1 christos 0x0a, 0xe2, 0x47, 0x64, 0x0e, 0x02, 0x21, 0x00,
90 1.1 christos 0xe5, 0xc9, 0xc2, 0x83, 0x47, 0x31, 0xc7, 0x26,
91 1.1 christos 0xe5, 0x25, 0xb2, 0xb4, 0x39, 0xa7, 0xfc, 0x3d,
92 1.1 christos 0x70, 0xbe, 0xe9, 0x81, 0x0d, 0x4a, 0x62, 0xa9,
93 1.1 christos 0xab, 0x4a, 0x91, 0xc0, 0x7d, 0x2d, 0x23, 0x1e,
94 1.1 christos };
95 1.1 christos
96 1.1 christos static void *
97 1.1 christos dummy_open(const char *path)
98 1.1 christos {
99 1.1 christos (void)path;
100 1.1 christos
101 1.1.1.4 christos return (&fake_dev_handle);
102 1.1 christos }
103 1.1 christos
104 1.1 christos static void
105 1.1 christos dummy_close(void *handle)
106 1.1 christos {
107 1.1.1.4 christos assert(handle == &fake_dev_handle);
108 1.1 christos }
109 1.1 christos
110 1.1 christos static int
111 1.1 christos dummy_read(void *handle, unsigned char *buf, size_t len, int ms)
112 1.1 christos {
113 1.1 christos (void)handle;
114 1.1 christos (void)buf;
115 1.1 christos (void)len;
116 1.1 christos (void)ms;
117 1.1 christos
118 1.1 christos abort();
119 1.1 christos /* NOTREACHED */
120 1.1 christos }
121 1.1 christos
122 1.1 christos static int
123 1.1 christos dummy_write(void *handle, const unsigned char *buf, size_t len)
124 1.1 christos {
125 1.1 christos (void)handle;
126 1.1 christos (void)buf;
127 1.1 christos (void)len;
128 1.1 christos
129 1.1 christos abort();
130 1.1 christos /* NOTREACHED */
131 1.1 christos }
132 1.1 christos
133 1.1 christos static fido_assert_t *
134 1.1 christos alloc_assert(void)
135 1.1 christos {
136 1.1 christos fido_assert_t *a;
137 1.1 christos
138 1.1 christos a = fido_assert_new();
139 1.1 christos assert(a != NULL);
140 1.1 christos
141 1.1 christos return (a);
142 1.1 christos }
143 1.1 christos
144 1.1 christos static void
145 1.1 christos free_assert(fido_assert_t *a)
146 1.1 christos {
147 1.1 christos fido_assert_free(&a);
148 1.1 christos assert(a == NULL);
149 1.1 christos }
150 1.1 christos
151 1.1 christos static fido_dev_t *
152 1.1 christos alloc_dev(void)
153 1.1 christos {
154 1.1 christos fido_dev_t *d;
155 1.1 christos
156 1.1 christos d = fido_dev_new();
157 1.1 christos assert(d != NULL);
158 1.1 christos
159 1.1 christos return (d);
160 1.1 christos }
161 1.1 christos
162 1.1 christos static void
163 1.1 christos free_dev(fido_dev_t *d)
164 1.1 christos {
165 1.1 christos fido_dev_free(&d);
166 1.1 christos assert(d == NULL);
167 1.1 christos }
168 1.1 christos
169 1.1 christos static es256_pk_t *
170 1.1 christos alloc_es256_pk(void)
171 1.1 christos {
172 1.1 christos es256_pk_t *pk;
173 1.1 christos
174 1.1 christos pk = es256_pk_new();
175 1.1 christos assert(pk != NULL);
176 1.1 christos
177 1.1 christos return (pk);
178 1.1 christos }
179 1.1 christos
180 1.1 christos static void
181 1.1 christos free_es256_pk(es256_pk_t *pk)
182 1.1 christos {
183 1.1 christos es256_pk_free(&pk);
184 1.1 christos assert(pk == NULL);
185 1.1 christos }
186 1.1 christos
187 1.1 christos static rs256_pk_t *
188 1.1 christos alloc_rs256_pk(void)
189 1.1 christos {
190 1.1 christos rs256_pk_t *pk;
191 1.1 christos
192 1.1 christos pk = rs256_pk_new();
193 1.1 christos assert(pk != NULL);
194 1.1 christos
195 1.1 christos return (pk);
196 1.1 christos }
197 1.1 christos
198 1.1 christos static void
199 1.1 christos free_rs256_pk(rs256_pk_t *pk)
200 1.1 christos {
201 1.1 christos rs256_pk_free(&pk);
202 1.1 christos assert(pk == NULL);
203 1.1 christos }
204 1.1 christos
205 1.1.1.3 christos static eddsa_pk_t *
206 1.1.1.3 christos alloc_eddsa_pk(void)
207 1.1.1.3 christos {
208 1.1.1.3 christos eddsa_pk_t *pk;
209 1.1.1.3 christos
210 1.1.1.3 christos pk = eddsa_pk_new();
211 1.1.1.3 christos assert(pk != NULL);
212 1.1.1.3 christos
213 1.1.1.3 christos return (pk);
214 1.1.1.3 christos }
215 1.1.1.3 christos
216 1.1.1.3 christos static void
217 1.1.1.3 christos free_eddsa_pk(eddsa_pk_t *pk)
218 1.1.1.3 christos {
219 1.1.1.3 christos eddsa_pk_free(&pk);
220 1.1.1.3 christos assert(pk == NULL);
221 1.1.1.3 christos }
222 1.1.1.3 christos
223 1.1 christos static void
224 1.1.1.2 christos empty_assert(fido_dev_t *d, fido_assert_t *a, size_t idx)
225 1.1 christos {
226 1.1 christos es256_pk_t *es256;
227 1.1 christos rs256_pk_t *rs256;
228 1.1.1.3 christos eddsa_pk_t *eddsa;
229 1.1 christos
230 1.1 christos assert(fido_assert_flags(a, idx) == 0);
231 1.1 christos assert(fido_assert_authdata_len(a, idx) == 0);
232 1.1 christos assert(fido_assert_authdata_ptr(a, idx) == NULL);
233 1.1.1.4.2.1 perseant assert(fido_assert_authdata_raw_len(a, idx) == 0);
234 1.1.1.4.2.1 perseant assert(fido_assert_authdata_raw_ptr(a, idx) == NULL);
235 1.1 christos assert(fido_assert_clientdata_hash_len(a) == 0);
236 1.1 christos assert(fido_assert_clientdata_hash_ptr(a) == NULL);
237 1.1 christos assert(fido_assert_id_len(a, idx) == 0);
238 1.1 christos assert(fido_assert_id_ptr(a, idx) == NULL);
239 1.1 christos assert(fido_assert_rp_id(a) == NULL);
240 1.1 christos assert(fido_assert_sig_len(a, idx) == 0);
241 1.1 christos assert(fido_assert_sig_ptr(a, idx) == NULL);
242 1.1 christos assert(fido_assert_user_display_name(a, idx) == NULL);
243 1.1 christos assert(fido_assert_user_icon(a, idx) == NULL);
244 1.1 christos assert(fido_assert_user_id_len(a, idx) == 0);
245 1.1 christos assert(fido_assert_user_id_ptr(a, idx) == NULL);
246 1.1 christos assert(fido_assert_user_name(a, idx) == NULL);
247 1.1 christos
248 1.1 christos es256 = alloc_es256_pk();
249 1.1 christos rs256 = alloc_rs256_pk();
250 1.1.1.3 christos eddsa = alloc_eddsa_pk();
251 1.1 christos
252 1.1 christos fido_dev_force_u2f(d);
253 1.1 christos assert(fido_dev_get_assert(d, a, NULL) == FIDO_ERR_INVALID_ARGUMENT);
254 1.1 christos assert(fido_dev_get_assert(d, a, "") == FIDO_ERR_INVALID_ARGUMENT);
255 1.1.1.2 christos assert(fido_assert_verify(a, idx, COSE_ES256,
256 1.1 christos NULL) == FIDO_ERR_INVALID_ARGUMENT);
257 1.1.1.2 christos assert(fido_assert_verify(a, idx, COSE_ES256,
258 1.1 christos es256) == FIDO_ERR_INVALID_ARGUMENT);
259 1.1.1.3 christos assert(fido_assert_verify(a, idx, -1,
260 1.1.1.3 christos es256) == FIDO_ERR_INVALID_ARGUMENT);
261 1.1.1.2 christos assert(fido_assert_verify(a, idx, COSE_RS256,
262 1.1 christos rs256) == FIDO_ERR_INVALID_ARGUMENT);
263 1.1.1.3 christos assert(fido_assert_verify(a, idx, COSE_EDDSA,
264 1.1.1.3 christos eddsa) == FIDO_ERR_INVALID_ARGUMENT);
265 1.1 christos
266 1.1 christos fido_dev_force_fido2(d);
267 1.1 christos assert(fido_dev_get_assert(d, a, NULL) == FIDO_ERR_INVALID_ARGUMENT);
268 1.1 christos assert(fido_dev_get_assert(d, a, "") == FIDO_ERR_INVALID_ARGUMENT);
269 1.1.1.2 christos assert(fido_assert_verify(a, idx, COSE_ES256,
270 1.1 christos NULL) == FIDO_ERR_INVALID_ARGUMENT);
271 1.1.1.2 christos assert(fido_assert_verify(a, idx, COSE_ES256,
272 1.1 christos es256) == FIDO_ERR_INVALID_ARGUMENT);
273 1.1.1.3 christos assert(fido_assert_verify(a, idx, -1,
274 1.1.1.3 christos es256) == FIDO_ERR_INVALID_ARGUMENT);
275 1.1.1.2 christos assert(fido_assert_verify(a, idx, COSE_RS256,
276 1.1 christos rs256) == FIDO_ERR_INVALID_ARGUMENT);
277 1.1.1.3 christos assert(fido_assert_verify(a, idx, COSE_EDDSA,
278 1.1.1.3 christos eddsa) == FIDO_ERR_INVALID_ARGUMENT);
279 1.1 christos
280 1.1 christos free_es256_pk(es256);
281 1.1 christos free_rs256_pk(rs256);
282 1.1.1.3 christos free_eddsa_pk(eddsa);
283 1.1 christos }
284 1.1 christos
285 1.1 christos static void
286 1.1 christos empty_assert_tests(void)
287 1.1 christos {
288 1.1 christos fido_assert_t *a;
289 1.1 christos fido_dev_t *d;
290 1.1 christos fido_dev_io_t io_f;
291 1.1.1.2 christos size_t i;
292 1.1 christos
293 1.1 christos memset(&io_f, 0, sizeof(io_f));
294 1.1 christos
295 1.1 christos a = alloc_assert();
296 1.1 christos d = alloc_dev();
297 1.1 christos
298 1.1 christos io_f.open = dummy_open;
299 1.1 christos io_f.close = dummy_close;
300 1.1 christos io_f.read = dummy_read;
301 1.1 christos io_f.write = dummy_write;
302 1.1 christos
303 1.1 christos assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK);
304 1.1 christos
305 1.1 christos empty_assert(d, a, 0);
306 1.1 christos assert(fido_assert_count(a) == 0);
307 1.1 christos assert(fido_assert_set_count(a, 4) == FIDO_OK);
308 1.1 christos assert(fido_assert_count(a) == 4);
309 1.1 christos for (i = 0; i < 4; i++) {
310 1.1 christos empty_assert(d, a, i);
311 1.1 christos }
312 1.1 christos empty_assert(d, a, 10);
313 1.1 christos free_assert(a);
314 1.1 christos free_dev(d);
315 1.1 christos }
316 1.1 christos
317 1.1 christos static void
318 1.1 christos valid_assert(void)
319 1.1 christos {
320 1.1 christos fido_assert_t *a;
321 1.1.1.3 christos es256_pk_t *es256;
322 1.1.1.3 christos rs256_pk_t *rs256;
323 1.1.1.3 christos eddsa_pk_t *eddsa;
324 1.1 christos
325 1.1 christos a = alloc_assert();
326 1.1.1.3 christos es256 = alloc_es256_pk();
327 1.1.1.3 christos rs256 = alloc_rs256_pk();
328 1.1.1.3 christos eddsa = alloc_eddsa_pk();
329 1.1.1.3 christos assert(es256_pk_from_ptr(es256, es256_pk, sizeof(es256_pk)) == FIDO_OK);
330 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
331 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
332 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
333 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
334 1.1 christos sizeof(authdata)) == FIDO_OK);
335 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
336 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
337 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
338 1.1.1.3 christos assert(fido_assert_verify(a, 0, COSE_ES256, es256) == FIDO_OK);
339 1.1.1.3 christos assert(fido_assert_verify(a, 0, COSE_RS256, rs256) == FIDO_ERR_INVALID_SIG);
340 1.1.1.3 christos assert(fido_assert_verify(a, 0, COSE_EDDSA, eddsa) == FIDO_ERR_INVALID_SIG);
341 1.1 christos free_assert(a);
342 1.1.1.3 christos free_es256_pk(es256);
343 1.1.1.3 christos free_rs256_pk(rs256);
344 1.1.1.3 christos free_eddsa_pk(eddsa);
345 1.1 christos }
346 1.1 christos
347 1.1 christos static void
348 1.1 christos no_cdh(void)
349 1.1 christos {
350 1.1 christos fido_assert_t *a;
351 1.1 christos es256_pk_t *pk;
352 1.1 christos
353 1.1 christos a = alloc_assert();
354 1.1 christos pk = alloc_es256_pk();
355 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
356 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
357 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
358 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
359 1.1 christos sizeof(authdata)) == FIDO_OK);
360 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
361 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
362 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
363 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
364 1.1 christos pk) == FIDO_ERR_INVALID_ARGUMENT);
365 1.1 christos free_assert(a);
366 1.1 christos free_es256_pk(pk);
367 1.1 christos }
368 1.1 christos
369 1.1 christos static void
370 1.1 christos no_rp(void)
371 1.1 christos {
372 1.1 christos fido_assert_t *a;
373 1.1 christos es256_pk_t *pk;
374 1.1 christos
375 1.1 christos a = alloc_assert();
376 1.1 christos pk = alloc_es256_pk();
377 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
378 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
379 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
380 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
381 1.1 christos sizeof(authdata)) == FIDO_OK);
382 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
383 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
384 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
385 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
386 1.1 christos pk) == FIDO_ERR_INVALID_ARGUMENT);
387 1.1 christos free_assert(a);
388 1.1 christos free_es256_pk(pk);
389 1.1 christos }
390 1.1 christos
391 1.1 christos static void
392 1.1 christos no_authdata(void)
393 1.1 christos {
394 1.1 christos fido_assert_t *a;
395 1.1 christos es256_pk_t *pk;
396 1.1 christos
397 1.1 christos a = alloc_assert();
398 1.1 christos pk = alloc_es256_pk();
399 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
400 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
401 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
402 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
403 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
404 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
405 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
406 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
407 1.1 christos pk) == FIDO_ERR_INVALID_ARGUMENT);
408 1.1 christos free_assert(a);
409 1.1 christos free_es256_pk(pk);
410 1.1 christos }
411 1.1 christos
412 1.1 christos static void
413 1.1 christos no_sig(void)
414 1.1 christos {
415 1.1 christos fido_assert_t *a;
416 1.1 christos es256_pk_t *pk;
417 1.1 christos
418 1.1 christos a = alloc_assert();
419 1.1 christos pk = alloc_es256_pk();
420 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
421 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
422 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
423 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
424 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
425 1.1 christos sizeof(authdata)) == FIDO_OK);
426 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
427 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
428 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
429 1.1 christos pk) == FIDO_ERR_INVALID_ARGUMENT);
430 1.1 christos free_assert(a);
431 1.1 christos free_es256_pk(pk);
432 1.1 christos }
433 1.1 christos
434 1.1 christos static void
435 1.1 christos junk_cdh(void)
436 1.1 christos {
437 1.1 christos fido_assert_t *a;
438 1.1 christos es256_pk_t *pk;
439 1.1 christos unsigned char *junk;
440 1.1 christos
441 1.1 christos junk = malloc(sizeof(cdh));
442 1.1 christos assert(junk != NULL);
443 1.1 christos memcpy(junk, cdh, sizeof(cdh));
444 1.1.1.4 christos junk[0] = (unsigned char)~junk[0];
445 1.1 christos
446 1.1 christos a = alloc_assert();
447 1.1 christos pk = alloc_es256_pk();
448 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
449 1.1 christos assert(fido_assert_set_clientdata_hash(a, junk, sizeof(cdh)) == FIDO_OK);
450 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
451 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
452 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
453 1.1 christos sizeof(authdata)) == FIDO_OK);
454 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
455 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
456 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
457 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256, pk) == FIDO_ERR_INVALID_SIG);
458 1.1 christos free_assert(a);
459 1.1 christos free_es256_pk(pk);
460 1.1 christos free(junk);
461 1.1 christos }
462 1.1 christos
463 1.1 christos static void
464 1.1 christos junk_rp(void)
465 1.1 christos {
466 1.1 christos fido_assert_t *a;
467 1.1 christos es256_pk_t *pk;
468 1.1 christos
469 1.1 christos a = alloc_assert();
470 1.1 christos pk = alloc_es256_pk();
471 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
472 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
473 1.1 christos assert(fido_assert_set_rp(a, "potato") == FIDO_OK);
474 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
475 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
476 1.1 christos sizeof(authdata)) == FIDO_OK);
477 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
478 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
479 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
480 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
481 1.1 christos pk) == FIDO_ERR_INVALID_PARAM);
482 1.1 christos free_assert(a);
483 1.1 christos free_es256_pk(pk);
484 1.1 christos }
485 1.1 christos
486 1.1 christos static void
487 1.1 christos junk_authdata(void)
488 1.1 christos {
489 1.1 christos fido_assert_t *a;
490 1.1 christos unsigned char *junk;
491 1.1 christos
492 1.1 christos junk = malloc(sizeof(authdata));
493 1.1 christos assert(junk != NULL);
494 1.1 christos memcpy(junk, authdata, sizeof(authdata));
495 1.1.1.4 christos junk[0] = (unsigned char)~junk[0];
496 1.1 christos
497 1.1 christos a = alloc_assert();
498 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
499 1.1 christos assert(fido_assert_set_authdata(a, 0, junk,
500 1.1 christos sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT);
501 1.1.1.4.2.1 perseant assert(fido_assert_authdata_ptr(a, 0) == NULL);
502 1.1.1.4.2.1 perseant assert(fido_assert_authdata_len(a, 0) == 0);
503 1.1.1.4.2.1 perseant assert(fido_assert_authdata_raw_ptr(a, 0) == NULL);
504 1.1.1.4.2.1 perseant assert(fido_assert_authdata_raw_len(a, 0) == 0);
505 1.1 christos free_assert(a);
506 1.1 christos free(junk);
507 1.1 christos }
508 1.1 christos
509 1.1 christos static void
510 1.1 christos junk_sig(void)
511 1.1 christos {
512 1.1 christos fido_assert_t *a;
513 1.1 christos es256_pk_t *pk;
514 1.1 christos unsigned char *junk;
515 1.1 christos
516 1.1 christos junk = malloc(sizeof(sig));
517 1.1 christos assert(junk != NULL);
518 1.1 christos memcpy(junk, sig, sizeof(sig));
519 1.1.1.4 christos junk[0] = (unsigned char)~junk[0];
520 1.1 christos
521 1.1 christos a = alloc_assert();
522 1.1 christos pk = alloc_es256_pk();
523 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
524 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
525 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
526 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
527 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
528 1.1 christos sizeof(authdata)) == FIDO_OK);
529 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
530 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
531 1.1 christos assert(fido_assert_set_sig(a, 0, junk, sizeof(sig)) == FIDO_OK);
532 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256, pk) == FIDO_ERR_INVALID_SIG);
533 1.1 christos free_assert(a);
534 1.1 christos free_es256_pk(pk);
535 1.1 christos free(junk);
536 1.1 christos }
537 1.1 christos
538 1.1 christos static void
539 1.1 christos wrong_options(void)
540 1.1 christos {
541 1.1 christos fido_assert_t *a;
542 1.1 christos es256_pk_t *pk;
543 1.1 christos
544 1.1 christos a = alloc_assert();
545 1.1 christos pk = alloc_es256_pk();
546 1.1 christos assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);
547 1.1 christos assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);
548 1.1 christos assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);
549 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
550 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
551 1.1 christos sizeof(authdata)) == FIDO_OK);
552 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_TRUE) == FIDO_OK);
553 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
554 1.1 christos assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);
555 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
556 1.1 christos pk) == FIDO_ERR_INVALID_PARAM);
557 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
558 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_TRUE) == FIDO_OK);
559 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256,
560 1.1 christos pk) == FIDO_ERR_INVALID_PARAM);
561 1.1 christos assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);
562 1.1 christos assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);
563 1.1 christos assert(fido_assert_verify(a, 0, COSE_ES256, pk) == FIDO_OK);
564 1.1 christos free_assert(a);
565 1.1 christos free_es256_pk(pk);
566 1.1 christos }
567 1.1 christos
568 1.1 christos /* cbor_serialize_alloc misuse */
569 1.1 christos static void
570 1.1 christos bad_cbor_serialize(void)
571 1.1 christos {
572 1.1 christos fido_assert_t *a;
573 1.1 christos
574 1.1 christos a = alloc_assert();
575 1.1 christos assert(fido_assert_set_count(a, 1) == FIDO_OK);
576 1.1 christos assert(fido_assert_set_authdata(a, 0, authdata,
577 1.1 christos sizeof(authdata)) == FIDO_OK);
578 1.1 christos assert(fido_assert_authdata_len(a, 0) == sizeof(authdata));
579 1.1 christos free_assert(a);
580 1.1 christos }
581 1.1 christos
582 1.1.1.4 christos /* rs256 <-> EVP_PKEY transformations */
583 1.1.1.4 christos static void
584 1.1.1.4 christos rs256_PKEY(void)
585 1.1.1.4 christos {
586 1.1.1.4 christos rs256_pk_t *pk1, *pk2;
587 1.1.1.4 christos EVP_PKEY *pkey;
588 1.1.1.4 christos
589 1.1.1.4 christos pk1 = alloc_rs256_pk();
590 1.1.1.4 christos pk2 = alloc_rs256_pk();
591 1.1.1.4 christos
592 1.1.1.4 christos assert(rs256_pk_from_ptr(pk1, rs256_pk, sizeof(rs256_pk)) == FIDO_OK);
593 1.1.1.4 christos assert((pkey = rs256_pk_to_EVP_PKEY(pk1)) != NULL);
594 1.1.1.4 christos assert(rs256_pk_from_EVP_PKEY(pk2, pkey) == FIDO_OK);
595 1.1.1.4 christos assert(memcmp(pk1, pk2, sizeof(*pk1)) == 0);
596 1.1.1.4 christos
597 1.1.1.4 christos free_rs256_pk(pk1);
598 1.1.1.4 christos free_rs256_pk(pk2);
599 1.1.1.4 christos EVP_PKEY_free(pkey);
600 1.1.1.4 christos }
601 1.1.1.4 christos
602 1.1.1.4 christos /* es256 <-> EVP_PKEY transformations */
603 1.1.1.4 christos static void
604 1.1.1.4 christos es256_PKEY(void)
605 1.1.1.4 christos {
606 1.1.1.4 christos es256_pk_t *pk1, *pk2;
607 1.1.1.4 christos EVP_PKEY *pkey;
608 1.1.1.4 christos
609 1.1.1.4 christos pk1 = alloc_es256_pk();
610 1.1.1.4 christos pk2 = alloc_es256_pk();
611 1.1.1.4 christos
612 1.1.1.4 christos assert(es256_pk_from_ptr(pk1, es256_pk, sizeof(es256_pk)) == FIDO_OK);
613 1.1.1.4 christos assert((pkey = es256_pk_to_EVP_PKEY(pk1)) != NULL);
614 1.1.1.4 christos assert(es256_pk_from_EVP_PKEY(pk2, pkey) == FIDO_OK);
615 1.1.1.4 christos assert(memcmp(pk1, pk2, sizeof(*pk1)) == 0);
616 1.1.1.4 christos
617 1.1.1.4 christos free_es256_pk(pk1);
618 1.1.1.4 christos free_es256_pk(pk2);
619 1.1.1.4 christos EVP_PKEY_free(pkey);
620 1.1.1.4 christos }
621 1.1.1.4 christos
622 1.1.1.4.2.1 perseant static void
623 1.1.1.4.2.1 perseant raw_authdata(void)
624 1.1.1.4.2.1 perseant {
625 1.1.1.4.2.1 perseant fido_assert_t *a;
626 1.1.1.4.2.1 perseant cbor_item_t *item;
627 1.1.1.4.2.1 perseant struct cbor_load_result cbor_result;
628 1.1.1.4.2.1 perseant const unsigned char *ptr;
629 1.1.1.4.2.1 perseant unsigned char *cbor;
630 1.1.1.4.2.1 perseant size_t len;
631 1.1.1.4.2.1 perseant size_t cbor_len;
632 1.1.1.4.2.1 perseant size_t alloclen;
633 1.1.1.4.2.1 perseant
634 1.1.1.4.2.1 perseant a = alloc_assert();
635 1.1.1.4.2.1 perseant assert(fido_assert_set_count(a, 1) == FIDO_OK);
636 1.1.1.4.2.1 perseant assert(fido_assert_set_authdata(a, 0, authdata,
637 1.1.1.4.2.1 perseant sizeof(authdata)) == FIDO_OK);
638 1.1.1.4.2.1 perseant assert((ptr = fido_assert_authdata_ptr(a, 0)) != NULL);
639 1.1.1.4.2.1 perseant assert((len = fido_assert_authdata_len(a, 0)) != 0);
640 1.1.1.4.2.1 perseant assert((item = cbor_load(ptr, len, &cbor_result)) != NULL);
641 1.1.1.4.2.1 perseant assert(cbor_result.read == len);
642 1.1.1.4.2.1 perseant assert(cbor_isa_bytestring(item));
643 1.1.1.4.2.1 perseant assert((ptr = fido_assert_authdata_raw_ptr(a, 0)) != NULL);
644 1.1.1.4.2.1 perseant assert((len = fido_assert_authdata_raw_len(a, 0)) != 0);
645 1.1.1.4.2.1 perseant assert(cbor_bytestring_length(item) == len);
646 1.1.1.4.2.1 perseant assert(memcmp(ptr, cbor_bytestring_handle(item), len) == 0);
647 1.1.1.4.2.1 perseant assert((len = fido_assert_authdata_len(a, 0)) != 0);
648 1.1.1.4.2.1 perseant assert((cbor_len = cbor_serialize_alloc(item, &cbor, &alloclen)) == len);
649 1.1.1.4.2.1 perseant assert((ptr = cbor_bytestring_handle(item)) != NULL);
650 1.1.1.4.2.1 perseant assert((len = cbor_bytestring_length(item)) != 0);
651 1.1.1.4.2.1 perseant assert(fido_assert_set_authdata_raw(a, 0, ptr, len) == FIDO_OK);
652 1.1.1.4.2.1 perseant assert((ptr = fido_assert_authdata_ptr(a, 0)) != NULL);
653 1.1.1.4.2.1 perseant assert((len = fido_assert_authdata_len(a, 0)) != 0);
654 1.1.1.4.2.1 perseant assert(len == cbor_len);
655 1.1.1.4.2.1 perseant assert(memcmp(cbor, ptr, len) == 0);
656 1.1.1.4.2.1 perseant assert(cbor_len == sizeof(authdata));
657 1.1.1.4.2.1 perseant assert(memcmp(cbor, authdata, cbor_len) == 0);
658 1.1.1.4.2.1 perseant cbor_decref(&item);
659 1.1.1.4.2.1 perseant free(cbor);
660 1.1.1.4.2.1 perseant free_assert(a);
661 1.1.1.4.2.1 perseant }
662 1.1.1.4.2.1 perseant
663 1.1 christos int
664 1.1 christos main(void)
665 1.1 christos {
666 1.1 christos fido_init(0);
667 1.1 christos
668 1.1 christos empty_assert_tests();
669 1.1 christos valid_assert();
670 1.1 christos no_cdh();
671 1.1 christos no_rp();
672 1.1 christos no_authdata();
673 1.1 christos no_sig();
674 1.1 christos junk_cdh();
675 1.1 christos junk_rp();
676 1.1 christos junk_authdata();
677 1.1 christos junk_sig();
678 1.1 christos wrong_options();
679 1.1 christos bad_cbor_serialize();
680 1.1.1.4 christos rs256_PKEY();
681 1.1.1.4 christos es256_PKEY();
682 1.1.1.4.2.1 perseant raw_authdata();
683 1.1 christos
684 1.1 christos exit(0);
685 1.1 christos }
686