blob: 4674a350a1e09bb88b7b8f13aba397bf3b0f860b [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
Antonio de Angelis05b24192019-07-04 15:28:46 +010025 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080026 (veneer_fn)tfm_tfm_ps_set_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000027 (uint32_t)in_vec, IOVEC_LEN(in_vec),
Galanakis, Minosecc9de82019-11-20 14:29:44 +000028 (uint32_t)NULL, 0);
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010029
Galanakis, Minosecc9de82019-11-20 14:29:44 +000030 /* A parameter with a buffer pointer pointer that has data length longer
31 * than maximum permitted is treated as a secure violation.
32 * TF-M framework rejects the request with TFM_ERROR_INVALID_PARAMETER.
33 */
34 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
35 return PSA_ERROR_INVALID_ARGUMENT;
36 }
37 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000038}
39
Galanakis, Minosecc9de82019-11-20 14:29:44 +000040psa_status_t psa_ps_get(psa_storage_uid_t uid,
41 size_t data_offset,
42 size_t data_size,
43 void *p_data,
44 size_t *p_data_length)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000045{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000046 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000047 psa_invec in_vec[] = {
48 { .base = &uid, .len = sizeof(uid) },
49 { .base = &data_offset, .len = sizeof(data_offset) }
50 };
51
52 psa_outvec out_vec[] = {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000053 { .base = p_data, .len = data_size }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000054 };
55
Galanakis, Minosecc9de82019-11-20 14:29:44 +000056 if (p_data_length == NULL) {
57 return PSA_ERROR_INVALID_ARGUMENT;
58 }
59
Antonio de Angelis05b24192019-07-04 15:28:46 +010060 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080061 (veneer_fn)tfm_tfm_ps_get_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000062 (uint32_t)in_vec, IOVEC_LEN(in_vec),
63 (uint32_t)out_vec, IOVEC_LEN(out_vec));
64
Galanakis, Minosecc9de82019-11-20 14:29:44 +000065 *p_data_length = out_vec[0].len;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010066
Galanakis, Minosecc9de82019-11-20 14:29:44 +000067 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000068}
69
Galanakis, Minosecc9de82019-11-20 14:29:44 +000070psa_status_t psa_ps_get_info(psa_storage_uid_t uid,
71 struct psa_storage_info_t *p_info)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010072{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000073 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000074 psa_invec in_vec[] = {
75 { .base = &uid, .len = sizeof(uid) }
76 };
77
78 psa_outvec out_vec[] = {
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000079 { .base = p_info, .len = sizeof(*p_info) }
80 };
81
Antonio de Angelis05b24192019-07-04 15:28:46 +010082 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080083 (veneer_fn)tfm_tfm_ps_get_info_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000084 (uint32_t)in_vec, IOVEC_LEN(in_vec),
85 (uint32_t)out_vec, IOVEC_LEN(out_vec));
86
Galanakis, Minosecc9de82019-11-20 14:29:44 +000087 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010088}
89
Galanakis, Minosecc9de82019-11-20 14:29:44 +000090psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010091{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000092 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000093 psa_invec in_vec[] = {
94 { .base = &uid, .len = sizeof(uid) }
95 };
96
Antonio de Angelis05b24192019-07-04 15:28:46 +010097 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080098 (veneer_fn)tfm_tfm_ps_remove_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000099 (uint32_t)in_vec, IOVEC_LEN(in_vec),
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000100 (uint32_t)NULL, 0);
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000101
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000102 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100103}
104
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000105psa_status_t psa_ps_create(psa_storage_uid_t uid,
106 size_t capacity,
107 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000108{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000109 (void)uid;
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000110 (void)capacity;
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000111 (void)create_flags;
112
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000113 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000114}
115
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000116psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, size_t data_offset,
117 size_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000118{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000119 (void)uid;
120 (void)data_offset;
121 (void)data_length;
122 (void)p_data;
123
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000124 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000125}
126
Jamie Foxb93da8b2018-12-13 18:27:30 +0000127uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000128{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000129 /* Initialise support_flags to a sensible default, to avoid returning an
130 * uninitialised value in case the secure function fails.
131 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000132 uint32_t support_flags = 0;
133
134 psa_outvec out_vec[] = {
135 { .base = &support_flags, .len = sizeof(support_flags) }
136 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100137
Antonio de Angelis05b24192019-07-04 15:28:46 +0100138 (void)tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +0800139 (veneer_fn)tfm_tfm_ps_get_support_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000140 (uint32_t)NULL, 0,
141 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Jamie Foxb93da8b2018-12-13 18:27:30 +0000142
143 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000144}