diff --git a/tests/configs/config-wrapper-malloc-0-null.h b/tests/configs/config-wrapper-malloc-0-null.h
index e7bdbeb..2cb7722 100644
--- a/tests/configs/config-wrapper-malloc-0-null.h
+++ b/tests/configs/config-wrapper-malloc-0-null.h
@@ -24,8 +24,8 @@
 static inline void *custom_calloc( size_t nmemb, size_t size )
 {
     if( nmemb == 0 || size == 0 )
-        return( NULL );
-    return( calloc( nmemb, size ) );
+        return NULL ;
+    return calloc( nmemb, size ) ;
 }
 
 #define MBEDTLS_PLATFORM_MEMORY
diff --git a/tests/include/test/drivers/aead.h b/tests/include/test/drivers/aead.h
index 0830229..92c2989 100644
--- a/tests/include/test/drivers/aead.h
+++ b/tests/include/test/drivers/aead.h
@@ -40,7 +40,7 @@
     mbedtls_test_driver_aead_hooks_init( void )
 {
     const mbedtls_test_driver_aead_hooks_t v = MBEDTLS_TEST_DRIVER_AEAD_INIT;
-    return( v );
+    return v ;
 }
 
 extern mbedtls_test_driver_aead_hooks_t mbedtls_test_driver_aead_hooks;
diff --git a/tests/include/test/drivers/cipher.h b/tests/include/test/drivers/cipher.h
index 142f3b7..8dbee92 100644
--- a/tests/include/test/drivers/cipher.h
+++ b/tests/include/test/drivers/cipher.h
@@ -44,7 +44,7 @@
      mbedtls_test_driver_cipher_hooks_init( void )
 {
     const mbedtls_test_driver_cipher_hooks_t v = MBEDTLS_TEST_DRIVER_CIPHER_INIT;
-    return( v );
+    return v ;
 }
 
 extern mbedtls_test_driver_cipher_hooks_t mbedtls_test_driver_cipher_hooks;
diff --git a/tests/include/test/drivers/hash.h b/tests/include/test/drivers/hash.h
index d202c8b..f72a1a5 100644
--- a/tests/include/test/drivers/hash.h
+++ b/tests/include/test/drivers/hash.h
@@ -40,7 +40,7 @@
     mbedtls_test_driver_hash_hooks_init( void )
 {
     const mbedtls_test_driver_hash_hooks_t v = MBEDTLS_TEST_DRIVER_HASH_INIT;
-    return( v );
+    return v ;
 }
 
 extern mbedtls_test_driver_hash_hooks_t mbedtls_test_driver_hash_hooks;
diff --git a/tests/include/test/drivers/key_management.h b/tests/include/test/drivers/key_management.h
index 16e1f75..8c9c628 100644
--- a/tests/include/test/drivers/key_management.h
+++ b/tests/include/test/drivers/key_management.h
@@ -46,7 +46,7 @@
 {
     const mbedtls_test_driver_key_management_hooks_t
         v = MBEDTLS_TEST_DRIVER_KEY_MANAGEMENT_INIT;
-    return( v );
+    return v ;
 }
 
 extern mbedtls_test_driver_key_management_hooks_t
diff --git a/tests/include/test/drivers/mac.h b/tests/include/test/drivers/mac.h
index 5f6cd38..6c0e96b 100644
--- a/tests/include/test/drivers/mac.h
+++ b/tests/include/test/drivers/mac.h
@@ -40,7 +40,7 @@
     mbedtls_test_driver_mac_hooks_init( void )
 {
     const mbedtls_test_driver_mac_hooks_t v = MBEDTLS_TEST_DRIVER_MAC_INIT;
-    return( v );
+    return v ;
 }
 
 extern mbedtls_test_driver_mac_hooks_t mbedtls_test_driver_mac_hooks;
diff --git a/tests/include/test/drivers/signature.h b/tests/include/test/drivers/signature.h
index 67f2b29..c540d4c 100644
--- a/tests/include/test/drivers/signature.h
+++ b/tests/include/test/drivers/signature.h
@@ -42,7 +42,7 @@
 {
     const mbedtls_test_driver_signature_hooks_t
         v = MBEDTLS_TEST_DRIVER_SIGNATURE_INIT;
-    return( v );
+    return v ;
 }
 
 extern mbedtls_test_driver_signature_hooks_t
diff --git a/tests/src/asn1_helpers.c b/tests/src/asn1_helpers.c
index 79aa166..8ece1e3 100644
--- a/tests/src/asn1_helpers.c
+++ b/tests/src/asn1_helpers.c
@@ -52,7 +52,7 @@
         --len;
     }
     if( min_bits == 0 && len == 0 )
-        return( 1 );
+        return 1 ;
     msb = ( *p )[0];
     TEST_ASSERT( msb != 0 );
     actual_bits = 8 * ( len - 1 );
@@ -66,9 +66,9 @@
     if( must_be_odd )
         TEST_ASSERT( ( ( *p )[len-1] & 1 ) != 0 );
     *p += len;
-    return( 1 );
+    return 1 ;
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 #endif /* MBEDTLS_ASN1_PARSE_C */
diff --git a/tests/src/drivers/hash.c b/tests/src/drivers/hash.c
index b1880f7..d57ce6c 100644
--- a/tests/src/drivers/hash.c
+++ b/tests/src/drivers/hash.c
@@ -47,7 +47,7 @@
                 hash, hash_size, hash_length );
     }
 
-    return( mbedtls_test_driver_hash_hooks.driver_status );
+    return mbedtls_test_driver_hash_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_hash_setup(
@@ -67,7 +67,7 @@
             mbedtls_transparent_test_driver_hash_setup( operation, alg );
     }
 
-    return( mbedtls_test_driver_hash_hooks.driver_status );
+    return mbedtls_test_driver_hash_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_hash_clone(
@@ -88,7 +88,7 @@
                                                         target_operation );
     }
 
-    return( mbedtls_test_driver_hash_hooks.driver_status );
+    return mbedtls_test_driver_hash_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_hash_update(
@@ -110,7 +110,7 @@
                 operation, input, input_length );
     }
 
-    return( mbedtls_test_driver_hash_hooks.driver_status );
+    return mbedtls_test_driver_hash_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_hash_finish(
@@ -133,7 +133,7 @@
                 operation, hash, hash_size, hash_length );
     }
 
-    return( mbedtls_test_driver_hash_hooks.driver_status );
+    return mbedtls_test_driver_hash_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_hash_abort(
@@ -152,6 +152,6 @@
             mbedtls_transparent_test_driver_hash_abort( operation );
     }
 
-    return( mbedtls_test_driver_hash_hooks.driver_status );
+    return mbedtls_test_driver_hash_hooks.driver_status ;
 }
 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
diff --git a/tests/src/drivers/platform_builtin_keys.c b/tests/src/drivers/platform_builtin_keys.c
index da5865d..6d125a0 100644
--- a/tests/src/drivers/platform_builtin_keys.c
+++ b/tests/src/drivers/platform_builtin_keys.c
@@ -85,9 +85,9 @@
         {
             *lifetime = builtin_key->lifetime;
             *slot_number = builtin_key->slot_number;
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
         }
     }
 
-    return( PSA_ERROR_DOES_NOT_EXIST );
+    return PSA_ERROR_DOES_NOT_EXIST ;
 }
diff --git a/tests/src/drivers/test_driver_aead.c b/tests/src/drivers/test_driver_aead.c
index ce9ce37..76afcd7 100644
--- a/tests/src/drivers/test_driver_aead.c
+++ b/tests/src/drivers/test_driver_aead.c
@@ -55,7 +55,7 @@
                 ciphertext, ciphertext_size, ciphertext_length );
     }
 
-    return( mbedtls_test_driver_aead_hooks.driver_status );
+    return mbedtls_test_driver_aead_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_aead_decrypt(
@@ -86,7 +86,7 @@
                 plaintext, plaintext_size, plaintext_length );
     }
 
-    return( mbedtls_test_driver_aead_hooks.driver_status );
+    return mbedtls_test_driver_aead_hooks.driver_status ;
 }
 
 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
diff --git a/tests/src/drivers/test_driver_cipher.c b/tests/src/drivers/test_driver_cipher.c
index 89a7b59..20d79d8 100644
--- a/tests/src/drivers/test_driver_cipher.c
+++ b/tests/src/drivers/test_driver_cipher.c
@@ -51,18 +51,18 @@
     if( mbedtls_test_driver_cipher_hooks.forced_output != NULL )
     {
         if( output_size < mbedtls_test_driver_cipher_hooks.forced_output_length )
-            return( PSA_ERROR_BUFFER_TOO_SMALL );
+            return PSA_ERROR_BUFFER_TOO_SMALL ;
 
         memcpy( output,
                 mbedtls_test_driver_cipher_hooks.forced_output,
                 mbedtls_test_driver_cipher_hooks.forced_output_length );
         *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
 
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
     }
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     psa_generate_random( output, PSA_CIPHER_IV_LENGTH( attributes->core.type, alg ) );
 
@@ -88,18 +88,18 @@
     if( mbedtls_test_driver_cipher_hooks.forced_output != NULL )
     {
         if( output_size < mbedtls_test_driver_cipher_hooks.forced_output_length )
-            return( PSA_ERROR_BUFFER_TOO_SMALL );
+            return PSA_ERROR_BUFFER_TOO_SMALL ;
 
         memcpy( output,
                 mbedtls_test_driver_cipher_hooks.forced_output,
                 mbedtls_test_driver_cipher_hooks.forced_output_length );
         *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
 
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
     }
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     return( mbedtls_transparent_test_driver_cipher_decrypt(
                 attributes, key_buffer, key_buffer_size,
@@ -122,7 +122,7 @@
     memset( operation, 0, sizeof( *operation ) );
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     return ( mbedtls_transparent_test_driver_cipher_encrypt_setup(
                  operation, attributes, key, key_length, alg ) );
@@ -137,7 +137,7 @@
     mbedtls_test_driver_cipher_hooks.hits++;
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     return ( mbedtls_transparent_test_driver_cipher_decrypt_setup(
                  operation, attributes, key, key_length, alg ) );
@@ -149,7 +149,7 @@
     mbedtls_test_driver_cipher_hooks.hits++;
 
     if( operation->alg == 0 )
-        return( PSA_SUCCESS );
+        return PSA_SUCCESS ;
 
     mbedtls_transparent_test_driver_cipher_abort( operation );
 
@@ -159,7 +159,7 @@
      * our context struct. */
     memset( operation, 0, sizeof( *operation ) );
 
-    return( mbedtls_test_driver_cipher_hooks.forced_status );
+    return mbedtls_test_driver_cipher_hooks.forced_status ;
 }
 
 psa_status_t mbedtls_test_transparent_cipher_set_iv(
@@ -170,7 +170,7 @@
     mbedtls_test_driver_cipher_hooks.hits++;
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     return( mbedtls_transparent_test_driver_cipher_set_iv(
                 operation, iv, iv_length ) );
@@ -196,11 +196,11 @@
                 mbedtls_test_driver_cipher_hooks.forced_output_length );
         *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
 
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
     }
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     return( mbedtls_transparent_test_driver_cipher_update(
                 operation, input, input_length,
@@ -225,11 +225,11 @@
                 mbedtls_test_driver_cipher_hooks.forced_output_length );
         *output_length = mbedtls_test_driver_cipher_hooks.forced_output_length;
 
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
     }
 
     if( mbedtls_test_driver_cipher_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_cipher_hooks.forced_status );
+        return mbedtls_test_driver_cipher_hooks.forced_status ;
 
     return( mbedtls_transparent_test_driver_cipher_finish(
                 operation, output, output_size, output_length ) );
@@ -254,7 +254,7 @@
     (void) output;
     (void) output_size;
     (void) output_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_decrypt(
@@ -273,7 +273,7 @@
     (void) output;
     (void) output_size;
     (void) output_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_encrypt_setup(
@@ -287,7 +287,7 @@
     (void) key;
     (void) key_length;
     (void) alg;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_decrypt_setup(
@@ -301,14 +301,14 @@
     (void) key;
     (void) key_length;
     (void) alg;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_abort(
     mbedtls_opaque_test_driver_cipher_operation_t *operation )
 {
     (void) operation;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_set_iv(
@@ -319,7 +319,7 @@
     (void) operation;
     (void) iv;
     (void) iv_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_update(
@@ -336,7 +336,7 @@
     (void) output;
     (void) output_size;
     (void) output_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_opaque_cipher_finish(
@@ -349,6 +349,6 @@
     (void) output;
     (void) output_size;
     (void) output_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
diff --git a/tests/src/drivers/test_driver_key_management.c b/tests/src/drivers/test_driver_key_management.c
index afa1fc2..d2bc9b8 100644
--- a/tests/src/drivers/test_driver_key_management.c
+++ b/tests/src/drivers/test_driver_key_management.c
@@ -63,17 +63,17 @@
     ++mbedtls_test_driver_key_management_hooks.hits;
 
     if( mbedtls_test_driver_key_management_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_key_management_hooks.forced_status );
+        return mbedtls_test_driver_key_management_hooks.forced_status ;
 
     if( mbedtls_test_driver_key_management_hooks.forced_output != NULL )
     {
         if( mbedtls_test_driver_key_management_hooks.forced_output_length >
             key_size )
-            return( PSA_ERROR_BUFFER_TOO_SMALL );
+            return PSA_ERROR_BUFFER_TOO_SMALL ;
         memcpy( key, mbedtls_test_driver_key_management_hooks.forced_output,
                 mbedtls_test_driver_key_management_hooks.forced_output_length );
         *key_length = mbedtls_test_driver_key_management_hooks.forced_output_length;
-        return( PSA_SUCCESS );
+        return PSA_SUCCESS ;
     }
 
     /* Copied from psa_crypto.c */
@@ -95,7 +95,7 @@
 #endif /* defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_KEY_PAIR) */
     {
         (void)attributes;
-        return( PSA_ERROR_NOT_SUPPORTED );
+        return PSA_ERROR_NOT_SUPPORTED ;
     }
 }
 
@@ -107,7 +107,7 @@
     (void) key;
     (void) key_size;
     (void) key_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_transparent_import_key(
@@ -122,7 +122,7 @@
     ++mbedtls_test_driver_key_management_hooks.hits;
 
     if( mbedtls_test_driver_key_management_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_key_management_hooks.forced_status );
+        return mbedtls_test_driver_key_management_hooks.forced_status ;
 
     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
     psa_key_type_t type = psa_get_key_type( attributes );
@@ -162,7 +162,7 @@
         (void)type;
     }
 
-    return( status );
+    return status ;
 }
 
 psa_status_t mbedtls_test_opaque_export_key(
@@ -173,7 +173,7 @@
     if( key_length != sizeof( psa_drv_slot_number_t ) )
     {
         /* Test driver does not support generic opaque key handling yet. */
-        return( PSA_ERROR_NOT_SUPPORTED );
+        return PSA_ERROR_NOT_SUPPORTED ;
     }
 
     /* Assume this is a builtin key based on the key material length. */
@@ -186,47 +186,47 @@
              * returning the private key. */
             if( psa_get_key_type( attributes ) !=
                 PSA_KEY_TYPE_ECC_KEY_PAIR( PSA_ECC_FAMILY_SECP_R1 ) )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( psa_get_key_bits( attributes ) != 256 )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( psa_get_key_algorithm( attributes ) !=
                 PSA_ALG_ECDSA( PSA_ALG_ANY_HASH ) )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( ( psa_get_key_usage_flags( attributes ) &
                   PSA_KEY_USAGE_EXPORT ) == 0 )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
 
             if( data_size < sizeof( mbedtls_test_driver_ecdsa_key ) )
-                return( PSA_ERROR_BUFFER_TOO_SMALL );
+                return PSA_ERROR_BUFFER_TOO_SMALL ;
 
             memcpy( data, mbedtls_test_driver_ecdsa_key,
                     sizeof( mbedtls_test_driver_ecdsa_key ) );
             *data_length = sizeof( mbedtls_test_driver_ecdsa_key );
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
 
         case PSA_CRYPTO_TEST_DRIVER_BUILTIN_AES_KEY_SLOT:
             /* This is the AES slot. Verify the key's attributes before
              * returning the key. */
             if( psa_get_key_type( attributes ) != PSA_KEY_TYPE_AES )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( psa_get_key_bits( attributes ) != 128 )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( psa_get_key_algorithm( attributes ) != PSA_ALG_CTR )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( ( psa_get_key_usage_flags( attributes ) &
                   PSA_KEY_USAGE_EXPORT ) == 0 )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
 
             if( data_size < sizeof( mbedtls_test_driver_aes_key ) )
-                return( PSA_ERROR_BUFFER_TOO_SMALL );
+                return PSA_ERROR_BUFFER_TOO_SMALL ;
 
             memcpy( data, mbedtls_test_driver_aes_key,
                     sizeof( mbedtls_test_driver_aes_key ) );
             *data_length = sizeof( mbedtls_test_driver_aes_key );
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
 
         default:
-            return( PSA_ERROR_DOES_NOT_EXIST );
+            return PSA_ERROR_DOES_NOT_EXIST ;
     }
 }
 
@@ -238,17 +238,17 @@
     ++mbedtls_test_driver_key_management_hooks.hits;
 
     if( mbedtls_test_driver_key_management_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_key_management_hooks.forced_status );
+        return mbedtls_test_driver_key_management_hooks.forced_status ;
 
     if( mbedtls_test_driver_key_management_hooks.forced_output != NULL )
     {
         if( mbedtls_test_driver_key_management_hooks.forced_output_length >
             data_size )
-            return( PSA_ERROR_BUFFER_TOO_SMALL );
+            return PSA_ERROR_BUFFER_TOO_SMALL ;
         memcpy( data, mbedtls_test_driver_key_management_hooks.forced_output,
                 mbedtls_test_driver_key_management_hooks.forced_output_length );
         *data_length = mbedtls_test_driver_key_management_hooks.forced_output_length;
-        return( PSA_SUCCESS );
+        return PSA_SUCCESS ;
     }
 
     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
@@ -283,7 +283,7 @@
         (void)key_type;
     }
 
-    return( status );
+    return status ;
 }
 
 psa_status_t mbedtls_test_opaque_export_public_key(
@@ -294,7 +294,7 @@
     if( key_length != sizeof( psa_drv_slot_number_t ) )
     {
         /* Test driver does not support generic opaque key handling yet. */
-        return( PSA_ERROR_NOT_SUPPORTED );
+        return PSA_ERROR_NOT_SUPPORTED ;
     }
 
     /* Assume this is a builtin key based on the key material length. */
@@ -306,23 +306,23 @@
              * returning the public key. */
             if( psa_get_key_type( attributes ) !=
                 PSA_KEY_TYPE_ECC_KEY_PAIR( PSA_ECC_FAMILY_SECP_R1 ) )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( psa_get_key_bits( attributes ) != 256 )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
             if( psa_get_key_algorithm( attributes ) !=
                 PSA_ALG_ECDSA( PSA_ALG_ANY_HASH ) )
-                return( PSA_ERROR_CORRUPTION_DETECTED );
+                return PSA_ERROR_CORRUPTION_DETECTED ;
 
             if( data_size < sizeof( mbedtls_test_driver_ecdsa_pubkey ) )
-                return( PSA_ERROR_BUFFER_TOO_SMALL );
+                return PSA_ERROR_BUFFER_TOO_SMALL ;
 
             memcpy( data, mbedtls_test_driver_ecdsa_pubkey,
                     sizeof( mbedtls_test_driver_ecdsa_pubkey ) );
             *data_length = sizeof( mbedtls_test_driver_ecdsa_pubkey );
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
 
         default:
-            return( PSA_ERROR_DOES_NOT_EXIST );
+            return PSA_ERROR_DOES_NOT_EXIST ;
     }
 }
 
@@ -354,12 +354,12 @@
             psa_set_key_algorithm( attributes, PSA_ALG_CTR );
 
             if( key_buffer_size < sizeof( psa_drv_slot_number_t ) )
-                return( PSA_ERROR_BUFFER_TOO_SMALL );
+                return PSA_ERROR_BUFFER_TOO_SMALL ;
 
             *( (psa_drv_slot_number_t*) key_buffer ) =
                 PSA_CRYPTO_TEST_DRIVER_BUILTIN_AES_KEY_SLOT;
             *key_buffer_length = sizeof( psa_drv_slot_number_t );
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
         case PSA_CRYPTO_TEST_DRIVER_BUILTIN_ECDSA_KEY_SLOT:
             psa_set_key_type(
                 attributes,
@@ -374,14 +374,14 @@
                 attributes, PSA_ALG_ECDSA( PSA_ALG_ANY_HASH ) );
 
             if( key_buffer_size < sizeof( psa_drv_slot_number_t ) )
-                return( PSA_ERROR_BUFFER_TOO_SMALL );
+                return PSA_ERROR_BUFFER_TOO_SMALL ;
 
             *( (psa_drv_slot_number_t*) key_buffer ) =
                 PSA_CRYPTO_TEST_DRIVER_BUILTIN_ECDSA_KEY_SLOT;
             *key_buffer_length = sizeof( psa_drv_slot_number_t );
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
         default:
-            return( PSA_ERROR_DOES_NOT_EXIST );
+            return PSA_ERROR_DOES_NOT_EXIST ;
     }
 }
 
diff --git a/tests/src/drivers/test_driver_mac.c b/tests/src/drivers/test_driver_mac.c
index 3b766dc..cfcf162 100644
--- a/tests/src/drivers/test_driver_mac.c
+++ b/tests/src/drivers/test_driver_mac.c
@@ -54,7 +54,7 @@
                 mac, mac_size, mac_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_mac_sign_setup(
@@ -78,7 +78,7 @@
                 operation, attributes, key_buffer, key_buffer_size, alg );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_mac_verify_setup(
@@ -102,7 +102,7 @@
                 operation, attributes, key_buffer, key_buffer_size, alg );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_mac_update(
@@ -124,7 +124,7 @@
                 operation, input, input_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_mac_sign_finish(
@@ -147,7 +147,7 @@
                 operation, mac, mac_size, mac_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_mac_verify_finish(
@@ -169,7 +169,7 @@
                 operation, mac, mac_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_transparent_mac_abort(
@@ -188,7 +188,7 @@
             mbedtls_transparent_test_driver_mac_abort( operation );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_compute(
@@ -218,7 +218,7 @@
                 mac, mac_size, mac_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_sign_setup(
@@ -242,7 +242,7 @@
                 operation, attributes, key_buffer, key_buffer_size, alg );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_verify_setup(
@@ -266,7 +266,7 @@
                 operation, attributes, key_buffer, key_buffer_size, alg );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_update(
@@ -288,7 +288,7 @@
                 operation, input, input_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_sign_finish(
@@ -311,7 +311,7 @@
                 operation, mac, mac_size, mac_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_verify_finish(
@@ -333,7 +333,7 @@
                 operation, mac, mac_length );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 psa_status_t mbedtls_test_opaque_mac_abort(
@@ -352,7 +352,7 @@
             mbedtls_opaque_test_driver_mac_abort( operation );
     }
 
-    return( mbedtls_test_driver_mac_hooks.driver_status );
+    return mbedtls_test_driver_mac_hooks.driver_status ;
 }
 
 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
diff --git a/tests/src/drivers/test_driver_signature.c b/tests/src/drivers/test_driver_signature.c
index 2d58756..e573b72 100644
--- a/tests/src/drivers/test_driver_signature.c
+++ b/tests/src/drivers/test_driver_signature.c
@@ -88,7 +88,7 @@
         }
         else
         {
-            return( PSA_ERROR_INVALID_ARGUMENT );
+            return PSA_ERROR_INVALID_ARGUMENT ;
         }
     }
     else
@@ -104,7 +104,7 @@
         (void)signature;
         (void)signature_size;
         (void)signature_length;
-        return( PSA_ERROR_NOT_SUPPORTED );
+        return PSA_ERROR_NOT_SUPPORTED ;
     }
 }
 
@@ -146,7 +146,7 @@
         }
         else
         {
-            return( PSA_ERROR_INVALID_ARGUMENT );
+            return PSA_ERROR_INVALID_ARGUMENT ;
         }
     }
     else
@@ -162,7 +162,7 @@
         (void)signature;
         (void)signature_length;
 
-        return( PSA_ERROR_NOT_SUPPORTED );
+        return PSA_ERROR_NOT_SUPPORTED ;
     }
 }
 
@@ -184,18 +184,18 @@
     ++mbedtls_test_driver_signature_sign_hooks.hits;
 
     if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_signature_sign_hooks.forced_status );
+        return mbedtls_test_driver_signature_sign_hooks.forced_status ;
 
     if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
     {
         if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
-            return( PSA_ERROR_BUFFER_TOO_SMALL );
+            return PSA_ERROR_BUFFER_TOO_SMALL ;
 
         memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
                 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
         *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
 
-        return( PSA_SUCCESS );
+        return PSA_SUCCESS ;
     }
 
     status = mbedtls_transparent_test_driver_hash_compute(
@@ -231,7 +231,7 @@
     (void) signature_size;
     (void) signature_length;
 
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_transparent_signature_verify_message(
@@ -251,7 +251,7 @@
     ++mbedtls_test_driver_signature_verify_hooks.hits;
 
     if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_signature_verify_hooks.forced_status );
+        return mbedtls_test_driver_signature_verify_hooks.forced_status ;
 
     status = mbedtls_transparent_test_driver_hash_compute(
                 PSA_ALG_SIGN_GET_HASH( alg ), input, input_length,
@@ -284,7 +284,7 @@
     (void) signature;
     (void) signature_length;
 
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_transparent_signature_sign_hash(
@@ -297,16 +297,16 @@
     ++mbedtls_test_driver_signature_sign_hooks.hits;
 
     if( mbedtls_test_driver_signature_sign_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_signature_sign_hooks.forced_status );
+        return mbedtls_test_driver_signature_sign_hooks.forced_status ;
 
     if( mbedtls_test_driver_signature_sign_hooks.forced_output != NULL )
     {
         if( mbedtls_test_driver_signature_sign_hooks.forced_output_length > signature_size )
-            return( PSA_ERROR_BUFFER_TOO_SMALL );
+            return PSA_ERROR_BUFFER_TOO_SMALL ;
         memcpy( signature, mbedtls_test_driver_signature_sign_hooks.forced_output,
                 mbedtls_test_driver_signature_sign_hooks.forced_output_length );
         *signature_length = mbedtls_test_driver_signature_sign_hooks.forced_output_length;
-        return( PSA_SUCCESS );
+        return PSA_SUCCESS ;
     }
 
     return sign_hash( attributes, key_buffer, key_buffer_size,
@@ -331,7 +331,7 @@
     (void) signature_size;
     (void) signature_length;
 
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 psa_status_t mbedtls_test_transparent_signature_verify_hash(
@@ -344,7 +344,7 @@
     ++mbedtls_test_driver_signature_verify_hooks.hits;
 
     if( mbedtls_test_driver_signature_verify_hooks.forced_status != PSA_SUCCESS )
-        return( mbedtls_test_driver_signature_verify_hooks.forced_status );
+        return mbedtls_test_driver_signature_verify_hooks.forced_status ;
 
     return verify_hash( attributes, key_buffer, key_buffer_size,
                         alg, hash, hash_length,
@@ -366,7 +366,7 @@
     (void) hash_length;
     (void) signature;
     (void) signature_length;
-    return( PSA_ERROR_NOT_SUPPORTED );
+    return PSA_ERROR_NOT_SUPPORTED ;
 }
 
 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
diff --git a/tests/src/drivers/test_driver_size.c b/tests/src/drivers/test_driver_size.c
index 033cf32..837d82a 100644
--- a/tests/src/drivers/test_driver_size.c
+++ b/tests/src/drivers/test_driver_size.c
@@ -92,6 +92,6 @@
                             ( ( key_bits + 7 ) / 8 ) );
     }
 
-    return( key_buffer_size );
+    return key_buffer_size ;
 }
 #endif /* MBEDTLS_PSA_CRYPTO_DRIVERS && PSA_CRYPTO_DRIVER_TEST */
diff --git a/tests/src/fake_external_rng_for_test.c b/tests/src/fake_external_rng_for_test.c
index 9c2195b..ec83541 100644
--- a/tests/src/fake_external_rng_for_test.c
+++ b/tests/src/fake_external_rng_for_test.c
@@ -45,12 +45,12 @@
     (void) context;
 
     if( !test_insecure_external_rng_enabled )
-        return( PSA_ERROR_INSUFFICIENT_ENTROPY );
+        return PSA_ERROR_INSUFFICIENT_ENTROPY ;
 
     /* This implementation is for test purposes only!
      * Use the libc non-cryptographic random generator. */
     mbedtls_test_rnd_std_rand( NULL, output, output_size );
     *output_length = output_size;
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 #endif /* MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
diff --git a/tests/src/helpers.c b/tests/src/helpers.c
index 4d3d53d..7bbfa50 100644
--- a/tests/src/helpers.c
+++ b/tests/src/helpers.c
@@ -37,7 +37,7 @@
 #if defined(MBEDTLS_PLATFORM_C)
     ret = mbedtls_platform_setup( &platform_ctx );
 #endif /* MBEDTLS_PLATFORM_C */
-    return( ret );
+    return ret ;
 }
 
 void mbedtls_test_platform_teardown( void )
@@ -56,9 +56,9 @@
     else if( ( c >= 'A' ) && ( c <= 'F' ) )
         *uc = c - 'A' + 10;
     else
-        return( -1 );
+        return -1 ;
 
-    return( 0 );
+    return 0 ;
 }
 
 void mbedtls_test_fail( const char *test, int line_no, const char* filename )
@@ -108,24 +108,24 @@
 
     /* Must be even number of bytes. */
     if ( ( *len ) & 1 )
-        return( -1 );
+        return -1 ;
     *len /= 2;
 
     if ( (*len) > obufmax )
-        return( -1 );
+        return -1 ;
 
     while( *ibuf != 0 )
     {
         if ( ascii2uc( *(ibuf++), &uc ) != 0 )
-            return( -1 );
+            return -1 ;
 
         if ( ascii2uc( *(ibuf++), &uc2 ) != 0 )
-            return( -1 );
+            return -1 ;
 
         *(obuf++) = ( uc << 4 ) | uc2;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 void mbedtls_test_hexify( unsigned char *obuf,
@@ -164,7 +164,7 @@
 
     memset( p, 0x00, actual_len );
 
-    return( p );
+    return p ;
 }
 
 unsigned char *mbedtls_test_unhexify_alloc( const char *ibuf, size_t *olen )
@@ -175,13 +175,13 @@
     *olen = strlen( ibuf ) / 2;
 
     if( *olen == 0 )
-        return( mbedtls_test_zero_alloc( *olen ) );
+        return mbedtls_test_zero_alloc( *olen ) ;
 
     obuf = mbedtls_calloc( 1, *olen );
     TEST_HELPER_ASSERT( obuf != NULL );
     TEST_HELPER_ASSERT( mbedtls_test_unhexify( obuf, *olen, ibuf, &len ) == 0 );
 
-    return( obuf );
+    return obuf ;
 }
 
 int mbedtls_test_hexcmp( uint8_t * a, uint8_t * b,
@@ -191,7 +191,7 @@
     uint32_t i = 0;
 
     if( a_len != b_len )
-        return( -1 );
+        return -1 ;
 
     for( i = 0; i < a_len; i++ )
     {
@@ -268,9 +268,9 @@
     if( s[0] == 0 )
     {
         mbedtls_mpi_free( X );
-        return( 0 );
+        return 0 ;
     }
     else
-        return( mbedtls_mpi_read_string( X, radix, s ) );
+        return mbedtls_mpi_read_string( X, radix, s ) ;
 }
 #endif
diff --git a/tests/src/psa_crypto_helpers.c b/tests/src/psa_crypto_helpers.c
index d9d841a..cef4093 100644
--- a/tests/src/psa_crypto_helpers.c
+++ b/tests/src/psa_crypto_helpers.c
@@ -42,18 +42,18 @@
         PSA_MAX_PERSISTENT_KEY_IDENTIFIER )
     {
         /* Don't touch key id values that designate non-key files. */
-        return( 1 );
+        return 1 ;
     }
     for( i = 0; i < num_key_ids_used ; i++ )
     {
         if( mbedtls_svc_key_id_equal( key_id, key_ids_used_in_test[i] ) )
-            return( 1 );
+            return 1 ;
     }
     if( num_key_ids_used == ARRAY_LENGTH( key_ids_used_in_test ) )
-        return( 0 );
+        return 0 ;
     key_ids_used_in_test[num_key_ids_used] = key_id;
     ++num_key_ids_used;
-    return( 1 );
+    return 1 ;
 }
 
 void mbedtls_test_psa_purge_key_storage( void )
@@ -80,17 +80,17 @@
     mbedtls_psa_get_stats( &stats );
 
     if( stats.volatile_slots != 0 )
-        return( "A volatile slot has not been closed properly." );
+        return "A volatile slot has not been closed properly." ;
     if( stats.persistent_slots != 0 )
-        return( "A persistent slot has not been closed properly." );
+        return "A persistent slot has not been closed properly." ;
     if( stats.external_slots != 0 )
-        return( "An external slot has not been closed properly." );
+        return "An external slot has not been closed properly." ;
      if( stats.half_filled_slots != 0 )
-        return( "A half-filled slot has not been cleared properly." );
+        return "A half-filled slot has not been cleared properly." ;
     if( stats.locked_slots != 0 )
-        return( "Some slots are still marked as locked." );
+        return "Some slots are still marked as locked." ;
 
-    return( NULL );
+    return NULL ;
 }
 
 #if defined(RECORD_PSA_STATUS_COVERAGE_LOG)
@@ -110,7 +110,7 @@
     if( log == NULL )
         log = fopen( STATUS_LOG_FILE_NAME, "a" );
     fprintf( log, "%d:%s:%s:%d:%s\n", (int) status, func, file, line, expr );
-    return( status );
+    return status ;
 }
 #endif /* defined(RECORD_PSA_STATUS_COVERAGE_LOG) */
 
@@ -124,7 +124,7 @@
     if( usage_flags & PSA_KEY_USAGE_VERIFY_HASH )
         updated_usage |= PSA_KEY_USAGE_VERIFY_MESSAGE;
 
-    return( updated_usage );
+    return updated_usage ;
 }
 
 #endif /* MBEDTLS_PSA_CRYPTO_C */
diff --git a/tests/src/psa_exercise_key.c b/tests/src/psa_exercise_key.c
index e4e55c9..f47f15a 100644
--- a/tests/src/psa_exercise_key.c
+++ b/tests/src/psa_exercise_key.c
@@ -110,7 +110,7 @@
      */
     psa_reset_key_attributes( &attributes );
 
-    return( ok );
+    return ok ;
 }
 
 static int exercise_mac_key( mbedtls_svc_key_id_t key,
@@ -151,11 +151,11 @@
                     verify_status );
     }
 
-    return( 1 );
+    return 1 ;
 
 exit:
     psa_mac_abort( &operation );
-    return( 0 );
+    return 0 ;
 }
 
 static int exercise_cipher_key( mbedtls_svc_key_id_t key,
@@ -224,11 +224,11 @@
             PSA_ASSERT( status );
     }
 
-    return( 1 );
+    return 1 ;
 
 exit:
     psa_cipher_abort( &operation );
-    return( 0 );
+    return 0 ;
 }
 
 static int exercise_aead_key( mbedtls_svc_key_id_t key,
@@ -287,10 +287,10 @@
                     verify_status );
     }
 
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 static int exercise_signature_key( mbedtls_svc_key_id_t key,
@@ -371,10 +371,10 @@
         }
     }
 
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 static int exercise_asymmetric_encryption_key( mbedtls_svc_key_id_t key,
@@ -409,10 +409,10 @@
                          status == PSA_ERROR_INVALID_PADDING ) ) );
     }
 
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 int mbedtls_test_psa_setup_key_derivation_wrap(
@@ -458,10 +458,10 @@
     if( capacity != SIZE_MAX )
         PSA_ASSERT( psa_key_derivation_set_capacity( operation, capacity ) );
 
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 
@@ -491,10 +491,10 @@
         PSA_ASSERT( psa_key_derivation_abort( &operation ) );
     }
 
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 /* We need two keys to exercise key agreement. Exercise the
@@ -534,7 +534,7 @@
     psa_reset_key_attributes( &attributes );
 
     mbedtls_free( public_key );
-    return( status );
+    return status ;
 }
 
 /* We need two keys to exercise key agreement. Exercise the
@@ -586,7 +586,7 @@
     psa_reset_key_attributes( &attributes );
 
     mbedtls_free( public_key );
-    return( status );
+    return status ;
 }
 
 static int exercise_raw_key_agreement_key( mbedtls_svc_key_id_t key,
@@ -604,7 +604,7 @@
     ok = 1;
 
 exit:
-    return( ok );
+    return ok ;
 }
 
 static int exercise_key_agreement_key( mbedtls_svc_key_id_t key,
@@ -629,7 +629,7 @@
     ok = 1;
 
 exit:
-    return( ok );
+    return ok ;
 }
 
 int mbedtls_test_psa_exported_key_sanity_check(
@@ -785,10 +785,10 @@
     }
 #endif
 
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 static int exercise_export_key( mbedtls_svc_key_id_t key,
@@ -832,7 +832,7 @@
     psa_reset_key_attributes( &attributes );
 
     mbedtls_free( exported );
-    return( ok );
+    return ok ;
 }
 
 static int exercise_export_public_key( mbedtls_svc_key_id_t key )
@@ -880,7 +880,7 @@
     psa_reset_key_attributes( &attributes );
 
     mbedtls_free( exported );
-    return( ok );
+    return ok ;
 }
 
 int mbedtls_test_psa_exercise_key( mbedtls_svc_key_id_t key,
@@ -890,7 +890,7 @@
     int ok = 0;
 
     if( ! check_key_attributes_sanity( key ) )
-        return( 0 );
+        return 0 ;
 
     if( alg == 0 )
         ok = 1; /* If no algorihm, do nothing (used for raw data "keys"). */
@@ -917,7 +917,7 @@
     ok = ok && exercise_export_public_key( key );
 
 exit:
-    return( ok );
+    return ok ;
 }
 
 psa_key_usage_t mbedtls_test_psa_usage_to_exercise( psa_key_type_t type,
@@ -952,11 +952,11 @@
     else if( PSA_ALG_IS_KEY_DERIVATION( alg ) ||
              PSA_ALG_IS_KEY_AGREEMENT( alg ) )
     {
-        return( PSA_KEY_USAGE_DERIVE );
+        return PSA_KEY_USAGE_DERIVE ;
     }
     else
     {
-        return( 0 );
+        return 0 ;
     }
 
 }
diff --git a/tests/src/random.c b/tests/src/random.c
index 7f3f401..d578985 100644
--- a/tests/src/random.c
+++ b/tests/src/random.c
@@ -56,7 +56,7 @@
     arc4random_buf( output, len );
 #endif /* !OpenBSD && !NetBSD */
 
-    return( 0 );
+    return 0 ;
 }
 
 int mbedtls_test_rnd_zero_rand( void *rng_state,
@@ -68,7 +68,7 @@
 
     memset( output, 0, len );
 
-    return( 0 );
+    return 0 ;
 }
 
 int mbedtls_test_rnd_buffer_rand( void *rng_state,
@@ -79,7 +79,7 @@
     size_t use_len;
 
     if( rng_state == NULL )
-        return( mbedtls_test_rnd_std_rand( NULL, output, len ) );
+        return mbedtls_test_rnd_std_rand( NULL, output, len ) ;
 
     use_len = len;
     if( len > info->length )
@@ -101,10 +101,10 @@
                                           len - use_len ) );
         }
         else
-            return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
+            return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 int mbedtls_test_rnd_pseudo_rand( void *rng_state,
@@ -117,7 +117,7 @@
     unsigned char result[4], *out = output;
 
     if( rng_state == NULL )
-        return( mbedtls_test_rnd_std_rand( NULL, output, len ) );
+        return mbedtls_test_rnd_std_rand( NULL, output, len ) ;
 
     k = info->key;
 
@@ -141,5 +141,5 @@
         out += 4;
     }
 
-    return( 0 );
+    return 0 ;
 }
diff --git a/tests/src/threading_helpers.c b/tests/src/threading_helpers.c
index ca91b79..f5a9564 100644
--- a/tests/src/threading_helpers.c
+++ b/tests/src/threading_helpers.c
@@ -160,7 +160,7 @@
             mbedtls_test_mutex_usage_error( mutex, "corrupted state" );
             break;
     }
-    return( ret );
+    return ret ;
 }
 
 static int mbedtls_test_wrap_mutex_unlock( mbedtls_threading_mutex_t *mutex )
@@ -182,7 +182,7 @@
             mbedtls_test_mutex_usage_error( mutex, "corrupted state" );
             break;
     }
-    return( ret );
+    return ret ;
 }
 
 void mbedtls_test_mutex_usage_init( void )
diff --git a/tests/suites/helpers.function b/tests/suites/helpers.function
index 7481c5b..0071f6f 100644
--- a/tests/suites/helpers.function
+++ b/tests/suites/helpers.function
@@ -123,14 +123,14 @@
 
     if( dup_fd == -1 )
     {
-        return( -1 );
+        return -1 ;
     }
 
     path_stream = fopen( path, "w" );
     if( path_stream == NULL )
     {
         close( dup_fd );
-        return( -1 );
+        return -1 ;
     }
 
     fflush( out_stream );
@@ -138,11 +138,11 @@
     {
         close( dup_fd );
         fclose( path_stream );
-        return( -1 );
+        return -1 ;
     }
 
     fclose( path_stream );
-    return( dup_fd );
+    return dup_fd ;
 }
 
 static int restore_output( FILE* out_stream, int dup_fd )
@@ -154,10 +154,10 @@
     {
         close( out_fd );
         close( dup_fd );
-        return( -1 );
+        return -1 ;
     }
 
     close( dup_fd );
-    return( 0 );
+    return 0 ;
 }
 #endif /* __unix__ || __APPLE__ __MACH__ */
diff --git a/tests/suites/host_test.function b/tests/suites/host_test.function
index a5fd717..f414c38 100644
--- a/tests/suites/host_test.function
+++ b/tests/suites/host_test.function
@@ -15,13 +15,13 @@
     {
         mbedtls_fprintf( stderr,
             "Expected string (with \"\") for parameter and got: %s\n", *str );
-        return( -1 );
+        return -1 ;
     }
 
     ( *str )++;
     ( *str )[strlen( *str ) - 1] = '\0';
 
-    return( 0 );
+    return 0 ;
 }
 
 /**
@@ -71,12 +71,12 @@
         else
             *value = strtol( str, NULL, 10 );
 
-        return( 0 );
+        return 0 ;
     }
 
     mbedtls_fprintf( stderr,
                     "Expected integer for parameter and got: %s\n", str );
-    return( KEY_VALUE_MAPPING_NOT_FOUND );
+    return KEY_VALUE_MAPPING_NOT_FOUND ;
 }
 
 
@@ -117,7 +117,7 @@
     {
         ret = fgets( buf, len, f );
         if( ret == NULL )
-            return( -1 );
+            return -1 ;
 
         str_len = strlen( buf );
 
@@ -144,7 +144,7 @@
     if( ret-- > buf && *ret == '\r' )
         *ret = '\0';
 
-    return( 0 );
+    return 0 ;
 }
 
 /**
@@ -217,7 +217,7 @@
         *q = '\0';
     }
 
-    return( cnt );
+    return cnt ;
 }
 
 /**
@@ -312,7 +312,7 @@
           break;
         }
     }
-    return( ret );
+    return ret ;
 }
 
 /**
@@ -342,7 +342,7 @@
     const char ref[10] = "xxxxxxxxx";
 
     if( n >= sizeof( buf ) )
-        return( -1 );
+        return -1 ;
     ret = mbedtls_snprintf( buf, n, "%s", "123" );
     if( ret < 0 || (size_t) ret >= n )
         ret = -1;
@@ -351,10 +351,10 @@
         ref_ret != ret ||
         memcmp( buf + n, ref + n, sizeof( buf ) - n ) != 0 )
     {
-        return( 1 );
+        return 1 ;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 /**
@@ -547,7 +547,7 @@
     if( pointer != NULL )
     {
         mbedtls_fprintf( stderr, "all-bits-zero is not a NULL pointer\n" );
-        return( 1 );
+        return 1 ;
     }
 
     /*
@@ -556,7 +556,7 @@
     if( run_test_snprintf() != 0 )
     {
         mbedtls_fprintf( stderr, "the snprintf implementation is broken\n" );
-        return( 1 );
+        return 1 ;
     }
 
     if( outcome_file_name != NULL && *outcome_file_name != '\0' )
@@ -623,7 +623,7 @@
                              test_filename );
             if( outcome_file != NULL )
                 fclose( outcome_file );
-            return( 1 );
+            return 1 ;
         }
 
         while( !feof( file ) )
@@ -819,5 +819,5 @@
     mbedtls_memory_buffer_alloc_free();
 #endif
 
-    return( total_errors != 0 );
+    return total_errors != 0 ;
 }
diff --git a/tests/suites/main_test.function b/tests/suites/main_test.function
index e016865..cfad32e 100644
--- a/tests/suites/main_test.function
+++ b/tests/suites/main_test.function
@@ -86,7 +86,7 @@
            }
            break;
     }
-    return( ret );
+    return ret ;
 }
 
 
@@ -114,7 +114,7 @@
         default:
             break;
     }
-    return( ret );
+    return ret ;
 }
 
 
@@ -185,7 +185,7 @@
         ret = DISPATCH_TEST_FN_NOT_FOUND;
     }
 
-    return( ret );
+    return ret ;
 }
 
 
@@ -215,7 +215,7 @@
         ret = DISPATCH_TEST_FN_NOT_FOUND;
     }
 
-    return( ret );
+    return ret ;
 }
 
 
@@ -251,10 +251,10 @@
         mbedtls_fprintf( stderr,
                          "FATAL: Failed to initialize platform - error %d\n",
                          ret );
-        return( -1 );
+        return -1 ;
     }
 
     ret = execute_tests( argc, argv );
     mbedtls_test_platform_teardown();
-    return( ret );
+    return ret ;
 }
diff --git a/tests/suites/target_test.function b/tests/suites/target_test.function
index 637a79d..3d0bc80 100644
--- a/tests/suites/target_test.function
+++ b/tests/suites/target_test.function
@@ -54,9 +54,9 @@
     for ( i = 0; i < count; i++ )
     {
         if ( dep_check( (int)(dep_p[i]) ) != DEPENDENCY_SUPPORTED )
-            return( DEPENDENCY_NOT_SUPPORTED );
+            return DEPENDENCY_NOT_SUPPORTED ;
     }
-    return( DEPENDENCY_SUPPORTED );
+    return DEPENDENCY_SUPPORTED ;
 }
 
 /**
@@ -80,7 +80,7 @@
                                                c, &len ) == 0 );
     TEST_HELPER_ASSERT( len != 2 );
 
-    return( byte );
+    return byte ;
 }
 
 /**
@@ -111,7 +111,7 @@
                                                c, &len ) == 0 );
     TEST_HELPER_ASSERT( len != 8 );
 
-    return( value );
+    return value ;
 }
 
 /**
@@ -129,7 +129,7 @@
     value |= *p++ << 16;
     value |= *p++ << 8;
     value |= *p;
-    return( value );
+    return value ;
 }
 
 
@@ -157,7 +157,7 @@
             continue;
         i++;
         if ( c != '{' )
-            return( NULL );
+            return NULL ;
     }
 
     /* Read data length */
@@ -188,7 +188,7 @@
         *data_len = 0;
     }
 
-    return( data );
+    return data ;
 }
 
 /**
@@ -230,7 +230,7 @@
         }
     }
 
-    return( hex_count );
+    return hex_count ;
 }
 
 /**
@@ -317,7 +317,7 @@
         params = NULL;
     }
 
-    return( params );
+    return params ;
 }
 
 /**
@@ -444,6 +444,6 @@
         else
             send_status( mbedtls_test_info.result );
     }
-    return( 0 );
+    return 0 ;
 }
 
diff --git a/tests/suites/test_suite_asn1parse.function b/tests/suites/test_suite_asn1parse.function
index 535274b..78ccdb0 100644
--- a/tests/suites/test_suite_asn1parse.function
+++ b/tests/suites/test_suite_asn1parse.function
@@ -31,7 +31,7 @@
     ret = mbedtls_asn1_get_len( &content_start, end, &len );
     TEST_ASSERT( content_start <= end );
     if( ret != 0 )
-        return( ret );
+        return ret ;
 
     /* Since we have a valid element start (tag and length), retrieve and
      * check the tag. */
@@ -111,14 +111,14 @@
         default:
             /* No further testing implemented for this tag. */
             *p += len;
-            return( 0 );
+            return 0 ;
     }
 
     TEST_ASSERT( *p <= end );
-    return( ret );
+    return ret ;
 
 exit:
-    return( ERR_PARSE_INCONSISTENCY );
+    return ERR_PARSE_INCONSISTENCY ;
 }
 
 int get_len_step( const data_t *input, size_t buffer_size,
@@ -168,11 +168,11 @@
         TEST_EQUAL( ret, MBEDTLS_ERR_ASN1_OUT_OF_DATA );
     }
     mbedtls_free( buf );
-    return( 1 );
+    return 1 ;
 
 exit:
     mbedtls_free( buf );
-    return( 0 );
+    return 0 ;
 }
 
 typedef struct
@@ -201,7 +201,7 @@
     mbedtls_test_set_step( offset );
 
     if( *rest == 0 )
-        return( RET_TRAVERSE_STOP );
+        return RET_TRAVERSE_STOP ;
     n = strtoul( rest, (char **) &rest, 0 );
     TEST_EQUAL( n, offset );
     TEST_EQUAL( *rest, ',' );
@@ -216,10 +216,10 @@
         ++rest;
 
     state->description = rest;
-    return( 0 );
+    return 0 ;
 
 exit:
-    return( RET_TRAVERSE_ERROR );
+    return RET_TRAVERSE_ERROR ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_asn1write.function b/tests/suites/test_suite_asn1write.function
index 103a024..312145d 100644
--- a/tests/suites/test_suite_asn1write.function
+++ b/tests/suites/test_suite_asn1write.function
@@ -20,9 +20,9 @@
     data->end = data->output + data->size;
     data->p = data->end;
     data->start = data->end - data->size;
-    return( 1 );
+    return 1 ;
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 int generic_write_finish_step( generic_write_data_t *data,
@@ -47,7 +47,7 @@
 exit:
     mbedtls_free( data->output );
     data->output = NULL;
-    return( ok );
+    return ok ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_cipher.function b/tests/suites/test_suite_cipher.function
index 674349f..ff229e1 100644
--- a/tests/suites/test_suite_cipher.function
+++ b/tests/suites/test_suite_cipher.function
@@ -48,10 +48,10 @@
 
     TEST_ASSERT( 0 == mbedtls_cipher_setkey( ctx, key->x, 8 * key->len,
                                              direction ) );
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 /*
diff --git a/tests/suites/test_suite_ctr_drbg.function b/tests/suites/test_suite_ctr_drbg.function
index a46f21c..1447a04 100644
--- a/tests/suites/test_suite_ctr_drbg.function
+++ b/tests/suites/test_suite_ctr_drbg.function
@@ -18,10 +18,10 @@
 {
     const unsigned char *p = (unsigned char *) data;
     if( test_offset_idx + len > test_max_idx )
-        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
+        return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
     memcpy( buf, p + test_offset_idx, len );
     test_offset_idx += len;
-    return( 0 );
+    return 0 ;
 }
 
 static void ctr_drbg_validate_internal( int reseed_mode, data_t * nonce,
@@ -285,7 +285,7 @@
     }
     TEST_EQUAL( test_offset_idx, expected_idx );
 
-    /* Call update with too much data (sizeof entropy > MAX(_SEED)_INPUT).
+    /* Call update with too much data (sizeof(entropy) > MAX(_SEED)_INPUT).
      * Make sure it's detected as an error and doesn't cause memory
      * corruption. */
     TEST_ASSERT( mbedtls_ctr_drbg_update(
diff --git a/tests/suites/test_suite_dhm.function b/tests/suites/test_suite_dhm.function
index bc43016..db88daa 100644
--- a/tests/suites/test_suite_dhm.function
+++ b/tests/suites/test_suite_dhm.function
@@ -15,7 +15,7 @@
 
 exit:
     mbedtls_mpi_free( &actual );
-    return( ok );
+    return ok ;
 }
 
 /* Sanity checks on a Diffie-Hellman parameter: check the length-value
@@ -47,7 +47,7 @@
     ok = 1;
 exit:
     mbedtls_mpi_free( &actual );
-    return( ok );
+    return ok ;
 }
 
 /* Sanity checks on Diffie-Hellman parameters: syntax, range, and comparison
@@ -75,9 +75,9 @@
         goto exit;
     TEST_EQUAL( offset, ske_len );
 
-    return( 1 );
+    return 1 ;
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_ecdh.function b/tests/suites/test_suite_ecdh.function
index 6893bcf..b0cd2e4 100644
--- a/tests/suites/test_suite_ecdh.function
+++ b/tests/suites/test_suite_ecdh.function
@@ -14,7 +14,7 @@
                                            &ecp->Q ) == 0 );
     ok = 1;
 exit:
-    return( ok );
+    return ok ;
 }
 
 static int load_private_key( int grp_id, data_t *private_key,
@@ -33,7 +33,7 @@
                                   rnd_info ) == 0 );
     ok = 1;
 exit:
-    return( ok );
+    return ok ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_ecjpake.function b/tests/suites/test_suite_ecjpake.function
index 311733b..0ef334f 100644
--- a/tests/suites/test_suite_ecjpake.function
+++ b/tests/suites/test_suite_ecjpake.function
@@ -86,7 +86,7 @@
                      &ctx->Xp2, Xp2, len_Xp2 ) );
 
 cleanup:
-    return( ret );
+    return ret ;
 }
 
 #define ADD_SIZE( x )   x, sizeof( x )
diff --git a/tests/suites/test_suite_entropy.function b/tests/suites/test_suite_entropy.function
index c26f4f8..6f72add 100644
--- a/tests/suites/test_suite_entropy.function
+++ b/tests/suites/test_suite_entropy.function
@@ -39,11 +39,11 @@
             *olen = len;
             break;
         case DUMMY_FAIL:
-            return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
+            return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
     }
 
     memset( output, 0x2a, *olen );
-    return( 0 );
+    return 0 ;
 }
 
 /*
@@ -71,19 +71,19 @@
 int buffer_nv_seed_read( unsigned char *buf, size_t buf_len )
 {
     if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
-        return( -1 );
+        return -1 ;
 
     memcpy( buf, buffer_seed, MBEDTLS_ENTROPY_BLOCK_SIZE );
-    return( 0 );
+    return 0 ;
 }
 
 int buffer_nv_seed_write( unsigned char *buf, size_t buf_len )
 {
     if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
-        return( -1 );
+        return -1 ;
 
     memcpy( buffer_seed, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );
-    return( 0 );
+    return 0 ;
 }
 
 /*
@@ -94,18 +94,18 @@
     FILE *f;
 
     if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
-        return( -1 );
+        return -1 ;
 
     if( ( f = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w" ) ) == NULL )
-        return( -1 );
+        return -1 ;
 
     if( fwrite( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) !=
                     MBEDTLS_ENTROPY_BLOCK_SIZE )
-        return( -1 );
+        return -1 ;
 
     fclose( f );
 
-    return( 0 );
+    return 0 ;
 }
 
 int read_nv_seed( unsigned char *buf, size_t buf_len )
@@ -113,18 +113,18 @@
     FILE *f;
 
     if( buf_len != MBEDTLS_ENTROPY_BLOCK_SIZE )
-        return( -1 );
+        return -1 ;
 
     if( ( f = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb" ) ) == NULL )
-        return( -1 );
+        return -1 ;
 
     if( fread( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) !=
                     MBEDTLS_ENTROPY_BLOCK_SIZE )
-        return( -1 );
+        return -1 ;
 
     fclose( f );
 
-    return( 0 );
+    return 0 ;
 }
 #endif /* MBEDTLS_ENTROPY_NV_SEED */
 /* END_HEADER */
diff --git a/tests/suites/test_suite_gcm.function b/tests/suites/test_suite_gcm.function
index c530e6b..2bcd1d7 100644
--- a/tests/suites/test_suite_gcm.function
+++ b/tests/suites/test_suite_gcm.function
@@ -59,7 +59,7 @@
     ok = 1;
 exit:
     mbedtls_free( output );
-    return( ok );
+    return ok ;
 }
 
 static void check_cipher_with_empty_ad( mbedtls_gcm_context *ctx,
diff --git a/tests/suites/test_suite_hmac_drbg.function b/tests/suites/test_suite_hmac_drbg.function
index b83d760..e678979 100644
--- a/tests/suites/test_suite_hmac_drbg.function
+++ b/tests/suites/test_suite_hmac_drbg.function
@@ -13,14 +13,14 @@
     entropy_ctx *ctx = (entropy_ctx *) data;
 
     if( len > ctx->len )
-        return( -1 );
+        return -1 ;
 
     memcpy( buf, ctx->p, len );
 
     ctx->p += len;
     ctx->len -= len;
 
-    return( 0 );
+    return 0 ;
 }
 /* END_HEADER */
 
diff --git a/tests/suites/test_suite_mdx.function b/tests/suites/test_suite_mdx.function
index 73f9123..5cdb1a5 100644
--- a/tests/suites/test_suite_mdx.function
+++ b/tests/suites/test_suite_mdx.function
@@ -10,8 +10,8 @@
     unsigned char src_str[100];
     unsigned char output[16];
 
-    memset( src_str, 0x00, sizeof src_str );
-    memset( output, 0x00, sizeof output );
+    memset( src_str, 0x00, sizeof(src_str) );
+    memset( output, 0x00, sizeof(output) );
 
     strncpy( (char *) src_str, text_src_string, sizeof(src_str) - 1 );
 
@@ -19,7 +19,7 @@
     TEST_ASSERT( ret == 0 );
 
     TEST_ASSERT( mbedtls_test_hexcmp( output, hash->x,
-                                      sizeof  output, hash->len ) == 0 );
+                                      sizeof( output), hash->len ) == 0 );
 }
 /* END_CASE */
 
@@ -30,8 +30,8 @@
     unsigned char src_str[100];
     unsigned char output[20];
 
-    memset(src_str, 0x00, sizeof src_str);
-    memset(output, 0x00, sizeof output);
+    memset(src_str, 0x00, sizeof(src_str));
+    memset(output, 0x00, sizeof(output));
 
     strncpy( (char *) src_str, text_src_string, sizeof(src_str) - 1 );
 
@@ -39,7 +39,7 @@
     TEST_ASSERT( ret == 0 );
 
     TEST_ASSERT( mbedtls_test_hexcmp( output, hash->x,
-                                      sizeof output, hash->len ) == 0 );
+                                      sizeof(output), hash->len ) == 0 );
 }
 /* END_CASE */
 
diff --git a/tests/suites/test_suite_memory_buffer_alloc.function b/tests/suites/test_suite_memory_buffer_alloc.function
index cc884c2..f5e05e2 100644
--- a/tests/suites/test_suite_memory_buffer_alloc.function
+++ b/tests/suites/test_suite_memory_buffer_alloc.function
@@ -13,12 +13,12 @@
 static int check_pointer( void *p )
 {
     if( p == NULL )
-        return( -1 );
+        return -1 ;
 
     if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 )
-        return( -1 );
+        return -1 ;
 
-    return( 0 );
+    return 0 ;
 }
 /* END_SUITE_HELPERS */
 
diff --git a/tests/suites/test_suite_mpi.function b/tests/suites/test_suite_mpi.function
index 1372668..5c184cb 100644
--- a/tests/suites/test_suite_mpi.function
+++ b/tests/suites/test_suite_mpi.function
@@ -12,10 +12,10 @@
 static int sign_is_valid( const mbedtls_mpi *X )
 {
     if( X->s != 1 && X->s != -1 )
-        return( 0 ); // invalid sign bit, e.g. 0
+        return 0 ; // invalid sign bit, e.g. 0
     if( mbedtls_mpi_bitlen( X ) == 0 && X->s != 1 )
-        return( 0 ); // negative zero
-    return( 1 );
+        return 0 ; // negative zero
+    return 1 ;
 }
 
 typedef struct mbedtls_test_mpi_random
@@ -38,12 +38,12 @@
     mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random*) state;
 
     if( random == NULL || random->data->x == NULL || buf == NULL )
-        return( -1 );
+        return -1 ;
 
     if( random->pos + random->chunk_len > random->data->len
             || random->chunk_len > len )
     {
-        return( -1 );
+        return -1 ;
     }
 
     memset( buf, 0, len );
@@ -58,7 +58,7 @@
 
     random->pos += random->chunk_len;
 
-    return( 0 );
+    return 0 ;
 }
 
 /* Random generator that is told how many bytes to return. */
@@ -69,11 +69,11 @@
     for( i = 0; i < len; i++ )
     {
         if( *bytes_left == 0 )
-            return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
+            return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
         buf[i] = *bytes_left & 0xff;
         --( *bytes_left );
     }
-    return( 0 );
+    return 0 ;
 }
 
 /* Test whether bytes represents (in big-endian base 256) a number b that
@@ -101,7 +101,7 @@
     }
     /* 0 is not significantly above a power of 2 */
     if( len == 0 )
-        return( 0 );
+        return 0 ;
     /* Extract the (up to) 2 most significant bytes */
     if( len == 1 )
         x = p[0];
@@ -117,7 +117,7 @@
      * a power of 2 iff x is significantly above 0 compared to 2^8.
      * Testing x >= 2^4 amounts to picking A = 1/16 in the function
      * description above. */
-    return( x >= 0x10 );
+    return x >= 0x10 ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_net.function b/tests/suites/test_suite_net.function
index f429fc9..fdf6b02 100644
--- a/tests/suites/test_suite_net.function
+++ b/tests/suites/test_suite_net.function
@@ -40,9 +40,9 @@
         TEST_ASSERT( close( got_fd ) >= 0 );
     }
     ctx->fd = wanted_fd;
-    return( 0 );
+    return 0 ;
 exit:
-    return( -1 );
+    return -1 ;
 }
 #endif /* MBEDTLS_PLATFORM_IS_UNIXLIKE */
 
diff --git a/tests/suites/test_suite_pk.function b/tests/suites/test_suite_pk.function
index 56cc45b..454bfac 100644
--- a/tests/suites/test_suite_pk.function
+++ b/tests/suites/test_suite_pk.function
@@ -48,7 +48,7 @@
         int ret;
         if( ( ret = mbedtls_ecp_group_load( &mbedtls_pk_ec( *pk )->grp,
                                             parameter ) ) != 0 )
-            return( ret );
+            return ret ;
 
         return mbedtls_ecp_gen_keypair( &mbedtls_pk_ec( *pk )->grp,
                                         &mbedtls_pk_ec( *pk )->d,
@@ -56,7 +56,7 @@
                                         mbedtls_test_rnd_std_rand, NULL );
     }
 #endif
-    return( -1 );
+    return -1 ;
 }
 
 #if defined(MBEDTLS_RSA_C)
@@ -81,7 +81,7 @@
 }
 size_t mbedtls_rsa_key_len_func( void *ctx )
 {
-    return( ((const mbedtls_rsa_context *) ctx)->len );
+    return ((const mbedtls_rsa_context *) ctx)->len ;
 }
 #endif /* MBEDTLS_RSA_C */
 
@@ -107,7 +107,7 @@
     PSA_ASSERT( psa_generate_key( &attributes, &key ) );
 
 exit:
-    return( key );
+    return key ;
 }
 #endif /* MBEDTLS_USE_PSA_CRYPTO */
 /* END_HEADER */
@@ -604,7 +604,7 @@
 
         slen = sizeof( sig );
         ret = mbedtls_pk_sign_restartable( &prv, md_alg, hash, hlen,
-                                           sig, sizeof sig, &slen,
+                                           sig, sizeof(sig), &slen,
                                            mbedtls_test_rnd_std_rand, NULL,
                                            &rs_ctx );
         TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
@@ -640,15 +640,15 @@
     mbedtls_pk_init( &pk );
     USE_PSA_INIT( );
 
-    memset( hash, 0x2a, sizeof hash );
-    memset( sig, 0, sizeof sig );
+    memset( hash, 0x2a, sizeof(hash) );
+    memset( sig, 0, sizeof(sig) );
 
     TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
     TEST_ASSERT( pk_genkey( &pk, parameter ) == 0 );
 
     TEST_ASSERT( mbedtls_pk_sign_restartable( &pk, MBEDTLS_MD_SHA256,
                                               hash, hash_len,
-                                              sig, sizeof sig, &sig_len,
+                                              sig, sizeof(sig), &sig_len,
                                               mbedtls_test_rnd_std_rand, NULL,
                                               rs_ctx ) == sign_ret );
     if( sign_ret == 0 )
@@ -673,7 +673,7 @@
     }
 
     TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256, hash, hash_len,
-                                  sig, sizeof sig, &sig_len,
+                                  sig, sizeof(sig), &sig_len,
                                   mbedtls_test_rnd_std_rand,
                                   NULL ) == sign_ret );
     if( sign_ret == 0 )
@@ -688,12 +688,12 @@
     {
         hash[0]++;
         TEST_ASSERT( mbedtls_pk_verify_restartable( &pk, MBEDTLS_MD_SHA256,
-                     hash, sizeof hash, sig, sig_len, rs_ctx ) != 0 );
+                     hash, sizeof(hash), sig, sig_len, rs_ctx ) != 0 );
         hash[0]--;
 
         sig[0]++;
         TEST_ASSERT( mbedtls_pk_verify_restartable( &pk, MBEDTLS_MD_SHA256,
-                     hash, sizeof hash, sig, sig_len, rs_ctx ) != 0 );
+                     hash, sizeof(hash), sig, sig_len, rs_ctx ) != 0 );
         sig[0]--;
     }
 
@@ -835,8 +835,8 @@
     if( SIZE_MAX <= UINT_MAX )
         return;
 
-    memset( hash, 0x2a, sizeof hash );
-    memset( sig, 0, sizeof sig );
+    memset( hash, 0x2a, sizeof(hash) );
+    memset( sig, 0, sizeof(sig) );
 
     mbedtls_pk_init( &pk );
 
@@ -853,7 +853,7 @@
                     sig, sig_len ) == MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
     TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_NONE, hash, hash_len,
-                                  sig, sizeof sig, &sig_len,
+                                  sig, sizeof(sig), &sig_len,
                                   mbedtls_test_rnd_std_rand, NULL )
                  == MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 
@@ -881,11 +881,11 @@
     mbedtls_rsa_init( &raw );
     mbedtls_pk_init( &rsa ); mbedtls_pk_init( &alt );
 
-    memset( hash, 0x2a, sizeof hash );
-    memset( sig, 0, sizeof sig );
-    memset( msg, 0x2a, sizeof msg );
-    memset( ciph, 0, sizeof ciph );
-    memset( test, 0, sizeof test );
+    memset( hash, 0x2a, sizeof(hash) );
+    memset( sig, 0, sizeof(sig) );
+    memset( msg, 0x2a, sizeof(msg) );
+    memset( ciph, 0, sizeof(ciph) );
+    memset( test, 0, sizeof(test) );
 
     /* Initiliaze PK RSA context with random key */
     TEST_ASSERT( mbedtls_pk_setup( &rsa,
@@ -909,34 +909,34 @@
     /* Test signature */
 #if SIZE_MAX > UINT_MAX
     TEST_ASSERT( mbedtls_pk_sign( &alt, MBEDTLS_MD_NONE, hash, SIZE_MAX,
-                                  sig, sizeof sig, &sig_len,
+                                  sig, sizeof(sig), &sig_len,
                                   mbedtls_test_rnd_std_rand, NULL )
                  == MBEDTLS_ERR_PK_BAD_INPUT_DATA );
 #endif /* SIZE_MAX > UINT_MAX */
-    TEST_ASSERT( mbedtls_pk_sign( &alt, MBEDTLS_MD_NONE, hash, sizeof hash,
-                                  sig, sizeof sig, &sig_len,
+    TEST_ASSERT( mbedtls_pk_sign( &alt, MBEDTLS_MD_NONE, hash, sizeof(hash),
+                                  sig, sizeof(sig), &sig_len,
                                   mbedtls_test_rnd_std_rand, NULL )
                  == 0 );
     TEST_ASSERT( sig_len == RSA_KEY_LEN );
     TEST_ASSERT( mbedtls_pk_verify( &rsa, MBEDTLS_MD_NONE,
-                            hash, sizeof hash, sig, sig_len ) == 0 );
+                            hash, sizeof(hash), sig, sig_len ) == 0 );
 
     /* Test decrypt */
-    TEST_ASSERT( mbedtls_pk_encrypt( &rsa, msg, sizeof msg,
-                             ciph, &ciph_len, sizeof ciph,
+    TEST_ASSERT( mbedtls_pk_encrypt( &rsa, msg, sizeof(msg),
+                             ciph, &ciph_len, sizeof(ciph),
                              mbedtls_test_rnd_std_rand, NULL ) == 0 );
     TEST_ASSERT( mbedtls_pk_decrypt( &alt, ciph, ciph_len,
-                             test, &test_len, sizeof test,
+                             test, &test_len, sizeof(test),
                              mbedtls_test_rnd_std_rand, NULL ) == 0 );
-    TEST_ASSERT( test_len == sizeof msg );
+    TEST_ASSERT( test_len == sizeof(msg) );
     TEST_ASSERT( memcmp( test, msg, test_len ) == 0 );
 
     /* Test forbidden operations */
-    TEST_ASSERT( mbedtls_pk_encrypt( &alt, msg, sizeof msg,
-                             ciph, &ciph_len, sizeof ciph,
+    TEST_ASSERT( mbedtls_pk_encrypt( &alt, msg, sizeof(msg),
+                             ciph, &ciph_len, sizeof(ciph),
                              mbedtls_test_rnd_std_rand, NULL ) == ret );
     TEST_ASSERT( mbedtls_pk_verify( &alt, MBEDTLS_MD_NONE,
-                            hash, sizeof hash, sig, sig_len ) == ret );
+                            hash, sizeof(hash), sig, sig_len ) == ret );
     TEST_ASSERT( mbedtls_pk_debug( &alt, dbg_items ) == ret );
 
 exit:
@@ -999,11 +999,11 @@
     TEST_EQUAL( psa_get_key_lifetime( &attributes ),
                 PSA_KEY_LIFETIME_VOLATILE );
 
-    memset( hash, 0x2a, sizeof hash );
-    memset( sig, 0, sizeof sig );
+    memset( hash, 0x2a, sizeof(hash) );
+    memset( sig, 0, sizeof(sig) );
 
     TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256,
-                 hash, sizeof hash, sig, sizeof sig, &sig_len,
+                 hash, sizeof(hash), sig, sizeof(sig), &sig_len,
                  NULL, NULL ) == 0 );
 
     /* Export underlying public key for re-importing in a psa context. */
@@ -1024,7 +1024,7 @@
     TEST_ASSERT( mbedtls_pk_parse_public_key( &pk, pkey_legacy_start,
                                               klen_legacy ) == 0 );
     TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256,
-                            hash, sizeof hash, sig, sig_len ) == 0 );
+                            hash, sizeof(hash), sig, sig_len ) == 0 );
 
 exit:
     /*
diff --git a/tests/suites/test_suite_psa_crypto.function b/tests/suites/test_suite_psa_crypto.function
index 150a3f4..a73b9a1 100644
--- a/tests/suites/test_suite_psa_crypto.function
+++ b/tests/suites/test_suite_psa_crypto.function
@@ -44,9 +44,9 @@
     for( i = 0; i < size; i++ )
     {
         if( ( (unsigned char *) buffer )[i] != c )
-            return( 0 );
+            return 0 ;
     }
-    return( 1 );
+    return 1 ;
 }
 
 /* Write the ASN.1 INTEGER with the value 2^(bits-1)+x backwards from *p. */
@@ -58,11 +58,11 @@
     int ret;
     int len = bits / 8 + 1;
     if( bits == 0 )
-        return( MBEDTLS_ERR_ASN1_INVALID_DATA );
+        return MBEDTLS_ERR_ASN1_INVALID_DATA ;
     if( bits <= 8 && x >= 1 << ( bits - 1 ) )
-        return( MBEDTLS_ERR_ASN1_INVALID_DATA );
+        return MBEDTLS_ERR_ASN1_INVALID_DATA ;
     if( *p < start || *p - start < (ptrdiff_t) len )
-        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
+        return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ;
     *p -= len;
     ( *p )[len-1] = x;
     if( bits % 8 == 0 )
@@ -72,7 +72,7 @@
     MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
     MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
                                                        MBEDTLS_ASN1_INTEGER ) );
-    return( len );
+    return len ;
 }
 
 static int construct_fake_rsa_key( unsigned char *buffer,
@@ -130,7 +130,7 @@
             MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE;
         MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, buffer, tag ) );
     }
-    return( len );
+    return len ;
 }
 
 int exercise_mac_setup( psa_key_type_t key_type,
@@ -159,11 +159,11 @@
     }
 
     psa_destroy_key( key );
-    return( 1 );
+    return 1 ;
 
 exit:
     psa_destroy_key( key );
-    return( 0 );
+    return 0 ;
 }
 
 int exercise_cipher_setup( psa_key_type_t key_type,
@@ -193,11 +193,11 @@
     }
 
     psa_destroy_key( key );
-    return( 1 );
+    return 1 ;
 
 exit:
     psa_destroy_key( key );
-    return( 0 );
+    return 0 ;
 }
 
 static int test_operations_on_invalid_key( mbedtls_svc_key_id_t key )
@@ -239,7 +239,7 @@
      */
     psa_reset_key_attributes( &attributes );
 
-    return( ok );
+    return ok ;
 }
 
 /* Assert that a key isn't reported as having a slot number. */
diff --git a/tests/suites/test_suite_psa_crypto_entropy.function b/tests/suites/test_suite_psa_crypto_entropy.function
index 0a2623f..d209c08 100644
--- a/tests/suites/test_suite_psa_crypto_entropy.function
+++ b/tests/suites/test_suite_psa_crypto_entropy.function
@@ -26,11 +26,11 @@
 {
 #if defined(MBEDTLS_PSA_ITS_FILE_C)
     if( remove( "00000000ffffff52.psa_its" ) == 0 )
-        return( PSA_SUCCESS );
+        return PSA_SUCCESS ;
     else
-        return( PSA_ERROR_DOES_NOT_EXIST );
+        return PSA_ERROR_DOES_NOT_EXIST ;
 #else
-    return( psa_its_remove( PSA_CRYPTO_ITS_RANDOM_SEED_UID ) );
+    return psa_its_remove( PSA_CRYPTO_ITS_RANDOM_SEED_UID ) ;
 #endif
 }
 
diff --git a/tests/suites/test_suite_psa_crypto_init.function b/tests/suites/test_suite_psa_crypto_init.function
index 9f72b47..2ee3015 100644
--- a/tests/suites/test_suite_psa_crypto_init.function
+++ b/tests/suites/test_suite_psa_crypto_init.function
@@ -43,13 +43,13 @@
     size_t i;
 
     if( state->step >= state->max_steps )
-        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );
+        return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ;
 
     *olen = MIN( len, state->length_sequence[state->step] );
     for( i = 0; i < *olen; i++ )
         output[i] = i;
     ++state->step;
-    return( 0 );
+    return 0 ;
 }
 
 #define ENTROPY_SOURCE_PLATFORM                 0x00000001
diff --git a/tests/suites/test_suite_psa_crypto_metadata.function b/tests/suites/test_suite_psa_crypto_metadata.function
index 9f4fc75..52c96a6 100644
--- a/tests/suites/test_suite_psa_crypto_metadata.function
+++ b/tests/suites/test_suite_psa_crypto_metadata.function
@@ -88,7 +88,7 @@
     value ^= value >> 16;
     value ^= value >> 8;
     value ^= value >> 4;
-    return( 0x9669 & 1 << ( value & 0xf ) );
+    return 0x9669 & 1 << ( value & 0xf ) ;
 }
 #define TEST_PARITY( value )                    \
     TEST_ASSERT( has_even_parity( value ) )
diff --git a/tests/suites/test_suite_psa_crypto_se_driver_hal.function b/tests/suites/test_suite_psa_crypto_se_driver_hal.function
index 79d658f..7212d15 100644
--- a/tests/suites/test_suite_psa_crypto_se_driver_hal.function
+++ b/tests/suites/test_suite_psa_crypto_se_driver_hal.function
@@ -46,7 +46,7 @@
        if( ! (TEST) )                                       \
        {                                                    \
           mbedtls_test_fail( #TEST, __LINE__, __FILE__ );   \
-          return( PSA_ERROR_DETECTED_BY_DRIVER );           \
+          return PSA_ERROR_DETECTED_BY_DRIVER ;           \
        }                                                    \
     } while( 0 )
 
@@ -103,14 +103,14 @@
     {
         case PSA_ECC_FAMILY_SECP_R1:
             if( data_length == PSA_BYTES_TO_BITS( 521 ) )
-                return( 521 );
+                return 521 ;
             break;
         case PSA_ECC_FAMILY_MONTGOMERY:
             if( data_length == PSA_BYTES_TO_BITS( 255 ) )
-                return( 255 );
+                return 255 ;
     }
     /* If not listed above, assume a multiple of 8 bits. */
-    return( PSA_BYTES_TO_BITS( data_length ) );
+    return PSA_BYTES_TO_BITS( data_length ) ;
 }
 
 
@@ -141,7 +141,7 @@
                           validate_slot_number_directions.slot_number );
     DRIVER_ASSERT_RETURN( method ==
                           validate_slot_number_directions.method );
-    return( validate_slot_number_directions.status );
+    return validate_slot_number_directions.status ;
 }
 
 /* Allocate slot numbers with a monotonic counter. */
@@ -160,13 +160,13 @@
     (void) attributes;
     (void) method;
     if( context->persistent_data_size != sizeof( psa_key_slot_number_t ) )
-        return( PSA_ERROR_DETECTED_BY_DRIVER );
+        return PSA_ERROR_DETECTED_BY_DRIVER ;
     ++*p_counter;
     if( *p_counter == 0 )
-        return( PSA_ERROR_INSUFFICIENT_STORAGE );
+        return PSA_ERROR_INSUFFICIENT_STORAGE ;
     shadow_counter = *p_counter;
     *slot_number = *p_counter;
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 /* Null import: do nothing, but pretend it worked. */
@@ -184,7 +184,7 @@
     /* We're supposed to return a key size. Return one that's correct for
      * plain data keys. */
     *bits = PSA_BYTES_TO_BITS( data_length );
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 /* Null generate: do nothing, but pretend it worked. */
@@ -206,7 +206,7 @@
         DRIVER_ASSERT_RETURN( pubkey_size == 0 );
     }
 
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 /* Null destroy: do nothing, but pretend it worked. */
@@ -217,7 +217,7 @@
     (void) context;
     (void) persistent_data;
     (void) slot_number;
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 
@@ -274,10 +274,10 @@
     if( required_storage > sizeof( ram_slots[slot_number].content ) )
     {
         memset( &ram_slots[slot_number], 0, sizeof( ram_slots[slot_number] ) );
-        return( PSA_ERROR_INSUFFICIENT_STORAGE );
+        return PSA_ERROR_INSUFFICIENT_STORAGE ;
     }
 
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 /* This function does everything except actually generating key material.
@@ -304,7 +304,7 @@
 
     status = ram_create_common( context, slot_number, attributes,
                                 required_storage );
-    return( status );
+    return status ;
 }
 
 static psa_status_t ram_import( psa_drv_se_context_t *context,
@@ -318,7 +318,7 @@
     psa_status_t status = ram_create_common( context, slot_number, attributes,
                                              data_length );
     if( status != PSA_SUCCESS )
-        return( status );
+        return status ;
 
     /* The RAM driver only works for certain key types: raw keys,
      * and ECC key pairs. This is true in particular of the bit-size
@@ -329,18 +329,18 @@
     {
         *bits = ecc_curve_bits( PSA_KEY_TYPE_ECC_GET_FAMILY( type ), data_length );
         if( *bits == 0 )
-            return( PSA_ERROR_DETECTED_BY_DRIVER );
+            return PSA_ERROR_DETECTED_BY_DRIVER ;
     }
     else
     {
         memset( &ram_slots[slot_number], 0, sizeof( ram_slots[slot_number] ) );
-        return( PSA_ERROR_NOT_SUPPORTED );
+        return PSA_ERROR_NOT_SUPPORTED ;
     }
 
     ram_slots[slot_number].bits = *bits;
     memcpy( ram_slots[slot_number].content, data, data_length );
 
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 static psa_status_t ram_export( psa_drv_se_context_t *context,
@@ -354,10 +354,10 @@
     DRIVER_ASSERT_RETURN( slot_number < ARRAY_LENGTH( ram_slots ) );
     actual_size = PSA_BITS_TO_BYTES( ram_slots[slot_number].bits );
     if( actual_size > data_size )
-        return( PSA_ERROR_BUFFER_TOO_SMALL );
+        return PSA_ERROR_BUFFER_TOO_SMALL ;
     *data_length = actual_size;
     memcpy( data, ram_slots[slot_number].content, actual_size );
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 static psa_status_t ram_export_public( psa_drv_se_context_t *context,
@@ -381,10 +381,10 @@
                              PSA_BITS_TO_BYTES( ram_slots[slot_number].bits ),
                              &key );
     if( status != PSA_SUCCESS )
-        return( status );
+        return status ;
     status = psa_export_public_key( key, data, data_size, data_length );
     psa_destroy_key( key );
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 static psa_status_t ram_destroy( psa_drv_se_context_t *context,
@@ -397,7 +397,7 @@
     memset( &ram_slots[slot_number], 0, sizeof( ram_slots[slot_number] ) );
     *slot_usage &= ~(ram_slot_usage_t)( 1 << slot_number );
     ram_shadow_slot_usage = *slot_usage;
-    return( PSA_SUCCESS );
+    return PSA_SUCCESS ;
 }
 
 static psa_status_t ram_allocate( psa_drv_se_context_t *context,
@@ -417,10 +417,10 @@
         if( ! ( *slot_usage & 1 << *slot_number ) )
         {
             ram_shadow_slot_usage = *slot_usage;
-            return( PSA_SUCCESS );
+            return PSA_SUCCESS ;
         }
     }
-    return( PSA_ERROR_INSUFFICIENT_STORAGE );
+    return PSA_ERROR_INSUFFICIENT_STORAGE ;
 }
 
 static psa_status_t ram_validate_slot_number(
@@ -435,8 +435,8 @@
     (void) attributes;
     (void) method;
     if( slot_number >= ARRAY_LENGTH( ram_slots ) )
-        return( PSA_ERROR_INVALID_ARGUMENT );
-    return( PSA_SUCCESS );
+        return PSA_ERROR_INVALID_ARGUMENT ;
+    return PSA_SUCCESS ;
 }
 
 static psa_status_t ram_sign( psa_drv_se_context_t *context,
@@ -470,7 +470,7 @@
 
 exit:
     psa_destroy_key( key );
-    return( status );
+    return status ;
 }
 
 static psa_status_t ram_verify( psa_drv_se_context_t *context,
@@ -504,7 +504,7 @@
 
 exit:
     psa_destroy_key( key );
-    return( status );
+    return status ;
 }
 
 
@@ -583,7 +583,7 @@
      */
     psa_reset_key_attributes( &actual_attributes );
 
-    return( ok );
+    return ok ;
 }
 
 /* Get the file UID corresponding to the specified location.
@@ -593,8 +593,8 @@
 psa_storage_uid_t file_uid_for_location( psa_key_location_t location )
 {
     if( location > PSA_MAX_SE_LOCATION )
-        return( 0 );
-    return( 0xfffffe00 + location );
+        return 0 ;
+    return 0xfffffe00 + location ;
 }
 
 /* Check that the persistent data of a driver has its expected content. */
@@ -615,7 +615,7 @@
 
 exit:
     mbedtls_free( loaded );
-    return( ok );
+    return ok ;
 }
 
 /* Check that no persistent data exists for the given location. */
@@ -629,7 +629,7 @@
     ok = 1;
 
 exit:
-    return( ok );
+    return ok ;
 }
 
 /* Check that a function's return status is "smoke-free", i.e. that
@@ -646,9 +646,9 @@
         case PSA_ERROR_INVALID_ARGUMENT:
         case PSA_ERROR_INVALID_SIGNATURE:
         case PSA_ERROR_INVALID_PADDING:
-            return( 1 );
+            return 1 ;
         default:
-            return( 0 );
+            return 0 ;
     }
 }
 #define SMOKE_ASSERT( expr )                    \
@@ -764,7 +764,7 @@
      */
     psa_reset_key_attributes( &attributes );
 
-    return( ok );
+    return ok ;
 }
 
 static void psa_purge_storage( void )
diff --git a/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function b/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function
index 12c58eb..5d3af02 100644
--- a/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function
+++ b/tests/suites/test_suite_psa_crypto_se_driver_hal_mocks.function
@@ -127,7 +127,7 @@
 
     mock_init_data.called++;
     mock_init_data.location = location;
-    return( mock_init_data.return_value );
+    return mock_init_data.return_value ;
 }
 
 static psa_status_t mock_generate( psa_drv_se_context_t *drv_context,
@@ -146,7 +146,7 @@
     mock_generate_data.attributes = *attributes;
     mock_generate_data.pubkey_size = pubkey_size;
 
-    return( mock_generate_data.return_value );
+    return mock_generate_data.return_value ;
 }
 
 static psa_status_t mock_import( psa_drv_se_context_t *drv_context,
@@ -166,7 +166,7 @@
     mock_import_data.attributes = *attributes;
     mock_import_data.data_length = data_length;
 
-    return( mock_import_data.return_value );
+    return mock_import_data.return_value ;
 }
 
 psa_status_t mock_export( psa_drv_se_context_t *context,
@@ -183,7 +183,7 @@
     mock_export_data.slot_number = slot_number;
     mock_export_data.data_size = data_size;
 
-    return( mock_export_data.return_value );
+    return mock_export_data.return_value ;
 }
 
 psa_status_t mock_export_public( psa_drv_se_context_t *context,
@@ -200,7 +200,7 @@
     mock_export_public_data.slot_number = slot_number;
     mock_export_public_data.data_size = data_size;
 
-    return( mock_export_public_data.return_value );
+    return mock_export_public_data.return_value ;
 }
 
 psa_status_t mock_sign( psa_drv_se_context_t *context,
@@ -262,7 +262,7 @@
     mock_allocate_data.called++;
     *key_slot = 0;
 
-    return( mock_allocate_data.return_value );
+    return mock_allocate_data.return_value ;
 }
 
 psa_status_t mock_destroy( psa_drv_se_context_t *context,
@@ -275,7 +275,7 @@
     mock_destroy_data.called++;
     mock_destroy_data.slot_number = slot_number;
 
-    return( mock_destroy_data.return_value );
+    return mock_destroy_data.return_value ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_psa_crypto_slot_management.function b/tests/suites/test_suite_psa_crypto_slot_management.function
index aa3ce28..ca54966 100644
--- a/tests/suites/test_suite_psa_crypto_slot_management.function
+++ b/tests/suites/test_suite_psa_crypto_slot_management.function
@@ -68,9 +68,9 @@
         case INVALIDATE_BY_SHUTDOWN:
             break;
     }
-    return( 1 );
+    return 1 ;
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 /** Restart the PSA subsystem if \p invalidate_method says so. */
@@ -81,7 +81,7 @@
         case INVALIDATE_BY_CLOSING:
         case INVALIDATE_BY_DESTROYING:
         case INVALIDATE_BY_PURGING:
-            return( 1 );
+            return 1 ;
         case INVALIDATE_BY_CLOSING_WITH_SHUTDOWN:
         case INVALIDATE_BY_DESTROYING_WITH_SHUTDOWN:
         case INVALIDATE_BY_PURGING_WITH_SHUTDOWN:
@@ -97,10 +97,10 @@
 
     PSA_ASSERT( psa_crypto_init( ) );
     ASSERT_PSA_PRISTINE( );
-    return( 1 );
+    return 1 ;
 
 exit:
-    return( 0 );
+    return 0 ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_psa_crypto_storage_format.function b/tests/suites/test_suite_psa_crypto_storage_format.function
index b90ef6e..76d8189 100644
--- a/tests/suites/test_suite_psa_crypto_storage_format.function
+++ b/tests/suites/test_suite_psa_crypto_storage_format.function
@@ -46,18 +46,18 @@
 
 exit:
     mbedtls_free( actual_representation );
-    return( ok );
+    return ok ;
 }
 
 /** Check if a key is exportable. */
 static int can_export( const psa_key_attributes_t *attributes )
 {
     if( psa_get_key_usage_flags( attributes ) & PSA_KEY_USAGE_EXPORT )
-        return( 1 );
+        return 1 ;
     else if( PSA_KEY_TYPE_IS_PUBLIC_KEY( psa_get_key_type( attributes ) ) )
-        return( 1 );
+        return 1 ;
     else
-        return( 0 );
+        return 0 ;
 }
 
 /** Write a key with the given representation to storage, then check
@@ -137,7 +137,7 @@
     psa_reset_key_attributes( &actual_attributes );
     psa_its_remove( uid );
     mbedtls_free( exported_material );
-    return( ok );
+    return ok ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_psa_its.function b/tests/suites/test_suite_psa_its.function
index fb9ce07..79e5ccc 100644
--- a/tests/suites/test_suite_psa_its.function
+++ b/tests/suites/test_suite_psa_its.function
@@ -68,7 +68,7 @@
 {
     if( uid_max != (psa_storage_uid_t)( -1 ) && uid_max < uid )
         uid_max = uid;
-    return( psa_its_set( uid, data_length, p_data, create_flags ) );
+    return psa_its_set( uid, data_length, p_data, create_flags ) ;
 }
 
 /* END_HEADER */
diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function
index 72b0cdb..b24e131 100644
--- a/tests/suites/test_suite_ssl.function
+++ b/tests/suites/test_suite_ssl.function
@@ -1177,7 +1177,7 @@
     (void) name;
     (void) name_len;
 
-    return ( 0 );
+    return 0 ;
 }
 
 #if MBEDTLS_SSL_CID_OUT_LEN_MAX > MBEDTLS_SSL_CID_IN_LEN_MAX
@@ -1428,7 +1428,7 @@
     mbedtls_free( md0 );
     mbedtls_free( md1 );
 
-    return( ret );
+    return ret ;
 }
 
 /*
@@ -1458,13 +1458,13 @@
         mbedtls_x509_crt_init( &tmp_crt );
         ret = mbedtls_x509_crt_parse_file( &tmp_crt, crt_file );
         if( ret != 0 )
-            return( ret );
+            return ret ;
 
 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
         /* Move temporary CRT. */
         session->peer_cert = mbedtls_calloc( 1, sizeof( *session->peer_cert ) );
         if( session->peer_cert == NULL )
-            return( -1 );
+            return -1 ;
         *session->peer_cert = tmp_crt;
         memset( &tmp_crt, 0, sizeof( tmp_crt ) );
 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
@@ -1472,13 +1472,13 @@
         session->peer_cert_digest =
             mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
         if( session->peer_cert_digest == NULL )
-            return( -1 );
+            return -1 ;
         ret = mbedtls_md( mbedtls_md_info_from_type(
                               MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
                           tmp_crt.raw.p, tmp_crt.raw.len,
                           session->peer_cert_digest );
         if( ret != 0 )
-            return( ret );
+            return ret ;
         session->peer_cert_digest_type =
             MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
         session->peer_cert_digest_len =
@@ -1497,7 +1497,7 @@
     {
         session->ticket = mbedtls_calloc( 1, ticket_len );
         if( session->ticket == NULL )
-            return( -1 );
+            return -1 ;
         memset( session->ticket, 33, ticket_len );
     }
     session->ticket_len = ticket_len;
@@ -1513,7 +1513,7 @@
     session->encrypt_then_mac = 1;
 #endif
 
-    return( 0 );
+    return 0 ;
 }
 
 /*
diff --git a/tests/suites/test_suite_x509parse.function b/tests/suites/test_suite_x509parse.function
index fea02f3..912364c 100644
--- a/tests/suites/test_suite_x509parse.function
+++ b/tests/suites/test_suite_x509parse.function
@@ -139,7 +139,7 @@
     }
 
     *candidates = first;
-    return( ret );
+    return ret ;
 }
 #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
 
@@ -154,10 +154,10 @@
     if( *levels & ( 1 << certificate_depth ) )
     {
         *flags |= ( 1 << certificate_depth );
-        return( -1 - certificate_depth );
+        return -1 - certificate_depth ;
     }
 
-    return( 0 );
+    return 0 ;
 }
 
 /* strsep() not available on Windows */
@@ -167,7 +167,7 @@
     char *ret = *stringp;
 
     if( *stringp == NULL )
-        return( NULL );
+        return NULL ;
 
     for( ; ; (*stringp)++ )
     {
@@ -187,7 +187,7 @@
     }
 
 done:
-    return( ret );
+    return ret ;
 }
 
 #if defined(MBEDTLS_X509_CRT_PARSE_C)
@@ -227,7 +227,7 @@
 
     ctx->p = p;
 
-    return( 0 );
+    return 0 ;
 }
 
 int verify_parse_san( mbedtls_x509_subject_alternative_name *san,
@@ -265,7 +265,7 @@
                if( san->san.other_name.value.hardware_module_name.val.len >= n )
                {
                    *p = '\0';
-                   return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL );
+                   return MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ;
                }
 
                for( i=0; i < san->san.other_name.value.hardware_module_name.val.len; i++ )
@@ -281,7 +281,7 @@
             if( san->san.unstructured_name.len >= n )
             {
                 *p = '\0';
-                return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL );
+                return MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ;
             }
             n -= san->san.unstructured_name.len;
             for( i = 0; i < san->san.unstructured_name.len; i++ )
@@ -292,7 +292,7 @@
         /*
          * Should not happen.
          */
-        return( -1 );
+        return -1 ;
     }
     ret = mbedtls_snprintf( p, n, "\n" );
     MBEDTLS_X509_SAFE_SNPRINTF;
@@ -300,7 +300,7 @@
     *size = n;
     *buf = p;
 
-    return( 0 );
+    return 0 ;
 }
 
 int parse_crt_ext_cb( void *p_ctx, mbedtls_x509_crt const *crt, mbedtls_x509_buf const *oid,
@@ -321,7 +321,7 @@
         ret = mbedtls_asn1_get_tag( p, end, &len,
                                  MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE );
         if( ret != 0 )
-            return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) );
+            return MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) ;
 
         if( *p + len != end )
             return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS,
@@ -343,13 +343,13 @@
              */
             if( ( ret = mbedtls_asn1_get_tag( p, end, &len,
                     MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
-                return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) );
+                return MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) ;
 
             policy_end = *p + len;
 
             if( ( ret = mbedtls_asn1_get_tag( p, policy_end, &len,
                                               MBEDTLS_ASN1_OID ) ) != 0 )
-                return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) );
+                return MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) ;
 
             /*
              * Recognize exclusively the policy with OID 1
@@ -367,7 +367,7 @@
             {
                 if( ( ret = mbedtls_asn1_get_tag( p, policy_end, &len,
                          MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
-                    return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) );
+                    return MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS, ret ) ;
                 /*
                  * Skip the optional policy qualifiers.
                  */
@@ -383,11 +383,11 @@
             return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS,
                     MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ) );
 
-        return( parse_ret );
+        return parse_ret ;
     }
     else if( new_oid != NULL && new_oid->tag == oid->tag && new_oid->len == oid->len &&
              memcmp( new_oid->p, oid->p, oid->len ) == 0 )
-        return( 0 );
+        return 0 ;
     else
         return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_EXTENSIONS,
                                    MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) );
@@ -1059,9 +1059,9 @@
 
     /* Load a chain with nb_int intermediates (from 01 to nb_int),
      * plus one "end-entity" cert (nb_int + 1) */
-    ret = mbedtls_snprintf( file_buf, sizeof file_buf, "%s/c%02d.pem", chain_dir,
+    ret = mbedtls_snprintf( file_buf, sizeof(file_buf), "%s/c%02d.pem", chain_dir,
                                                             nb_int + 1 );
-    TEST_ASSERT( ret > 0 && (size_t) ret < sizeof file_buf );
+    TEST_ASSERT( ret > 0 && (size_t) ret < sizeof(file_buf) );
     TEST_ASSERT( mbedtls_x509_crt_parse_file( &chain, file_buf ) == 0 );
 
     /* Try to verify that chain */
@@ -1155,13 +1155,13 @@
     mbedtls_x509_buf oid;
     char num_buf[100];
 
-    memset( num_buf, 0x2a, sizeof num_buf );
+    memset( num_buf, 0x2a, sizeof(num_buf) );
 
     oid.tag = MBEDTLS_ASN1_OID;
     oid.p   = oid_buf->x;
     oid.len   = oid_buf->len;
 
-    TEST_ASSERT( (size_t) blen <= sizeof num_buf );
+    TEST_ASSERT( (size_t) blen <= sizeof(num_buf) );
 
     TEST_ASSERT( mbedtls_oid_get_numeric_string( num_buf, blen, &oid ) == ret );
 
diff --git a/tests/suites/test_suite_x509write.function b/tests/suites/test_suite_x509write.function
index 261794c..a545093 100644
--- a/tests/suites/test_suite_x509write.function
+++ b/tests/suites/test_suite_x509write.function
@@ -24,7 +24,7 @@
 }
 size_t mbedtls_rsa_key_len_func( void *ctx )
 {
-    return( ((const mbedtls_rsa_context *) ctx)->len );
+    return ((const mbedtls_rsa_context *) ctx)->len ;
 }
 #endif /* MBEDTLS_RSA_C */
 
@@ -64,7 +64,7 @@
 cleanup:
 
     mbedtls_x509_csr_free( &csr );
-    return( ret );
+    return ret ;
 }
 #endif /* MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_PEM_WRITE_C && MBEDTLS_X509_CSR_WRITE_C */
 
