blob: 5102b2f5287a1551357564854ed075e45f7f2765 [file] [log] [blame]
Ashutosh Singhf4d88672017-11-29 13:35:43 +00001/*
Jamie Foxb93da8b2018-12-13 18:27:30 +00002 * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
Ashutosh Singhf4d88672017-11-29 13:35:43 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Jamie Foxb93da8b2018-12-13 18:27:30 +00008#include "psa_protected_storage.h"
9
Ashutosh Singhf4d88672017-11-29 13:35:43 +000010#include "tfm_ns_lock.h"
Jamie Foxb93da8b2018-12-13 18:27:30 +000011#include "tfm_sst_defs.h"
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000012#include "tfm_veneers.h"
13
14#define IOVEC_LEN(x) (uint32_t)(sizeof(x)/sizeof(x[0]))
Mate Toth-Pal261df462018-08-07 12:02:42 +020015
Jamie Foxb93da8b2018-12-13 18:27:30 +000016psa_ps_status_t psa_ps_set(psa_ps_uid_t uid,
17 uint32_t data_length,
18 const void *p_data,
19 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000020{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000021 psa_status_t status;
Jamie Foxb93da8b2018-12-13 18:27:30 +000022 enum tfm_sst_err_t err;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010023
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000024 psa_invec in_vec[] = {
25 { .base = &uid, .len = sizeof(uid) },
26 { .base = p_data, .len = data_length },
27 { .base = &create_flags, .len = sizeof(create_flags) }
28 };
29
30 psa_outvec out_vec[] = {
31 { .base = &err , .len = sizeof(err) }
32 };
33
34 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_set_req_veneer,
35 (uint32_t)in_vec, IOVEC_LEN(in_vec),
36 (uint32_t)out_vec, IOVEC_LEN(out_vec));
37 if (status != PSA_SUCCESS) {
38 return PSA_PS_ERROR_OPERATION_FAILED;
39 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010040
Jamie Foxb93da8b2018-12-13 18:27:30 +000041 return TFM_SST_PSA_RETURN(err);
Ashutosh Singhf4d88672017-11-29 13:35:43 +000042}
43
Jamie Foxb93da8b2018-12-13 18:27:30 +000044psa_ps_status_t psa_ps_get(psa_ps_uid_t uid,
45 uint32_t data_offset,
46 uint32_t data_length,
47 void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +000048{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000049 psa_status_t status;
Jamie Foxb93da8b2018-12-13 18:27:30 +000050 enum tfm_sst_err_t err;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010051
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000052 psa_invec in_vec[] = {
53 { .base = &uid, .len = sizeof(uid) },
54 { .base = &data_offset, .len = sizeof(data_offset) }
55 };
56
57 psa_outvec out_vec[] = {
58 { .base = &err, .len = sizeof(err) },
59 { .base = p_data, .len = data_length }
60 };
61
62 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_req_veneer,
63 (uint32_t)in_vec, IOVEC_LEN(in_vec),
64 (uint32_t)out_vec, IOVEC_LEN(out_vec));
65
66 if (status != PSA_SUCCESS) {
67 return PSA_PS_ERROR_OPERATION_FAILED;
68 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010069
Jamie Foxb93da8b2018-12-13 18:27:30 +000070 return TFM_SST_PSA_RETURN(err);
Ashutosh Singhf4d88672017-11-29 13:35:43 +000071}
72
Jamie Foxb93da8b2018-12-13 18:27:30 +000073psa_ps_status_t psa_ps_get_info(psa_ps_uid_t uid, struct psa_ps_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;
Jamie Foxb93da8b2018-12-13 18:27:30 +000076 enum tfm_sst_err_t err;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010077
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +000078 psa_invec in_vec[] = {
79 { .base = &uid, .len = sizeof(uid) }
80 };
81
82 psa_outvec out_vec[] = {
83 { .base = &err, .len = sizeof(err) },
84 { .base = p_info, .len = sizeof(*p_info) }
85 };
86
87 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_info_req_veneer,
88 (uint32_t)in_vec, IOVEC_LEN(in_vec),
89 (uint32_t)out_vec, IOVEC_LEN(out_vec));
90
91 if (status != PSA_SUCCESS) {
92 return PSA_PS_ERROR_OPERATION_FAILED;
93 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +010094
Jamie Foxb93da8b2018-12-13 18:27:30 +000095 return TFM_SST_PSA_RETURN(err);
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010096}
97
Jamie Foxb93da8b2018-12-13 18:27:30 +000098psa_ps_status_t psa_ps_remove(psa_ps_uid_t uid)
Marc Moreno Berengue51af9512018-06-14 18:28:14 +010099{
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000100 psa_status_t status;
Jamie Foxb93da8b2018-12-13 18:27:30 +0000101 enum tfm_sst_err_t err;
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100102
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000103 psa_invec in_vec[] = {
104 { .base = &uid, .len = sizeof(uid) }
105 };
106
107 psa_outvec out_vec[] = {
108 { .base = &err, .len = sizeof(err) }
109 };
110
111 status = tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_remove_req_veneer,
112 (uint32_t)in_vec, IOVEC_LEN(in_vec),
113 (uint32_t)out_vec, IOVEC_LEN(out_vec));
114
115 if (status != PSA_SUCCESS) {
116 return PSA_PS_ERROR_OPERATION_FAILED;
117 }
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100118
Jamie Foxb93da8b2018-12-13 18:27:30 +0000119 return TFM_SST_PSA_RETURN(err);
Marc Moreno Berengue51af9512018-06-14 18:28:14 +0100120}
121
Jamie Foxb93da8b2018-12-13 18:27:30 +0000122psa_ps_status_t psa_ps_create(psa_ps_uid_t uid, uint32_t size,
123 psa_ps_create_flags_t create_flags)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000124{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000125 (void)uid, (void)size, (void)create_flags;
126 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000127}
128
Jamie Foxb93da8b2018-12-13 18:27:30 +0000129psa_ps_status_t psa_ps_set_extended(psa_ps_uid_t uid, uint32_t data_offset,
130 uint32_t data_length, const void *p_data)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000131{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000132 (void)uid, (void)data_offset, (void)data_length, (void)p_data;
133 return PSA_PS_ERROR_NOT_SUPPORTED;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000134}
135
Jamie Foxb93da8b2018-12-13 18:27:30 +0000136uint32_t psa_ps_get_support(void)
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000137{
Jamie Foxb93da8b2018-12-13 18:27:30 +0000138 /* Initialise support_flags to a sensible default, to avoid returning an
139 * uninitialised value in case the secure function fails.
140 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000141 uint32_t support_flags = 0;
142
143 psa_outvec out_vec[] = {
144 { .base = &support_flags, .len = sizeof(support_flags) }
145 };
Marc Moreno Berengue10d0d362018-06-18 14:15:56 +0100146
Jamie Foxb93da8b2018-12-13 18:27:30 +0000147 /* The PSA API does not return an error, so any error from TF-M is
148 * ignored.
149 */
Marc Moreno Berengue684f61e2019-01-25 13:29:52 +0000150 (void)tfm_ns_lock_dispatch((veneer_fn)tfm_tfm_sst_get_support_req_veneer,
151 (uint32_t)NULL, 0,
152 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Jamie Foxb93da8b2018-12-13 18:27:30 +0000153
154 return support_flags;
Ashutosh Singhf4d88672017-11-29 13:35:43 +0000155}