blob: 34396350205567d6e3f2a1d9384858c80aa8e74b [file] [log] [blame]
Antonio de Angelis2eeac642018-08-21 14:23:22 +01001/*
Hugues de Valonadf9f082019-02-19 14:26:20 +00002 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
Antonio de Angelis2eeac642018-08-21 14:23:22 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Antonio de Angelis2eeac642018-08-21 14:23:22 +01008#include "psa_audit_api.h"
Antonio de Angelisab000e82019-07-09 15:05:22 +01009#include "tfm_veneers.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010010#include "tfm_ns_interface.h"
Antonio de Angelis2eeac642018-08-21 14:23:22 +010011
Antonio de Angelisab000e82019-07-09 15:05:22 +010012#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
13
Antonio de Angelis05b24192019-07-04 15:28:46 +010014#define API_DISPATCH(sfn_name) \
15 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
16 (uint32_t)in_vec, (uint32_t)ARRAY_SIZE(in_vec), \
Antonio de Angelisab000e82019-07-09 15:05:22 +010017 (uint32_t)out_vec, (uint32_t)ARRAY_SIZE(out_vec))
18
Antonio de Angelis05b24192019-07-04 15:28:46 +010019#define API_DISPATCH_NO_INVEC(sfn_name) \
20 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
21 (uint32_t)NULL, 0, \
Antonio de Angelisab000e82019-07-09 15:05:22 +010022 (uint32_t)out_vec, (uint32_t)ARRAY_SIZE(out_vec))
23
Antonio de Angelis05b24192019-07-04 15:28:46 +010024#define API_DISPATCH_NO_OUTVEC(sfn_name) \
25 tfm_ns_interface_dispatch((veneer_fn)tfm_##sfn_name##_veneer, \
26 (uint32_t)in_vec, (uint32_t)ARRAY_SIZE(in_vec), \
Antonio de Angelisab000e82019-07-09 15:05:22 +010027 (uint32_t)NULL, 0)
28
29psa_status_t psa_audit_retrieve_record(const uint32_t record_index,
30 const uint32_t buffer_size,
31 const uint8_t *token,
32 const uint32_t token_size,
33 uint8_t *buffer,
34 uint32_t *record_size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010035{
Antonio de Angelisab000e82019-07-09 15:05:22 +010036 psa_status_t status;
37 psa_invec in_vec[] = {
38 {.base = &record_index, .len = sizeof(uint32_t)},
39 {.base = token, .len = token_size},
40 };
41 psa_outvec out_vec[] = {
42 {.base = buffer, .len = buffer_size},
43 };
Antonio de Angelis2eeac642018-08-21 14:23:22 +010044
Antonio de Angelisab000e82019-07-09 15:05:22 +010045 status = API_DISPATCH(audit_core_retrieve_record);
Antonio de Angelis2eeac642018-08-21 14:23:22 +010046
Antonio de Angelisab000e82019-07-09 15:05:22 +010047 *record_size = out_vec[0].len;
48
49 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010050}
51
Antonio de Angelisab000e82019-07-09 15:05:22 +010052psa_status_t psa_audit_get_info(uint32_t *num_records, uint32_t *size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010053{
Antonio de Angelisab000e82019-07-09 15:05:22 +010054 psa_status_t status;
55 psa_outvec out_vec[] = {
56 {.base = num_records, .len = sizeof(uint32_t)},
57 {.base = size, .len = sizeof(uint32_t)},
58 };
59
60 status = API_DISPATCH_NO_INVEC(audit_core_get_info);
61
62 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010063}
64
Antonio de Angelisab000e82019-07-09 15:05:22 +010065psa_status_t psa_audit_get_record_info(const uint32_t record_index,
66 uint32_t *size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010067{
Antonio de Angelisab000e82019-07-09 15:05:22 +010068 psa_status_t status;
69 psa_invec in_vec[] = {
70 {.base = &record_index, .len = sizeof(uint32_t)},
71 };
72 psa_outvec out_vec[] = {
73 {.base = size, .len = sizeof(uint32_t)},
74 };
75
76 status = API_DISPATCH(audit_core_get_record_info);
77
78 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010079}
80
Antonio de Angelisab000e82019-07-09 15:05:22 +010081psa_status_t psa_audit_delete_record(const uint32_t record_index,
82 const uint8_t *token,
83 const uint32_t token_size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010084{
Antonio de Angelisab000e82019-07-09 15:05:22 +010085 psa_status_t status;
86 psa_invec in_vec[] = {
87 {.base = &record_index, .len = sizeof(uint32_t)},
88 {.base = token, .len = token_size},
89 };
90
91 status = API_DISPATCH_NO_OUTVEC(audit_core_delete_record);
92
93 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010094}
95
Antonio de Angelisab000e82019-07-09 15:05:22 +010096psa_status_t psa_audit_add_record(const struct psa_audit_record *record)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010097{
98 /* This API supports only Secure world calls. As this is the implementation
99 * of the Non-Secure interface, always directly return an error without
Antonio de Angelisab000e82019-07-09 15:05:22 +0100100 * routing the call to TF-M in the Secure world.
Antonio de Angelis2eeac642018-08-21 14:23:22 +0100101 */
Hugues de Valonadf9f082019-02-19 14:26:20 +0000102 (void)record;
Antonio de Angelisab000e82019-07-09 15:05:22 +0100103 return PSA_ERROR_NOT_PERMITTED;
Antonio de Angelis2eeac642018-08-21 14:23:22 +0100104}