From 914f46aad7f3e4ba2b3ffca4bc7261b73070be6d Mon Sep 17 00:00:00 2001 From: cherat01 Date: Thu, 24 Jan 2019 13:32:09 +0530 Subject: [PATCH] Alinging return codes and optional PS api support --- api-specs/include/protected_storage.h | 114 ++++++++------ .../test_s001/test_ps_data.h | 18 +-- .../test_s002/test_its_data.h | 12 +- .../test_s002/test_ps_data.h | 19 ++- .../test_s003/test_s003.c | 17 ++- .../test_s004/test_its_data.h | 2 +- .../test_s005/test_its_data.h | 4 +- .../test_s005/test_ps_data.h | 4 +- .../test_s005/test_s005.c | 2 +- .../test_s006/test_its_data.h | 2 +- .../test_s006/test_ps_data.h | 2 +- .../test_s007/test_entry.c | 2 +- .../test_s007/test_its_data.h | 21 ++- .../test_s007/test_ps_data.h | 21 ++- .../test_s007/test_s007.c | 47 +++--- .../test_s007/test_s007.h | 2 +- .../test_s009/test_its_data.h | 2 +- .../test_s009/test_ps_data.h | 10 +- .../protected_storage/test_p010/source.mk | 20 +++ .../protected_storage/test_p010/test_entry.c | 53 +++++++ .../protected_storage/test_p010/test_p010.c | 122 +++++++++++++++ .../protected_storage/test_p010/test_p010.h | 29 ++++ .../test_p010/test_ps_data.h | 77 ++++++++++ .../protected_storage/test_p011/source.mk | 20 +++ .../protected_storage/test_p011/test_entry.c | 53 +++++++ .../protected_storage/test_p011/test_p011.c | 133 +++++++++++++++++ .../protected_storage/test_p011/test_p011.h | 29 ++++ .../test_p011/test_ps_data.h | 80 ++++++++++ .../protected_storage/test_p012/source.mk | 20 +++ .../protected_storage/test_p012/test_entry.c | 53 +++++++ .../protected_storage/test_p012/test_p012.c | 139 ++++++++++++++++++ .../protected_storage/test_p012/test_p012.h | 30 ++++ .../test_p012/test_ps_data.h | 95 ++++++++++++ .../dev_apis/protected_storage/testsuite.db | 3 + api-tests/docs/psa_its_testlist.md | 19 ++- api-tests/docs/psa_ps_testlist.md | 24 ++- .../nspe/pal_protected_storage_intf.c | 2 + .../nspe/pal_protected_storage_intf.h | 1 + .../nspe/pal_protected_storage_intf.c | 2 + .../nspe/pal_protected_storage_intf.h | 1 + .../nspe/pal_protected_storage_intf.c | 2 + .../nspe/pal_protected_storage_intf.h | 1 + api-tests/val/common/val.h | 1 + .../val/nspe/val_internal_trusted_storage.h | 1 - api-tests/val/nspe/val_protected_storage.h | 4 +- 45 files changed, 1172 insertions(+), 143 deletions(-) create mode 100644 api-tests/dev_apis/protected_storage/test_p010/source.mk create mode 100644 api-tests/dev_apis/protected_storage/test_p010/test_entry.c create mode 100644 api-tests/dev_apis/protected_storage/test_p010/test_p010.c create mode 100644 api-tests/dev_apis/protected_storage/test_p010/test_p010.h create mode 100644 api-tests/dev_apis/protected_storage/test_p010/test_ps_data.h create mode 100644 api-tests/dev_apis/protected_storage/test_p011/source.mk create mode 100644 api-tests/dev_apis/protected_storage/test_p011/test_entry.c create mode 100644 api-tests/dev_apis/protected_storage/test_p011/test_p011.c create mode 100644 api-tests/dev_apis/protected_storage/test_p011/test_p011.h create mode 100644 api-tests/dev_apis/protected_storage/test_p011/test_ps_data.h create mode 100644 api-tests/dev_apis/protected_storage/test_p012/source.mk create mode 100644 api-tests/dev_apis/protected_storage/test_p012/test_entry.c create mode 100644 api-tests/dev_apis/protected_storage/test_p012/test_p012.c create mode 100644 api-tests/dev_apis/protected_storage/test_p012/test_p012.h create mode 100644 api-tests/dev_apis/protected_storage/test_p012/test_ps_data.h diff --git a/api-specs/include/protected_storage.h b/api-specs/include/protected_storage.h index 9fdb1cd3..8b13d974 100644 --- a/api-specs/include/protected_storage.h +++ b/api-specs/include/protected_storage.h @@ -37,7 +37,7 @@ typedef uint32_t psa_ps_create_flags_t; typedef uint64_t psa_ps_uid_t; #define PSA_PS_FLAG_NONE 0 -#define PSA_PS_FLAG_WRITE_ONCE (1 << 0) /**< The data associated with the uid will not be able to be modified or deleted. Intended to be used to set bits in `psa_eps_create_flags_t`*/ +#define PSA_PS_FLAG_WRITE_ONCE (1 << 0) /**< The data associated with the uid will not be able to be modified or deleted. Intended to be used to set bits in `psa_ps_create_flags_t`*/ /** * \brief A container for metadata associated with a specific uid @@ -57,32 +57,39 @@ typedef uint32_t psa_ps_status_t; #define PSA_PS_ERROR_INSUFFICIENT_SPACE 4 /**< The operation failed because there was insufficient space on the storage medium */ #define PSA_PS_ERROR_STORAGE_FAILURE 6 /**< The operation failed because the physical storage has failed (Fatal error) */ #define PSA_PS_ERROR_BAD_POINTER 7 /**< The operation failed because one of the provided pointers is invalid, for example is `NULL` or references memory the caller cannot access */ -#define PSA_PS_ERROR_KEY_NOT_FOUND 8 /**< The operation failed because the provided key value was not found in the storage */ +#define PSA_PS_ERROR_UID_NOT_FOUND 8 /**< The operation failed because the provided uid value was not found in the storage */ #define PSA_PS_ERROR_INCORRECT_SIZE 9 /**< The operation failed because the data associated with provided key is not the same size as `data_size`, or `offset+data_size` is too large for the data, but `offset` is less than the size */ #define PSA_PS_ERROR_OFFSET_INVALID 10 /**< The operation failed because an offset was supplied that is invalid for the existing data associated with the uid. For example, offset is greater that the size of the data */ +#define PSA_PS_ERROR_INVALID_ARGUMENT 11 /**< The operation failed because one or more of the given arguments were invalid (null pointer, wrong flags etc.) */ +#define PSA_PS_ERROR_DATA_CORRUPT 12 /**< The operation failed because data was corrupt when attempting to get the key */ +#define PSA_PS_ERROR_AUTH_FAILED 13 /**< The operation failed because of an authentication failure when attempting to get the key */ +#define PSA_PS_ERROR_OPERATION_FAILED 14 /**< The operation failed because of an unspecified/internal failure */ +#define PSA_PS_ERROR_INVALID_KEY 15 /**< The associated UID does not exist or the provided properties do no match the existing UID */ +#define PSA_PS_ERROR_NOT_SUPPORTED 16 /**< The returning function is not supported in this implementation of the API */ +/** Flag indicating that \ref psa_ps_create and \ref psa_ps_set_extended are supported */ +#define PSA_PS_SUPPORT_SET_EXTENDED (1 << 0) /** * \brief create a new or modify an existing key/value pair * * \param[in] uid the identifier for the data * \param[in] data_length The size in bytes of the data in `p_data` - * \param[in] p_data A buffer containing the data + * \param[in] p_data A buffer containing the data * \param[in] create_flags The flags indicating the properties of the data - * + * * \return A status indicating the success/failure of the operation - - * \retval PSA_PS_SUCCESS The operation completed successfully - * \retval PSA_PS_ERROR_WRITE_ONCE The operation failed because the provided uid value was already created with PSA_PS_WRITE_ONCE_FLAG - * \retval PSA_PS_ERROR_FLAGS_NOT_SUPPORTED The operation failed because one or more of the flags provided in `create_flags` is not supported or is not valid - * \retval PSA_PS_ERROR_FLAGS_SET_AFTER_CREATE The operation failed because a non-zero `create_flags` was provided for a previously created uid - * \retval PSA_PS_ERROR_INSUFFICIENT_SPACE The operation failed because there was insufficient space on the storage medium - * \retval PSA_PS_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) - * \retval PSA_PS_ERROR_BAD_POINTER The operation failed because one of the provided pointers(`p_data`) - * is invalid, for example is `NULL` or references memory the caller cannot access + + * \retval PSA_PS_SUCCESS The operation completed successfully + * \retval PSA_PS_ERROR_WRITE_ONCE The operation failed because the provided uid value was already created with PSA_PS_WRITE_ONCE_FLAG + * \retval PSA_PS_ERROR_INVALID_ARGUMENT The operation The operation failed because one or more of the given arguments were invalid. + * \retval PSA_PS_ERROR_FLAGS_NOT_SUPPORTED The operation failed because one or more of the flags provided in `create_flags` is not supported or is not valid + * \retval PSA_PS_ERROR_INSUFFICIENT_SPACE The operation failed because there was insufficient space on the storage medium + * \retval PSA_PS_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) + * \retval PSA_PS_ERROR_OPERATION_FAILED The operation failed because of an unspecified internal failure */ -psa_ps_status_t psa_ps_set( psa_ps_uid_t uid, uint32_t data_length, - const void *p_data, psa_ps_create_flags_t create_flags ); +psa_ps_status_t psa_ps_set(psa_ps_uid_t uid, uint32_t data_length, + const void *p_data, psa_ps_create_flags_t create_flags); /** * \brief Retrieve the value for a provided uid @@ -91,49 +98,51 @@ psa_ps_status_t psa_ps_set( psa_ps_uid_t uid, uint32_t data_length, * \param[in] data_offset The offset within the data associated with the `uid` to start retrieving data * \param[in] data_length The amount of data to read (and the minimum allocated size of the `p_data` buffer) * \param[out] p_data The buffer where the data will be placed upon successful completion - * + * * \return A status indicating the success/failure of the operation * - * \retval PSA_PS_SUCCESS The operation completed successfully - * \retval PSA_PS_ERROR_KEY_NOT_FOUND The operation failed because the provided uid value was not found in the storage - * \retval PSA_PS_ERROR_INCORRECT_SIZE The operation failed because the data associated with provided uid is not the same size as `data_size` - * \retval PSA_PS_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) - * \retval PSA_PS_ERROR_BAD_POINTER The operation failed because one of the provided pointers(`p_data`) - * is invalid, for example is `NULL` or references memory the caller cannot access - * \retval PSA_PS_ERROR_OFFSET_INVALID The operation failed because an offset was supplied that is invalid for the existing data associated with the - * uid. For example, offset + size is invalid - * \retval PSA_PS_ERROR_OFFSET_NOT_SUPPORTED A non-zero offset was supplied, but the implementation does not support offsets + * \retval PSA_PS_ERROR_INVALID_ARGUMENT The operation The operation failed because one or more of the given arguments were invalid (null pointer, wrong flags etc.) + * \retval PSA_PS_ERROR_UID_NOT_FOUND The operation failed because the provided uid value was not found in the storage + * \retval PSA_PS_ERROR_INCORRECT_SIZE The operation failed because the data associated with provided uid is not the same size as `data_size` + * \retval PSA_PS_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) + * \retval PSA_PS_ERROR_OPERATION_FAILED The operation failed because of an unspecified internal failure + * \retval PSA_PS_ERROR_DATA_CORRUPT The operation failed because of an authentication failure when attempting to get the key + * \retval PSA_PS_ERROR_AUTH_FAILED The operation failed because of an unspecified internal failure */ -psa_ps_status_t psa_ps_get( psa_ps_uid_t uid, uint32_t data_offset, - uint32_t data_length, void *p_data ); +psa_ps_status_t psa_ps_get(psa_ps_uid_t uid, uint32_t data_offset, + uint32_t data_length, void *p_data ); /** * \brief Retrieve the metadata about the provided uid - * + * * \param[in] uid The identifier for the data * \param[out] p_info A pointer to the `psa_ps_info_t` struct that will be populated with the metadata - * + * * \return A status indicating the success/failure of the operation - * - * \retval PSA_PS_SUCCESS The operation completed successfully - * \retval PSA_PS_ERROR_KEY_NOT_FOUND The operation failed because the provided uid value was not found in the storage + * + * \retval PSA_PS_ERROR_SUCCESS The operation completed successfully + * \retval PSA_PS_ERROR_INVALID_ARGUMENT The operation The operation failed because one or more of the given arguments were invalid (null pointer, wrong flags etc.) + * \retval PSA_PS_ERROR_UID_NOT_FOUND The operation failed because the provided uid value was not found in the storage * \retval PSA_PS_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) - * \retval PSA_PS_ERROR_BAD_POINTER The operation failed because one of the provided pointers(`p_info`) - * is invalid, for example is `NULL` or references memory the caller cannot access + * \retval PSA_PS_ERROR_OPERATION_FAILED The operation failed because of an unspecified internal failure + * \retval PSA_PS_ERROR_DATA_CORRUPT The operation failed because of an authentication failure when attempting to get the key + * \retval PSA_PS_ERROR_AUTH_FAILED The operation failed because of an unspecified internal failure */ psa_ps_status_t psa_ps_get_info( psa_ps_uid_t uid, struct psa_ps_info_t *p_info); /** * \brief Remove the provided uid and its associated data from the storage - * + * * \param[in] uid The identifier for the data to be removed - * + * * \return A status indicating the success/failure of the operation - * + * * \retval PSA_PS_SUCCESS The operation completed successfully - * \retval PSA_PS_ERROR_KEY_NOT_FOUND The operation failed because the provided uid value was not found in the storage + * \retval PSA_PS_ERROR_INVALID_ARGUMENT The operation The operation failed because one or more of the given arguments were invalid (null pointer, wrong flags etc.) + * \retval PSA_PS_ERROR_UID_NOT_FOUND The operation failed because the provided uid value was not found in the storage * \retval PSA_PS_ERROR_WRITE_ONCE The operation failed because the provided uid value was created with psa_eps_WRITE_ONCE_FLAG * \retval PSA_PS_ERROR_STORAGE_FAILURE The operation failed because the physical storage has failed (Fatal error) + * \retval PSA_PS_ERROR_OPERATION_FAILED The operation failed because of an unspecified internal failure */ psa_ps_status_t psa_ps_remove( psa_ps_uid_t uid); @@ -141,10 +150,14 @@ psa_ps_status_t psa_ps_remove( psa_ps_uid_t uid); * Creates an asset based on the given identifier, the maximum size and * creation flags. This create allocates the space in the secure storage * area without setting any data in the asset. + * * It is only necessary to call this function for items that will be written * with the \ref psa_ps_set_extended function. If only the \ref psa_ps_set function * is needed, calls to this function are redundant. * + * If the \ref PSA_PS_FLAG_WRITE_ONCE flag is passed, implementations should + * return \ref PSA_PS_ERROR_FLAGS_NOT_SUPPORTED. + * * This function is optional. Not all PSA Protected Storage Implementations * will implement this function. Consult the documentation of your chosen * platform to determine if it is present. @@ -161,17 +174,18 @@ psa_ps_status_t psa_ps_remove( psa_ps_uid_t uid); * \retval PSA_PS_ERROR_STORAGE_FAILURE The create action has a physical storage error * \retval PSA_PS_ERROR_INSUFFICIENT_SPACE The maximum size is bigger of the current available space * \retval PSA_PS_ERROR_FLAGS_NOT_SUPPORTED One or more create_flags are not valid or supported - * \retval PSA_PS_ERROR_INVALID_KEY The the asset exists and the input paramters are not the same as the existing asset + * \retval PSA_PS_ERROR_INVALID_KEY The asset exists and the input paramters are not the same as the existing asset + * \retval PSA_PS_ERROR_NOT_SUPPORTED The implementation of the API does not support this function */ -psa_its_status_t psa_ps_create( psa_ps_uid_t uid, uint32_t size, - psa_ps_create_flags_t create_flags); +psa_ps_status_t psa_ps_create( psa_ps_uid_t uid, uint32_t size, + psa_ps_create_flags_t create_flags); /** * Sets partial data into an asset based on the given identifier, data_offset, * data length and p_data. * - * Before calling this function, the asset must have been created with a cal - * to \ref psa_ps_create + * Before calling this function, the asset must have been created with a call + * to \ref psa_ps_create. * * This function is optional. Not all PSA Protected Storage Implementations * will implement this function. Consult the documentation of your chosen @@ -192,8 +206,18 @@ psa_its_status_t psa_ps_create( psa_ps_uid_t uid, uint32_t size, * is too large * \retval PSA_PS_ERROR_BAD_POINTER If p_data is NULL or references memory the caller cannot access * \retval PSA_PS_ERROR_INVALID_KEY If the asset does not exist + * \retval PSA_PS_ERROR_NOT_SUPPORTED The implementation of the API does not support this function + */ +psa_ps_status_t psa_ps_set_extended( psa_ps_uid_t uid, uint32_t data_offset, + uint32_t data_length, const void *p_data); + +/** + * Returns a bitmask with flags set for all of the optional features supported + * by the implementation. + * + * Currently defined flags are limited to: + * - \ref PSA_PS_SUPPORT_SET_EXTENDED */ -psa_its_status_t psa_ps_set_extended( psa_ps_uid_t uid, uint32_t data_offset, - uint32_t data_length, const void *p_data); +uint32_t psa_ps_get_support(); #endif // __PROTECTED_STORAGE_H__ diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s001/test_ps_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s001/test_ps_data.h index 906cb193..21a1409d 100644 --- a/api-tests/dev_apis/internal_trusted_storage/test_s001/test_ps_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s001/test_ps_data.h @@ -34,13 +34,13 @@ static test_data s001_data[] = { "This is dummy for index0", 0, 0 }, { - "Call the get api when no uid is set", VAL_PS_GET, PSA_PS_ERROR_KEY_NOT_FOUND + "Call the get api when no uid is set", VAL_PS_GET, PSA_PS_ERROR_UID_NOT_FOUND }, { - "Call the get_info api when no uid is set", VAL_PS_GET_INFO, PSA_PS_ERROR_KEY_NOT_FOUND + "Call the get_info api when no uid is set", VAL_PS_GET_INFO, PSA_PS_ERROR_UID_NOT_FOUND }, { - "Call the remove api when no uid is set", VAL_PS_REMOVE, PSA_PS_ERROR_KEY_NOT_FOUND + "Call the remove api when no uid is set", VAL_PS_REMOVE, PSA_PS_ERROR_UID_NOT_FOUND }, { "Create a valid storage entity with uid1", VAL_PS_SET, PSA_PS_SUCCESS @@ -52,25 +52,25 @@ static test_data s001_data[] = { "Remove uid1", VAL_PS_REMOVE, PSA_PS_SUCCESS }, { - "Call get api for uid1", VAL_PS_GET, PSA_PS_ERROR_KEY_NOT_FOUND + "Call get api for uid1", VAL_PS_GET, PSA_PS_ERROR_UID_NOT_FOUND }, { - "Call get_info api for uid1", VAL_PS_GET_INFO, PSA_PS_ERROR_KEY_NOT_FOUND + "Call get_info api for uid1", VAL_PS_GET_INFO, PSA_PS_ERROR_UID_NOT_FOUND }, { - "Call remove api for uid1", VAL_PS_REMOVE, PSA_PS_ERROR_KEY_NOT_FOUND + "Call remove api for uid1", VAL_PS_REMOVE, PSA_PS_ERROR_UID_NOT_FOUND }, { "Create a valid storage entity again with uid1", VAL_PS_SET, PSA_PS_SUCCESS }, { - "Call get api for uid not same as uid1 or uid2", VAL_PS_GET, PSA_PS_ERROR_KEY_NOT_FOUND + "Call get api for uid not same as uid1 or uid2", VAL_PS_GET, PSA_PS_ERROR_UID_NOT_FOUND }, { - "Call get_info for uid not same as uid1 or uid2", VAL_PS_GET_INFO, PSA_PS_ERROR_KEY_NOT_FOUND + "Call get_info for uid not same as uid1 or uid2", VAL_PS_GET_INFO, PSA_PS_ERROR_UID_NOT_FOUND }, { - "Call remove api for uid not same as uid1 or uid2", VAL_PS_REMOVE, PSA_PS_ERROR_KEY_NOT_FOUND + "Call remove api for uid not same as uid1 or uid2", VAL_PS_REMOVE, PSA_PS_ERROR_UID_NOT_FOUND }, { "Remove uid1", VAL_PS_REMOVE, PSA_PS_SUCCESS diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s002/test_its_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s002/test_its_data.h index 0179c966..51f0478e 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s002/test_its_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s002/test_its_data.h @@ -48,7 +48,7 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, { - "validate the data using get api", VAL_ITS_GET, PSA_ITS_SUCCESS + "Validate the data using get api", VAL_ITS_GET, PSA_ITS_SUCCESS }, { "Index not used",0,0 @@ -72,16 +72,16 @@ static test_data s002_data[] = { "Index not used",0,0 }, { - " storage should not be removed after WRITE_ONCE flag", VAL_ITS_REMOVE, PSA_ITS_ERROR_WRITE_ONCE + "Storage should not be removed after WRITE_ONCE flag", VAL_ITS_REMOVE, PSA_ITS_ERROR_WRITE_ONCE }, { "Create a valid storage with different uid and flag value WRITE_ONCE ", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "storage should not be removed", VAL_ITS_REMOVE, PSA_ITS_ERROR_WRITE_ONCE + "Storage should not be removed", VAL_ITS_REMOVE, PSA_ITS_ERROR_WRITE_ONCE }, { - "validate the data using get api after flag change", VAL_ITS_GET, PSA_ITS_SUCCESS + "Validate the data using get api after flag change", VAL_ITS_GET, PSA_ITS_SUCCESS }, { "Index not used",0,0 @@ -96,10 +96,10 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, { - "try to set different size for same uid and flag value ", VAL_ITS_SET, PSA_ITS_ERROR_WRITE_ONCE + "Try to set different size for same uid and flag value ", VAL_ITS_SET, PSA_ITS_ERROR_WRITE_ONCE }, { - "storage should not be removed", VAL_ITS_REMOVE, PSA_ITS_ERROR_WRITE_ONCE + "Storage should not be removed", VAL_ITS_REMOVE, PSA_ITS_ERROR_WRITE_ONCE }, { "Call the get_info api to validate the flag change", VAL_ITS_GET_INFO, PSA_ITS_SUCCESS diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s002/test_ps_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s002/test_ps_data.h index df4ce83a..8d09551e 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s002/test_ps_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s002/test_ps_data.h @@ -48,7 +48,7 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, { - "validate the data using get api", VAL_PS_GET, PSA_PS_SUCCESS + "Validate the data using get api", VAL_PS_GET, PSA_PS_SUCCESS }, { "Index not used",0,0 @@ -66,22 +66,22 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, { - "validate the data using get api after flag change", VAL_PS_GET, PSA_PS_SUCCESS + "Validate the data using get api after flag change", VAL_PS_GET, PSA_PS_SUCCESS }, { "Index not used",0,0 }, { - " storage should not be removed after WRITE_ONCE flag", VAL_PS_REMOVE, PSA_PS_ERROR_WRITE_ONCE + "Storage should not be removed after WRITE_ONCE flag", VAL_PS_REMOVE, PSA_PS_ERROR_WRITE_ONCE }, { "Create a valid storage with different uid and flag value WRITE_ONCE ", VAL_PS_SET, PSA_PS_SUCCESS }, { - "storage should not be removed", VAL_PS_REMOVE, PSA_PS_ERROR_WRITE_ONCE + "Storage should not be removed", VAL_PS_REMOVE, PSA_PS_ERROR_WRITE_ONCE }, { - "validate the data using get api after flag change", VAL_PS_GET, PSA_PS_SUCCESS + "Validate the data using get api after flag change", VAL_PS_GET, PSA_PS_SUCCESS }, { "Index not used",0,0 @@ -96,7 +96,7 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, { - "try to set different size for same uid and flag value ", VAL_PS_SET, PSA_PS_ERROR_WRITE_ONCE + "Try to set different size for same uid and flag value ", VAL_PS_SET, PSA_PS_ERROR_WRITE_ONCE }, { "storage should not be removed", VAL_PS_REMOVE, PSA_PS_ERROR_WRITE_ONCE @@ -111,7 +111,7 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, { - "validate the data using get api after flag change", VAL_PS_GET, PSA_PS_SUCCESS + "Validate the data using get api after flag change", VAL_PS_GET, PSA_PS_SUCCESS }, { "Index not used",0,0 @@ -119,6 +119,9 @@ static test_data s002_data[] = { { "Setting flag to zero for uid should fail ", VAL_PS_SET, PSA_PS_ERROR_WRITE_ONCE }, +{ + "Storage should not be removed", VAL_PS_REMOVE, PSA_PS_ERROR_WRITE_ONCE +}, { "Check that the WRITE_ONCE flag is preserved", VAL_PS_GET_INFO, PSA_PS_SUCCESS }, @@ -129,4 +132,4 @@ static test_data s002_data[] = { "Index not used as check for get info flag",0,0 }, }; -#endif /* _TEST_S001_PS_DATA_TESTS_H_ */ +#endif /* _TEST_S002_PS_DATA_TESTS_H_ */ diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s003/test_s003.c b/api-tests/dev_apis/internal_trusted_storage/test_s003/test_s003.c index 38a568fb..2232a57e 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s003/test_s003.c +++ b/api-tests/dev_apis/internal_trusted_storage/test_s003/test_s003.c @@ -26,6 +26,7 @@ #define TEST_BUFF_SIZE 256 #define NUM_ITERATIONS 5 +#define TEST_BASE_UID_VALUE 20 client_test_t test_s003_sst_list[] = { NULL, @@ -46,21 +47,27 @@ int32_t psa_sst_insufficient_space(security_t caller) for (i = 0 ; i < NUM_ITERATIONS; i++) { val->print(PRINT_TEST, "[Check %d] Overload storage space\n", i + 1 ); - for (uid = 1; status == PSA_SST_SUCCESS; uid++) + for (uid = TEST_BASE_UID_VALUE; status == PSA_SST_SUCCESS; uid++) { val->print(PRINT_INFO, "Setting 0x%x bytes for ", TEST_BUFF_SIZE); - val->print(PRINT_INFO, "UID 0x%x\n", uid); + val->print(PRINT_INFO, "UID %d\n", uid); status = SST_FUNCTION(s003_data[1].api, uid, TEST_BUFF_SIZE, write_buff, 0); + if (status != PSA_SST_SUCCESS) + { + val->print(PRINT_TEST, "UID %d set failed, Storage Space is exhausted\n", uid); + break; + } } TEST_ASSERT_EQUAL(status, s003_data[1].status, TEST_CHECKPOINT_NUM(1)); /* Store number of set()s it took to saturate the storage */ - count = uid; - results[i] = uid - 1; + count = uid - TEST_BASE_UID_VALUE; + results[i] = uid - TEST_BASE_UID_VALUE; val->print(PRINT_TEST, "Remove all registered UIDs\n", 0); - for (uid = 1; uid < count; uid++) + for (uid = TEST_BASE_UID_VALUE; uid < count + TEST_BASE_UID_VALUE; uid++) { + val->print(PRINT_INFO, "Removing UID %d\n", uid); status = SST_FUNCTION(s003_data[2].api, uid); if (status != PSA_SST_SUCCESS) return VAL_STATUS_ERROR; diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s004/test_its_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s004/test_its_data.h index ab29232c..6ec9467e 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s004/test_its_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s004/test_its_data.h @@ -36,7 +36,7 @@ static test_data s004_data[] = { "Create a valid storage entity ", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "validate the data using get api after set api failure", VAL_ITS_GET, PSA_ITS_SUCCESS + "Validate the data using get api after set api failure", VAL_ITS_GET, PSA_ITS_SUCCESS }, { "Index not used",0,0 diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s005/test_its_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s005/test_its_data.h index 5c7693f2..5e7cc9cd 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s005/test_its_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s005/test_its_data.h @@ -38,13 +38,13 @@ static test_data s005_data[] = { "Create a valid storage entity ", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "validate the data using get api", VAL_ITS_GET, PSA_ITS_SUCCESS + "Validate the data using get api", VAL_ITS_GET, PSA_ITS_SUCCESS }, { "Index not used",0,0 }, { - "validate the data attributes get_info api", VAL_ITS_GET_INFO, PSA_ITS_SUCCESS + "Validate the data attributes get_info api", VAL_ITS_GET_INFO, PSA_ITS_SUCCESS }, { "Index not used",0,0 diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s005/test_ps_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s005/test_ps_data.h index a928ed11..55770f53 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s005/test_ps_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s005/test_ps_data.h @@ -38,13 +38,13 @@ static test_data s005_data[] = { "Create a valid storage entity ", VAL_PS_SET, PSA_PS_SUCCESS }, { - "validate the data using get api", VAL_PS_GET, PSA_PS_SUCCESS + "Validate the data using get api", VAL_PS_GET, PSA_PS_SUCCESS }, { "Index not used",0,0 }, { - "validate the data attributes get_info api", VAL_PS_GET_INFO, PSA_PS_SUCCESS + "Validate the data attributes get_info api", VAL_PS_GET_INFO, PSA_PS_SUCCESS }, { "Index not used",0,0 diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s005/test_s005.c b/api-tests/dev_apis/internal_trusted_storage/test_s005/test_s005.c index 6e8b0b43..d372172b 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s005/test_s005.c +++ b/api-tests/dev_apis/internal_trusted_storage/test_s005/test_s005.c @@ -72,7 +72,7 @@ int32_t psa_sst_apis_check_success_case(security_t caller) /* Calling SET function with BASE uid_value , data_len zero and valid data pointer */ val->print(PRINT_TEST, "[Check 1] Set UID with data length zero and call storage apis\n", 0); - if (psa_sst_apis_check(UID_BASE_VALUE, data_len, write_buff, flag)) + if (psa_sst_apis_check(UID_BASE_VALUE + 1, data_len, write_buff, flag)) { val->print(PRINT_ERROR, "Data Len = %d\n", data_len); val->print(PRINT_ERROR, "Create Flag value = %d\n", flag); diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s006/test_its_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s006/test_its_data.h index e6ddd357..4468340f 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s006/test_its_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s006/test_its_data.h @@ -39,7 +39,7 @@ static test_data s006_data[] = { "Create a valid storage entity with different flag values ", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "validate the flag value get_info api", VAL_ITS_GET_INFO, PSA_ITS_SUCCESS + "Validate the flag value get_info api", VAL_ITS_GET_INFO, PSA_ITS_SUCCESS }, { "Index not used",0,0 diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s006/test_ps_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s006/test_ps_data.h index 400723b8..6ec89eee 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s006/test_ps_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s006/test_ps_data.h @@ -39,7 +39,7 @@ static test_data s006_data[] = { "Create a valid storage entity with different flag values ", VAL_PS_SET, PSA_PS_SUCCESS }, { - "validate the flag value get_info api", VAL_PS_GET_INFO, PSA_PS_SUCCESS + "Validate the flag value get_info api", VAL_PS_GET_INFO, PSA_PS_SUCCESS }, { "Index not used",0,0 diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_entry.c b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_entry.c index 9dbc1dfb..5d252214 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_entry.c +++ b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_entry.c @@ -20,7 +20,7 @@ #include "test_s007.h" #define TEST_NUM VAL_CREATE_TEST_ID(VAL_STORAGE_BASE, 7) -#define TEST_DESC "Flag set after create error check\n" +#define TEST_DESC "Incorrect Size error check\n" TEST_PUBLISH(TEST_NUM, test_entry); val_api_t *val = NULL; diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_its_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_its_data.h index 90c4931e..c06d9518 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_its_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_its_data.h @@ -28,31 +28,36 @@ typedef struct { psa_its_status_t status; } test_data; -static psa_its_create_flags_t flag; static test_data s007_data[] = { { "This is dummy for index0", 0, 0 }, { - "Create a valid storage entity with non-zero flag value", VAL_ITS_SET, PSA_ITS_SUCCESS + "Create a valid storage entity", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "try to change the flag value with another non-zero value", VAL_ITS_SET, PSA_ITS_ERROR_FLAGS_SET_AFTER_CREATE + "Increase the length of storage", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "try to change the flag value with zero value", VAL_ITS_SET, PSA_ITS_ERROR_FLAGS_SET_AFTER_CREATE + "Try to access old length", VAL_ITS_GET, PSA_ITS_SUCCESS }, { - "Remove the storage entity ", VAL_ITS_REMOVE, PSA_ITS_SUCCESS + "Try to access valid length less than set length ", VAL_ITS_GET, PSA_ITS_SUCCESS +}, +{ + "This is dummy for index5", 0, 0 +}, +{ + "Decrease the length of storage", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "Create a valid storage entity with zero flag value", VAL_ITS_SET, PSA_ITS_SUCCESS + "Try to access old length", VAL_ITS_GET, PSA_ITS_ERROR_INCORRECT_SIZE }, { - "try to change the flag value with non-zero value", VAL_ITS_SET, PSA_ITS_SUCCESS + "Try to access old length", VAL_ITS_GET, PSA_ITS_ERROR_INCORRECT_SIZE }, { - "try to change the flag again to zero value", VAL_ITS_SET, PSA_ITS_ERROR_FLAGS_SET_AFTER_CREATE + "Try to access data with correct length", VAL_ITS_GET, PSA_ITS_SUCCESS }, { "Remove the storage entity ", VAL_ITS_REMOVE, PSA_ITS_SUCCESS diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_ps_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_ps_data.h index 6757c9a3..ff2601f0 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_ps_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_ps_data.h @@ -28,31 +28,36 @@ typedef struct { psa_ps_status_t status; } test_data; -static psa_ps_create_flags_t flag; static test_data s007_data[] = { { "This is dummy for index0", 0, 0 }, { - "Create a valid storage entity with non-zero flag value", VAL_PS_SET, PSA_PS_SUCCESS + "Create a valid storage entity", VAL_PS_SET, PSA_PS_SUCCESS }, { - "try to change the flag value with another non-zero value", VAL_PS_SET, PSA_PS_ERROR_FLAGS_SET_AFTER_CREATE + "Increase the length of storage", VAL_PS_SET, PSA_PS_SUCCESS }, { - "try to change the flag value with zero value", VAL_PS_SET, PSA_PS_ERROR_FLAGS_SET_AFTER_CREATE + "Try to access old length", VAL_PS_GET, PSA_PS_SUCCESS }, { - "Remove the storage entity ", VAL_PS_REMOVE, PSA_PS_SUCCESS + "Try to access valid length less than set length ", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index5", 0, 0 +}, +{ + "Decrease the length of storage", VAL_PS_SET, PSA_PS_SUCCESS }, { - "Create a valid storage entity with zero flag value", VAL_PS_SET, PSA_PS_SUCCESS + "Try to access old length", VAL_PS_GET, PSA_PS_ERROR_INCORRECT_SIZE }, { - "try to change the flag value with non-zero value", VAL_PS_SET, PSA_PS_SUCCESS + "Try to access old length", VAL_PS_GET, PSA_PS_ERROR_INCORRECT_SIZE }, { - "try to change the flag again to zero value", VAL_PS_SET, PSA_PS_ERROR_FLAGS_SET_AFTER_CREATE + "Try to access data with correct length", VAL_PS_GET, PSA_PS_SUCCESS }, { "Remove the storage entity ", VAL_PS_REMOVE, PSA_PS_SUCCESS diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.c b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.c index a5208379..4dabb0c6 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.c +++ b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.c @@ -28,51 +28,56 @@ client_test_t test_s007_sst_list[] = { NULL, - psa_sst_api_flag_set_after_create, + psa_sst_get_incorrect_size, NULL, }; static uint8_t write_buff[TEST_BUFF_SIZE] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x23, 0xF6, 0x07, 0x08, 0x0D, 0x0A, 0x1B, 0x0C, 0x5D, 0x0E,\ 0x70, 0xA1, 0xFF, 0xFF, 0x14, 0x73, 0x46, 0x97, 0xE8, 0xDD, 0xCA, 0x0B, 0x3C, 0x0D, 0x2E}; +static uint8_t read_buff[TEST_BUFF_SIZE]; -int32_t psa_sst_api_flag_set_after_create(security_t caller) +int32_t psa_sst_get_incorrect_size(security_t caller) { psa_sst_uid_t uid = UID_BASE_VALUE + 10; uint32_t status = VAL_STATUS_SUCCESS; - flag = 0x0000100; /* Set the uid with the data_len and data_buff */ - status = SST_FUNCTION(s007_data[1].api, uid, TEST_BUFF_SIZE/2, write_buff, flag); + status = SST_FUNCTION(s007_data[1].api, uid, TEST_BUFF_SIZE/2, write_buff, 0); TEST_ASSERT_EQUAL(status, s007_data[1].status, TEST_CHECKPOINT_NUM(1)); - /* Call set for same uid and different non-zero flag value */ - status = SST_FUNCTION(s007_data[2].api, uid, TEST_BUFF_SIZE, write_buff, flag<<1); + /* Call set for same uid and increase the length */ + status = SST_FUNCTION(s007_data[2].api, uid, TEST_BUFF_SIZE, write_buff, 0); TEST_ASSERT_EQUAL(status, s007_data[2].status, TEST_CHECKPOINT_NUM(2)); - /* Call set for same uid and different nzero flag value */ - status = SST_FUNCTION(s007_data[3].api, uid, TEST_BUFF_SIZE, write_buff, 0); + /* Access data using get api and old length */ + status = SST_FUNCTION(s007_data[3].api, uid, 0, TEST_BUFF_SIZE/2, read_buff); TEST_ASSERT_EQUAL(status, s007_data[3].status, TEST_CHECKPOINT_NUM(3)); - /* Remove the uid */ - status = SST_FUNCTION(s007_data[4].api, uid); + /* Access data using get api and valid length */ + status = SST_FUNCTION(s007_data[4].api, uid, 0, TEST_BUFF_SIZE/4, read_buff); TEST_ASSERT_EQUAL(status, s007_data[4].status, TEST_CHECKPOINT_NUM(4)); + TEST_ASSERT_MEMCMP(read_buff, write_buff, TEST_BUFF_SIZE/4, TEST_CHECKPOINT_NUM(5)); - /* Set the uid with the data_len and data_buff */ - status = SST_FUNCTION(s007_data[5].api, uid, TEST_BUFF_SIZE, write_buff, 0); - TEST_ASSERT_EQUAL(status, s007_data[5].status, TEST_CHECKPOINT_NUM(5)); - - /* Call set for same uid and different non-zero flag value */ - status = SST_FUNCTION(s007_data[6].api, uid, TEST_BUFF_SIZE, write_buff, flag); + /* Decrease the length again */ + status = SST_FUNCTION(s007_data[6].api, uid, TEST_BUFF_SIZE/4, write_buff, 0); TEST_ASSERT_EQUAL(status, s007_data[6].status, TEST_CHECKPOINT_NUM(6)); - /* Call set for same uid and different zero flag value */ - status = SST_FUNCTION(s007_data[7].api, uid, TEST_BUFF_SIZE, write_buff, flag); + /* Access data using get api and old length */ + status = SST_FUNCTION(s007_data[7].api, uid, 0, TEST_BUFF_SIZE/2, read_buff); TEST_ASSERT_EQUAL(status, s007_data[7].status, TEST_CHECKPOINT_NUM(7)); - /* Remove the uid */ - status = SST_FUNCTION(s007_data[8].api, uid); + /* Access data using get api and old length */ + status = SST_FUNCTION(s007_data[8].api, uid, 0, TEST_BUFF_SIZE, read_buff); TEST_ASSERT_EQUAL(status, s007_data[8].status, TEST_CHECKPOINT_NUM(8)); - return status; + /* Access data using correct length */ + status = SST_FUNCTION(s007_data[9].api, uid, 0, TEST_BUFF_SIZE/4, read_buff); + TEST_ASSERT_EQUAL(status, s007_data[9].status, TEST_CHECKPOINT_NUM(9)); + + /* Remove the uid */ + status = SST_FUNCTION(s007_data[10].api, uid); + TEST_ASSERT_EQUAL(status, s007_data[10].status, TEST_CHECKPOINT_NUM(10)); + + return status; } diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.h b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.h index 37775b0b..5a71e4be 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s007/test_s007.h @@ -31,6 +31,6 @@ extern val_api_t *val; extern psa_api_t *psa; extern client_test_t test_s007_sst_list[]; -int32_t psa_sst_api_flag_set_after_create(security_t caller); +int32_t psa_sst_get_incorrect_size(security_t caller); #endif /* _TEST_S007_CLIENT_TESTS_H_ */ diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s009/test_its_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s009/test_its_data.h index 0fb4dc06..5f3c8e0e 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s009/test_its_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s009/test_its_data.h @@ -43,7 +43,7 @@ static test_data s009_data[] = { "Create storage of zero size", VAL_ITS_SET, PSA_ITS_SUCCESS }, { - "try to set 0 buffer for previous created storage", VAL_ITS_SET, PSA_ITS_ERROR_BAD_POINTER + "Try to set 0 buffer for previous created storage", VAL_ITS_SET, PSA_ITS_ERROR_BAD_POINTER }, { "Call get_info api to check data size", VAL_ITS_GET_INFO, PSA_ITS_SUCCESS diff --git a/api-tests/dev_apis/internal_trusted_storage/test_s009/test_ps_data.h b/api-tests/dev_apis/internal_trusted_storage/test_s009/test_ps_data.h index 53f20e9e..7fb2f5e6 100755 --- a/api-tests/dev_apis/internal_trusted_storage/test_s009/test_ps_data.h +++ b/api-tests/dev_apis/internal_trusted_storage/test_s009/test_ps_data.h @@ -34,16 +34,16 @@ static test_data s009_data[] = { "This is dummy for index0", 0, 0 }, { - "Call set api with 0 write buffer", VAL_PS_SET, PSA_PS_ERROR_BAD_POINTER + "Call set api with 0 write buffer", VAL_PS_SET, PSA_PS_ERROR_INVALID_ARGUMENT }, { - "Call to get_info api should fail", VAL_PS_GET_INFO, PSA_PS_ERROR_KEY_NOT_FOUND + "Call to get_info api should fail", VAL_PS_GET_INFO, PSA_PS_ERROR_UID_NOT_FOUND }, { "Create storage of zero size", VAL_PS_SET, PSA_PS_SUCCESS }, { - "try to set 0 buffer for previous created storage", VAL_PS_SET, PSA_PS_ERROR_BAD_POINTER + "Try to set 0 buffer for previous created storage", VAL_PS_SET, PSA_PS_ERROR_INVALID_ARGUMENT }, { "Call get_info api to check data size", VAL_PS_GET_INFO, PSA_PS_SUCCESS @@ -52,10 +52,10 @@ static test_data s009_data[] = { "This is dummy for index6", 0, 0 }, { - "Call get api with 0 read buffer", VAL_PS_GET, PSA_PS_ERROR_BAD_POINTER + "Call get api with 0 read buffer", VAL_PS_GET, PSA_PS_ERROR_INVALID_ARGUMENT }, { - "Call get_info api with 0 info buffer", VAL_PS_GET_INFO, PSA_PS_ERROR_BAD_POINTER + "Call get_info api with 0 info buffer", VAL_PS_GET_INFO, PSA_PS_ERROR_INVALID_ARGUMENT }, { "Remove the storage entity ", VAL_PS_REMOVE, PSA_PS_SUCCESS diff --git a/api-tests/dev_apis/protected_storage/test_p010/source.mk b/api-tests/dev_apis/protected_storage/test_p010/source.mk new file mode 100644 index 00000000..aa23cf67 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p010/source.mk @@ -0,0 +1,20 @@ +# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. +# * 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. +#**/ + +CC_SOURCE = test_entry.c test_p010.c +CC_OPTIONS = -DPS_TEST +AS_SOURCE = +AS_OPTIONS = diff --git a/api-tests/dev_apis/protected_storage/test_p010/test_entry.c b/api-tests/dev_apis/protected_storage/test_p010/test_entry.c new file mode 100644 index 00000000..8883c5e1 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p010/test_entry.c @@ -0,0 +1,53 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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. +**/ + +#include "val_interfaces.h" +#include "val_target.h" +#include "test_p010.h" + +#define TEST_NUM VAL_CREATE_TEST_ID(VAL_PROTECTED_STORAGE_BASE, 10) +#define TEST_DESC "Invalid Key error check\n" + +TEST_PUBLISH(TEST_NUM, test_entry); +val_api_t *val = NULL; +psa_api_t *psa = NULL; + +void test_entry(val_api_t *val_api, psa_api_t *psa_api) +{ + int32_t status = VAL_STATUS_SUCCESS; + + val = val_api; + psa = psa_api; + + /* test init */ + val->test_init(TEST_NUM, TEST_DESC, TEST_FIELD(TEST_ISOLATION_L1, WD_HIGH_TIMEOUT)); + if (!IS_TEST_START(val->get_status())) + { + goto test_exit; + } + + /* Execute list of tests available in test[num]_protected_storage_list from Non-secure side*/ + status = val->execute_non_secure_tests(TEST_NUM, test_p010_sst_list, FALSE); + + if (VAL_ERROR(status)) + { + goto test_exit; + } + +test_exit: + val->test_exit(); +} diff --git a/api-tests/dev_apis/protected_storage/test_p010/test_p010.c b/api-tests/dev_apis/protected_storage/test_p010/test_p010.c new file mode 100644 index 00000000..c54d2228 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p010/test_p010.c @@ -0,0 +1,122 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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. +**/ + +#include "val_interfaces.h" +#include "val_target.h" +#include "test_p010.h" +#include "test_ps_data.h" + +#define TEST_BUFF_SIZE 16 + +client_test_t test_p010_sst_list[] = { + NULL, + psa_sst_optional_api_key_not_found, + NULL, +}; + +static uint8_t write_buff[TEST_BUFF_SIZE] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; +static uint8_t read_buff[TEST_BUFF_SIZE] = {0}; + +static int32_t psa_sst_invalid_key() +{ + uint32_t status,j; + psa_ps_uid_t p_uid = UID_BASE_VALUE + 10; + struct psa_ps_info_t orig_info; + + /* Call the set_extended API with uid which is not created */ + val->print(PRINT_TEST, "[Check 1] Set_extended api call for UID %d which is not set\n", p_uid); + status = SST_FUNCTION(p010_data[1].api, p_uid, 0, TEST_BUFF_SIZE, write_buff); + TEST_ASSERT_EQUAL(status, p010_data[1].status, TEST_CHECKPOINT_NUM(1)); + + /* Create a valid storage with set api */ + status = SST_FUNCTION(p010_data[2].api, p_uid, TEST_BUFF_SIZE, write_buff, 0); + TEST_ASSERT_EQUAL(status, p010_data[2].status, TEST_CHECKPOINT_NUM(2)); + + /* Try to change data length for same uid using create api */ + val->print(PRINT_TEST, "[Check 2] Call create api with different data length than used to" + " create the asset using set api\n", 0); + status = SST_FUNCTION(p010_data[3].api, p_uid, TEST_BUFF_SIZE/2, 0); + TEST_ASSERT_EQUAL(status, p010_data[3].status, TEST_CHECKPOINT_NUM(3)); + + /* Try to change flag value associated with the uid */ + val->print(PRINT_TEST, "[Check 3] Call create api with different flag value than used to" + " create the asset using set api\n", 0); + status = SST_FUNCTION(p010_data[4].api, p_uid, TEST_BUFF_SIZE, PSA_PS_FLAG_WRITE_ONCE); + TEST_ASSERT_EQUAL(status, p010_data[4].status, TEST_CHECKPOINT_NUM(4)); + + /* Check the flag value should be same as original*/ + status = SST_FUNCTION(p010_data[5].api, p_uid, &orig_info); + TEST_ASSERT_EQUAL(status, p010_data[5].status, TEST_CHECKPOINT_NUM(5)); + TEST_ASSERT_EQUAL(orig_info.size, TEST_BUFF_SIZE, TEST_CHECKPOINT_NUM(6)); + TEST_ASSERT_EQUAL(orig_info.flags, 0, TEST_CHECKPOINT_NUM(7)); + + /* Remove the uid */ + status = SST_FUNCTION(p010_data[8].api, p_uid); + TEST_ASSERT_EQUAL(status, p010_data[8].status, TEST_CHECKPOINT_NUM(8)); + + /* Create a valid storage */ + status = SST_FUNCTION(p010_data[9].api, p_uid, TEST_BUFF_SIZE/2, 0); + TEST_ASSERT_EQUAL(status, p010_data[9].status, TEST_CHECKPOINT_NUM(9)); + + /* Try to change length using create api */ + val->print(PRINT_TEST, "[Check 4] Call create api with different parameters than used to" + " create the asset using create api\n", 0); + status = SST_FUNCTION(p010_data[10].api, p_uid, TEST_BUFF_SIZE, 0); + TEST_ASSERT_EQUAL(status, p010_data[10].status, TEST_CHECKPOINT_NUM(10)); + + /* Check the storage should be empty */ + status = SST_FUNCTION(p010_data[11].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p010_data[11].status, TEST_CHECKPOINT_NUM(11)); + for (j = 0; j < TEST_BUFF_SIZE; j++) + { + TEST_ASSERT_EQUAL(read_buff[j], 0, TEST_CHECKPOINT_NUM(12)); + } + + /* Remove the uid */ + status = SST_FUNCTION(p010_data[13].api, p_uid); + TEST_ASSERT_EQUAL(status, p010_data[13].api, TEST_CHECKPOINT_NUM(13)); + + /* Call the set_extended API with uid which is removed */ + val->print(PRINT_TEST, "[Check 5] Set_extended api call for UID %d which is removed\n", p_uid); + status = SST_FUNCTION(p010_data[14].api, p_uid, 0, TEST_BUFF_SIZE, write_buff); + TEST_ASSERT_EQUAL(status, p010_data[14].status, TEST_CHECKPOINT_NUM(14)); + + return VAL_STATUS_SUCCESS; +} + +int32_t psa_sst_optional_api_key_not_found(security_t caller) +{ + uint32_t status; + + /* Call the get_support api and check if create and set_extended api are supported */ + status = SST_FUNCTION(p010_data[0].api); + + if (status == p010_data[0].status) + { + val->print(PRINT_INFO, "Optional PS APIs are supported.\n", 0); + psa_sst_invalid_key(); + } + else + { + val->print(PRINT_TEST, "Test Case not needed as Optional PS APIs are not supported.\n", 0); + return RESULT_SKIP(VAL_STATUS_UNSUPPORTED); + } + + return VAL_STATUS_SUCCESS; +} + diff --git a/api-tests/dev_apis/protected_storage/test_p010/test_p010.h b/api-tests/dev_apis/protected_storage/test_p010/test_p010.h new file mode 100644 index 00000000..84551428 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p010/test_p010.h @@ -0,0 +1,29 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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 _TEST_P010_CLIENT_TESTS_H_ +#define _TEST_P010_CLIENT_TESTS_H_ + +#define test_entry CONCAT(test_entry_, p010) +#define val CONCAT(val,test_entry) +#define psa CONCAT(psa,test_entry) + +extern val_api_t *val; +extern psa_api_t *psa; +extern client_test_t test_p010_sst_list[]; + +int32_t psa_sst_optional_api_key_not_found(security_t caller); +#endif /* _TEST_P010_CLIENT_TESTS_H_ */ diff --git a/api-tests/dev_apis/protected_storage/test_p010/test_ps_data.h b/api-tests/dev_apis/protected_storage/test_p010/test_ps_data.h new file mode 100644 index 00000000..f8d385b4 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p010/test_ps_data.h @@ -0,0 +1,77 @@ +/** @file + * Copyright (c) 2019, Arm Limited or ps affiliates. All rights reserved. + * 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 _TEST_P010_PS_DATA_TESTS_H_ +#define _TEST_P010_PS_DATA_TESTS_H_ + +#include "val_protected_storage.h" + +#define SST_FUNCTION val->ps_function + +typedef struct { + char test_desc[100]; + enum ps_function_code api; + psa_ps_status_t status; +} test_data; + +static test_data p010_data[] = { +{ + "Check if optional PS api supported", VAL_PS_GET_SUPPORT, PSA_PS_SUPPORT_SET_EXTENDED +}, +{ + "Set_extended call for non-existing uid", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_INVALID_KEY +}, +{ + "Create valid storage using set api", VAL_PS_SET, PSA_PS_SUCCESS +}, +{ + "Call create api for existing uid with different length", VAL_PS_CREATE, PSA_PS_ERROR_INVALID_KEY +}, +{ + "Call create api for to set WRITE_ONCE flag", VAL_PS_CREATE, PSA_PS_ERROR_INVALID_KEY +}, +{ + "Validate existing uid attributes maintained", VAL_PS_GET_INFO, PSA_PS_SUCCESS +}, +{ + "This is dummy for index6", 0, 0 +}, +{ + "This is dummy for index7", 0, 0 +}, +{ + "Remove the uid", VAL_PS_REMOVE, PSA_PS_SUCCESS +}, +{ + "Create valid storage using create api", VAL_PS_CREATE, PSA_PS_SUCCESS +}, +{ + "Again call create api with different length", VAL_PS_CREATE, PSA_PS_ERROR_INVALID_KEY +}, +{ + "Validate the storage is empty", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index12", 0, 0 +}, +{ + "Remove the uid", VAL_PS_REMOVE, PSA_PS_SUCCESS +}, +{ + "Set_extended call for removed uid", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_INVALID_KEY +} +}; +#endif /* _TEST_P010_PS_DATA_TESTS_H_ */ diff --git a/api-tests/dev_apis/protected_storage/test_p011/source.mk b/api-tests/dev_apis/protected_storage/test_p011/source.mk new file mode 100644 index 00000000..16b6a868 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p011/source.mk @@ -0,0 +1,20 @@ +# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. +# * 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. +#**/ + +CC_SOURCE = test_entry.c test_p011.c +CC_OPTIONS = +AS_SOURCE = +AS_OPTIONS = diff --git a/api-tests/dev_apis/protected_storage/test_p011/test_entry.c b/api-tests/dev_apis/protected_storage/test_p011/test_entry.c new file mode 100644 index 00000000..c4c713f0 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p011/test_entry.c @@ -0,0 +1,53 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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. +**/ + +#include "val_interfaces.h" +#include "val_target.h" +#include "test_p011.h" + +#define TEST_NUM VAL_CREATE_TEST_ID(VAL_PROTECTED_STORAGE_BASE, 11) +#define TEST_DESC "Set_Extended api : Bad pointer and offset invalid check\n" + +TEST_PUBLISH(TEST_NUM, test_entry); +val_api_t *val = NULL; +psa_api_t *psa = NULL; + +void test_entry(val_api_t *val_api, psa_api_t *psa_api) +{ + int32_t status = VAL_STATUS_SUCCESS; + + val = val_api; + psa = psa_api; + + /* test init */ + val->test_init(TEST_NUM, TEST_DESC, TEST_FIELD(TEST_ISOLATION_L1, WD_HIGH_TIMEOUT)); + if (!IS_TEST_START(val->get_status())) + { + goto test_exit; + } + + /* Execute list of tests available in test[num]_protected_storage_list from Non-secure side*/ + status = val->execute_non_secure_tests(TEST_NUM, test_p011_sst_list, FALSE); + + if (VAL_ERROR(status)) + { + goto test_exit; + } + +test_exit: + val->test_exit(); +} diff --git a/api-tests/dev_apis/protected_storage/test_p011/test_p011.c b/api-tests/dev_apis/protected_storage/test_p011/test_p011.c new file mode 100644 index 00000000..4e36b9ce --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p011/test_p011.c @@ -0,0 +1,133 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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. +**/ + +#include "val_interfaces.h" +#include "val_target.h" +#include "test_p011.h" +#include "test_ps_data.h" + +#define TEST_BUFF_SIZE 16 + +client_test_t test_p011_sst_list[] = { + NULL, + psa_sst_optional_api_offset_invalid, + NULL, +}; + +static psa_ps_uid_t p_uid = UID_BASE_VALUE + 11; +static uint8_t write_buff[TEST_BUFF_SIZE] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; +static uint8_t read_buff[TEST_BUFF_SIZE] = {0}; +static uint8_t write_buff_2[TEST_BUFF_SIZE] = {0xFF, 0xC1, 0xA2, 0xE3, 0x04, 0x05, 0x06, 0x07, + 0x03, 0x09, 0x0A, 0x1B, 0x0C, 0x0D, 0x0E, 0x0F}; + +int32_t psa_sst_offset_invalid() +{ + uint32_t status; + + /* Create valid storage using create api */ + status = SST_FUNCTION(p011_data[1].api, p_uid, TEST_BUFF_SIZE, 0); + TEST_ASSERT_EQUAL(status, p011_data[1].status, TEST_CHECKPOINT_NUM(1)); + + /* Set some data in the storage created */ + status = SST_FUNCTION(p011_data[2].api, p_uid, TEST_BUFF_SIZE/2, 5, write_buff); + TEST_ASSERT_EQUAL(status, p011_data[2].status, TEST_CHECKPOINT_NUM(2)); + + /* Try to set data at invalid location with incorrect data len + offset */ + val->print(PRINT_TEST, "[Check 1] Set_extended api call with invalid offset + length\n", 0); + status = SST_FUNCTION(p011_data[3].api, p_uid, TEST_BUFF_SIZE, 2, write_buff); + TEST_ASSERT_EQUAL(status, p011_data[3].status, TEST_CHECKPOINT_NUM(3)); + + /* Try to set data at invalid location with incorrect offset */ + val->print(PRINT_TEST, "[Check 2] Set_extended api call with invalid offset\n", 0); + status = SST_FUNCTION(p011_data[4].api, p_uid, TEST_BUFF_SIZE + 2, 0, write_buff); + TEST_ASSERT_EQUAL(status, p011_data[4].status, TEST_CHECKPOINT_NUM(4)); + + /* Try to set data at correct offset, but zero data len */ + val->print(PRINT_TEST, "[Check 3] Set_extended api call with offset equals length\n", 0); + status = SST_FUNCTION(p011_data[5].api, p_uid, TEST_BUFF_SIZE, 0, write_buff); + TEST_ASSERT_EQUAL(status, p011_data[5].status, TEST_CHECKPOINT_NUM(5)); + + /* Try to set data at invalid location with incorrect data len + offset */ + val->print(PRINT_TEST, "[Check 4] Set_extended api call with invalid offset + length\n", 0); + status = SST_FUNCTION(p011_data[6].api, p_uid, 1, TEST_BUFF_SIZE, write_buff); + TEST_ASSERT_EQUAL(status, p011_data[6].status, TEST_CHECKPOINT_NUM(6)); + + /* Try to set data at invalid location with incorrect data len */ + val->print(PRINT_TEST, "[Check 5] Set_extended api call with invalid length\n", 0); + status = SST_FUNCTION(p011_data[7].api, p_uid, 0, TEST_BUFF_SIZE + 1, write_buff); + TEST_ASSERT_EQUAL(status, p011_data[7].status, TEST_CHECKPOINT_NUM(7)); + + /* Set data using set api */ + val->print(PRINT_TEST, "[Check 6] Overwrite the whole data with set api\n", 0); + status = SST_FUNCTION(p011_data[8].api, p_uid, TEST_BUFF_SIZE, write_buff, 0); + TEST_ASSERT_EQUAL(status, p011_data[8].status, TEST_CHECKPOINT_NUM(8)); + + /* Call the GET function to check data is correctly overwritten */ + status = SST_FUNCTION(p011_data[9].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p011_data[9].status, TEST_CHECKPOINT_NUM(9)); + TEST_ASSERT_MEMCMP(read_buff, write_buff, TEST_BUFF_SIZE, TEST_CHECKPOINT_NUM(10)); + + return VAL_STATUS_SUCCESS; +} + +static int32_t psa_sst_bad_pointer() +{ + uint32_t status; + + /* Call set extended with NULL write_buff */ + val->print(PRINT_TEST, "[Check 7] Call set_extended with NULL write buffer\n", 0); + status = SST_FUNCTION(p011_data[11].api, p_uid, 0, TEST_BUFF_SIZE, NULL); + TEST_ASSERT_EQUAL(status, p011_data[11].status, TEST_CHECKPOINT_NUM(11)); + + /* Call set extended to overwrite data with new values */ + status = SST_FUNCTION(p011_data[12].api, p_uid, 0, TEST_BUFF_SIZE, write_buff_2); + TEST_ASSERT_EQUAL(status, p011_data[12].status, TEST_CHECKPOINT_NUM(12)); + + /* Call the GET function to get the data buffer and match the buffer */ + status = SST_FUNCTION(p011_data[13].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p011_data[13].status, TEST_CHECKPOINT_NUM(13)); + TEST_ASSERT_MEMCMP(read_buff, write_buff_2, TEST_BUFF_SIZE, TEST_CHECKPOINT_NUM(14)); + + /* Remove the storage */ + status = SST_FUNCTION(p011_data[15].api, p_uid); + TEST_ASSERT_EQUAL(status, p011_data[15].status, TEST_CHECKPOINT_NUM(15)); + + return VAL_STATUS_SUCCESS; +} + +int32_t psa_sst_optional_api_offset_invalid(security_t caller) +{ + uint32_t status; + + /* Call the get_support api and check if create and set_extended api are supported */ + status = SST_FUNCTION(p011_data[0].api); + + if (status == p011_data[0].status) + { + val->print(PRINT_INFO, "Optional PS APIs are supported.\n", 0); + psa_sst_offset_invalid(); + psa_sst_bad_pointer(); + } + else + { + val->print(PRINT_TEST, "Test Case not needed as Optional PS APIs are not supported.\n", 0); + return RESULT_SKIP(VAL_STATUS_UNSUPPORTED); + } + + return VAL_STATUS_SUCCESS; +} diff --git a/api-tests/dev_apis/protected_storage/test_p011/test_p011.h b/api-tests/dev_apis/protected_storage/test_p011/test_p011.h new file mode 100644 index 00000000..8d09c077 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p011/test_p011.h @@ -0,0 +1,29 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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 _TEST_P011_CLIENT_TESTS_H_ +#define _TEST_P011_CLIENT_TESTS_H_ + +#define test_entry CONCAT(test_entry_, p011) +#define val CONCAT(val,test_entry) +#define psa CONCAT(psa,test_entry) + +extern val_api_t *val; +extern psa_api_t *psa; +extern client_test_t test_p011_sst_list[]; + +int32_t psa_sst_optional_api_offset_invalid(security_t caller); +#endif /* _TEST_P011_CLIENT_TESTS_H_ */ diff --git a/api-tests/dev_apis/protected_storage/test_p011/test_ps_data.h b/api-tests/dev_apis/protected_storage/test_p011/test_ps_data.h new file mode 100644 index 00000000..594b7660 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p011/test_ps_data.h @@ -0,0 +1,80 @@ +/** @file + * Copyright (c) 2019, Arm Limited or ps affiliates. All rights reserved. + * 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 _TEST_P011_PS_DATA_TESTS_H_ +#define _TEST_P011_PS_DATA_TESTS_H_ + +#include "val_protected_storage.h" + +#define SST_FUNCTION val->ps_function + +typedef struct { + char test_desc[100]; + enum ps_function_code api; + psa_ps_status_t status; +} test_data; + +static test_data p011_data[] = { +{ + "Check if optional PS api supported", VAL_PS_GET_SUPPORT, PSA_PS_SUPPORT_SET_EXTENDED +}, +{ + "Create valid storage", VAL_PS_CREATE, PSA_PS_SUCCESS +}, +{ + "Set data using set_extended api", VAL_PS_SET_EXTENDED, PSA_PS_SUCCESS +}, +{ + "Set_extended call with invalid offset + length", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_OFFSET_INVALID +}, +{ + "Set_extended call with invalid offset", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_OFFSET_INVALID +}, +{ + "Set_extended call with valid offset and zero length", VAL_PS_SET_EXTENDED, PSA_PS_SUCCESS +}, +{ + "Set_extended call with invalid offset + length", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_OFFSET_INVALID +}, +{ + "Set_extended call with invalid length", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_OFFSET_INVALID +}, +{ + "Write data using set api", VAL_PS_SET, PSA_PS_SUCCESS +}, +{ + "Check data validity using get api", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index10", 0, 0 +}, +{ + "Set_extended call with NULL write buffer", VAL_PS_SET_EXTENDED, PSA_PS_ERROR_BAD_POINTER +}, +{ + "Overwrite data using set_extended", VAL_PS_SET_EXTENDED, PSA_PS_SUCCESS +}, +{ + "Check data validity using get api", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index14", 0, 0 +}, +{ + "Remove the uid", VAL_PS_REMOVE, PSA_PS_SUCCESS +}, +}; +#endif /* _TEST_P011_PS_DATA_TESTS_H_ */ diff --git a/api-tests/dev_apis/protected_storage/test_p012/source.mk b/api-tests/dev_apis/protected_storage/test_p012/source.mk new file mode 100644 index 00000000..20354091 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p012/source.mk @@ -0,0 +1,20 @@ +# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. +# * 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. +#**/ + +CC_SOURCE = test_entry.c test_p012.c +CC_OPTIONS = +AS_SOURCE = +AS_OPTIONS = diff --git a/api-tests/dev_apis/protected_storage/test_p012/test_entry.c b/api-tests/dev_apis/protected_storage/test_p012/test_entry.c new file mode 100644 index 00000000..e7bf507f --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p012/test_entry.c @@ -0,0 +1,53 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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. +**/ + +#include "val_interfaces.h" +#include "val_target.h" +#include "test_p012.h" + +#define TEST_NUM VAL_CREATE_TEST_ID(VAL_PROTECTED_STORAGE_BASE, 12) +#define TEST_DESC "Set_Extended and Create api : Success\n" + +TEST_PUBLISH(TEST_NUM, test_entry); +val_api_t *val = NULL; +psa_api_t *psa = NULL; + +void test_entry(val_api_t *val_api, psa_api_t *psa_api) +{ + int32_t status = VAL_STATUS_SUCCESS; + + val = val_api; + psa = psa_api; + + /* test init */ + val->test_init(TEST_NUM, TEST_DESC, TEST_FIELD(TEST_ISOLATION_L1, WD_HIGH_TIMEOUT)); + if (!IS_TEST_START(val->get_status())) + { + goto test_exit; + } + + /* Execute list of tests available in test[num]_protected_storage_list from Non-secure side*/ + status = val->execute_non_secure_tests(TEST_NUM, test_p012_sst_list, FALSE); + + if (VAL_ERROR(status)) + { + goto test_exit; + } + +test_exit: + val->test_exit(); +} diff --git a/api-tests/dev_apis/protected_storage/test_p012/test_p012.c b/api-tests/dev_apis/protected_storage/test_p012/test_p012.c new file mode 100644 index 00000000..48d7256e --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p012/test_p012.c @@ -0,0 +1,139 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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. +**/ + +#include "val_interfaces.h" +#include "val_target.h" +#include "test_p012.h" +#include "test_ps_data.h" + +#define TEST_BUFF_SIZE 16 + +client_test_t test_p012_sst_list[] = { + NULL, + psa_sst_optional_api_success_check, + NULL, +}; + +static psa_ps_uid_t p_uid = UID_BASE_VALUE + 11; +static uint8_t write_buff[TEST_BUFF_SIZE/2] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; +static uint8_t write_buff_2[TEST_BUFF_SIZE/2] = {0xFF, 0x11, 0xA2, 0xE3, 0x04, 0xA5, 0xD6, 0x97}; +static uint8_t read_buff[TEST_BUFF_SIZE] = {0}; +static uint8_t write_buff_3[TEST_BUFF_SIZE] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; + +static int32_t psa_sst_set_extended_create_success() +{ + uint32_t status; + struct psa_ps_info_t info; + + /* Create storage of zero length using create api */ + val->print(PRINT_TEST, "[Check 1] Create storage using create api for 0 length\n", 0); + status = SST_FUNCTION(p012_data[1].api, p_uid, 0, 0); + TEST_ASSERT_EQUAL(status, p012_data[1].status, TEST_CHECKPOINT_NUM(1)); + + /* Set some data in the storage created */ + val->print(PRINT_TEST, "[Check 2] Call set_extended for zero storage length\n", 0); + status = SST_FUNCTION(p012_data[2].api, p_uid, 0, 0, write_buff); + TEST_ASSERT_EQUAL(status, p012_data[2].status, TEST_CHECKPOINT_NUM(2)); + + /* Call the GET_INFO function to match attributes */ + status = SST_FUNCTION(p012_data[3].api, p_uid, &info); + TEST_ASSERT_EQUAL(status, p012_data[3].status, TEST_CHECKPOINT_NUM(3)); + TEST_ASSERT_EQUAL(info.flags, 0, TEST_CHECKPOINT_NUM(4)); + TEST_ASSERT_EQUAL(info.size, 0, TEST_CHECKPOINT_NUM(5)); + + /* Remove the storage */ + val->print(PRINT_TEST, "[Check 3] Remove the storage\n", 0); + status = SST_FUNCTION(p012_data[6].api, p_uid); + TEST_ASSERT_EQUAL(status, p012_data[6].status, TEST_CHECKPOINT_NUM(6)); + + /* Create a valid storage */ + status = SST_FUNCTION(p012_data[7].api, p_uid, TEST_BUFF_SIZE, 0); + TEST_ASSERT_EQUAL(status, p012_data[7].status, TEST_CHECKPOINT_NUM(7)); + + /* Try to set data in first half of buffer */ + status = SST_FUNCTION(p012_data[8].api, p_uid, 0, TEST_BUFF_SIZE/2, write_buff); + TEST_ASSERT_EQUAL(status, p012_data[8].status, TEST_CHECKPOINT_NUM(8)); + + /* Try to set data in second half of buffer */ + status = SST_FUNCTION(p012_data[9].api, p_uid, TEST_BUFF_SIZE/2, TEST_BUFF_SIZE/2,\ + write_buff_2); + TEST_ASSERT_EQUAL(status, p012_data[9].status, TEST_CHECKPOINT_NUM(9)); + + /* Call the GET function to match the data */ + val->print(PRINT_TEST, "[Check 4] Valid data written by multiple set_extended\n", 0); + status = SST_FUNCTION(p012_data[10].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p012_data[10].status, TEST_CHECKPOINT_NUM(10)); + TEST_ASSERT_MEMCMP(read_buff, write_buff, TEST_BUFF_SIZE/2, TEST_CHECKPOINT_NUM(11)); + TEST_ASSERT_MEMCMP(read_buff + TEST_BUFF_SIZE/2, write_buff_2, TEST_BUFF_SIZE/2,\ + TEST_CHECKPOINT_NUM(12)); + + /* Overwrite data using set api */ + val->print(PRINT_TEST, "[Check 5] Overwrite whole data using set api\n", 0); + status = SST_FUNCTION(p012_data[13].api, p_uid, TEST_BUFF_SIZE, write_buff_3, 0); + TEST_ASSERT_EQUAL(status, p012_data[13].status, TEST_CHECKPOINT_NUM(13)); + + /* Call the GET function to match the data */ + val->print(PRINT_TEST, "[Check 6] Validate the data using get api\n", 0); + status = SST_FUNCTION(p012_data[14].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p012_data[14].status, TEST_CHECKPOINT_NUM(14)); + TEST_ASSERT_MEMCMP(read_buff, write_buff_3, TEST_BUFF_SIZE, TEST_CHECKPOINT_NUM(15)); + + /* Call create api for existing uid with same parameters */ + val->print(PRINT_TEST, "[Check 7] Call create api for existing uid with same parameters\n", 0); + status = SST_FUNCTION(p012_data[16].api, p_uid, TEST_BUFF_SIZE, 0); + TEST_ASSERT_EQUAL(status, p012_data[16].status, TEST_CHECKPOINT_NUM(16)); + + /* Call the GET function to match the data */ + val->print(PRINT_TEST, "[Check 8] validity of data after create api call\n", 0); + status = SST_FUNCTION(p012_data[17].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p012_data[17].status, TEST_CHECKPOINT_NUM(17)); + TEST_ASSERT_MEMCMP(read_buff, write_buff_3, TEST_BUFF_SIZE, TEST_CHECKPOINT_NUM(18)); + + /* Remove the storage */ + val->print(PRINT_TEST, "[Check 9] Remove the uid\n", 0); + status = SST_FUNCTION(p012_data[19].api, p_uid); + TEST_ASSERT_EQUAL(status, p012_data[19].status, TEST_CHECKPOINT_NUM(19)); + + /* Validate there should not be duplicate uid present */ + val->print(PRINT_TEST, "[Check 10] No duplicate entry of uid present\n", 0); + status = SST_FUNCTION(p012_data[20].api, p_uid, 0, TEST_BUFF_SIZE, read_buff); + TEST_ASSERT_EQUAL(status, p012_data[20].status, TEST_CHECKPOINT_NUM(20)); + + return VAL_STATUS_SUCCESS; +} + +int32_t psa_sst_optional_api_success_check(security_t caller) +{ + uint32_t status; + + /* Call the get_support api and check if create and set_extended api are supported */ + status = SST_FUNCTION(p012_data[0].api); + + if (status == p012_data[0].status) + { + val->print(PRINT_INFO, "Optional PS APIs are supported.\n", 0); + psa_sst_set_extended_create_success(); + } + else + { + val->print(PRINT_TEST, "Test Case not needed as Optional PS APIs are not supported.\n", 0); + return RESULT_SKIP(VAL_STATUS_UNSUPPORTED); + } + + return VAL_STATUS_SUCCESS; +} diff --git a/api-tests/dev_apis/protected_storage/test_p012/test_p012.h b/api-tests/dev_apis/protected_storage/test_p012/test_p012.h new file mode 100644 index 00000000..b2aeae79 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p012/test_p012.h @@ -0,0 +1,30 @@ +/** @file + * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved. + * 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 _TEST_P012_CLIENT_TESTS_H_ +#define _TEST_P012_CLIENT_TESTS_H_ + +#define test_entry CONCAT(test_entry_, p012) +#define val CONCAT(val,test_entry) +#define psa CONCAT(psa,test_entry) + +extern val_api_t *val; +extern psa_api_t *psa; +extern client_test_t test_p012_sst_list[]; + +int32_t psa_sst_optional_api_success_check(security_t caller); + +#endif /* _TEST_P012_CLIENT_TESTS_H_ */ diff --git a/api-tests/dev_apis/protected_storage/test_p012/test_ps_data.h b/api-tests/dev_apis/protected_storage/test_p012/test_ps_data.h new file mode 100644 index 00000000..a9c79a20 --- /dev/null +++ b/api-tests/dev_apis/protected_storage/test_p012/test_ps_data.h @@ -0,0 +1,95 @@ +/** @file + * Copyright (c) 2019, Arm Limited or ps affiliates. All rights reserved. + * 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 _TEST_P012_PS_DATA_TESTS_H_ +#define _TEST_P012_PS_DATA_TESTS_H_ + +#include "val_protected_storage.h" + +#define SST_FUNCTION val->ps_function + +typedef struct { + char test_desc[100]; + enum ps_function_code api; + psa_ps_status_t status; +} test_data; + +static test_data p012_data[] = { +{ + "Check if optional PS api supported", VAL_PS_GET_SUPPORT, PSA_PS_SUPPORT_SET_EXTENDED +}, +{ + "Create storage of zero length", VAL_PS_CREATE, PSA_PS_SUCCESS +}, +{ + "Call set_extened with zero length", VAL_PS_SET_EXTENDED, PSA_PS_SUCCESS +}, +{ + "Validate the storage attributes", VAL_PS_GET_INFO, PSA_PS_SUCCESS +}, +{ + "This is dummy for index4", 0, 0 +}, +{ + "This is dummy for index5", 0, 0 +}, +{ + "Remove the uid", VAL_PS_REMOVE, PSA_PS_SUCCESS +}, +{ + "Create storage of non-zero length", VAL_PS_CREATE, PSA_PS_SUCCESS +}, +{ + "Call set_extened to write data in first half of buffer", VAL_PS_SET_EXTENDED, PSA_PS_SUCCESS +}, +{ + "Call set_extened to write data in second half of buffer", VAL_PS_SET_EXTENDED, PSA_PS_SUCCESS +}, +{ + "Validate the data stored", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index11", 0, 0 +}, +{ + "This is dummy for index12", 0, 0 +}, +{ + "Overwrite data with set api", VAL_PS_SET, PSA_PS_SUCCESS +}, +{ + "Validate the data written", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index15", 0, 0 +}, +{ + "Call Create api for existing uid with same parameters ", VAL_PS_CREATE, PSA_PS_SUCCESS +}, +{ + "Validate the data", VAL_PS_GET, PSA_PS_SUCCESS +}, +{ + "This is dummy for index18", 0, 0 +}, +{ + "Remove the uid", VAL_PS_REMOVE, PSA_PS_SUCCESS +}, +{ + "Check no duplicate entry of uid present", VAL_PS_GET, PSA_PS_ERROR_UID_NOT_FOUND +} +}; +#endif /* _TEST_P012_PS_DATA_TESTS_H_ */ diff --git a/api-tests/dev_apis/protected_storage/testsuite.db b/api-tests/dev_apis/protected_storage/testsuite.db index 186fb040..841cdf74 100644 --- a/api-tests/dev_apis/protected_storage/testsuite.db +++ b/api-tests/dev_apis/protected_storage/testsuite.db @@ -29,5 +29,8 @@ test_s006 test_s007 test_s008 test_s009 +test_p010 +test_p011 +test_p012 (END) diff --git a/api-tests/docs/psa_its_testlist.md b/api-tests/docs/psa_its_testlist.md index a10c3a55..2b47d5ce 100644 --- a/api-tests/docs/psa_its_testlist.md +++ b/api-tests/docs/psa_its_testlist.md @@ -1,18 +1,25 @@ # PSA Internal Trusted Storage Testcase checklist +## Requirements for Storage Test Suite + +Following are the requirements of the Storage Test Suite.
+ +1. Unless described in this document, any behaviour that is defined as IMPLEMENTATION_DEFINED in PSA Storage API document is not verified in this document.
+2. Storage Test Cases use UID value starting from 10 onwards. These UID needs to be free for successfull test execution.
+ | Test | Return Value | API Verified | Test Algorithm | UID Usage | |-----------|--------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| test_s001 | PSA_ITS_ERROR_KEY_NOT_FOUND | psa_its_get
psa_its_get_info
psa_its_remove
| 1. Call get API with UID for which no UID/Data pair is created
2. Call get_info API for which no UID/Data pair is created
3. Call remove API for which no UID/Data pair is created
4. Set valid UID/Data pair with uid1
5. Set one more set of UID/Data pair, with different uid, than previous
6. Remove the uid of step 4.
7. Call get API for removed UID/data pair
8. Call get_info API for removed UID/Data pair
9. Call remove API for removed UID/Data pair
10. Set valid UID/Data pair
11. Call get API for different uid , then created
12. Call get_info API for different uid, then created
13. Call remove API for different uid, then created
14. Remove the created UID/Data pair.
15. remove the stray uid.
| UID value used are 10,11 | +| test_s001 | PSA_ITS_ERROR_KEY_NOT_FOUND | psa_its_get
psa_its_get_info
psa_its_remove
| 1. Call get API with UID for which no UID/Data pair is created
2. Call get_info API for which no UID/Data pair is created
3. Call remove API for which no UID/Data pair is created
4. Set valid UID/Data pair with uid1
5. Set one more set of UID/Data pair, with different uid, than previous
6. Remove the uid of step 4.
7. Call get API for removed UID/data pair
8. Call get_info API for removed UID/Data pair
9. Call remove API for removed UID/Data pair
10. Set valid UID/Data pair
11. Call get API for different uid , then created
12. Call get_info API for different uid, then created
13. Call remove API for different uid, then created
14. Remove the created UID/Data pair.
15. Remove the stray uid.
| UID value used are 10,11 | | test_s002 | PSA_ITS_ERROR_WRITE_ONCE | psa_its_set
psa_its_remove
| 1. Set valid UID/data value pair , with create flag value none.2. Call get and get_info API to validate the data, attributes associated with data
3. Call set API again with same uid and create flag PSA_PS_WRITE_ONCE_FLAG
4. Call get and get_info API to validate the data, attributes associated with data is not changed after second set operation
5. try to remove the UID/data pair.
6. Create new UID/data value pair, with create flag PSA_PS_WRITE_ONCE_FLAG
7. Try to remove the created UID.
8. Call get and get_info API to validate the data, attributes associated with data
9. Again call SET with same UID , create flag PSA_PS_WRITE_ONCE_FLAG but different data length
10. Try to remove the UID, PSA_ITS_ERROR_WRITE_ONCE error should be returned
11. Call get and get_info API to validate the data, attributes associated with data
| UID value used are 14 and 15 | -| test_s003 | PSA_ITS_ERROR_INSUFFICIENT_SPACE | psa_its_set
| 1. Create UID/data pairs, with data_len 256 bytes. Do this with incrementing uid values till we have INSUFFICENT_SPACE.
2. Remove all the UID/data pairs created.
3. repeat the steps 5 times, to check same number of uid
| UID value starts from 1 and keep on incrementing till all space is exhausted | +| test_s003 | PSA_ITS_ERROR_INSUFFICIENT_SPACE | psa_its_set
| 1. Create UID/data pairs, with data_len 256 bytes. Do this with incrementing uid values till we have INSUFFICENT_SPACE.
2. Remove all the UID/data pairs created.
3. Repeat the steps 5 times, to check same number of uid
| UID value starts from 20 and keep on incrementing till all space is exhausted | | test_s004 | PSA_ITS_SUCCESS | psa_its_set
psa_its_get
psa_its_get_info
psa_its_remove
| 1. Set a valid uid/data pair
2. Validate the data using get api
3. Change the data length to half of previous.
4. Call GET api with original data length , error should be returned and also the return buffer should be empty
5. Call GET api with correct data_len and validate the data received.
6. Check old data cannot be accessed.
7. Call REMOVE api to delete the UID/data pair
| UID value used is 11 | -| test_s005 | PSA_ITS_SUCCESS | psa_its_set
psa_its_get
psa_its_get_info
psa_its_remove
| 1. Set valid UID/data pair with varying uid and data_len
2. Call GET api and validate the set data
3. Call GET info api and validate the data attributes
4. Call REMOVE api to delete the UID/data pair
| UID value used are 0 and 10 | -| test_s006 | PSA_ITS_ERROR_FLAGS_NOT_SUPPORTED | psa_its_set
| 1. Call the SET_INFO with minimum flag value to max flag value
2. Call GET_INFO api and validae the flag value
3. remove the uid/data pair
| UID value used is 10 | -| test_s007 | PSA_ITS_ERROR_FLAGS_SET_AFTER_CREATE | psa_its_set
| 1. Create valid uid/data pair with non-zero value.
2. Again call the set api for same uid to change flag to some different non-zero value.
3. Try to set flag to now CREATE_FLAG_VALUE_NONE.
4. remove the uid.
5. Create a new UID/data pair with zero create flag.
6. try to change the flag value to non-zero.
7. remove the uid
| UID value used is 10 | +| test_s005 | PSA_ITS_SUCCESS | psa_its_set
psa_its_get
psa_its_get_info
psa_its_remove
| 1. Set valid UID/data pair with varying uid and data_len
2. Call GET api and validate the set data
3. Call GET info api and validate the data attributes
4. Call REMOVE api to delete the UID/data pair
| UID value used are 1 and 10 | +| test_s006 | PSA_ITS_ERROR_FLAGS_NOT_SUPPORTED | psa_its_set
| 1. Call the SET_INFO with minimum flag value to max flag value
2. Call GET_INFO api and validate the flag value
3. Remove the uid/data pair
| UID value used is 10 | +| test_s007 | PSA_ITS_ERROR_INCORRECT_SIZE | psa_its_set
| 1. Create valid uid/data pair.
2. Increase the length of storage.
3. Try to access the old length using get api.
4. Try to access with valid length less than stored size.
5. Decrease the length of storage.
6. Try to access the old length.
7. Remove the uid
| UID value used is 10 | | test_s008 | PSA_ITS_ERROR_OFFSET_INVALID | psa_its_get
| 1. Set valid UID/data pair
2. Call GET api with valid offset and offset + data_len equal to stored data size.
3. Call GET api with valid offset and offset + data_len less than stored data size.
4. Call get api with invalid offset.
5. Call get api with zero offset , but data len greater than data size.
6. Remove the uid.
| UID value used is 11 | -| test_s009 | PSA_ITS_ERROR_BAD_POINTER | psa_its_get
psa_its_set
psa_its_get_info
| 1. Call the SET API with NULL pointer and data_len zero
2. Validate using get_info api storage should not be present.
3. Set storage entity with valid write_buffer , but length zero.
4. Again try to set for same uid with NULL write_buffer.
5. Call get and get_info api with NULL pointer and valid uid.
6. remove the uid
| UID value used is 11
| +| test_s009 | PSA_ITS_ERROR_BAD_POINTER | psa_its_get
psa_its_set
psa_its_get_info
| 1. Call the SET API with NULL pointer and data_len zero
2. Validate using get_info api storage should not be present.
3. Set storage entity with valid write_buffer , but length zero.
4. Again try to set for same uid with NULL write_buffer.
5. Call get and get_info api with NULL pointer and valid uid.
6. Remove the uid
| UID value used is 11
| ## License diff --git a/api-tests/docs/psa_ps_testlist.md b/api-tests/docs/psa_ps_testlist.md index 89f69819..d84d9a06 100644 --- a/api-tests/docs/psa_ps_testlist.md +++ b/api-tests/docs/psa_ps_testlist.md @@ -1,19 +1,27 @@ # PSA Protected Storage Testcase checklist +## Requirements for Storage Test Suite + +Following are the requirements of the Storage Test Suite.
+ +1. Unless described in this document, any behaviour that is defined as IMPLEMENTATION_DEFINED in PSA Storage API document is not verified in this document.
+2. Storage Test Cases use UID value starting from 10 onwards. These UID needs to be free for successfull test execution.
| Test | Return Value | API Verified | Test Algorithm | UID Usage | |-----------|--------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| test_s001 | PSA_PS_ERROR_KEY_NOT_FOUND | psa_ps_get
psa_ps_get_info
psa_ps_remove
| 1. Call get API with UID for which no UID/Data pair is created
2. Call get_info API for which no UID/Data pair is created
3. Call remove API for which no UID/Data pair is created
4. Set valid UID/Data pair with uid1
5. Set one more set of UID/Data pair, with different uid, than previous
6. Remove the uid of step 4.
7. Call get API for removed UID/data pair
8. Call get_info API for removed UID/Data pair
9. Call remove API for removed UID/Data pair
10. Set valid UID/Data pair
11. Call get API for different uid , then created
12. Call get_info API for different uid, then created
13. Call remove API for different uid, then created
14. Remove the created UID/Data pair.
15. remove the stray uid.
| UID value used are 10,11,9 | -| test_s002 | PSA_PS_ERROR_WRITE_ONCE | psa_ps_set
psa_ps_remove
| 1. Set valid UID/data value pair , with create flag value none.2. Call get and get_info API to validate the data, attributes associated with data
3. Call set API again with same uid and create flag PSA_PS_WRITE_ONCE_FLAG
4. Call get and get_info API to validate the data, attributes associated with data is not changed after second set operation
5. try to remove the UID/data pair.
6. Create new UID/data value pair, with create flag PSA_PS_WRITE_ONCE_FLAG
7. Try to remove the created UID.
8. Call get and get_info API to validate the data, attributes associated with data
9. Again call SET with same UID , create flag PSA_PS_WRITE_ONCE_FLAG but different data length
10. Try to remove the UID, PSA_PS_ERROR_WRITE_ONCE error should be returned
11. Call get and get_info API to validate the data, attributes associated with data
| UID value used are 20 and 21 | -| test_s003 | PSA_PS_ERROR_INSUFFICIENT_SPACE | psa_ps_set
| 1. Create UID/data pairs, with data_len 256 bytes. Do this with incrementing uid values till we have INSUFFICENT_SPACE.
2. Remove all the UID/data pairs created.
3. repeat the steps 5 times, to check same number of uid
| UID value starts from 1 and keep on incrementing till all space is exhausted | +| test_s001 | PSA_PS_ERROR_UID_NOT_FOUND | psa_ps_get
psa_ps_get_info
psa_ps_remove
| 1. Call get API with UID for which no UID/Data pair is created
2. Call get_info API for which no UID/Data pair is created
3. Call remove API for which no UID/Data pair is created
4. Set valid UID/Data pair with uid1
5. Set one more set of UID/Data pair, with different uid, than previous
6. Remove the uid of step 4.
7. Call get API for removed UID/data pair
8. Call get_info API for removed UID/Data pair
9. Call remove API for removed UID/Data pair
10. Set valid UID/Data pair
11. Call get API for different uid , then created
12. Call get_info API for different uid, then created
13. Call remove API for different uid, then created
14. Remove the created UID/Data pair.
15. Remove the stray uid.
| UID value used are 10,11 | +| test_s002 | PSA_PS_ERROR_WRITE_ONCE | psa_ps_set
psa_ps_remove
| 1. Set valid UID/data value pair , with create flag value none.2. Call get and get_info API to validate the data, attributes associated with data
3. Call set API again with same uid and create flag PSA_PS_WRITE_ONCE_FLAG
4. Call get and get_info API to validate the data, attributes associated with data is not changed after second set operation
5. Try to remove the UID/data pair.
6. Create new UID/data value pair, with create flag PSA_PS_WRITE_ONCE_FLAG
7. Try to remove the created UID.
8. Call get and get_info API to validate the data, attributes associated with data
9. Again call SET with same UID , create flag PSA_PS_WRITE_ONCE_FLAG but different data length
10. Try to remove the UID, PSA_PS_ERROR_WRITE_ONCE error should be returned
11. Call get and get_info API to validate the data, attributes associated with data
| UID value used are 20 and 21 | +| test_s003 | PSA_PS_ERROR_INSUFFICIENT_SPACE | psa_ps_set
| 1. Create UID/data pairs, with data_len 256 bytes. Do this with incrementing uid values till we have INSUFFICENT_SPACE.
2. Remove all the UID/data pairs created.
3. Repeat the steps 5 times, to check same number of uid
| UID value starts from 20 and keep on incrementing till all space is exhausted | | test_s004 | PSA_PS_SUCCESS | psa_ps_set
psa_ps_get
psa_ps_get_info
psa_ps_remove
| 1. Set a valid uid/data pair
2. Validate the data using get api
3. Change the data length to half of previous.
4. Call GET api with original data length , error should be returned and also the return buffer should be empty
5. Call GET api with correct data_len and validate the data received.
6. Check old data cannot be accessed.
7. Call REMOVE api to delete the UID/data pair
| UID value used is 11 | -| test_s005 | PSA_PS_SUCCESS | psa_ps_set
psa_ps_get
psa_ps_get_info
psa_ps_remove
| 1. Set valid UID/data pair with varying uid and data_len
2. Call GET api and validate the set data
3. Call GET info api and validate the data attributes
4. Call REMOVE api to delete the UID/data pair
| UID value used are 0 and 10 | -| test_s006 | PSA_PS_ERROR_FLAGS_NOT_SUPPORTED | psa_ps_set
| 1. Call the SET_INFO with minimum flag value to max flag value
2. Call GET_INFO api and validae the flag value
3. remove the uid/data pair
| UID value used is 10 | -| test_s007 | PSA_PS_ERROR_FLAGS_SET_AFTER_CREATE | psa_ps_set
| 1. Create valid uid/data pair with non-zero value.
2. Again call the set api for same uid to change flag to some different non-zero value.
3. Try to set flag to now CREATE_FLAG_VALUE_NONE.
4. remove the uid.
5. Create a new UID/data pair with zero create flag.
6. try to change the flag value to non-zero.
7. remove the uid
| UID value used is 10 | +| test_s005 | PSA_PS_SUCCESS | psa_ps_set
psa_ps_get
psa_ps_get_info
psa_ps_remove
| 1. Set valid UID/data pair with varying uid and data_len
2. Call GET api and validate the set data
3. Call GET info api and validate the data attributes
4. Call REMOVE api to delete the UID/data pair
| UID value used are 1 and 10 | +| test_s006 | PSA_PS_ERROR_FLAGS_NOT_SUPPORTED | psa_ps_set
| 1. Call the SET_INFO with minimum flag value to max flag value
2. Call GET_INFO api and validae the flag value
3. Remove the uid/data pair
| UID value used is 10 | +| test_s007 | PSA_PS_ERROR_INCORRECT_SIZE | psa_ps_set
| 1. Create valid uid/data pair.
2. Increase the length of storage.
3. Try to access the old length using get api.
4. Try to access with valid length less than stored size.
5. Decrease the length of storage.
6. Try to access the old length.
7. Remove the uid
| UID value used is 10 | | test_s008 | PSA_PS_ERROR_OFFSET_INVALID | psa_ps_get
| 1. Set valid UID/data pair
2. Call GET api with valid offset and offset + data_len equal to stored data size.
3. Call GET api with valid offset and offset + data_len less than stored data size.
4. Call get api with invalid offset.
5. Call get api with zero offset , but data len greater than data size.
6. Remove the uid.
| UID value used is 11 | -| test_s009 | PSA_PS_ERROR_BAD_POINTER | psa_ps_get
psa_ps_set
psa_ps_get_info
| 1. Call the SET API with NULL pointer and data_len zero
2. Validate using get_info api storage should not be present.
3. Set storage entity with valid write_buffer , but length zero.
4. Again try to set for same uid with NULL write_buffer.
5. Call get and get_info api with NULL pointer and valid uid.
6. remove the uid
| UID value used is 11
| - +| test_s009 | PSA_PS_ERROR_INVALID_ARGUMENT | psa_ps_get
psa_ps_set
psa_ps_get_info
| 1. Call the SET API with NULL pointer and data_len zero
2. Validate using get_info api storage should not be present.
3. Set storage entity with valid write_buffer , but length zero.
4. Again try to set for same uid with NULL write_buffer.
5. Call get and get_info api with NULL pointer and valid uid.
6. Remove the uid
| UID value used is 11
| +| test_p010 | PSA_PS_ERROR_INVALID_KEY | psa_ps_create
psa_ps_set_extended
| 1. Call the SET Extended API when no uid present
2. Create a valid storage using set.
3. Call create api with different length for existing uid.
4. Call create api to set WRITE_ONCE flag.
5. Validate data attributes are maintained.
6. Remove the uid.
7. Create valid storage using create api.
8. Try to change length using create api.
9. Validate storage is empty.
10. Again call create api with original parameters.
11. Remove the uid.
12. Check no duplicate entry present.
| UID value used is 10
| +| test_p011 | PSA_PS_ERROR_INVALID_ARGUMENT
PSA_PS_ERROR_OFFSET_INVALID
| psa_ps_create
psa_ps_set_extended
| 1. Create a valid storage using set.
2. Set data on first half of buffer.
3. Try to set data at incorrect offset +length.
4. Try to set data at incorrect offset.
5. Try to set at correct offset but zero length buffer.
6. Try to set data at incorrect length and valid offset.
7. Overwrite the storage using set api.
8. Validate data is correctly written.
9. Call set_extended with NULL write buffer.
10. Overwrite storage using set_extended api.
11. Remove the uid.
| UID value used is 11
+| test_s012 | PSA_PS_SUCCESS | psa_ps_set_extended
| 1. Create Storage of zero length using create
2. Try to set some data in the storage created.
3. Validate the storage attributes
4. Remove the storage.
5. Create a valid storage with non-zero length.
6. Set data in the buffer.
7. Validate the data attributes.
8. Overwrite data using set api.
9. Validate the data.
10. Call create api for existing uid with same parameters.
11. Remove the uid.
12. Check with set_extended no duplicate uid exists.
| UID value used is 11 ## License Arm PSA test suite is distributed under Apache v2.0 License. diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c index 4f89efe3..a4241533 100644 --- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c +++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c @@ -65,6 +65,8 @@ uint32_t pal_ps_function(int type, va_list valist) data_length = va_arg(valist, uint32_t); p_write_data = va_arg(valist, const void*); return psa_ps_set_extended(uid, offset, data_length, p_write_data); + case PAL_PS_GET_SUPPORT: + return psa_ps_get_support(); default: return PAL_STATUS_UNSUPPORTED_FUNC; } diff --git a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h index 2f7e5fca..a338cdf7 100644 --- a/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h +++ b/api-tests/platform/targets/tgt_dev_apis_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h @@ -27,6 +27,7 @@ enum ps_function_code { PAL_PS_REMOVE = 0x4, PAL_PS_CREATE = 0x5, PAL_PS_SET_EXTENDED = 0x6, + PAL_PS_GET_SUPPORT = 0x7, }; uint32_t pal_ps_function(int type, va_list valist); diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.c b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.c index 4f89efe3..a4241533 100644 --- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.c +++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.c @@ -65,6 +65,8 @@ uint32_t pal_ps_function(int type, va_list valist) data_length = va_arg(valist, uint32_t); p_write_data = va_arg(valist, const void*); return psa_ps_set_extended(uid, offset, data_length, p_write_data); + case PAL_PS_GET_SUPPORT: + return psa_ps_get_support(); default: return PAL_STATUS_UNSUPPORTED_FUNC; } diff --git a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.h b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.h index 2f7e5fca..a338cdf7 100644 --- a/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.h +++ b/api-tests/platform/targets/tgt_dev_apis_tfm_musca_a/nspe/pal_protected_storage_intf.h @@ -27,6 +27,7 @@ enum ps_function_code { PAL_PS_REMOVE = 0x4, PAL_PS_CREATE = 0x5, PAL_PS_SET_EXTENDED = 0x6, + PAL_PS_GET_SUPPORT = 0x7, }; uint32_t pal_ps_function(int type, va_list valist); diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c index 4f89efe3..a4241533 100644 --- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c +++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.c @@ -65,6 +65,8 @@ uint32_t pal_ps_function(int type, va_list valist) data_length = va_arg(valist, uint32_t); p_write_data = va_arg(valist, const void*); return psa_ps_set_extended(uid, offset, data_length, p_write_data); + case PAL_PS_GET_SUPPORT: + return psa_ps_get_support(); default: return PAL_STATUS_UNSUPPORTED_FUNC; } diff --git a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h index 2f7e5fca..a338cdf7 100644 --- a/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h +++ b/api-tests/platform/targets/tgt_ff_mbedos_fvp_mps2_m4/nspe/pal_protected_storage_intf.h @@ -27,6 +27,7 @@ enum ps_function_code { PAL_PS_REMOVE = 0x4, PAL_PS_CREATE = 0x5, PAL_PS_SET_EXTENDED = 0x6, + PAL_PS_GET_SUPPORT = 0x7, }; uint32_t pal_ps_function(int type, va_list valist); diff --git a/api-tests/val/common/val.h b/api-tests/val/common/val.h index 3e9a9d71..b3dbcd55 100644 --- a/api-tests/val/common/val.h +++ b/api-tests/val/common/val.h @@ -223,6 +223,7 @@ typedef enum { VAL_STATUS_BOOT_EXPECTED_BUT_FAILED = 0x28, VAL_STATUS_INIT_ALREADY_DONE = 0x29, VAL_STATUS_HEAP_NOT_AVAILABLE = 0x2A, + VAL_STATUS_UNSUPPORTED = 0x2B, VAL_STATUS_ERROR_MAX = INT_MAX, } val_status_t; diff --git a/api-tests/val/nspe/val_internal_trusted_storage.h b/api-tests/val/nspe/val_internal_trusted_storage.h index e74a7016..2f9384de 100644 --- a/api-tests/val/nspe/val_internal_trusted_storage.h +++ b/api-tests/val/nspe/val_internal_trusted_storage.h @@ -21,7 +21,6 @@ #include "val.h" #define UID_BASE_VALUE 0 -#define UID_MAX_VALUE 15 #define BYTES_TO_BITS(byte) (byte * 8) enum its_function_code { diff --git a/api-tests/val/nspe/val_protected_storage.h b/api-tests/val/nspe/val_protected_storage.h index 5d2df213..7f05cea2 100644 --- a/api-tests/val/nspe/val_protected_storage.h +++ b/api-tests/val/nspe/val_protected_storage.h @@ -20,8 +20,7 @@ #include "val.h" -#define UID_BASE_VALUE 0 -#define UID_MAX_VALUE 15 +#define UID_BASE_VALUE 0 #define BYTES_TO_BITS(byte) (byte * 8) enum ps_function_code { @@ -31,6 +30,7 @@ enum ps_function_code { VAL_PS_REMOVE = 0x4, VAL_PS_CREATE = 0x5, VAL_PS_SET_EXTENDED = 0x6, + VAL_PS_GET_SUPPORT = 0x7, }; uint32_t val_ps_function(int type, ...);