1 /* 2 * Copyright (c) 2019, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 * 6 */ 7 8 /** This file describes the PSA Internal Trusted Storage API 9 */ 10 11 #ifndef PSA_INTERNAL_TRUSTED_STORAGE_H 12 #define PSA_INTERNAL_TRUSTED_STORAGE_H 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include "psa/error.h" 18 #include "psa/storage_common.h" 19 20 #ifdef __cplusplus 21 extern "C" { 22 #endif 23 #define PSA_ITS_API_VERSION_MAJOR 1 /**< The major version number of the 24 * PSA ITS API 25 */ 26 #define PSA_ITS_API_VERSION_MINOR 0 /**< The minor version number of the 27 * PSA ITS API 28 */ 29 // This version of the header file is associated with 1.0 final release. 30 31 /** 32 * \brief Create a new, or modify an existing, uid/value pair 33 * 34 * Stores data in the internal storage. 35 * 36 * \param[in] uid The identifier for the data 37 * \param[in] data_length The size in bytes of the data in `p_data` 38 * \param[in] p_data A buffer containing the data 39 * \param[in] create_flags The flags that the data will be stored with 40 * 41 * \return A status indicating the success/failure of the operation 42 * 43 * \retval PSA_SUCCESS The operation completed successfully 44 * \retval PSA_ERROR_NOT_PERMITTED The operation failed because the 45 * provided `uid` value was already 46 * created with 47 * PSA_STORAGE_FLAG_WRITE_ONCE 48 * \retval PSA_ERROR_NOT_SUPPORTED The operation failed because one or 49 * more of the flags provided in 50 * `create_flags` is not supported or is 51 * not valid 52 * \retval PSA_ERROR_INSUFFICIENT_STORAGE The operation failed because there 53 * was insufficient space on the 54 * storage medium 55 * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the 56 * physical storage has failed (Fatal 57 * error) 58 * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one 59 * of the provided pointers(`p_data`) 60 * is invalid, for example is `NULL` or 61 * references memory the caller cannot 62 * access 63 */ 64 psa_status_t psa_its_set(psa_storage_uid_t uid, 65 size_t data_length, 66 const void *p_data, 67 psa_storage_create_flags_t create_flags); 68 69 /** 70 * \brief Retrieve data associated with a provided UID 71 * 72 * Retrieves up to `data_size` bytes of the data associated with `uid`, starting 73 * at `data_offset` bytes from the beginning of the data. Upon successful 74 * completion, the data will be placed in the `p_data` buffer, which must be at 75 * least `data_size` bytes in size. The length of the data returned will be in 76 * `p_data_length`. If `data_size` is 0, the contents of `p_data_length` will 77 * be set to zero. 78 * 79 * \param[in] uid The uid value 80 * \param[in] data_offset The starting offset of the data requested 81 * \param[in] data_size The amount of data requested 82 * \param[out] p_data On success, the buffer where the data will 83 * be placed 84 * \param[out] p_data_length On success, this will contain size of the data 85 * placed in `p_data` 86 * 87 * \return A status indicating the success/failure of the operation 88 * 89 * \retval PSA_SUCCESS The operation completed successfully 90 * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the 91 * provided `uid` value was not found in 92 * the storage 93 * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the 94 * physical storage has failed (Fatal 95 * error) 96 * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the 97 * provided arguments (`p_data`, 98 * `p_data_length`) is invalid, for example 99 * is `NULL` or references memory the 100 * caller cannot access. In addition, this 101 * can also happen if `data_offset` is 102 * larger than the size of the data 103 * associated with `uid` 104 */ 105 psa_status_t psa_its_get(psa_storage_uid_t uid, 106 size_t data_offset, 107 size_t data_size, 108 void *p_data, 109 size_t *p_data_length); 110 111 /** 112 * \brief Retrieve the metadata about the provided uid 113 * 114 * Retrieves the metadata stored for a given `uid` as a `psa_storage_info_t` 115 * structure. 116 * 117 * \param[in] uid The `uid` value 118 * \param[out] p_info A pointer to the `psa_storage_info_t` struct that will 119 * be populated with the metadata 120 * 121 * \return A status indicating the success/failure of the operation 122 * 123 * \retval PSA_SUCCESS The operation completed successfully 124 * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided 125 * uid value was not found in the storage 126 * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the physical 127 * storage has failed (Fatal error) 128 * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one of the 129 * provided pointers(`p_info`) 130 * is invalid, for example is `NULL` or 131 * references memory the caller cannot 132 * access 133 */ 134 psa_status_t psa_its_get_info(psa_storage_uid_t uid, 135 struct psa_storage_info_t *p_info); 136 137 /** 138 * \brief Remove the provided uid and its associated data from the storage 139 * 140 * Deletes the data from internal storage. 141 * 142 * \param[in] uid The `uid` value 143 * 144 * \return A status indicating the success/failure of the operation 145 * 146 * \retval PSA_SUCCESS The operation completed successfully 147 * \retval PSA_ERROR_INVALID_ARGUMENT The operation failed because one or more 148 * of the given arguments were invalid (null 149 * pointer, wrong flags and so on) 150 * \retval PSA_ERROR_DOES_NOT_EXIST The operation failed because the provided 151 * uid value was not found in the storage 152 * \retval PSA_ERROR_NOT_PERMITTED The operation failed because the provided 153 * uid value was created with 154 * PSA_STORAGE_FLAG_WRITE_ONCE 155 * \retval PSA_ERROR_STORAGE_FAILURE The operation failed because the physical 156 * storage has failed (Fatal error) 157 */ 158 psa_status_t psa_its_remove(psa_storage_uid_t uid); 159 160 #ifdef __cplusplus 161 } 162 #endif 163 164 #endif // PSA_INTERNAL_TRUSTED_STORAGE_H 165