Line data Source code
1 : #if !FD_HAS_HOSTED 2 : #error "This target requires FD_HAS_HOSTED" 3 : #endif 4 : 5 : #include <assert.h> 6 : #include <stdio.h> 7 : #include <stdlib.h> 8 : 9 : #include "../../util/fd_util.h" 10 : #include "../../util/sanitize/fd_fuzz.h" 11 : #include "fd_siphash13.h" 12 : 13 : static fd_siphash13_t sip[1]; 14 : static fd_siphash13_t sip_fast[1]; 15 : 16 : int 17 : LLVMFuzzerInitialize( int * pargc, 18 18 : char *** pargv ) { 19 : /* Set up shell without signal handlers */ 20 18 : putenv( "FD_LOG_BACKTRACE=0" ); 21 18 : fd_boot( pargc, pargv ); 22 18 : atexit( fd_halt ); 23 18 : fd_log_level_core_set(3); /* crash on warning log */ 24 18 : return 0; 25 18 : } 26 : 27 : #define FAST_HASH_CHUNK_SZ (32UL) /* MUST be a multiple of 8 */ 28 : 29 : struct fuzz_siphash13 30 : { 31 : ulong k0; 32 : ulong k1; 33 : uchar flex []; 34 : }; 35 : 36 : 37 : int 38 : LLVMFuzzerTestOneInput( uchar const * fuzz_data, 39 : ulong fuzz_data_sz ) { 40 : 41 : if (fuzz_data_sz < sizeof(struct fuzz_siphash13)) { 42 : return -1; 43 : }; 44 : 45 : // Clear buffers on the heap 46 : memset( sip, 0, sizeof(fd_siphash13_t) ); 47 : memset( sip_fast, 0, sizeof(fd_siphash13_t) ); 48 : 49 : 50 : struct fuzz_siphash13 * testcase = (struct fuzz_siphash13 *)(fuzz_data); 51 : ulong flex_sz = fuzz_data_sz - sizeof(struct fuzz_siphash13); 52 : 53 : assert( sip == fd_siphash13_init ( sip, testcase->k0, testcase->k1 ) ); 54 : assert( sip == fd_siphash13_append( sip, testcase->flex, flex_sz ) ); 55 : 56 : ulong hash = fd_siphash13_fini( sip ); 57 : assert( hash == fd_siphash13_hash( testcase->flex, flex_sz, testcase->k0, testcase->k1 ) ); 58 : 59 : // fuzz fast hashing 60 : assert( sip_fast == fd_siphash13_init( sip_fast, testcase->k0, testcase->k1 ) ); 61 : 62 : uchar const * data_chunk = testcase->flex; 63 : for( ulong rem = flex_sz/FAST_HASH_CHUNK_SZ; rem > 0; rem-- ) { 64 : assert( sip_fast == fd_siphash13_append_fast( sip_fast, data_chunk, FAST_HASH_CHUNK_SZ ) ); 65 : data_chunk += FAST_HASH_CHUNK_SZ; 66 : } 67 : assert( sip_fast == fd_siphash13_append( sip_fast, data_chunk, flex_sz%FAST_HASH_CHUNK_SZ ) ); 68 : ulong hash_fast = fd_siphash13_fini( sip_fast ); 69 : assert( hash == hash_fast ); 70 : 71 : FD_FUZZ_MUST_BE_COVERED; 72 : return 0; 73 : }