blob: e433dffbf3f8d25eccfc373f3b83d29bedada278 [file] [log] [blame]
Antonio de Angelis2eeac642018-08-21 14:23:22 +01001/*
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08002 * Copyright (c) 2018-2021, Arm Limited. All rights reserved.
Antonio de Angelis2eeac642018-08-21 14:23:22 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Xinyu Zhangade2e0a2021-03-18 16:20:54 +08008#include "psa/client.h"
Antonio de Angelis2eeac642018-08-21 14:23:22 +01009#include "psa_audit_api.h"
Antonio de Angelisab000e82019-07-09 15:05:22 +010010#include "tfm_veneers.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010011#include "tfm_ns_interface.h"
Antonio de Angelis2eeac642018-08-21 14:23:22 +010012
Antonio de Angelis05b24192019-07-04 15:28:46 +010013#define API_DISPATCH(sfn_name) \
David Hu7c2a7442021-04-01 16:34:30 +080014 tfm_ns_interface_dispatch((veneer_fn)sfn_name##_veneer, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080015 (uint32_t)in_vec, IOVEC_LEN(in_vec), \
16 (uint32_t)out_vec, IOVEC_LEN(out_vec))
Antonio de Angelisab000e82019-07-09 15:05:22 +010017
Antonio de Angelis05b24192019-07-04 15:28:46 +010018#define API_DISPATCH_NO_INVEC(sfn_name) \
David Hu7c2a7442021-04-01 16:34:30 +080019 tfm_ns_interface_dispatch((veneer_fn)sfn_name##_veneer, \
Antonio de Angelis05b24192019-07-04 15:28:46 +010020 (uint32_t)NULL, 0, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080021 (uint32_t)out_vec, IOVEC_LEN(out_vec))
Antonio de Angelisab000e82019-07-09 15:05:22 +010022
Antonio de Angelis05b24192019-07-04 15:28:46 +010023#define API_DISPATCH_NO_OUTVEC(sfn_name) \
David Hu7c2a7442021-04-01 16:34:30 +080024 tfm_ns_interface_dispatch((veneer_fn)sfn_name##_veneer, \
Xinyu Zhangade2e0a2021-03-18 16:20:54 +080025 (uint32_t)in_vec, IOVEC_LEN(in_vec), \
Antonio de Angelisab000e82019-07-09 15:05:22 +010026 (uint32_t)NULL, 0)
27
28psa_status_t psa_audit_retrieve_record(const uint32_t record_index,
29 const uint32_t buffer_size,
30 const uint8_t *token,
31 const uint32_t token_size,
32 uint8_t *buffer,
33 uint32_t *record_size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010034{
Antonio de Angelisab000e82019-07-09 15:05:22 +010035 psa_status_t status;
36 psa_invec in_vec[] = {
37 {.base = &record_index, .len = sizeof(uint32_t)},
38 {.base = token, .len = token_size},
39 };
40 psa_outvec out_vec[] = {
41 {.base = buffer, .len = buffer_size},
42 };
Antonio de Angelis2eeac642018-08-21 14:23:22 +010043
David Hu7c2a7442021-04-01 16:34:30 +080044 status = API_DISPATCH(tfm_audit_core_retrieve_record);
Antonio de Angelis2eeac642018-08-21 14:23:22 +010045
Antonio de Angelisab000e82019-07-09 15:05:22 +010046 *record_size = out_vec[0].len;
47
48 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010049}
50
Antonio de Angelisab000e82019-07-09 15:05:22 +010051psa_status_t psa_audit_get_info(uint32_t *num_records, uint32_t *size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010052{
Antonio de Angelisab000e82019-07-09 15:05:22 +010053 psa_status_t status;
54 psa_outvec out_vec[] = {
55 {.base = num_records, .len = sizeof(uint32_t)},
56 {.base = size, .len = sizeof(uint32_t)},
57 };
58
David Hu7c2a7442021-04-01 16:34:30 +080059 status = API_DISPATCH_NO_INVEC(tfm_audit_core_get_info);
Antonio de Angelisab000e82019-07-09 15:05:22 +010060
61 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010062}
63
Antonio de Angelisab000e82019-07-09 15:05:22 +010064psa_status_t psa_audit_get_record_info(const uint32_t record_index,
65 uint32_t *size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010066{
Antonio de Angelisab000e82019-07-09 15:05:22 +010067 psa_status_t status;
68 psa_invec in_vec[] = {
69 {.base = &record_index, .len = sizeof(uint32_t)},
70 };
71 psa_outvec out_vec[] = {
72 {.base = size, .len = sizeof(uint32_t)},
73 };
74
David Hu7c2a7442021-04-01 16:34:30 +080075 status = API_DISPATCH(tfm_audit_core_get_record_info);
Antonio de Angelisab000e82019-07-09 15:05:22 +010076
77 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010078}
79
Antonio de Angelisab000e82019-07-09 15:05:22 +010080psa_status_t psa_audit_delete_record(const uint32_t record_index,
81 const uint8_t *token,
82 const uint32_t token_size)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010083{
Antonio de Angelisab000e82019-07-09 15:05:22 +010084 psa_status_t status;
85 psa_invec in_vec[] = {
86 {.base = &record_index, .len = sizeof(uint32_t)},
87 {.base = token, .len = token_size},
88 };
89
David Hu7c2a7442021-04-01 16:34:30 +080090 status = API_DISPATCH_NO_OUTVEC(tfm_audit_core_delete_record);
Antonio de Angelisab000e82019-07-09 15:05:22 +010091
92 return status;
Antonio de Angelis2eeac642018-08-21 14:23:22 +010093}
94
Antonio de Angelisab000e82019-07-09 15:05:22 +010095psa_status_t psa_audit_add_record(const struct psa_audit_record *record)
Antonio de Angelis2eeac642018-08-21 14:23:22 +010096{
97 /* This API supports only Secure world calls. As this is the implementation
98 * of the Non-Secure interface, always directly return an error without
Antonio de Angelisab000e82019-07-09 15:05:22 +010099 * routing the call to TF-M in the Secure world.
Antonio de Angelis2eeac642018-08-21 14:23:22 +0100100 */
Hugues de Valonadf9f082019-02-19 14:26:20 +0000101 (void)record;
Antonio de Angelisab000e82019-07-09 15:05:22 +0100102 return PSA_ERROR_NOT_PERMITTED;
Antonio de Angelis2eeac642018-08-21 14:23:22 +0100103}