From f9fbc38e66fbd6ee0a375e3ff43df2370c3502f1 Mon Sep 17 00:00:00 2001 From: Gilles Peskine Date: Wed, 15 May 2019 18:42:09 +0200 Subject: [PATCH] Declare key id 0 as invalid In keeping with other integral types, declare 0 to be an invalid key identifier. Documented, implemented and tested. --- include/psa/crypto_types.h | 4 ++-- include/psa/crypto_values.h | 2 +- library/psa_crypto_slot_management.c | 15 +++++++-------- .../test_suite_psa_crypto_slot_management.data | 8 ++++++++ 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/include/psa/crypto_types.h b/include/psa/crypto_types.h index 44c7c66e0..ced42de1a 100644 --- a/include/psa/crypto_types.h +++ b/include/psa/crypto_types.h @@ -107,8 +107,8 @@ typedef uint32_t psa_key_lifetime_t; * #PSA_KEY_ID_USER_MIN to #PSA_KEY_ID_USER_MAX. * - Implementations may define additional key identifiers in the range * #PSA_KEY_ID_VENDOR_MIN to #PSA_KEY_ID_VENDOR_MAX. - * - Key identifiers outside these ranges are reserved for future use - * in future versions of this specification. + * - 0 is reserved as an invalid key identifier. + * - Key identifiers outside these ranges are reserved for future use. */ /* Implementation-specific quirk: The Mbed Crypto library can be built as * part of a multi-client service that exposes the PSA Crypto API in each diff --git a/include/psa/crypto_values.h b/include/psa/crypto_values.h index 40172b32d..2ee8839c6 100644 --- a/include/psa/crypto_values.h +++ b/include/psa/crypto_values.h @@ -1442,7 +1442,7 @@ /** The minimum value for a key identifier chosen by the application. */ -#define PSA_KEY_ID_USER_MIN ((psa_key_id_t)0x00000000) +#define PSA_KEY_ID_USER_MIN ((psa_key_id_t)0x00000001) /** The minimum value for a key identifier chosen by the application. */ #define PSA_KEY_ID_USER_MAX ((psa_key_id_t)0x3fffffff) diff --git a/library/psa_crypto_slot_management.c b/library/psa_crypto_slot_management.c index 2ef70db59..22cac619d 100644 --- a/library/psa_crypto_slot_management.c +++ b/library/psa_crypto_slot_management.c @@ -185,15 +185,14 @@ static int psa_is_key_id_valid( psa_key_file_id_t file_id, int vendor_ok ) { psa_app_key_id_t key_id = PSA_KEY_FILE_GET_KEY_ID( file_id ); - /* Reject high values because the file names are reserved for the - * library's internal use. */ - if( key_id > PSA_MAX_PERSISTENT_KEY_IDENTIFIER ) + if( PSA_KEY_ID_USER_MIN <= key_id && key_id <= PSA_KEY_ID_USER_MAX ) + return( 1 ); + else if( vendor_ok && + PSA_KEY_ID_VENDOR_MIN <= key_id && + key_id <= PSA_KEY_ID_VENDOR_MAX ) + return( 1 ); + else return( 0 ); - /* Applications may only create keys in the range - * 0..PSA_KEY_ID_USER_MAX. */ - if( ! vendor_ok && key_id > PSA_KEY_ID_USER_MAX ) - return( 0 ); - return( 1 ); } /** Declare a slot as persistent and load it from storage. diff --git a/tests/suites/test_suite_psa_crypto_slot_management.data b/tests/suites/test_suite_psa_crypto_slot_management.data index 519e81ec7..ecfb37a0c 100644 --- a/tests/suites/test_suite_psa_crypto_slot_management.data +++ b/tests/suites/test_suite_psa_crypto_slot_management.data @@ -34,6 +34,10 @@ create_existent:PSA_KEY_LIFETIME_PERSISTENT:1:CLOSE_AFTER Attempt to overwrite: keep open create_existent:PSA_KEY_LIFETIME_PERSISTENT:1:KEEP_OPEN +Open failure: invalid identifier (0) +depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C +open_fail:0:PSA_ERROR_INVALID_ARGUMENT + Open failure: invalid identifier (random seed UID) depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C open_fail:PSA_CRYPTO_ITS_RANDOM_SEED_UID:PSA_ERROR_INVALID_ARGUMENT @@ -53,6 +57,10 @@ open_fail:1:PSA_ERROR_DOES_NOT_EXIST Create failure: invalid lifetime create_fail:0x7fffffff:0:PSA_ERROR_INVALID_ARGUMENT +Create failure: invalid key id (0) +depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C +create_fail:PSA_KEY_LIFETIME_PERSISTENT:0:PSA_ERROR_INVALID_ARGUMENT + Create failure: invalid key id (random seed UID) depends_on:MBEDTLS_PSA_CRYPTO_STORAGE_C create_fail:PSA_KEY_LIFETIME_PERSISTENT:PSA_CRYPTO_ITS_RANDOM_SEED_UID:PSA_ERROR_INVALID_ARGUMENT