Home | History | Annotate | Line # | Download | only in regress
      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