Use enum for slot state in PSA-based cipher context
diff --git a/include/mbedtls/cipher_internal.h b/include/mbedtls/cipher_internal.h
index f1f0e2b..cecad9a 100644
--- a/include/mbedtls/cipher_internal.h
+++ b/include/mbedtls/cipher_internal.h
@@ -119,14 +119,26 @@
} mbedtls_cipher_definition_t;
#if defined(MBEDTLS_USE_PSA_CRYPTO)
+typedef enum
+{
+ MBEDTLS_CIPHER_PSA_KEY_UNSET = 0,
+ MBEDTLS_CIPHER_PSA_KEY_OWNED, /* Used for PSA-based cipher contexts
+ * which use raw key material internally
+ * imported into a freshly allocated key slot,
+ * and which hence need to destroy that key
+ * slot when they are no longer needed. */
+ MBEDTLS_CIPHER_PSA_KEY_NOT_OWNED, /* Used for PSA-based cipher contexts
+ * which use a key from a key slot
+ * provided by the user, and which hence
+ * should not be destroyed when the
+ * context is no longer needed. */
+} mbedtls_cipher_psa_key_ownership;
+
typedef struct
{
psa_algorithm_t alg;
psa_key_slot_t slot;
- unsigned char slot_state; /*!< 0: The slot is unset.
- * 1: The slot is set and we own it.
- * 2: The slot is set but we don't own it. */
-
+ mbedtls_cipher_psa_key_ownership slot_state;
} mbedtls_cipher_context_psa;
#endif /* MBEDTLS_USE_PSA_CRYPTO */
diff --git a/library/cipher.c b/library/cipher.c
index e9a1a07..95146ac 100644
--- a/library/cipher.c
+++ b/library/cipher.c
@@ -175,7 +175,7 @@
mbedtls_cipher_context_psa * const cipher_psa =
(mbedtls_cipher_context_psa *) ctx->cipher_ctx;
- if( cipher_psa->slot_state == 1 )
+ if( cipher_psa->slot_state == MBEDTLS_CIPHER_PSA_KEY_OWNED )
{
/* xxx_free() doesn't allow to return failures. */
(void) psa_destroy_key( cipher_psa->slot );
@@ -299,14 +299,16 @@
return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
/* Don't allow keys to be set multiple times. */
- if( cipher_psa->slot_state != 0 )
+ if( cipher_psa->slot_state != MBEDTLS_CIPHER_PSA_KEY_UNSET )
return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
/* Find a fresh key slot to use. */
status = mbedtls_psa_get_free_key_slot( &cipher_psa->slot );
if( status != PSA_SUCCESS )
return( MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED );
- cipher_psa->slot_state = 1; /* Indicate that we own the key slot. */
+ /* Indicate that we own the key slot and need to
+ * destroy it in mbedtls_cipher_free(). */
+ cipher_psa->slot_state = MBEDTLS_CIPHER_PSA_KEY_OWNED;
/* From that point on, the responsibility for destroying the
* key slot is on mbedtls_cipher_free(). This includes the case