blob: da126d7a2f6d6772383ce3ce8d0d2c5047494f1a [file] [log] [blame]
TudorCretufb182bc2019-07-05 17:34:12 +01001/*
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08002 * Copyright (c) 2019-2021, Arm Limited. All rights reserved.
TudorCretufb182bc2019-07-05 17:34:12 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
TudorCretufb182bc2019-07-05 17:34:12 +01009#include "psa/internal_trusted_storage.h"
10#include "tfm_api.h"
TudorCretufb182bc2019-07-05 17:34:12 +010011#include "tfm_ns_interface.h"
12#include "tfm_veneers.h"
13
TudorCretufb182bc2019-07-05 17:34:12 +010014psa_status_t psa_its_set(psa_storage_uid_t uid,
15 size_t data_length,
16 const void *p_data,
17 psa_storage_create_flags_t create_flags)
18{
19 psa_status_t status;
20
21 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
David Hu7c2a7442021-04-01 16:34:30 +080027 status = tfm_ns_interface_dispatch((veneer_fn)tfm_its_set_req_veneer,
TudorCretufb182bc2019-07-05 17:34:12 +010028 (uint32_t)in_vec, IOVEC_LEN(in_vec),
29 (uint32_t)NULL, 0);
30
31 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
32 return PSA_ERROR_INVALID_ARGUMENT;
33 }
34
35 return status;
36}
37
38psa_status_t psa_its_get(psa_storage_uid_t uid,
39 size_t data_offset,
40 size_t data_size,
41 void *p_data,
42 size_t *p_data_length)
43{
44 psa_status_t status;
45
46 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[] = {
52 { .base = p_data, .len = data_size }
53 };
54
55 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_its_get_req_veneer,
TudorCretufb182bc2019-07-05 17:34:12 +010060 (uint32_t)in_vec, IOVEC_LEN(in_vec),
61 (uint32_t)out_vec, IOVEC_LEN(out_vec));
62
63 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
64 return PSA_ERROR_INVALID_ARGUMENT;
65 }
66
67 *p_data_length = out_vec[0].len;
68
69 return status;
70}
71
72psa_status_t psa_its_get_info(psa_storage_uid_t uid,
73 struct psa_storage_info_t *p_info)
74{
75 psa_status_t status;
76
77 psa_invec in_vec[] = {
78 { .base = &uid, .len = sizeof(uid) }
79 };
80
81 psa_outvec out_vec[] = {
82 { .base = p_info, .len = sizeof(*p_info) }
83 };
84
David Hu7c2a7442021-04-01 16:34:30 +080085 status = tfm_ns_interface_dispatch((veneer_fn)tfm_its_get_info_req_veneer,
86 (uint32_t)in_vec, IOVEC_LEN(in_vec),
87 (uint32_t)out_vec, IOVEC_LEN(out_vec));
TudorCretufb182bc2019-07-05 17:34:12 +010088
89 if (status == (psa_status_t)TFM_ERROR_INVALID_PARAMETER) {
90 return PSA_ERROR_INVALID_ARGUMENT;
91 }
92
93 return status;
94}
95
96psa_status_t psa_its_remove(psa_storage_uid_t uid)
97{
98 psa_invec in_vec[] = {
99 { .base = &uid, .len = sizeof(uid) }
100 };
101
David Hu7c2a7442021-04-01 16:34:30 +0800102 return tfm_ns_interface_dispatch((veneer_fn)tfm_its_remove_req_veneer,
TudorCretufb182bc2019-07-05 17:34:12 +0100103 (uint32_t)in_vec, IOVEC_LEN(in_vec),
104 (uint32_t)NULL, 0);
105}