blob: ffa2f480af5a63517b436378db9be6dfb6cc9c2c [file] [log] [blame]
laurenw-arm4fc77a72022-08-11 15:29:56 -05001/*
2 * Copyright (c) 2023, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
laurenw-arm4fc77a72022-08-11 15:29:56 -05008#include <psa/client.h>
9#include <psa_manifest/sid.h>
Leo Yan42269422025-01-31 17:16:34 +000010#if CRYPTO_SUPPORT
Tamas Bandc2a2862024-02-22 11:41:25 +010011#include <rse_crypto_defs.h>
Leo Yan42269422025-01-31 17:16:34 +000012#endif
Tamas Bandc2a2862024-02-22 11:41:25 +010013#include <rse_platform_api.h>
laurenw-arm4fc77a72022-08-11 15:29:56 -050014
15psa_status_t
Tamas Bandc2a2862024-02-22 11:41:25 +010016rse_platform_nv_counter_increment(uint32_t counter_id)
laurenw-arm4fc77a72022-08-11 15:29:56 -050017{
18 struct psa_invec in_vec[1];
19
20 in_vec[0].base = &counter_id;
21 in_vec[0].len = sizeof(counter_id);
22
Tamas Bandc2a2862024-02-22 11:41:25 +010023 return psa_call(RSE_PLATFORM_SERVICE_HANDLE,
24 RSE_PLATFORM_API_ID_NV_INCREMENT,
laurenw-arm4fc77a72022-08-11 15:29:56 -050025 in_vec, 1, NULL, 0);
26}
27
28psa_status_t
Tamas Bandc2a2862024-02-22 11:41:25 +010029rse_platform_nv_counter_read(uint32_t counter_id,
laurenw-arm4fc77a72022-08-11 15:29:56 -050030 uint32_t size, uint8_t *val)
31{
32 struct psa_invec in_vec[1];
33 struct psa_outvec out_vec[1];
34
35 in_vec[0].base = &counter_id;
36 in_vec[0].len = sizeof(counter_id);
37
38 out_vec[0].base = val;
39 out_vec[0].len = size;
40
Tamas Bandc2a2862024-02-22 11:41:25 +010041 return psa_call(RSE_PLATFORM_SERVICE_HANDLE,
42 RSE_PLATFORM_API_ID_NV_READ,
laurenw-arm4fc77a72022-08-11 15:29:56 -050043 in_vec, 1, out_vec, 1);
44}
laurenw-arm6c4d0412023-06-13 16:40:51 -050045
Leo Yan42269422025-01-31 17:16:34 +000046#if CRYPTO_SUPPORT
laurenw-arm6c4d0412023-06-13 16:40:51 -050047psa_status_t
Tamas Bandc2a2862024-02-22 11:41:25 +010048rse_platform_key_read(enum rse_key_id_builtin_t key, uint8_t *data,
laurenw-arm6c4d0412023-06-13 16:40:51 -050049 size_t data_size, size_t *data_length)
50{
51 psa_status_t status;
52
Tamas Bandc2a2862024-02-22 11:41:25 +010053 struct rse_crypto_pack_iovec iov = {
54 .function_id = RSE_CRYPTO_EXPORT_PUBLIC_KEY_SID,
laurenw-arm6c4d0412023-06-13 16:40:51 -050055 .key_id = key,
56 };
57
58 psa_invec in_vec[] = {
Tamas Bandc2a2862024-02-22 11:41:25 +010059 {.base = &iov, .len = sizeof(struct rse_crypto_pack_iovec)},
laurenw-arm6c4d0412023-06-13 16:40:51 -050060 };
61 psa_outvec out_vec[] = {
62 {.base = data, .len = data_size}
63 };
64
Tamas Bandc2a2862024-02-22 11:41:25 +010065 status = psa_call(RSE_CRYPTO_HANDLE, PSA_IPC_CALL,
laurenw-arm6c4d0412023-06-13 16:40:51 -050066 in_vec, IOVEC_LEN(in_vec),
67 out_vec, IOVEC_LEN(out_vec));
68
69 *data_length = out_vec[0].len;
70
71 return status;
72}
Leo Yan21591bb2025-01-31 10:07:51 +000073
74psa_status_t
75rse_platform_get_entropy(uint8_t *data, size_t data_size)
76{
77 psa_status_t status;
78
79 struct rse_crypto_pack_iovec iov = {
80 .function_id = RSE_CRYPTO_GENERATE_RANDOM_SID,
81 };
82
83 psa_invec in_vec[] = {
84 {.base = &iov, .len = sizeof(struct rse_crypto_pack_iovec)},
85 };
86 psa_outvec out_vec[] = {
87 {.base = data, .len = data_size}
88 };
89
90 status = psa_call(RSE_CRYPTO_HANDLE, PSA_IPC_CALL,
91 in_vec, IOVEC_LEN(in_vec),
92 out_vec, IOVEC_LEN(out_vec));
93
94 return status;
95}
Leo Yan42269422025-01-31 17:16:34 +000096#endif