#include "common.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mbedtls/ctr_drbg.h"

mbedtls_time_t dummy_constant_time( mbedtls_time_t* time )
{
    (void) time;
    return 0x5af2a056;
}

void dummy_init()
{
#if defined(MBEDTLS_PLATFORM_TIME_ALT)
    mbedtls_platform_set_time( dummy_constant_time );
#else
    fprintf(stderr, "Warning: fuzzing without constant time\n");
#endif
}

int dummy_send( void *ctx, const unsigned char *buf, size_t len )
{
    //silence warning about unused parameter
    (void) ctx;
    (void) buf;

    //pretends we wrote everything ok
    if( len > INT_MAX ) {
        return( -1 );
    }
    return( (int) len );
}

int fuzz_recv( void *ctx, unsigned char *buf, size_t len )
{
    //reads from the buffer from fuzzer
    fuzzBufferOffset_t * biomemfuzz = (fuzzBufferOffset_t *) ctx;

    if(biomemfuzz->Offset == biomemfuzz->Size) {
        //EOF
        return( 0 );
    }
    if( len > INT_MAX ) {
        return( -1 );
    }
    if( len + biomemfuzz->Offset > biomemfuzz->Size ) {
        //do not overflow
        len = biomemfuzz->Size - biomemfuzz->Offset;
    }
    memcpy(buf, biomemfuzz->Data + biomemfuzz->Offset, len);
    biomemfuzz->Offset += len;
    return( (int) len );
}

int dummy_random( void *p_rng, unsigned char *output, size_t output_len )
{
    int ret;
    size_t i;

    //use mbedtls_ctr_drbg_random to find bugs in it
    ret = mbedtls_ctr_drbg_random(p_rng, output, output_len);
    for (i=0; i<output_len; i++) {
        //replace result with pseudo random
        output[i] = (unsigned char) rand();
    }
    return( ret );
}

int dummy_entropy( void *data, unsigned char *output, size_t len )
{
    size_t i;
    (void) data;

    //use mbedtls_entropy_func to find bugs in it
    //test performance impact of entropy
    //ret = mbedtls_entropy_func(data, output, len);
    for (i=0; i<len; i++) {
        //replace result with pseudo random
        output[i] = (unsigned char) rand();
    }
    return( 0 );
}

int fuzz_recv_timeout( void *ctx, unsigned char *buf, size_t len,
                      uint32_t timeout )
{
    (void) timeout;

    return fuzz_recv(ctx, buf, len);
}
