blob: ea6e1c801ae390f763f136f9d8272f879518b174 [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08002 * Copyright (c) 2017-2021, Arm Limited. All rights reserved.
Ashutosh Singhf4d88672017-11-29 13:35:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
Jamie Foxcc31d402019-01-28 17:13:52 +00009#include "psa/protected_storage.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010010#include "tfm_ns_interface.h"
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000011#include "tfm_veneers.h"
12
Galanakis, Minosecc9de82019-11-20 14:29:44 +000013psa_status_t psa_ps_set(psa_storage_uid_t uid,
14 size_t data_length,
15 const void *p_data,
16 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000017{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000018 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000019 psa_invec in_vec[] = {
20 { .base = &uid, .len = sizeof(uid) },
21 { .base = p_data, .len = data_length },
22 { .base = &create_flags, .len = sizeof(create_flags) }
23 };
24
David Hu7c2a7442021-04-01 16:34:30 +080025 status = tfm_ns_interface_dispatch((veneer_fn)tfm_ps_set_req_veneer,
26 (uint32_t)in_vec, IOVEC_LEN(in_vec),
27 (uint32_t)NULL, 0);
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010028
Galanakis, Minosecc9de82019-11-20 14:29:44 +000029 /* A parameter with a buffer pointer pointer that has data length longer
30 * than maximum permitted is treated as a secure violation.
31 * TF-M framework rejects the request with TFM_ERROR_INVALID_PARAMETER.
32 */
33 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
34 return PSA_ERROR_INVALID_ARGUMENT;
35 }
36 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000037}
38
Galanakis, Minosecc9de82019-11-20 14:29:44 +000039psa_status_t psa_ps_get(psa_storage_uid_t uid,
40 size_t data_offset,
41 size_t data_size,
42 void *p_data,
43 size_t *p_data_length)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000044{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000045 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000046 psa_invec in_vec[] = {
47 { .base = &uid, .len = sizeof(uid) },
48 { .base = &data_offset, .len = sizeof(data_offset) }
49 };
50
51 psa_outvec out_vec[] = {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000052 { .base = p_data, .len = data_size }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000053 };
54
Galanakis, Minosecc9de82019-11-20 14:29:44 +000055 if (p_data_length == NULL) {
56 return PSA_ERROR_INVALID_ARGUMENT;
57 }
58
David Hu7c2a7442021-04-01 16:34:30 +080059 status = tfm_ns_interface_dispatch((veneer_fn)tfm_ps_get_req_veneer,
60 (uint32_t)in_vec, IOVEC_LEN(in_vec),
61 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000062
Galanakis, Minosecc9de82019-11-20 14:29:44 +000063 *p_data_length = out_vec[0].len;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010064
Galanakis, Minosecc9de82019-11-20 14:29:44 +000065 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000066}
67
Galanakis, Minosecc9de82019-11-20 14:29:44 +000068psa_status_t psa_ps_get_info(psa_storage_uid_t uid,
69 struct psa_storage_info_t *p_info)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010070{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000071 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000072 psa_invec in_vec[] = {
73 { .base = &uid, .len = sizeof(uid) }
74 };
75
76 psa_outvec out_vec[] = {
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000077 { .base = p_info, .len = sizeof(*p_info) }
78 };
79
David Hu7c2a7442021-04-01 16:34:30 +080080 status = tfm_ns_interface_dispatch((veneer_fn)tfm_ps_get_info_req_veneer,
81 (uint32_t)in_vec, IOVEC_LEN(in_vec),
82 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000083
Galanakis, Minosecc9de82019-11-20 14:29:44 +000084 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010085}
86
Galanakis, Minosecc9de82019-11-20 14:29:44 +000087psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010088{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000089 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000090 psa_invec in_vec[] = {
91 { .base = &uid, .len = sizeof(uid) }
92 };
93
David Hu7c2a7442021-04-01 16:34:30 +080094 status = tfm_ns_interface_dispatch((veneer_fn)tfm_ps_remove_req_veneer,
95 (uint32_t)in_vec, IOVEC_LEN(in_vec),
96 (uint32_t)NULL, 0);
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000097
Galanakis, Minosecc9de82019-11-20 14:29:44 +000098 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010099}
100
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000101psa_status_t psa_ps_create(psa_storage_uid_t uid,
102 size_t capacity,
103 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000104{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000105 (void)uid;
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000106 (void)capacity;
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000107 (void)create_flags;
108
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000109 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000110}
111
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000112psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, size_t data_offset,
113 size_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000114{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000115 (void)uid;
116 (void)data_offset;
117 (void)data_length;
118 (void)p_data;
119
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000120 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000121}
122
Jamie Foxb93da8b2018-12-13 18:27:30 +0000123uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000124{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000125 /* Initialise support_flags to a sensible default, to avoid returning an
126 * uninitialised value in case the secure function fails.
127 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000128 uint32_t support_flags = 0;
129
130 psa_outvec out_vec[] = {
131 { .base = &support_flags, .len = sizeof(support_flags) }
132 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100133
David Hu7c2a7442021-04-01 16:34:30 +0800134 (void)tfm_ns_interface_dispatch((veneer_fn)tfm_ps_get_support_req_veneer,
135 (uint32_t)NULL, 0,
136 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Jamie Foxb93da8b2018-12-13 18:27:30 +0000137
138 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000139}