blob: d3c53a400995140a5728b7380623a36a7dcc23c3 [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Galanakis, Minosecc9de82019-11-20 14:29:44 +00002 * Copyright (c) 2017-2020, Arm Limited. All rights reserved.
Ashutosh Singhf4d88672017-11-29 13:35:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Jamie Foxcc31d402019-01-28 17:13:52 +00008#include "psa/protected_storage.h"
Jamie Foxb93da8b2018-12-13 18:27:30 +00009
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
13#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
Mate Toth-Pal261df462018-08-07 12:02:42 +020014
Galanakis, Minosecc9de82019-11-20 14:29:44 +000015psa_status_t psa_ps_set(psa_storage_uid_t uid,
16 size_t data_length,
17 const void *p_data,
18 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000019{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000020 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000021 psa_invec in_vec[] = {
22 { .base = &uid, .len = sizeof(uid) },
23 { .base = p_data, .len = data_length },
24 { .base = &create_flags, .len = sizeof(create_flags) }
25 };
26
Antonio de Angelis05b24192019-07-04 15:28:46 +010027 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080028 (veneer_fn)tfm_tfm_ps_set_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000029 (uint32_t)in_vec, IOVEC_LEN(in_vec),
Galanakis, Minosecc9de82019-11-20 14:29:44 +000030 (uint32_t)NULL, 0);
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010031
Galanakis, Minosecc9de82019-11-20 14:29:44 +000032 /* A parameter with a buffer pointer pointer that has data length longer
33 * than maximum permitted is treated as a secure violation.
34 * TF-M framework rejects the request with TFM_ERROR_INVALID_PARAMETER.
35 */
36 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
37 return PSA_ERROR_INVALID_ARGUMENT;
38 }
39 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000040}
41
Galanakis, Minosecc9de82019-11-20 14:29:44 +000042psa_status_t psa_ps_get(psa_storage_uid_t uid,
43 size_t data_offset,
44 size_t data_size,
45 void *p_data,
46 size_t *p_data_length)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000047{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000048 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000049 psa_invec in_vec[] = {
50 { .base = &uid, .len = sizeof(uid) },
51 { .base = &data_offset, .len = sizeof(data_offset) }
52 };
53
54 psa_outvec out_vec[] = {
Galanakis, Minosecc9de82019-11-20 14:29:44 +000055 { .base = p_data, .len = data_size }
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000056 };
57
Galanakis, Minosecc9de82019-11-20 14:29:44 +000058 if (p_data_length == NULL) {
59 return PSA_ERROR_INVALID_ARGUMENT;
60 }
61
Antonio de Angelis05b24192019-07-04 15:28:46 +010062 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080063 (veneer_fn)tfm_tfm_ps_get_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000064 (uint32_t)in_vec, IOVEC_LEN(in_vec),
65 (uint32_t)out_vec, IOVEC_LEN(out_vec));
66
Galanakis, Minosecc9de82019-11-20 14:29:44 +000067 *p_data_length = out_vec[0].len;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010068
Galanakis, Minosecc9de82019-11-20 14:29:44 +000069 return status;
Ashutosh Singhf4d88672017-11-29 13:35:43 +000070}
71
Galanakis, Minosecc9de82019-11-20 14:29:44 +000072psa_status_t psa_ps_get_info(psa_storage_uid_t uid,
73 struct psa_storage_info_t *p_info)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010074{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000075 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000076 psa_invec in_vec[] = {
77 { .base = &uid, .len = sizeof(uid) }
78 };
79
80 psa_outvec out_vec[] = {
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000081 { .base = p_info, .len = sizeof(*p_info) }
82 };
83
Antonio de Angelis05b24192019-07-04 15:28:46 +010084 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +080085 (veneer_fn)tfm_tfm_ps_get_info_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000086 (uint32_t)in_vec, IOVEC_LEN(in_vec),
87 (uint32_t)out_vec, IOVEC_LEN(out_vec));
88
Galanakis, Minosecc9de82019-11-20 14:29:44 +000089 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010090}
91
Galanakis, Minosecc9de82019-11-20 14:29:44 +000092psa_status_t psa_ps_remove(psa_storage_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010093{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000094 psa_status_t status;
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000095 psa_invec in_vec[] = {
96 { .base = &uid, .len = sizeof(uid) }
97 };
98
Antonio de Angelis05b24192019-07-04 15:28:46 +010099 status = tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +0800100 (veneer_fn)tfm_tfm_ps_remove_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000101 (uint32_t)in_vec, IOVEC_LEN(in_vec),
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000102 (uint32_t)NULL, 0);
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000103
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000104 return status;
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100105}
106
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000107psa_status_t psa_ps_create(psa_storage_uid_t uid,
108 size_t capacity,
109 psa_storage_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000110{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000111 (void)uid;
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000112 (void)capacity;
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000113 (void)create_flags;
114
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000115 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000116}
117
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000118psa_status_t psa_ps_set_extended(psa_storage_uid_t uid, size_t data_offset,
119 size_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000120{
Hugues de Valoned5d01a2019-02-19 14:41:38 +0000121 (void)uid;
122 (void)data_offset;
123 (void)data_length;
124 (void)p_data;
125
Galanakis, Minosecc9de82019-11-20 14:29:44 +0000126 return PSA_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000127}
128
Jamie Foxb93da8b2018-12-13 18:27:30 +0000129uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000130{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000131 /* Initialise support_flags to a sensible default, to avoid returning an
132 * uninitialised value in case the secure function fails.
133 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000134 uint32_t support_flags = 0;
135
136 psa_outvec out_vec[] = {
137 { .base = &support_flags, .len = sizeof(support_flags) }
138 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100139
Antonio de Angelis05b24192019-07-04 15:28:46 +0100140 (void)tfm_ns_interface_dispatch(
Kevin Pengc6d74502020-03-04 16:55:37 +0800141 (veneer_fn)tfm_tfm_ps_get_support_req_veneer,
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000142 (uint32_t)NULL, 0,
143 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Jamie Foxb93da8b2018-12-13 18:27:30 +0000144
145 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000146}