Home | History | Annotate | Line # | Download | only in fuzz
      1 /*
      2  * Copyright (c) 2019-2022 Yubico AB. All rights reserved.
      3  * Use of this source code is governed by a BSD-style
      4  * license that can be found in the LICENSE file.
      5  * SPDX-License-Identifier: BSD-2-Clause
      6  */
      7 
      8 #include <sys/types.h>
      9 #include <sys/random.h>
     10 #include <sys/socket.h>
     11 
     12 #include <openssl/bn.h>
     13 #include <openssl/evp.h>
     14 #include <openssl/sha.h>
     15 
     16 #include <cbor.h>
     17 #include <stdbool.h>
     18 #include <stdint.h>
     19 #include <stdio.h>
     20 #include <stdlib.h>
     21 #include <zlib.h>
     22 
     23 #include "mutator_aux.h"
     24 
     25 extern int prng_up;
     26 
     27 int fuzz_save_corpus;
     28 
     29 /*
     30  * Build wrappers around functions of interest, and have them fail
     31  * in a pseudo-random manner. A uniform probability of 0.25% (1/400)
     32  * allows for a depth of log(0.5)/log(399/400) > 276 operations
     33  * before simulated errors become statistically more likely.
     34  */
     35 
     36 #define WRAP(type, name, args, retval, param, prob)	\
     37 extern type __wrap_##name args;				\
     38 extern type __real_##name args;				\
     39 type __wrap_##name args {				\
     40 	if (prng_up && uniform_random(400) < (prob)) {	\
     41 		return (retval);			\
     42 	}						\
     43 							\
     44 	return (__real_##name param);			\
     45 }
     46 
     47 WRAP(void *,
     48 	malloc,
     49 	(size_t size),
     50 	NULL,
     51 	(size),
     52 	1
     53 )
     54 
     55 WRAP(void *,
     56 	calloc,
     57 	(size_t nmemb, size_t size),
     58 	NULL,
     59 	(nmemb, size),
     60 	1
     61 )
     62 
     63 WRAP(void *,
     64 	realloc,
     65 	(void *ptr, size_t size),
     66 	NULL,
     67 	(ptr, size),
     68 	1
     69 )
     70 
     71 WRAP(char *,
     72 	strdup,
     73 	(const char *s),
     74 	NULL,
     75 	(s),
     76 	1
     77 )
     78 
     79 WRAP(ssize_t,
     80 	getrandom,
     81 	(void *buf, size_t buflen, unsigned int flags),
     82 	-1,
     83 	(buf, buflen, flags),
     84 	1
     85 )
     86 
     87 WRAP(int,
     88 	EVP_Cipher,
     89 	(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in,
     90 	    unsigned int inl),
     91 	-1,
     92 	(ctx, out, in, inl),
     93 	1
     94 )
     95 
     96 WRAP(int,
     97 	EVP_CIPHER_CTX_ctrl,
     98 	(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr),
     99 	0,
    100 	(ctx, type, arg, ptr),
    101 	1
    102 )
    103 
    104 WRAP(EVP_CIPHER_CTX *,
    105 	EVP_CIPHER_CTX_new,
    106 	(void),
    107 	NULL,
    108 	(),
    109 	1
    110 )
    111 
    112 WRAP(int,
    113 	EVP_CipherInit,
    114 	(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
    115 	    const unsigned char *key, const unsigned char *iv, int enc),
    116 	0,
    117 	(ctx, cipher, key, iv, enc),
    118 	1
    119 )
    120 
    121 WRAP(RSA *,
    122 	EVP_PKEY_get0_RSA,
    123 	(EVP_PKEY *pkey),
    124 	NULL,
    125 	(pkey),
    126 	1
    127 )
    128 
    129 WRAP(EC_KEY *,
    130 	EVP_PKEY_get0_EC_KEY,
    131 	(EVP_PKEY *pkey),
    132 	NULL,
    133 	(pkey),
    134 	1
    135 )
    136 
    137 WRAP(int,
    138 	EVP_PKEY_get_raw_public_key,
    139 	(const EVP_PKEY *pkey, unsigned char *pub, size_t *len),
    140 	0,
    141 	(pkey, pub, len),
    142 	1
    143 )
    144 
    145 WRAP(EVP_MD_CTX *,
    146 	EVP_MD_CTX_new,
    147 	(void),
    148 	NULL,
    149 	(),
    150 	1
    151 )
    152 
    153 WRAP(int,
    154 	EVP_DigestVerifyInit,
    155 	(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, ENGINE *e,
    156 	    EVP_PKEY *pkey),
    157 	0,
    158 	(ctx, pctx, type, e, pkey),
    159 	1
    160 )
    161 
    162 WRAP(int,
    163 	EVP_DigestInit_ex,
    164 	(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl),
    165 	0,
    166 	(ctx, type, impl),
    167 	1
    168 )
    169 
    170 WRAP(int,
    171 	EVP_DigestUpdate,
    172 	(EVP_MD_CTX *ctx, const void *data, size_t count),
    173 	0,
    174 	(ctx, data, count),
    175 	1
    176 )
    177 
    178 WRAP(int,
    179 	EVP_DigestFinal_ex,
    180 	(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *isize),
    181 	0,
    182 	(ctx, md, isize),
    183 	1
    184 )
    185 
    186 WRAP(BIGNUM *,
    187 	BN_bin2bn,
    188 	(const unsigned char *s, int len, BIGNUM *ret),
    189 	NULL,
    190 	(s, len, ret),
    191 	1
    192 )
    193 
    194 WRAP(int,
    195 	BN_bn2bin,
    196 	(const BIGNUM *a, unsigned char *to),
    197 	-1,
    198 	(a, to),
    199 	1
    200 )
    201 
    202 WRAP(BIGNUM *,
    203 	BN_CTX_get,
    204 	(BN_CTX *ctx),
    205 	NULL,
    206 	(ctx),
    207 	1
    208 )
    209 
    210 WRAP(BN_CTX *,
    211 	BN_CTX_new,
    212 	(void),
    213 	NULL,
    214 	(),
    215 	1
    216 )
    217 
    218 WRAP(BIGNUM *,
    219 	BN_new,
    220 	(void),
    221 	NULL,
    222 	(),
    223 	1
    224 )
    225 
    226 WRAP(RSA *,
    227 	RSA_new,
    228 	(void),
    229 	NULL,
    230 	(),
    231 	1
    232 )
    233 
    234 WRAP(int,
    235 	RSA_set0_key,
    236 	(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d),
    237 	0,
    238 	(r, n, e, d),
    239 	1
    240 )
    241 
    242 WRAP(int,
    243 	RSA_pkey_ctx_ctrl,
    244 	(EVP_PKEY_CTX *ctx, int optype, int cmd, int p1, void *p2),
    245 	-1,
    246 	(ctx, optype, cmd, p1, p2),
    247 	1
    248 )
    249 
    250 WRAP(EC_KEY *,
    251 	EC_KEY_new_by_curve_name,
    252 	(int nid),
    253 	NULL,
    254 	(nid),
    255 	1
    256 )
    257 
    258 WRAP(const EC_GROUP *,
    259 	EC_KEY_get0_group,
    260 	(const EC_KEY *key),
    261 	NULL,
    262 	(key),
    263 	1
    264 )
    265 
    266 WRAP(const BIGNUM *,
    267 	EC_KEY_get0_private_key,
    268 	(const EC_KEY *key),
    269 	NULL,
    270 	(key),
    271 	1
    272 )
    273 
    274 WRAP(EC_POINT *,
    275 	EC_POINT_new,
    276 	(const EC_GROUP *group),
    277 	NULL,
    278 	(group),
    279 	1
    280 )
    281 
    282 WRAP(int,
    283 	EC_POINT_get_affine_coordinates_GFp,
    284 	(const EC_GROUP *group, const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx),
    285 	0,
    286 	(group, p, x, y, ctx),
    287 	1
    288 )
    289 
    290 WRAP(EVP_PKEY *,
    291 	EVP_PKEY_new,
    292 	(void),
    293 	NULL,
    294 	(),
    295 	1
    296 )
    297 
    298 WRAP(int,
    299 	EVP_PKEY_assign,
    300 	(EVP_PKEY *pkey, int type, void *key),
    301 	0,
    302 	(pkey, type, key),
    303 	1
    304 )
    305 
    306 WRAP(int,
    307 	EVP_PKEY_keygen_init,
    308 	(EVP_PKEY_CTX *ctx),
    309 	0,
    310 	(ctx),
    311 	1
    312 )
    313 
    314 WRAP(int,
    315 	EVP_PKEY_keygen,
    316 	(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey),
    317 	0,
    318 	(ctx, ppkey),
    319 	1
    320 )
    321 
    322 WRAP(int,
    323 	EVP_PKEY_paramgen_init,
    324 	(EVP_PKEY_CTX *ctx),
    325 	0,
    326 	(ctx),
    327 	1
    328 )
    329 
    330 WRAP(int,
    331 	EVP_PKEY_paramgen,
    332 	(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey),
    333 	0,
    334 	(ctx, ppkey),
    335 	1
    336 )
    337 
    338 WRAP(EVP_PKEY *,
    339 	EVP_PKEY_new_raw_public_key,
    340 	(int type, ENGINE *e, const unsigned char *key, size_t keylen),
    341 	NULL,
    342 	(type, e, key, keylen),
    343 	1
    344 )
    345 
    346 WRAP(EVP_PKEY_CTX *,
    347 	EVP_PKEY_CTX_new,
    348 	(EVP_PKEY *pkey, ENGINE *e),
    349 	NULL,
    350 	(pkey, e),
    351 	1
    352 )
    353 
    354 WRAP(EVP_PKEY_CTX *,
    355 	EVP_PKEY_CTX_new_id,
    356 	(int id, ENGINE *e),
    357 	NULL,
    358 	(id, e),
    359 	1
    360 )
    361 
    362 WRAP(int,
    363 	EVP_PKEY_derive,
    364 	(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *pkeylen),
    365 	0,
    366 	(ctx, key, pkeylen),
    367 	1
    368 )
    369 
    370 WRAP(int,
    371 	EVP_PKEY_derive_init,
    372 	(EVP_PKEY_CTX *ctx),
    373 	0,
    374 	(ctx),
    375 	1
    376 )
    377 
    378 WRAP(int,
    379 	EVP_PKEY_derive_set_peer,
    380 	(EVP_PKEY_CTX *ctx, EVP_PKEY *peer),
    381 	0,
    382 	(ctx, peer),
    383 	1
    384 )
    385 
    386 WRAP(int,
    387 	EVP_PKEY_verify_init,
    388 	(EVP_PKEY_CTX *ctx),
    389 	0,
    390 	(ctx),
    391 	1
    392 )
    393 
    394 WRAP(int,
    395 	EVP_PKEY_CTX_ctrl,
    396 	(EVP_PKEY_CTX *ctx, int keytype, int optype, int cmd, int p1, void *p2),
    397 	-1,
    398 	(ctx, keytype, optype, cmd, p1, p2),
    399 	1
    400 )
    401 
    402 WRAP(const EVP_MD *,
    403 	EVP_sha1,
    404 	(void),
    405 	NULL,
    406 	(),
    407 	1
    408 )
    409 
    410 WRAP(const EVP_MD *,
    411 	EVP_sha256,
    412 	(void),
    413 	NULL,
    414 	(),
    415 	1
    416 )
    417 
    418 WRAP(const EVP_CIPHER *,
    419 	EVP_aes_256_cbc,
    420 	(void),
    421 	NULL,
    422 	(),
    423 	1
    424 )
    425 
    426 WRAP(const EVP_CIPHER *,
    427 	EVP_aes_256_gcm,
    428 	(void),
    429 	NULL,
    430 	(),
    431 	1
    432 )
    433 
    434 WRAP(unsigned char *,
    435 	HMAC,
    436 	(const EVP_MD *evp_md, const void *key, int key_len,
    437 	    const unsigned char *d, int n, unsigned char *md,
    438 	    unsigned int *md_len),
    439 	NULL,
    440 	(evp_md, key, key_len, d, n, md, md_len),
    441 	1
    442 )
    443 
    444 WRAP(HMAC_CTX *,
    445 	HMAC_CTX_new,
    446 	(void),
    447 	NULL,
    448 	(),
    449 	1
    450 )
    451 
    452 WRAP(int,
    453 	HMAC_Init_ex,
    454 	(HMAC_CTX *ctx, const void *key, int key_len, const EVP_MD *md,
    455 	    ENGINE *impl),
    456 	0,
    457 	(ctx, key, key_len, md, impl),
    458 	1
    459 )
    460 
    461 WRAP(int,
    462 	HMAC_Update,
    463 	(HMAC_CTX *ctx, const unsigned char *data, int len),
    464 	0,
    465 	(ctx, data, len),
    466 	1
    467 )
    468 
    469 WRAP(int,
    470 	HMAC_Final,
    471 	(HMAC_CTX *ctx, unsigned char *md, unsigned int *len),
    472 	0,
    473 	(ctx, md, len),
    474 	1
    475 )
    476 
    477 WRAP(unsigned char *,
    478 	SHA1,
    479 	(const unsigned char *d, size_t n, unsigned char *md),
    480 	NULL,
    481 	(d, n, md),
    482 	1
    483 )
    484 
    485 WRAP(unsigned char *,
    486 	SHA256,
    487 	(const unsigned char *d, size_t n, unsigned char *md),
    488 	NULL,
    489 	(d, n, md),
    490 	1
    491 )
    492 
    493 WRAP(cbor_item_t *,
    494 	cbor_build_string,
    495 	(const char *val),
    496 	NULL,
    497 	(val),
    498 	1
    499 )
    500 
    501 WRAP(cbor_item_t *,
    502 	cbor_build_bytestring,
    503 	(cbor_data handle, size_t length),
    504 	NULL,
    505 	(handle, length),
    506 	1
    507 )
    508 
    509 WRAP(cbor_item_t *,
    510 	cbor_build_bool,
    511 	(bool value),
    512 	NULL,
    513 	(value),
    514 	1
    515 )
    516 
    517 WRAP(cbor_item_t *,
    518 	cbor_build_negint8,
    519 	(uint8_t value),
    520 	NULL,
    521 	(value),
    522 	1
    523 )
    524 
    525 WRAP(cbor_item_t *,
    526 	cbor_build_negint16,
    527 	(uint16_t value),
    528 	NULL,
    529 	(value),
    530 	1
    531 )
    532 
    533 WRAP(cbor_item_t *,
    534 	cbor_load,
    535 	(cbor_data source, size_t source_size, struct cbor_load_result *result),
    536 	NULL,
    537 	(source, source_size, result),
    538 	1
    539 )
    540 
    541 WRAP(cbor_item_t *,
    542 	cbor_build_uint8,
    543 	(uint8_t value),
    544 	NULL,
    545 	(value),
    546 	1
    547 )
    548 
    549 WRAP(cbor_item_t *,
    550 	cbor_build_uint16,
    551 	(uint16_t value),
    552 	NULL,
    553 	(value),
    554 	1
    555 )
    556 
    557 WRAP(cbor_item_t *,
    558 	cbor_build_uint32,
    559 	(uint32_t value),
    560 	NULL,
    561 	(value),
    562 	1
    563 )
    564 
    565 WRAP(cbor_item_t *,
    566 	cbor_build_uint64,
    567 	(uint64_t value),
    568 	NULL,
    569 	(value),
    570 	1
    571 )
    572 
    573 WRAP(struct cbor_pair *,
    574 	cbor_map_handle,
    575 	(const cbor_item_t *item),
    576 	NULL,
    577 	(item),
    578 	1
    579 )
    580 
    581 WRAP(cbor_item_t **,
    582 	cbor_array_handle,
    583 	(const cbor_item_t *item),
    584 	NULL,
    585 	(item),
    586 	1
    587 )
    588 
    589 WRAP(bool,
    590 	cbor_array_push,
    591 	(cbor_item_t *array, cbor_item_t *pushee),
    592 	false,
    593 	(array, pushee),
    594 	1
    595 )
    596 
    597 WRAP(bool,
    598 	cbor_map_add,
    599 	(cbor_item_t *item, struct cbor_pair pair),
    600 	false,
    601 	(item, pair),
    602 	1
    603 )
    604 
    605 WRAP(cbor_item_t *,
    606 	cbor_new_definite_map,
    607 	(size_t size),
    608 	NULL,
    609 	(size),
    610 	1
    611 )
    612 
    613 WRAP(cbor_item_t *,
    614 	cbor_new_definite_array,
    615 	(size_t size),
    616 	NULL,
    617 	(size),
    618 	1
    619 )
    620 
    621 WRAP(cbor_item_t *,
    622 	cbor_new_definite_bytestring,
    623 	(void),
    624 	NULL,
    625 	(),
    626 	1
    627 )
    628 
    629 WRAP(size_t,
    630 	cbor_serialize_alloc,
    631 	(const cbor_item_t *item, cbor_mutable_data *buffer,
    632 	    size_t *buffer_size),
    633 	0,
    634 	(item, buffer, buffer_size),
    635 	1
    636 )
    637 
    638 WRAP(int,
    639 	fido_tx,
    640 	(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count, int *ms),
    641 	-1,
    642 	(d, cmd, buf, count, ms),
    643 	1
    644 )
    645 
    646 WRAP(int,
    647 	bind,
    648 	(int sockfd, const struct sockaddr *addr, socklen_t addrlen),
    649 	-1,
    650 	(sockfd, addr, addrlen),
    651 	1
    652 )
    653 
    654 WRAP(int,
    655 	deflateInit2_,
    656 	(z_streamp strm, int level, int method, int windowBits, int memLevel,
    657 	    int strategy, const char *version, int stream_size),
    658 	Z_STREAM_ERROR,
    659 	(strm, level, method, windowBits, memLevel, strategy, version,
    660 	    stream_size),
    661 	1
    662 )
    663 
    664 int __wrap_deflate(z_streamp, int);
    665 int __real_deflate(z_streamp, int);
    666 
    667 int
    668 __wrap_deflate(z_streamp strm, int flush)
    669 {
    670 	if (prng_up && uniform_random(400) < 1) {
    671 		return Z_BUF_ERROR;
    672 	}
    673 	/* should never happen, but we check for it */
    674 	if (prng_up && uniform_random(400) < 1) {
    675 		strm->avail_out = UINT_MAX;
    676 		return Z_STREAM_END;
    677 	}
    678 
    679 	return __real_deflate(strm, flush);
    680 }
    681 
    682 int __wrap_asprintf(char **, const char *, ...);
    683 
    684 int
    685 __wrap_asprintf(char **strp, const char *fmt, ...)
    686 {
    687 	va_list ap;
    688 	int r;
    689 
    690 	if (prng_up && uniform_random(400) < 1) {
    691 		*strp = (void *)0xdeadbeef;
    692 		return -1;
    693 	}
    694 
    695 	va_start(ap, fmt);
    696 	r = vasprintf(strp, fmt, ap);
    697 	va_end(ap);
    698 
    699 	return r;
    700 }
    701