diff --git a/programs/fuzz/common.c b/programs/fuzz/common.c
index 70a5380..bbea39f 100644
--- a/programs/fuzz/common.c
+++ b/programs/fuzz/common.c
@@ -4,93 +4,95 @@
 #include <stdlib.h>
 #include "mbedtls/ctr_drbg.h"
 
-mbedtls_time_t dummy_constant_time( mbedtls_time_t* time )
+mbedtls_time_t dummy_constant_time(mbedtls_time_t *time)
 {
-    (void) time;
+    (void)time;
     return 0x5af2a056;
 }
 
 void dummy_init()
 {
 #if defined(MBEDTLS_PLATFORM_TIME_ALT)
-    mbedtls_platform_set_time( dummy_constant_time );
+    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 )
+int dummy_send(void *ctx, const unsigned char *buf, size_t len)
 {
-    //silence warning about unused parameter
-    (void) ctx;
-    (void) buf;
+    // silence warning about unused parameter
+    (void)ctx;
+    (void)buf;
 
-    //pretends we wrote everything ok
-    if( len > INT_MAX ) {
-        return -1 ;
+    // pretends we wrote everything ok
+    if (len > INT_MAX) {
+        return -1;
     }
-    return (int) len ;
+    return (int)len;
 }
 
-int fuzz_recv( void *ctx, unsigned char *buf, size_t len )
+int fuzz_recv(void *ctx, unsigned char *buf, size_t len)
 {
-    //reads from the buffer from fuzzer
-    fuzzBufferOffset_t * biomemfuzz = (fuzzBufferOffset_t *) ctx;
+    // reads from the buffer from fuzzer
+    fuzzBufferOffset_t *biomemfuzz = (fuzzBufferOffset_t *)ctx;
 
-    if(biomemfuzz->Offset == biomemfuzz->Size) {
-        //EOF
-        return 0 ;
+    if (biomemfuzz->Offset == biomemfuzz->Size) {
+        // EOF
+        return 0;
     }
-    if( len > INT_MAX ) {
-        return -1 ;
+    if (len > INT_MAX) {
+        return -1;
     }
-    if( len + biomemfuzz->Offset > biomemfuzz->Size ) {
-        //do not overflow
+    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 ;
+    return (int)len;
 }
 
-int dummy_random( void *p_rng, unsigned char *output, size_t output_len )
+int dummy_random(void *p_rng, unsigned char *output, size_t output_len)
 {
     int ret;
     size_t i;
 
 #if defined(MBEDTLS_CTR_DRBG_C)
-    //use mbedtls_ctr_drbg_random to find bugs in it
+    // use mbedtls_ctr_drbg_random to find bugs in it
     ret = mbedtls_ctr_drbg_random(p_rng, output, output_len);
 #else
-    (void) p_rng;
+    (void)p_rng;
     ret = 0;
 #endif
-    for (i=0; i<output_len; i++) {
-        //replace result with pseudo random
-        output[i] = (unsigned char) rand();
+    for (i = 0; i < output_len; i++) {
+        // replace result with pseudo random
+        output[i] = (unsigned char)rand();
     }
-    return ret ;
+    return ret;
 }
 
-int dummy_entropy( void *data, unsigned char *output, size_t len )
+int dummy_entropy(void *data, unsigned char *output, size_t len)
 {
     size_t i;
-    (void) data;
+    (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();
+    // 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 ;
+    return 0;
 }
 
-int fuzz_recv_timeout( void *ctx, unsigned char *buf, size_t len,
-                      uint32_t timeout )
+int fuzz_recv_timeout(void *ctx,
+                      unsigned char *buf,
+                      size_t len,
+                      uint32_t timeout)
 {
-    (void) timeout;
+    (void)timeout;
 
     return fuzz_recv(ctx, buf, len);
 }
