diff --git a/library/psa_crypto_driver_wrappers.c b/library/psa_crypto_driver_wrappers.c
index 43aa180cb4..81a7d4dc20 100644
--- a/library/psa_crypto_driver_wrappers.c
+++ b/library/psa_crypto_driver_wrappers.c
@@ -1083,6 +1083,12 @@ psa_status_t psa_driver_wrapper_hash_compute(
     psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
 
     /* Try accelerators first */
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+    status = test_transparent_hash_compute( alg, input, input_length,
+                                            hash, hash_size, hash_length );
+    if( status != PSA_ERROR_NOT_SUPPORTED )
+        return( status );
+#endif
 
     /* If software fallback is compiled in, try fallback */
 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
@@ -1112,6 +1118,14 @@ psa_status_t psa_driver_wrapper_hash_setup(
     psa_status_t status = PSA_ERROR_NOT_SUPPORTED;
 
     /* Try setup on accelerators first */
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+    status = test_transparent_hash_setup( &operation->ctx.test_ctx, alg );
+    if( status == PSA_SUCCESS )
+        operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
+
+    if( status != PSA_ERROR_NOT_SUPPORTED )
+        return( status );
+#endif
 
     /* If software fallback is compiled in, try fallback */
 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
@@ -1135,6 +1149,12 @@ psa_status_t psa_driver_wrapper_hash_clone(
 {
     switch( source_operation->id )
     {
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+        case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
+            target_operation->id = PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID;
+            return( test_transparent_hash_clone( &source_operation->ctx.test_ctx,
+                                                 &target_operation->ctx.test_ctx ) );
+#endif
 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
             target_operation->id = PSA_CRYPTO_MBED_TLS_DRIVER_ID;
@@ -1155,6 +1175,11 @@ psa_status_t psa_driver_wrapper_hash_update(
 {
     switch( operation->id )
     {
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+        case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
+            return( test_transparent_hash_update( &operation->ctx.test_ctx,
+                                                  input, input_length ) );
+#endif
 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
             return( mbedtls_psa_hash_update( &operation->ctx.mbedtls_ctx,
@@ -1176,6 +1201,11 @@ psa_status_t psa_driver_wrapper_hash_finish(
 {
     switch( operation->id )
     {
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+        case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
+            return( test_transparent_hash_finish( &operation->ctx.test_ctx,
+                                                  hash, hash_size, hash_length ) );
+#endif
 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
             return( mbedtls_psa_hash_finish( &operation->ctx.mbedtls_ctx,
@@ -1196,6 +1226,10 @@ psa_status_t psa_driver_wrapper_hash_abort(
 {
     switch( operation->id )
     {
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+        case PSA_CRYPTO_TRANSPARENT_TEST_DRIVER_ID:
+            return( test_transparent_hash_abort( &operation->ctx.test_ctx ) );
+#endif
 #if defined(MBEDTLS_PSA_BUILTIN_HASH)
         case PSA_CRYPTO_MBED_TLS_DRIVER_ID:
             return( mbedtls_psa_hash_abort( &operation->ctx.mbedtls_ctx ) );
diff --git a/library/psa_crypto_driver_wrappers_contexts.h b/library/psa_crypto_driver_wrappers_contexts.h
index 9bb79664a4..db4153c4d9 100644
--- a/library/psa_crypto_driver_wrappers_contexts.h
+++ b/library/psa_crypto_driver_wrappers_contexts.h
@@ -28,6 +28,9 @@
 
 /* Include all structure definitions for the drivers that have been included
  * during the auto-generation of this file (autogeneration not yet in place) */
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+#include "test/drivers/test_driver.h"
+#endif
 
 /* Include the structure definitions for the mbed TLS software drivers */
 #include "psa_crypto_hash.h"
@@ -42,6 +45,9 @@
 union psa_driver_hash_context_u {
     unsigned dummy; /* Make sure this structure is always non-empty */
     mbedtls_psa_hash_operation_t mbedtls_ctx;
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+    test_transparent_hash_operation_t test_ctx;
+#endif
 };
 
 #endif /* PSA_CRYPTO_DRIVER_WRAPPERS_CONTEXTS_H */
diff --git a/library/psa_crypto_hash.c b/library/psa_crypto_hash.c
index 8ac21d0cb6..bd3b57e6e7 100644
--- a/library/psa_crypto_hash.c
+++ b/library/psa_crypto_hash.c
@@ -434,4 +434,179 @@ psa_status_t mbedtls_psa_hash_abort(
     return( PSA_SUCCESS );
 }
 
+ /*
+  * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
+  */
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+
+#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_MD4) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_MD5) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384) || \
+    defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
+#define INCLUDE_HASH_TEST_DRIVER
+#endif
+
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+psa_status_t is_hash_accelerated( psa_algorithm_t alg )
+{
+    switch( alg )
+    {
+#if defined(MBEDTLS_PSA_ACCEL_ALG_MD2)
+        case PSA_ALG_MD2:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_MD4)
+        case PSA_ALG_MD4:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_MD5)
+        case PSA_ALG_MD5:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_RIPEMD160)
+        case PSA_ALG_RIPEMD160:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_1)
+        case PSA_ALG_SHA_1:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_224)
+        case PSA_ALG_SHA_224:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_256)
+        case PSA_ALG_SHA_256:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_384)
+        case PSA_ALG_SHA_384:
+            return( PSA_SUCCESS );
+#endif
+#if defined(MBEDTLS_PSA_ACCEL_ALG_SHA_512)
+        case PSA_ALG_SHA_512:
+            return( PSA_SUCCESS );
+#endif
+        default:
+            return( PSA_ERROR_NOT_SUPPORTED );
+    }
+}
+#endif /* INCLUDE_HASH_TEST_DRIVER */
+
+psa_status_t test_transparent_hash_compute(
+    psa_algorithm_t alg,
+    const uint8_t *input,
+    size_t input_length,
+    uint8_t *hash,
+    size_t hash_size,
+    size_t *hash_length)
+{
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+    if( is_hash_accelerated( alg ) == PSA_SUCCESS )
+        return( mbedtls_psa_hash_compute( alg, input, input_length,
+                                          hash, hash_size, hash_length ) );
+    else
+        return( PSA_ERROR_NOT_SUPPORTED );
+#else
+    (void) alg;
+    (void) input;
+    (void) input_length;
+    (void) hash;
+    (void) hash_size;
+    (void) hash_length;
+    return( PSA_ERROR_NOT_SUPPORTED );
+#endif
+}
+
+psa_status_t test_transparent_hash_setup(
+    test_transparent_hash_operation_t *operation,
+    psa_algorithm_t alg )
+{
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+    if( is_hash_accelerated( alg ) == PSA_SUCCESS )
+        return( mbedtls_psa_hash_setup( &operation->operation, alg ) );
+    else
+        return( PSA_ERROR_NOT_SUPPORTED );
+#else
+    (void) alg;
+    (void) operation;
+    return( PSA_ERROR_NOT_SUPPORTED );
+#endif
+}
+
+psa_status_t test_transparent_hash_clone(
+    const test_transparent_hash_operation_t *source_operation,
+    test_transparent_hash_operation_t *target_operation )
+{
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+    if( is_hash_accelerated( source_operation->operation.alg ) == PSA_SUCCESS )
+        return( mbedtls_psa_hash_clone( &source_operation->operation,
+                                        &target_operation->operation ) );
+    else
+        return( PSA_ERROR_BAD_STATE );
+#else
+    (void) source_operation;
+    (void) target_operation;
+    return( PSA_ERROR_NOT_SUPPORTED );
+#endif
+}
+
+psa_status_t test_transparent_hash_update(
+    test_transparent_hash_operation_t *operation,
+    const uint8_t *input,
+    size_t input_length )
+{
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+    if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
+        return( mbedtls_psa_hash_update( &operation->operation,
+                                         input, input_length ) );
+    else
+        return( PSA_ERROR_BAD_STATE );
+#else
+    (void) operation;
+    (void) input;
+    (void) input_length;
+    return( PSA_ERROR_NOT_SUPPORTED );
+#endif
+}
+
+psa_status_t test_transparent_hash_finish(
+    test_transparent_hash_operation_t *operation,
+    uint8_t *hash,
+    size_t hash_size,
+    size_t *hash_length )
+{
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+    if( is_hash_accelerated( operation->operation.alg ) == PSA_SUCCESS )
+        return( mbedtls_psa_hash_finish( &operation->operation,
+                                         hash, hash_size, hash_length ) );
+    else
+        return( PSA_ERROR_BAD_STATE );
+#else
+    (void) operation;
+    (void) hash;
+    (void) hash_size;
+    (void) hash_length;
+    return( PSA_ERROR_NOT_SUPPORTED );
+#endif
+}
+
+psa_status_t test_transparent_hash_abort(
+    test_transparent_hash_operation_t *operation )
+{
+#if defined(INCLUDE_HASH_TEST_DRIVER)
+    return( mbedtls_psa_hash_abort( &operation->operation ) );
+#else
+    (void) operation;
+    return( PSA_ERROR_NOT_SUPPORTED );
+#endif
+}
+
+#endif /* PSA_CRYPTO_DRIVER_TEST */
+
 #endif /* MBEDTLS_PSA_CRYPTO_C */
diff --git a/tests/include/test/drivers/hash.h b/tests/include/test/drivers/hash.h
new file mode 100644
index 0000000000..45c770c811
--- /dev/null
+++ b/tests/include/test/drivers/hash.h
@@ -0,0 +1,69 @@
+/*
+ * Test driver for hash functions
+ */
+/*  Copyright The Mbed TLS Contributors
+ *  SPDX-License-Identifier: Apache-2.0
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License"); you may
+ *  not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+#ifndef PSA_CRYPTO_TEST_DRIVERS_HASH_H
+#define PSA_CRYPTO_TEST_DRIVERS_HASH_H
+
+#if !defined(MBEDTLS_CONFIG_FILE)
+#include "mbedtls/config.h"
+#else
+#include MBEDTLS_CONFIG_FILE
+#endif
+
+#if defined(PSA_CRYPTO_DRIVER_TEST)
+/* Include path is relative to the tests/include folder, which is the base
+ * include path for including this (hash.h) test driver header. */
+#include "../../library/psa_crypto_hash.h"
+
+typedef struct {
+    mbedtls_psa_hash_operation_t operation;
+} test_transparent_hash_operation_t;
+
+psa_status_t test_transparent_hash_compute(
+    psa_algorithm_t alg,
+    const uint8_t *input,
+    size_t input_length,
+    uint8_t *hash,
+    size_t hash_size,
+    size_t *hash_length);
+
+psa_status_t test_transparent_hash_setup(
+    test_transparent_hash_operation_t *operation,
+    psa_algorithm_t alg );
+
+psa_status_t test_transparent_hash_clone(
+    const test_transparent_hash_operation_t *source_operation,
+    test_transparent_hash_operation_t *target_operation );
+
+psa_status_t test_transparent_hash_update(
+    test_transparent_hash_operation_t *operation,
+    const uint8_t *input,
+    size_t input_length );
+
+psa_status_t test_transparent_hash_finish(
+    test_transparent_hash_operation_t *operation,
+    uint8_t *hash,
+    size_t hash_size,
+    size_t *hash_length );
+
+psa_status_t test_transparent_hash_abort(
+    test_transparent_hash_operation_t *operation );
+
+#endif /* PSA_CRYPTO_DRIVER_TEST */
+#endif /* PSA_CRYPTO_TEST_DRIVERS_HASH_H */
diff --git a/tests/include/test/drivers/test_driver.h b/tests/include/test/drivers/test_driver.h
index f26b795dd4..8783924b80 100644
--- a/tests/include/test/drivers/test_driver.h
+++ b/tests/include/test/drivers/test_driver.h
@@ -26,5 +26,6 @@
 #include "test/drivers/key_management.h"
 #include "test/drivers/cipher.h"
 #include "test/drivers/size.h"
+#include "test/drivers/hash.h"
 
 #endif /* PSA_CRYPTO_TEST_DRIVER_H */
diff --git a/visualc/VS2010/mbedTLS.vcxproj b/visualc/VS2010/mbedTLS.vcxproj
index c4ec8b674a..7322cc76de 100644
--- a/visualc/VS2010/mbedTLS.vcxproj
+++ b/visualc/VS2010/mbedTLS.vcxproj
@@ -242,6 +242,7 @@
     <ClInclude Include="..\..\tests\include\test\psa_helpers.h" />
     <ClInclude Include="..\..\tests\include\test\random.h" />
     <ClInclude Include="..\..\tests\include\test\drivers\cipher.h" />
+    <ClInclude Include="..\..\tests\include\test\drivers\hash.h" />
     <ClInclude Include="..\..\tests\include\test\drivers\key_management.h" />
     <ClInclude Include="..\..\tests\include\test\drivers\signature.h" />
     <ClInclude Include="..\..\tests\include\test\drivers\size.h" />