Path: blob/main/contrib/libfido2/fuzz/fuzz_netlink.c
39586 views
/*1* Copyright (c) 2020 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#include <assert.h>8#include <stdint.h>9#include <stdlib.h>10#include <string.h>11#include <stdio.h>1213#include "../openbsd-compat/openbsd-compat.h"14#include "mutator_aux.h"15#include "dummy.h"1617struct param {18int seed;19int dev;20struct blob wiredata;21};2223struct param *24unpack(const uint8_t *ptr, size_t len)25{26cbor_item_t *item = NULL, **v;27struct cbor_load_result cbor;28struct param *p;29int ok = -1;3031if ((p = calloc(1, sizeof(*p))) == NULL ||32(item = cbor_load(ptr, len, &cbor)) == NULL ||33cbor.read != len ||34cbor_isa_array(item) == false ||35cbor_array_is_definite(item) == false ||36cbor_array_size(item) != 3 ||37(v = cbor_array_handle(item)) == NULL)38goto fail;3940if (unpack_int(v[0], &p->seed) < 0 ||41unpack_int(v[1], &p->dev) < 0 ||42unpack_blob(v[2], &p->wiredata) < 0)43goto fail;4445ok = 0;46fail:47if (ok < 0) {48free(p);49p = NULL;50}5152if (item)53cbor_decref(&item);5455return p;56}5758size_t59pack(uint8_t *ptr, size_t len, const struct param *p)60{61cbor_item_t *argv[3], *array = NULL;62size_t cbor_alloc_len, cbor_len = 0;63unsigned char *cbor = NULL;6465memset(argv, 0, sizeof(argv));6667if ((array = cbor_new_definite_array(3)) == NULL ||68(argv[0] = pack_int(p->seed)) == NULL ||69(argv[1] = pack_int(p->dev)) == NULL ||70(argv[2] = pack_blob(&p->wiredata)) == NULL)71goto fail;7273for (size_t i = 0; i < 3; i++)74if (cbor_array_push(array, argv[i]) == false)75goto fail;7677if ((cbor_len = cbor_serialize_alloc(array, &cbor,78&cbor_alloc_len)) == 0 || cbor_len > len) {79cbor_len = 0;80goto fail;81}8283memcpy(ptr, cbor, cbor_len);84fail:85for (size_t i = 0; i < 3; i++)86if (argv[i])87cbor_decref(&argv[i]);8889if (array)90cbor_decref(&array);9192free(cbor);9394return cbor_len;95}9697size_t98pack_dummy(uint8_t *ptr, size_t len)99{100struct param dummy;101uint8_t blob[MAXCORPUS];102size_t blob_len;103104memset(&dummy, 0, sizeof(dummy));105106dummy.wiredata.len = sizeof(dummy_netlink_wiredata);107memcpy(&dummy.wiredata.body, &dummy_netlink_wiredata,108dummy.wiredata.len);109110assert((blob_len = pack(blob, sizeof(blob), &dummy)) != 0);111112if (blob_len > len) {113memcpy(ptr, blob, len);114return len;115}116117memcpy(ptr, blob, blob_len);118119return blob_len;120}121122void123test(const struct param *p)124{125fido_nl_t *nl;126uint32_t target;127128prng_init((unsigned int)p->seed);129fuzz_clock_reset();130fido_init(FIDO_DEBUG);131fido_set_log_handler(consume_str);132133set_netlink_io_functions(fd_read, fd_write);134set_wire_data(p->wiredata.body, p->wiredata.len);135136if ((nl = fido_nl_new()) == NULL)137return;138139consume(&nl->fd, sizeof(nl->fd));140consume(&nl->nfc_type, sizeof(nl->nfc_type));141consume(&nl->nfc_mcastgrp, sizeof(nl->nfc_mcastgrp));142consume(&nl->saddr, sizeof(nl->saddr));143144fido_nl_power_nfc(nl, (uint32_t)p->dev);145146if (fido_nl_get_nfc_target(nl, (uint32_t)p->dev, &target) == 0)147consume(&target, sizeof(target));148149fido_nl_free(&nl);150}151152void153mutate(struct param *p, unsigned int seed, unsigned int flags) NO_MSAN154{155if (flags & MUTATE_SEED)156p->seed = (int)seed;157158if (flags & MUTATE_PARAM)159mutate_int(&p->dev);160161if (flags & MUTATE_WIREDATA)162mutate_blob(&p->wiredata);163}164165166