Path: blob/main/contrib/libfido2/fuzz/mutator_aux.h
39586 views
/*1* Copyright (c) 2019-2022 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#ifndef _MUTATOR_AUX_H8#define _MUTATOR_AUX_H910#include <sys/types.h>1112#include <stddef.h>13#include <stdint.h>14#include <cbor.h>1516#include "../src/fido.h"17#include "../src/fido/bio.h"18#include "../src/fido/config.h"19#include "../src/fido/credman.h"20#include "../src/fido/eddsa.h"21#include "../src/fido/es256.h"22#include "../src/fido/es384.h"23#include "../src/fido/rs256.h"24#include "../src/netlink.h"2526/*27* As of LLVM 10.0.0, MSAN support in libFuzzer was still experimental.28* We therefore have to be careful when using our custom mutator, or29* MSAN will flag uninitialised reads on memory populated by libFuzzer.30* Since there is no way to suppress MSAN without regenerating object31* code (in which case you might as well rebuild libFuzzer with MSAN),32* we adjust our mutator to make it less accurate while allowing33* fuzzing to proceed.34*/3536#if defined(__has_feature)37# if __has_feature(memory_sanitizer)38# include <sanitizer/msan_interface.h>39# define NO_MSAN __attribute__((no_sanitize("memory")))40# define WITH_MSAN 141# endif42#endif4344#if !defined(WITH_MSAN)45# define NO_MSAN46#endif4748#define MUTATE_SEED 0x0149#define MUTATE_PARAM 0x0250#define MUTATE_WIREDATA 0x0451#define MUTATE_ALL (MUTATE_SEED | MUTATE_PARAM | MUTATE_WIREDATA)5253#define MAXSTR 102454#define MAXBLOB 360055#define MAXCORPUS 81925657#define HID_DEV_HANDLE 0x6869642158#define NFC_DEV_HANDLE 0x6e6663215960struct blob {61uint8_t body[MAXBLOB];62size_t len;63};6465struct param;6667struct param *unpack(const uint8_t *, size_t);68size_t pack(uint8_t *, size_t, const struct param *);69size_t pack_dummy(uint8_t *, size_t);70void mutate(struct param *, unsigned int, unsigned int);71void test(const struct param *);7273void consume(const void *, size_t);74void consume_str(const char *);7576int unpack_blob(cbor_item_t *, struct blob *);77int unpack_byte(cbor_item_t *, uint8_t *);78int unpack_int(cbor_item_t *, int *);79int unpack_string(cbor_item_t *, char *);8081cbor_item_t *pack_blob(const struct blob *);82cbor_item_t *pack_byte(uint8_t);83cbor_item_t *pack_int(int);84cbor_item_t *pack_string(const char *);8586void mutate_byte(uint8_t *);87void mutate_int(int *);88void mutate_blob(struct blob *);89void mutate_string(char *);9091ssize_t fd_read(int, void *, size_t);92ssize_t fd_write(int, const void *, size_t);9394int nfc_read(void *, unsigned char *, size_t, int);95int nfc_write(void *, const unsigned char *, size_t);9697fido_dev_t *open_dev(int);98void set_wire_data(const uint8_t *, size_t);99100void fuzz_clock_reset(void);101void prng_init(unsigned long);102unsigned long prng_uint32(void);103104uint32_t uniform_random(uint32_t);105106void set_pcsc_parameters(const struct blob *);107void set_pcsc_io_functions(int (*)(void *, u_char *, size_t, int),108int (*)(void *, const u_char *, size_t), void (*)(const void *, size_t));109110#endif /* !_MUTATOR_AUX_H */111112113