diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index 16e0d89..847413b 100644
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -2842,22 +2842,31 @@
 /* Asymmetric cryptography */
 /****************************************************************/
 
-typedef enum
+static psa_status_t psa_sign_verify_check_alg( uint8_t do_hash,
+                                               psa_algorithm_t alg )
 {
-    PSA_SIGN_INVALID = 0,
-    PSA_SIGN_HASH = 1,
-    PSA_SIGN_MESSAGE
-} psa_sign_operation_t;
+    if( do_hash )
+    {
+        if( ! PSA_ALG_IS_SIGN_MESSAGE( alg ) )
+            return( PSA_ERROR_INVALID_ARGUMENT );
 
-typedef enum
-{
-    PSA_VERIFY_INVALID = 0,
-    PSA_VERIFY_HASH = 1,
-    PSA_VERIFY_MESSAGE
-} psa_verify_operation_t;
+        if ( PSA_ALG_IS_HASH_AND_SIGN( alg ) )
+        {
+            if( ! PSA_ALG_IS_HASH( PSA_ALG_SIGN_GET_HASH( alg ) ) )
+                return( PSA_ERROR_INVALID_ARGUMENT );
+        }
+    }
+    else
+    {
+        if( ! PSA_ALG_IS_HASH_AND_SIGN( alg ) )
+            return( PSA_ERROR_INVALID_ARGUMENT );
+    }
+
+    return( PSA_SUCCESS );
+}
 
 static psa_status_t psa_sign_internal( mbedtls_svc_key_id_t key,
-                                       psa_sign_operation_t operation,
+                                       uint8_t do_hash,
                                        psa_algorithm_t alg,
                                        const uint8_t * input,
                                        size_t input_length,
@@ -2871,27 +2880,9 @@
 
     *signature_length = 0;
 
-    switch( operation )
-    {
-        case PSA_SIGN_HASH:
-            if( ! PSA_ALG_IS_HASH_AND_SIGN( alg ) )
-                return( PSA_ERROR_INVALID_ARGUMENT );
-            break;
-
-        case PSA_SIGN_MESSAGE:
-            if( ! PSA_ALG_IS_SIGN_MESSAGE( alg ) )
-                return( PSA_ERROR_INVALID_ARGUMENT );
-
-            if ( PSA_ALG_IS_HASH_AND_SIGN( alg ) )
-            {
-                if( ! PSA_ALG_IS_HASH( PSA_ALG_SIGN_GET_HASH( alg ) ) )
-                    return( PSA_ERROR_INVALID_ARGUMENT );
-            }
-            break;
-
-        default:
-            return( PSA_ERROR_INVALID_ARGUMENT );
-    }
+    status = psa_sign_verify_check_alg( do_hash, alg );
+    if( status != PSA_SUCCESS )
+        return status;
 
     /* Immediately reject a zero-length signature buffer. This guarantees
      * that signature must be a valid pointer. (On the other hand, the input
@@ -2902,8 +2893,8 @@
 
     status = psa_get_and_lock_key_slot_with_policy(
                 key, &slot,
-                operation == PSA_SIGN_HASH ? PSA_KEY_USAGE_SIGN_HASH :
-                                             PSA_KEY_USAGE_SIGN_MESSAGE,
+                do_hash ? PSA_KEY_USAGE_SIGN_MESSAGE :
+                          PSA_KEY_USAGE_SIGN_HASH,
                 alg );
 
     if( status != PSA_SUCCESS )
@@ -2919,14 +2910,14 @@
       .core = slot->attr
     };
 
-    if( operation == PSA_SIGN_MESSAGE )
+    if( do_hash )
     {
         status = psa_driver_wrapper_sign_message(
             &attributes, slot->key.data, slot->key.bytes,
             alg, input, input_length,
             signature, signature_size, signature_length );
     }
-    else if( operation == PSA_SIGN_HASH )
+    else
     {
 
         status = psa_driver_wrapper_sign_hash(
@@ -2955,7 +2946,7 @@
 }
 
 static psa_status_t psa_verify_internal( mbedtls_svc_key_id_t key,
-                                         psa_verify_operation_t operation,
+                                         uint8_t do_hash,
                                          psa_algorithm_t alg,
                                          const uint8_t * input,
                                          size_t input_length,
@@ -2966,32 +2957,14 @@
     psa_status_t unlock_status = PSA_ERROR_CORRUPTION_DETECTED;
     psa_key_slot_t *slot;
 
-    switch( operation )
-    {
-        case PSA_VERIFY_HASH:
-            if( ! PSA_ALG_IS_HASH_AND_SIGN( alg ) )
-                return( PSA_ERROR_INVALID_ARGUMENT );
-            break;
-
-        case PSA_VERIFY_MESSAGE:
-            if( ! PSA_ALG_IS_SIGN_MESSAGE( alg ) )
-                return( PSA_ERROR_INVALID_ARGUMENT );
-
-            if ( PSA_ALG_IS_HASH_AND_SIGN( alg ) )
-            {
-                if( ! PSA_ALG_IS_HASH( PSA_ALG_SIGN_GET_HASH( alg ) ) )
-                    return( PSA_ERROR_INVALID_ARGUMENT );
-            }
-            break;
-
-        default:
-            return( PSA_ERROR_INVALID_ARGUMENT );
-    }
+    status = psa_sign_verify_check_alg( do_hash, alg );
+    if( status != PSA_SUCCESS )
+        return status;
 
     status = psa_get_and_lock_key_slot_with_policy(
                 key, &slot,
-                operation == PSA_VERIFY_HASH ? PSA_KEY_USAGE_VERIFY_HASH :
-                                               PSA_KEY_USAGE_VERIFY_MESSAGE,
+                do_hash ? PSA_KEY_USAGE_VERIFY_MESSAGE :
+                          PSA_KEY_USAGE_VERIFY_HASH,
                 alg );
 
     if( status != PSA_SUCCESS )
@@ -3001,14 +2974,14 @@
       .core = slot->attr
     };
 
-    if( operation == PSA_VERIFY_MESSAGE )
+    if( do_hash )
     {
         status = psa_driver_wrapper_verify_message(
             &attributes, slot->key.data, slot->key.bytes,
             alg, input, input_length,
             signature, signature_length );
     }
-    else if( operation == PSA_VERIFY_HASH )
+    else
     {
         status = psa_driver_wrapper_verify_hash(
             &attributes, slot->key.data, slot->key.bytes,
@@ -3054,10 +3027,7 @@
                     signature, signature_size, signature_length );
     }
 
-    return psa_driver_wrapper_sign_hash(
-                attributes, key_buffer, key_buffer_size,
-                alg, input, input_length,
-                signature, signature_size, signature_length );
+    return( PSA_ERROR_NOT_SUPPORTED );
 }
 
 psa_status_t psa_sign_message( mbedtls_svc_key_id_t key,
@@ -3069,7 +3039,7 @@
                                size_t * signature_length )
 {
     return psa_sign_internal(
-        key, PSA_SIGN_MESSAGE, alg, input, input_length,
+        key, 1, alg, input, input_length,
         signature, signature_size, signature_length );
 }
 
@@ -3118,7 +3088,7 @@
                                  size_t signature_length )
 {
     return psa_verify_internal(
-        key, PSA_VERIFY_MESSAGE, alg, input, input_length,
+        key, 1, alg, input, input_length,
         signature, signature_length );
 }
 
@@ -3189,7 +3159,7 @@
                             size_t *signature_length )
 {
     return psa_sign_internal(
-        key, PSA_SIGN_HASH, alg, hash, hash_length,
+        key, 0, alg, hash, hash_length,
         signature, signature_size, signature_length );
 }
 
@@ -3258,7 +3228,7 @@
                               size_t signature_length )
 {
     return psa_verify_internal(
-        key, PSA_VERIFY_HASH, alg, hash, hash_length,
+        key, 0, alg, hash, hash_length,
         signature, signature_length );
 }
 
