Skip to content

Commit

Permalink
PSA storage: Implement additional flags, change ints to size_t
Browse files Browse the repository at this point in the history
  • Loading branch information
David Saada committed Jun 20, 2019
1 parent 9974899 commit 5991b9c
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 31 deletions.
12 changes: 6 additions & 6 deletions components/TARGET_PSA/inc/psa/protected_storage.h
Expand Up @@ -54,7 +54,7 @@ extern "C" {
* \retval PSA_ERROR_GENERIC_ERROR The operation failed because of an unspecified internal failure
*/
psa_status_t psa_ps_set(psa_storage_uid_t uid,
uint32_t data_length,
size_t data_length,
const void *p_data,
psa_storage_create_flags_t create_flags);

Expand All @@ -78,8 +78,8 @@ psa_status_t psa_ps_set(psa_storage_uid_t uid,
* \retval PSA_ERROR_INVALID_SIGNATURE The operation failed because the data associated with the UID failed authentication
*/
psa_status_t psa_ps_get(psa_storage_uid_t uid,
uint32_t data_offset,
uint32_t data_length,
size_t data_offset,
size_t data_length,
void *p_data);

/**
Expand Down Expand Up @@ -149,7 +149,7 @@ psa_status_t psa_ps_remove(psa_storage_uid_t uid);
* \retval PSA_ERROR_GENERIC_ERROR The operation has failed due to an unspecified error
*/
psa_status_t psa_ps_create(psa_storage_uid_t uid,
uint32_t size,
size_t size,
psa_storage_create_flags_t create_flags);

/**
Expand Down Expand Up @@ -179,8 +179,8 @@ psa_status_t psa_ps_create(psa_storage_uid_t uid,
* \retval PSA_ERROR_INVALID_SIGNATURE The operation failed because the existing data failed authentication (MAC check failed)
*/
psa_status_t psa_ps_set_extended(psa_storage_uid_t uid,
uint32_t data_offset,
uint32_t data_length,
size_t data_offset,
size_t data_length,
const void *p_data);

/**
Expand Down
9 changes: 6 additions & 3 deletions components/TARGET_PSA/inc/psa/storage_common.h
Expand Up @@ -33,8 +33,10 @@ extern "C" {
*/
typedef uint32_t psa_storage_create_flags_t;

#define PSA_STORAGE_FLAG_NONE 0 /**< No flags to pass */
#define PSA_STORAGE_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_storage_create_flags_t`*/
#define PSA_STORAGE_FLAG_NONE 0 /**< No flags to pass */
#define PSA_STORAGE_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_storage_create_flags_t`*/
#define PSA_STORAGE_FLAG_NO_CONFIDENTIALITY (1 << 1) /**< The data associated with the uid is public and therefore does not require confidentiality. It therefore only needs to be integrity protected */
#define PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION (1 << 2) /**< The data associated with the uid does not require replay protection. This may permit faster storage - but it permits an attecker with physical access to revert to an earlier version of the data. */

/** \brief A type for UIDs used for identifying data
*/
Expand All @@ -44,7 +46,8 @@ typedef uint64_t psa_storage_uid_t;
* \brief A container for metadata associated with a specific uid
*/
struct psa_storage_info_t {
uint32_t size; /**< The size of the data associated with a uid **/
size_t capacity; /**< The allocated capacity of the storage associated with a UID **/
size_t size; /**< The size of the data associated with a uid **/
psa_storage_create_flags_t flags; /**< The flags set when the uid was created **/
};

Expand Down
Expand Up @@ -184,7 +184,7 @@ static void generate_fn(char *tdb_filename, uint32_t tdb_filename_size, psa_stor
}

psa_status_t psa_storage_set_impl(KVStore *kvstore, int32_t pid, psa_storage_uid_t uid,
uint32_t data_length, const void *p_data,
size_t data_length, const void *p_data,
uint32_t kv_create_flags)
{
if (uid == 0) {
Expand All @@ -200,7 +200,7 @@ psa_status_t psa_storage_set_impl(KVStore *kvstore, int32_t pid, psa_storage_uid
}

psa_status_t psa_storage_get_impl(KVStore *kvstore, int32_t pid, psa_storage_uid_t uid,
uint32_t data_offset, uint32_t data_length, void *p_data)
size_t data_offset, size_t data_length, void *p_data)
{
if (uid == 0) {
return PSA_ERROR_INVALID_ARGUMENT;
Expand Down Expand Up @@ -238,7 +238,7 @@ psa_status_t psa_storage_get_impl(KVStore *kvstore, int32_t pid, psa_storage_uid
}

psa_status_t psa_storage_get_info_impl(KVStore *kvstore, int32_t pid, psa_storage_uid_t uid,
struct psa_storage_info_t *p_info)
struct psa_storage_info_t *p_info, uint32_t *kv_get_flags)
{

if (uid == 0) {
Expand All @@ -257,7 +257,9 @@ psa_status_t psa_storage_get_info_impl(KVStore *kvstore, int32_t pid, psa_storag
if (kv_info.flags & KVStore::WRITE_ONCE_FLAG) {
p_info->flags |= PSA_STORAGE_FLAG_WRITE_ONCE;
}
p_info->size = (uint32_t)(kv_info.size); // kv_info.size is of type size_t
*kv_get_flags = kv_info.flags;
p_info->size = kv_info.size;
p_info->capacity = kv_info.size;
}

return convert_status(status);
Expand Down
Expand Up @@ -36,9 +36,9 @@ typedef psa_status_t (*migrate_func_t)(mbed::KVStore *kvstore, const psa_storage

void psa_storage_handle_version(mbed::KVStore *kvstore, const char *version_key, const psa_storage_version_t *version,
migrate_func_t migrate_func);
psa_status_t psa_storage_set_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, uint32_t data_length, const void *p_data, uint32_t kv_create_flags);
psa_status_t psa_storage_get_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data);
psa_status_t psa_storage_get_info_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info);
psa_status_t psa_storage_set_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, size_t data_length, const void *p_data, uint32_t kv_create_flags);
psa_status_t psa_storage_get_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data);
psa_status_t psa_storage_get_info_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info, uint32_t *kv_get_flags);
psa_status_t psa_storage_remove_impl(mbed::KVStore *kvstore, int32_t pid, psa_storage_uid_t uid);
psa_status_t psa_storage_reset_impl(mbed::KVStore *kvstore);

Expand Down
Expand Up @@ -28,7 +28,7 @@
// So here we set a global pid value to be used for when calling IMPL functions
#define PSA_ITS_EMUL_PID 1

psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
psa_status_t psa_its_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
{
if (!p_data && data_length) {
return PSA_ERROR_INVALID_ARGUMENT;
Expand All @@ -47,7 +47,7 @@ psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void
return res;
}

psa_status_t psa_its_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
{
if (!p_data && data_length) {
return PSA_ERROR_INVALID_ARGUMENT;
Expand Down
Expand Up @@ -81,7 +81,7 @@ void its_deinit(void)
}


psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
{
if (!kvstore) {
its_init();
Expand All @@ -94,7 +94,7 @@ psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_
return psa_storage_set_impl(kvstore, pid, uid, data_length, p_data, create_flags);
}

psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
{
if (!kvstore) {
its_init();
Expand All @@ -105,11 +105,12 @@ psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_

psa_status_t psa_its_get_info_impl(int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info)
{
uint32_t kv_get_flags;
if (!kvstore) {
its_init();
}

return psa_storage_get_info_impl(kvstore, pid, uid, p_info);
return psa_storage_get_info_impl(kvstore, pid, uid, p_info, &kv_get_flags);
}

psa_status_t psa_its_remove_impl(int32_t pid, psa_storage_uid_t uid)
Expand Down
Expand Up @@ -26,8 +26,8 @@ extern "C"
{
#endif

psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags);
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data);
psa_status_t psa_its_set_impl(int32_t pid, psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags);
psa_status_t psa_its_get_impl(int32_t pid, psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data);
psa_status_t psa_its_get_info_impl(int32_t pid, psa_storage_uid_t uid, struct psa_storage_info_t *p_info);
psa_status_t psa_its_remove_impl(int32_t pid, psa_storage_uid_t uid);
psa_status_t psa_its_reset_impl();
Expand Down
Expand Up @@ -20,7 +20,7 @@
#include "psa/internal_trusted_storage.h"
#include "psa_manifest/sid.h"

psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
psa_status_t psa_its_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
{
if (!p_data && data_length) {
return PSA_ERROR_INVALID_ARGUMENT;
Expand All @@ -46,7 +46,7 @@ psa_status_t psa_its_set(psa_storage_uid_t uid, uint32_t data_length, const void
return status;
}

psa_status_t psa_its_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
psa_status_t psa_its_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
{
if (!p_data && data_length) {
return PSA_ERROR_INVALID_ARGUMENT;
Expand Down
Expand Up @@ -97,7 +97,7 @@ MBED_DEPRECATED("PS specific types should not be used")
* is invalid, for example is `NULL` or references memory the caller cannot access
*/
psa_status_t psa_its_set(psa_storage_uid_t uid,
uint32_t data_length,
size_t data_length,
const void *p_data,
psa_storage_create_flags_t create_flags);

Expand All @@ -120,8 +120,8 @@ psa_status_t psa_its_set(psa_storage_uid_t uid,
* is invalid. For example is `NULL` or references memory the caller cannot access
*/
psa_status_t psa_its_get(psa_storage_uid_t uid,
uint32_t data_offset,
uint32_t data_length,
size_t data_offset,
size_t data_length,
void *p_data);

/**
Expand Down
Expand Up @@ -84,7 +84,7 @@ void ps_deinit(void)
}


psa_status_t psa_ps_set(psa_storage_uid_t uid, uint32_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
psa_status_t psa_ps_set(psa_storage_uid_t uid, size_t data_length, const void *p_data, psa_storage_create_flags_t create_flags)
{
if (!kvstore) {
ps_init();
Expand All @@ -95,14 +95,20 @@ psa_status_t psa_ps_set(psa_storage_uid_t uid, uint32_t data_length, const void
}

uint32_t kv_create_flags = def_kvstore_flags;
if (create_flags & PSA_STORAGE_FLAG_NO_CONFIDENTIALITY) {
kv_create_flags &= ~KVStore::REQUIRE_CONFIDENTIALITY_FLAG;
}
if (create_flags & PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION) {
kv_create_flags &= ~KVStore::REQUIRE_REPLAY_PROTECTION_FLAG;
}
if (create_flags & PSA_STORAGE_FLAG_WRITE_ONCE) {
kv_create_flags |= KVStore::WRITE_ONCE_FLAG;
}

return psa_storage_set_impl(kvstore, PSA_PS_GLOBAL_PID, uid, data_length, p_data, kv_create_flags);
}

psa_status_t psa_ps_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t data_length, void *p_data)
psa_status_t psa_ps_get(psa_storage_uid_t uid, size_t data_offset, size_t data_length, void *p_data)
{
if (!kvstore) {
ps_init();
Expand All @@ -113,11 +119,25 @@ psa_status_t psa_ps_get(psa_storage_uid_t uid, uint32_t data_offset, uint32_t da

psa_status_t psa_ps_get_info(psa_storage_uid_t uid, struct psa_storage_info_t *p_info)
{
psa_status_t ret;
uint32_t kv_get_flags;

if (!kvstore) {
ps_init();
}

return psa_storage_get_info_impl(kvstore, PSA_PS_GLOBAL_PID, uid, p_info);
ret = psa_storage_get_info_impl(kvstore, PSA_PS_GLOBAL_PID, uid, p_info, &kv_get_flags);

// In case we're on external storage, need to add some logics in order to remove missing flags
if (def_kvstore_flags) {
if ((kv_get_flags & ~KVStore::REQUIRE_CONFIDENTIALITY_FLAG) == kv_get_flags) {
p_info->flags |= PSA_STORAGE_FLAG_NO_CONFIDENTIALITY;
}
if ((kv_get_flags & ~KVStore::REQUIRE_REPLAY_PROTECTION_FLAG) == kv_get_flags) {
p_info->flags |= PSA_STORAGE_FLAG_NO_REPLAY_PROTECTION;
}
}
return ret;
}

psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Expand Down

0 comments on commit 5991b9c

Please sign in to comment.