Path: blob/main/contrib/libfido2/regress/assert.c
104913 views
/*1* Copyright (c) 2018-2023 Yubico AB. All rights reserved.2* Use of this source code is governed by a BSD-style3* license that can be found in the LICENSE file.4* SPDX-License-Identifier: BSD-2-Clause5*/67#undef NDEBUG89#include <assert.h>10#include <string.h>1112#define _FIDO_INTERNAL1314#include <fido.h>15#include <fido/es256.h>16#include <fido/rs256.h>17#include <fido/eddsa.h>1819static int fake_dev_handle;2021static const unsigned char es256_pk[64] = {220x34, 0xeb, 0x99, 0x77, 0x02, 0x9c, 0x36, 0x38,230xbb, 0xc2, 0xae, 0xa0, 0xa0, 0x18, 0xc6, 0x64,240xfc, 0xe8, 0x49, 0x92, 0xd7, 0x74, 0x9e, 0x0c,250x46, 0x8c, 0x9d, 0xa6, 0xdf, 0x46, 0xf7, 0x84,260x60, 0x1e, 0x0f, 0x8b, 0x23, 0x85, 0x4a, 0x9a,270xec, 0xc1, 0x08, 0x9f, 0x30, 0xd0, 0x0d, 0xd7,280x76, 0x7b, 0x55, 0x48, 0x91, 0x7c, 0x4f, 0x0f,290x64, 0x1a, 0x1d, 0xf8, 0xbe, 0x14, 0x90, 0x8a,30};3132static const unsigned char rs256_pk[259] = {330x9e, 0x54, 0x78, 0xb2, 0x51, 0xbe, 0x19, 0x7c,340xcb, 0x1a, 0x9a, 0xc3, 0x49, 0x2a, 0x2f, 0xfd,350x99, 0x64, 0x76, 0xc6, 0xdb, 0xca, 0x38, 0x3f,360xb0, 0x6a, 0xc9, 0xc0, 0x07, 0x9f, 0x5c, 0x4d,370xfc, 0xd1, 0x01, 0x7f, 0x69, 0x65, 0xab, 0x9c,380x2a, 0xc2, 0x95, 0xd9, 0x44, 0xf3, 0xea, 0x94,390x6b, 0x25, 0x66, 0x54, 0x81, 0xee, 0x24, 0x1d,400xe1, 0x7d, 0x7f, 0xbe, 0xea, 0x76, 0x90, 0x5c,410xbf, 0x59, 0x22, 0xd3, 0xa0, 0x68, 0x1a, 0x65,420x8b, 0x2f, 0xb6, 0xa8, 0x30, 0x2d, 0x26, 0x81,430xfa, 0x9e, 0x59, 0xec, 0x2f, 0xee, 0x59, 0x39,440xe2, 0x79, 0x19, 0x54, 0x54, 0xdf, 0x24, 0x83,450xee, 0x61, 0x5a, 0x66, 0x24, 0x2b, 0x7b, 0xfb,460x82, 0x66, 0xe4, 0x85, 0x18, 0x20, 0x76, 0xe5,470x4a, 0xb6, 0xcb, 0xec, 0x43, 0xbe, 0xfd, 0xb0,480x8f, 0xfd, 0x2f, 0x69, 0xda, 0x06, 0x9c, 0x09,490x68, 0x7a, 0x94, 0x6c, 0xb7, 0x51, 0x6d, 0x4c,500xf7, 0x13, 0xe8, 0xd5, 0x22, 0x6b, 0x1e, 0xba,510xb9, 0x85, 0xe8, 0x5f, 0xa1, 0x66, 0xe3, 0x20,520x75, 0x30, 0x11, 0xb5, 0xa3, 0xc3, 0xb0, 0x72,530x08, 0xff, 0xa3, 0xbb, 0xf1, 0x32, 0x0b, 0x06,540xc4, 0x12, 0xa3, 0x49, 0x30, 0x19, 0xb9, 0xfe,550x69, 0x0c, 0xd6, 0xe1, 0x58, 0x36, 0xe6, 0x41,560x22, 0x41, 0xbf, 0x96, 0x50, 0x35, 0x56, 0x0d,570x92, 0x8c, 0x34, 0xea, 0x28, 0x91, 0x88, 0x9e,580x8a, 0xaa, 0x36, 0xd0, 0x0f, 0xbe, 0x16, 0xde,590x9d, 0x5f, 0x7b, 0xda, 0x52, 0xf7, 0xf1, 0xb6,600x28, 0x10, 0x05, 0x8f, 0xb9, 0x19, 0x7a, 0xcf,610x18, 0x9b, 0x40, 0xcd, 0xff, 0x78, 0xea, 0x61,620x24, 0x3b, 0x80, 0x68, 0x04, 0x9b, 0x40, 0x07,630x98, 0xd4, 0x94, 0xd1, 0x18, 0x44, 0xa5, 0xed,640xee, 0x18, 0xc2, 0x25, 0x52, 0x66, 0x42, 0xdf,650x01, 0x00, 0x01,66};6768static const unsigned char cdh[32] = {690xec, 0x8d, 0x8f, 0x78, 0x42, 0x4a, 0x2b, 0xb7,700x82, 0x34, 0xaa, 0xca, 0x07, 0xa1, 0xf6, 0x56,710x42, 0x1c, 0xb6, 0xf6, 0xb3, 0x00, 0x86, 0x52,720x35, 0x2d, 0xa2, 0x62, 0x4a, 0xbe, 0x89, 0x76,73};7475static const unsigned char authdata[39] = {760x58, 0x25, 0x49, 0x96, 0x0d, 0xe5, 0x88, 0x0e,770x8c, 0x68, 0x74, 0x34, 0x17, 0x0f, 0x64, 0x76,780x60, 0x5b, 0x8f, 0xe4, 0xae, 0xb9, 0xa2, 0x86,790x32, 0xc7, 0x99, 0x5c, 0xf3, 0xba, 0x83, 0x1d,800x97, 0x63, 0x00, 0x00, 0x00, 0x00, 0x03,81};8283static const unsigned char sig[72] = {840x30, 0x46, 0x02, 0x21, 0x00, 0xf6, 0xd1, 0xa3,850xd5, 0x24, 0x2b, 0xde, 0xee, 0xa0, 0x90, 0x89,860xcd, 0xf8, 0x9e, 0xbd, 0x6b, 0x4d, 0x55, 0x79,870xe4, 0xc1, 0x42, 0x27, 0xb7, 0x9b, 0x9b, 0xa4,880x0a, 0xe2, 0x47, 0x64, 0x0e, 0x02, 0x21, 0x00,890xe5, 0xc9, 0xc2, 0x83, 0x47, 0x31, 0xc7, 0x26,900xe5, 0x25, 0xb2, 0xb4, 0x39, 0xa7, 0xfc, 0x3d,910x70, 0xbe, 0xe9, 0x81, 0x0d, 0x4a, 0x62, 0xa9,920xab, 0x4a, 0x91, 0xc0, 0x7d, 0x2d, 0x23, 0x1e,93};9495static void *96dummy_open(const char *path)97{98(void)path;99100return (&fake_dev_handle);101}102103static void104dummy_close(void *handle)105{106assert(handle == &fake_dev_handle);107}108109static int110dummy_read(void *handle, unsigned char *buf, size_t len, int ms)111{112(void)handle;113(void)buf;114(void)len;115(void)ms;116117abort();118/* NOTREACHED */119}120121static int122dummy_write(void *handle, const unsigned char *buf, size_t len)123{124(void)handle;125(void)buf;126(void)len;127128abort();129/* NOTREACHED */130}131132static fido_assert_t *133alloc_assert(void)134{135fido_assert_t *a;136137a = fido_assert_new();138assert(a != NULL);139140return (a);141}142143static void144free_assert(fido_assert_t *a)145{146fido_assert_free(&a);147assert(a == NULL);148}149150static fido_dev_t *151alloc_dev(void)152{153fido_dev_t *d;154155d = fido_dev_new();156assert(d != NULL);157158return (d);159}160161static void162free_dev(fido_dev_t *d)163{164fido_dev_free(&d);165assert(d == NULL);166}167168static es256_pk_t *169alloc_es256_pk(void)170{171es256_pk_t *pk;172173pk = es256_pk_new();174assert(pk != NULL);175176return (pk);177}178179static void180free_es256_pk(es256_pk_t *pk)181{182es256_pk_free(&pk);183assert(pk == NULL);184}185186static rs256_pk_t *187alloc_rs256_pk(void)188{189rs256_pk_t *pk;190191pk = rs256_pk_new();192assert(pk != NULL);193194return (pk);195}196197static void198free_rs256_pk(rs256_pk_t *pk)199{200rs256_pk_free(&pk);201assert(pk == NULL);202}203204static eddsa_pk_t *205alloc_eddsa_pk(void)206{207eddsa_pk_t *pk;208209pk = eddsa_pk_new();210assert(pk != NULL);211212return (pk);213}214215static void216free_eddsa_pk(eddsa_pk_t *pk)217{218eddsa_pk_free(&pk);219assert(pk == NULL);220}221222static void223empty_assert(fido_dev_t *d, fido_assert_t *a, size_t idx)224{225es256_pk_t *es256;226rs256_pk_t *rs256;227eddsa_pk_t *eddsa;228229assert(fido_assert_flags(a, idx) == 0);230assert(fido_assert_authdata_len(a, idx) == 0);231assert(fido_assert_authdata_ptr(a, idx) == NULL);232assert(fido_assert_authdata_raw_len(a, idx) == 0);233assert(fido_assert_authdata_raw_ptr(a, idx) == NULL);234assert(fido_assert_clientdata_hash_len(a) == 0);235assert(fido_assert_clientdata_hash_ptr(a) == NULL);236assert(fido_assert_id_len(a, idx) == 0);237assert(fido_assert_id_ptr(a, idx) == NULL);238assert(fido_assert_rp_id(a) == NULL);239assert(fido_assert_sig_len(a, idx) == 0);240assert(fido_assert_sig_ptr(a, idx) == NULL);241assert(fido_assert_user_display_name(a, idx) == NULL);242assert(fido_assert_user_icon(a, idx) == NULL);243assert(fido_assert_user_id_len(a, idx) == 0);244assert(fido_assert_user_id_ptr(a, idx) == NULL);245assert(fido_assert_user_name(a, idx) == NULL);246247es256 = alloc_es256_pk();248rs256 = alloc_rs256_pk();249eddsa = alloc_eddsa_pk();250251fido_dev_force_u2f(d);252assert(fido_dev_get_assert(d, a, NULL) == FIDO_ERR_INVALID_ARGUMENT);253assert(fido_dev_get_assert(d, a, "") == FIDO_ERR_INVALID_ARGUMENT);254assert(fido_assert_verify(a, idx, COSE_ES256,255NULL) == FIDO_ERR_INVALID_ARGUMENT);256assert(fido_assert_verify(a, idx, COSE_ES256,257es256) == FIDO_ERR_INVALID_ARGUMENT);258assert(fido_assert_verify(a, idx, -1,259es256) == FIDO_ERR_INVALID_ARGUMENT);260assert(fido_assert_verify(a, idx, COSE_RS256,261rs256) == FIDO_ERR_INVALID_ARGUMENT);262assert(fido_assert_verify(a, idx, COSE_EDDSA,263eddsa) == FIDO_ERR_INVALID_ARGUMENT);264265fido_dev_force_fido2(d);266assert(fido_dev_get_assert(d, a, NULL) == FIDO_ERR_INVALID_ARGUMENT);267assert(fido_dev_get_assert(d, a, "") == FIDO_ERR_INVALID_ARGUMENT);268assert(fido_assert_verify(a, idx, COSE_ES256,269NULL) == FIDO_ERR_INVALID_ARGUMENT);270assert(fido_assert_verify(a, idx, COSE_ES256,271es256) == FIDO_ERR_INVALID_ARGUMENT);272assert(fido_assert_verify(a, idx, -1,273es256) == FIDO_ERR_INVALID_ARGUMENT);274assert(fido_assert_verify(a, idx, COSE_RS256,275rs256) == FIDO_ERR_INVALID_ARGUMENT);276assert(fido_assert_verify(a, idx, COSE_EDDSA,277eddsa) == FIDO_ERR_INVALID_ARGUMENT);278279free_es256_pk(es256);280free_rs256_pk(rs256);281free_eddsa_pk(eddsa);282}283284static void285empty_assert_tests(void)286{287fido_assert_t *a;288fido_dev_t *d;289fido_dev_io_t io_f;290size_t i;291292memset(&io_f, 0, sizeof(io_f));293294a = alloc_assert();295d = alloc_dev();296297io_f.open = dummy_open;298io_f.close = dummy_close;299io_f.read = dummy_read;300io_f.write = dummy_write;301302assert(fido_dev_set_io_functions(d, &io_f) == FIDO_OK);303304empty_assert(d, a, 0);305assert(fido_assert_count(a) == 0);306assert(fido_assert_set_count(a, 4) == FIDO_OK);307assert(fido_assert_count(a) == 4);308for (i = 0; i < 4; i++) {309empty_assert(d, a, i);310}311empty_assert(d, a, 10);312free_assert(a);313free_dev(d);314}315316static void317valid_assert(void)318{319fido_assert_t *a;320es256_pk_t *es256;321rs256_pk_t *rs256;322eddsa_pk_t *eddsa;323324a = alloc_assert();325es256 = alloc_es256_pk();326rs256 = alloc_rs256_pk();327eddsa = alloc_eddsa_pk();328assert(es256_pk_from_ptr(es256, es256_pk, sizeof(es256_pk)) == FIDO_OK);329assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);330assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);331assert(fido_assert_set_count(a, 1) == FIDO_OK);332assert(fido_assert_set_authdata(a, 0, authdata,333sizeof(authdata)) == FIDO_OK);334assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);335assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);336assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);337assert(fido_assert_verify(a, 0, COSE_ES256, es256) == FIDO_OK);338assert(fido_assert_verify(a, 0, COSE_RS256, rs256) == FIDO_ERR_INVALID_SIG);339assert(fido_assert_verify(a, 0, COSE_EDDSA, eddsa) == FIDO_ERR_INVALID_SIG);340free_assert(a);341free_es256_pk(es256);342free_rs256_pk(rs256);343free_eddsa_pk(eddsa);344}345346static void347no_cdh(void)348{349fido_assert_t *a;350es256_pk_t *pk;351352a = alloc_assert();353pk = alloc_es256_pk();354assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);355assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);356assert(fido_assert_set_count(a, 1) == FIDO_OK);357assert(fido_assert_set_authdata(a, 0, authdata,358sizeof(authdata)) == FIDO_OK);359assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);360assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);361assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);362assert(fido_assert_verify(a, 0, COSE_ES256,363pk) == FIDO_ERR_INVALID_ARGUMENT);364free_assert(a);365free_es256_pk(pk);366}367368static void369no_rp(void)370{371fido_assert_t *a;372es256_pk_t *pk;373374a = alloc_assert();375pk = alloc_es256_pk();376assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);377assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);378assert(fido_assert_set_count(a, 1) == FIDO_OK);379assert(fido_assert_set_authdata(a, 0, authdata,380sizeof(authdata)) == FIDO_OK);381assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);382assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);383assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);384assert(fido_assert_verify(a, 0, COSE_ES256,385pk) == FIDO_ERR_INVALID_ARGUMENT);386free_assert(a);387free_es256_pk(pk);388}389390static void391no_authdata(void)392{393fido_assert_t *a;394es256_pk_t *pk;395396a = alloc_assert();397pk = alloc_es256_pk();398assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);399assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);400assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);401assert(fido_assert_set_count(a, 1) == FIDO_OK);402assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);403assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);404assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);405assert(fido_assert_verify(a, 0, COSE_ES256,406pk) == FIDO_ERR_INVALID_ARGUMENT);407free_assert(a);408free_es256_pk(pk);409}410411static void412no_sig(void)413{414fido_assert_t *a;415es256_pk_t *pk;416417a = alloc_assert();418pk = alloc_es256_pk();419assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);420assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);421assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);422assert(fido_assert_set_count(a, 1) == FIDO_OK);423assert(fido_assert_set_authdata(a, 0, authdata,424sizeof(authdata)) == FIDO_OK);425assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);426assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);427assert(fido_assert_verify(a, 0, COSE_ES256,428pk) == FIDO_ERR_INVALID_ARGUMENT);429free_assert(a);430free_es256_pk(pk);431}432433static void434junk_cdh(void)435{436fido_assert_t *a;437es256_pk_t *pk;438unsigned char *junk;439440junk = malloc(sizeof(cdh));441assert(junk != NULL);442memcpy(junk, cdh, sizeof(cdh));443junk[0] = (unsigned char)~junk[0];444445a = alloc_assert();446pk = alloc_es256_pk();447assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);448assert(fido_assert_set_clientdata_hash(a, junk, sizeof(cdh)) == FIDO_OK);449assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);450assert(fido_assert_set_count(a, 1) == FIDO_OK);451assert(fido_assert_set_authdata(a, 0, authdata,452sizeof(authdata)) == FIDO_OK);453assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);454assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);455assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);456assert(fido_assert_verify(a, 0, COSE_ES256, pk) == FIDO_ERR_INVALID_SIG);457free_assert(a);458free_es256_pk(pk);459free(junk);460}461462static void463junk_rp(void)464{465fido_assert_t *a;466es256_pk_t *pk;467468a = alloc_assert();469pk = alloc_es256_pk();470assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);471assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);472assert(fido_assert_set_rp(a, "potato") == FIDO_OK);473assert(fido_assert_set_count(a, 1) == FIDO_OK);474assert(fido_assert_set_authdata(a, 0, authdata,475sizeof(authdata)) == FIDO_OK);476assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);477assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);478assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);479assert(fido_assert_verify(a, 0, COSE_ES256,480pk) == FIDO_ERR_INVALID_PARAM);481free_assert(a);482free_es256_pk(pk);483}484485static void486junk_authdata(void)487{488fido_assert_t *a;489unsigned char *junk;490491junk = malloc(sizeof(authdata));492assert(junk != NULL);493memcpy(junk, authdata, sizeof(authdata));494junk[0] = (unsigned char)~junk[0];495496a = alloc_assert();497assert(fido_assert_set_count(a, 1) == FIDO_OK);498assert(fido_assert_set_authdata(a, 0, junk,499sizeof(authdata)) == FIDO_ERR_INVALID_ARGUMENT);500assert(fido_assert_authdata_ptr(a, 0) == NULL);501assert(fido_assert_authdata_len(a, 0) == 0);502assert(fido_assert_authdata_raw_ptr(a, 0) == NULL);503assert(fido_assert_authdata_raw_len(a, 0) == 0);504free_assert(a);505free(junk);506}507508static void509junk_sig(void)510{511fido_assert_t *a;512es256_pk_t *pk;513unsigned char *junk;514515junk = malloc(sizeof(sig));516assert(junk != NULL);517memcpy(junk, sig, sizeof(sig));518junk[0] = (unsigned char)~junk[0];519520a = alloc_assert();521pk = alloc_es256_pk();522assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);523assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);524assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);525assert(fido_assert_set_count(a, 1) == FIDO_OK);526assert(fido_assert_set_authdata(a, 0, authdata,527sizeof(authdata)) == FIDO_OK);528assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);529assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);530assert(fido_assert_set_sig(a, 0, junk, sizeof(sig)) == FIDO_OK);531assert(fido_assert_verify(a, 0, COSE_ES256, pk) == FIDO_ERR_INVALID_SIG);532free_assert(a);533free_es256_pk(pk);534free(junk);535}536537static void538wrong_options(void)539{540fido_assert_t *a;541es256_pk_t *pk;542543a = alloc_assert();544pk = alloc_es256_pk();545assert(es256_pk_from_ptr(pk, es256_pk, sizeof(es256_pk)) == FIDO_OK);546assert(fido_assert_set_clientdata_hash(a, cdh, sizeof(cdh)) == FIDO_OK);547assert(fido_assert_set_rp(a, "localhost") == FIDO_OK);548assert(fido_assert_set_count(a, 1) == FIDO_OK);549assert(fido_assert_set_authdata(a, 0, authdata,550sizeof(authdata)) == FIDO_OK);551assert(fido_assert_set_up(a, FIDO_OPT_TRUE) == FIDO_OK);552assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);553assert(fido_assert_set_sig(a, 0, sig, sizeof(sig)) == FIDO_OK);554assert(fido_assert_verify(a, 0, COSE_ES256,555pk) == FIDO_ERR_INVALID_PARAM);556assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);557assert(fido_assert_set_uv(a, FIDO_OPT_TRUE) == FIDO_OK);558assert(fido_assert_verify(a, 0, COSE_ES256,559pk) == FIDO_ERR_INVALID_PARAM);560assert(fido_assert_set_up(a, FIDO_OPT_FALSE) == FIDO_OK);561assert(fido_assert_set_uv(a, FIDO_OPT_FALSE) == FIDO_OK);562assert(fido_assert_verify(a, 0, COSE_ES256, pk) == FIDO_OK);563free_assert(a);564free_es256_pk(pk);565}566567/* cbor_serialize_alloc misuse */568static void569bad_cbor_serialize(void)570{571fido_assert_t *a;572573a = alloc_assert();574assert(fido_assert_set_count(a, 1) == FIDO_OK);575assert(fido_assert_set_authdata(a, 0, authdata,576sizeof(authdata)) == FIDO_OK);577assert(fido_assert_authdata_len(a, 0) == sizeof(authdata));578free_assert(a);579}580581/* rs256 <-> EVP_PKEY transformations */582static void583rs256_PKEY(void)584{585rs256_pk_t *pk1, *pk2;586EVP_PKEY *pkey;587588pk1 = alloc_rs256_pk();589pk2 = alloc_rs256_pk();590591assert(rs256_pk_from_ptr(pk1, rs256_pk, sizeof(rs256_pk)) == FIDO_OK);592assert((pkey = rs256_pk_to_EVP_PKEY(pk1)) != NULL);593assert(rs256_pk_from_EVP_PKEY(pk2, pkey) == FIDO_OK);594assert(memcmp(pk1, pk2, sizeof(*pk1)) == 0);595596free_rs256_pk(pk1);597free_rs256_pk(pk2);598EVP_PKEY_free(pkey);599}600601/* es256 <-> EVP_PKEY transformations */602static void603es256_PKEY(void)604{605es256_pk_t *pk1, *pk2;606EVP_PKEY *pkey;607608pk1 = alloc_es256_pk();609pk2 = alloc_es256_pk();610611assert(es256_pk_from_ptr(pk1, es256_pk, sizeof(es256_pk)) == FIDO_OK);612assert((pkey = es256_pk_to_EVP_PKEY(pk1)) != NULL);613assert(es256_pk_from_EVP_PKEY(pk2, pkey) == FIDO_OK);614assert(memcmp(pk1, pk2, sizeof(*pk1)) == 0);615616free_es256_pk(pk1);617free_es256_pk(pk2);618EVP_PKEY_free(pkey);619}620621static void622raw_authdata(void)623{624fido_assert_t *a;625cbor_item_t *item;626struct cbor_load_result cbor_result;627const unsigned char *ptr;628unsigned char *cbor;629size_t len;630size_t cbor_len;631size_t alloclen;632633a = alloc_assert();634assert(fido_assert_set_count(a, 1) == FIDO_OK);635assert(fido_assert_set_authdata(a, 0, authdata,636sizeof(authdata)) == FIDO_OK);637assert((ptr = fido_assert_authdata_ptr(a, 0)) != NULL);638assert((len = fido_assert_authdata_len(a, 0)) != 0);639assert((item = cbor_load(ptr, len, &cbor_result)) != NULL);640assert(cbor_result.read == len);641assert(cbor_isa_bytestring(item));642assert((ptr = fido_assert_authdata_raw_ptr(a, 0)) != NULL);643assert((len = fido_assert_authdata_raw_len(a, 0)) != 0);644assert(cbor_bytestring_length(item) == len);645assert(memcmp(ptr, cbor_bytestring_handle(item), len) == 0);646assert((len = fido_assert_authdata_len(a, 0)) != 0);647assert((cbor_len = cbor_serialize_alloc(item, &cbor, &alloclen)) == len);648assert((ptr = cbor_bytestring_handle(item)) != NULL);649assert((len = cbor_bytestring_length(item)) != 0);650assert(fido_assert_set_authdata_raw(a, 0, ptr, len) == FIDO_OK);651assert((ptr = fido_assert_authdata_ptr(a, 0)) != NULL);652assert((len = fido_assert_authdata_len(a, 0)) != 0);653assert(len == cbor_len);654assert(memcmp(cbor, ptr, len) == 0);655assert(cbor_len == sizeof(authdata));656assert(memcmp(cbor, authdata, cbor_len) == 0);657cbor_decref(&item);658free(cbor);659free_assert(a);660}661662int663main(void)664{665fido_init(0);666667empty_assert_tests();668valid_assert();669no_cdh();670no_rp();671no_authdata();672no_sig();673junk_cdh();674junk_rp();675junk_authdata();676junk_sig();677wrong_options();678bad_cbor_serialize();679rs256_PKEY();680es256_PKEY();681raw_authdata();682683exit(0);684}685686687