1 1.1 christos /* 2 1.1.1.5 christos * 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.5 christos assert(fido_assert_authdata_raw_len(a, idx) == 0); 234 1.1.1.5 christos 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.5 christos assert(fido_assert_authdata_ptr(a, 0) == NULL); 502 1.1.1.5 christos assert(fido_assert_authdata_len(a, 0) == 0); 503 1.1.1.5 christos assert(fido_assert_authdata_raw_ptr(a, 0) == NULL); 504 1.1.1.5 christos 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.5 christos static void 623 1.1.1.5 christos raw_authdata(void) 624 1.1.1.5 christos { 625 1.1.1.5 christos fido_assert_t *a; 626 1.1.1.5 christos cbor_item_t *item; 627 1.1.1.5 christos struct cbor_load_result cbor_result; 628 1.1.1.5 christos const unsigned char *ptr; 629 1.1.1.5 christos unsigned char *cbor; 630 1.1.1.5 christos size_t len; 631 1.1.1.5 christos size_t cbor_len; 632 1.1.1.5 christos size_t alloclen; 633 1.1.1.5 christos 634 1.1.1.5 christos a = alloc_assert(); 635 1.1.1.5 christos assert(fido_assert_set_count(a, 1) == FIDO_OK); 636 1.1.1.5 christos assert(fido_assert_set_authdata(a, 0, authdata, 637 1.1.1.5 christos sizeof(authdata)) == FIDO_OK); 638 1.1.1.5 christos assert((ptr = fido_assert_authdata_ptr(a, 0)) != NULL); 639 1.1.1.5 christos assert((len = fido_assert_authdata_len(a, 0)) != 0); 640 1.1.1.5 christos assert((item = cbor_load(ptr, len, &cbor_result)) != NULL); 641 1.1.1.5 christos assert(cbor_result.read == len); 642 1.1.1.5 christos assert(cbor_isa_bytestring(item)); 643 1.1.1.5 christos assert((ptr = fido_assert_authdata_raw_ptr(a, 0)) != NULL); 644 1.1.1.5 christos assert((len = fido_assert_authdata_raw_len(a, 0)) != 0); 645 1.1.1.5 christos assert(cbor_bytestring_length(item) == len); 646 1.1.1.5 christos assert(memcmp(ptr, cbor_bytestring_handle(item), len) == 0); 647 1.1.1.5 christos assert((len = fido_assert_authdata_len(a, 0)) != 0); 648 1.1.1.5 christos assert((cbor_len = cbor_serialize_alloc(item, &cbor, &alloclen)) == len); 649 1.1.1.5 christos assert((ptr = cbor_bytestring_handle(item)) != NULL); 650 1.1.1.5 christos assert((len = cbor_bytestring_length(item)) != 0); 651 1.1.1.5 christos assert(fido_assert_set_authdata_raw(a, 0, ptr, len) == FIDO_OK); 652 1.1.1.5 christos assert((ptr = fido_assert_authdata_ptr(a, 0)) != NULL); 653 1.1.1.5 christos assert((len = fido_assert_authdata_len(a, 0)) != 0); 654 1.1.1.5 christos assert(len == cbor_len); 655 1.1.1.5 christos assert(memcmp(cbor, ptr, len) == 0); 656 1.1.1.5 christos assert(cbor_len == sizeof(authdata)); 657 1.1.1.5 christos assert(memcmp(cbor, authdata, cbor_len) == 0); 658 1.1.1.5 christos cbor_decref(&item); 659 1.1.1.5 christos free(cbor); 660 1.1.1.5 christos free_assert(a); 661 1.1.1.5 christos } 662 1.1.1.5 christos 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.5 christos raw_authdata(); 683 1.1 christos 684 1.1 christos exit(0); 685 1.1 christos } 686