1 /*
2 * Copyright (c) 2023, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #include <psa/client.h>
9 #include <psa_manifest/sid.h>
10 #if CRYPTO_SUPPORT
11 #include <rse_crypto_defs.h>
12 #endif
13 #include <rse_platform_api.h>
14
15 psa_status_t
rse_platform_nv_counter_increment(uint32_t counter_id)16 rse_platform_nv_counter_increment(uint32_t counter_id)
17 {
18 struct psa_invec in_vec[1];
19
20 in_vec[0].base = &counter_id;
21 in_vec[0].len = sizeof(counter_id);
22
23 return psa_call(RSE_PLATFORM_SERVICE_HANDLE,
24 RSE_PLATFORM_API_ID_NV_INCREMENT,
25 in_vec, 1, NULL, 0);
26 }
27
28 psa_status_t
rse_platform_nv_counter_read(uint32_t counter_id,uint32_t size,uint8_t * val)29 rse_platform_nv_counter_read(uint32_t counter_id,
30 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
41 return psa_call(RSE_PLATFORM_SERVICE_HANDLE,
42 RSE_PLATFORM_API_ID_NV_READ,
43 in_vec, 1, out_vec, 1);
44 }
45
46 #if CRYPTO_SUPPORT
47 psa_status_t
rse_platform_key_read(enum rse_key_id_builtin_t key,uint8_t * data,size_t data_size,size_t * data_length)48 rse_platform_key_read(enum rse_key_id_builtin_t key, uint8_t *data,
49 size_t data_size, size_t *data_length)
50 {
51 psa_status_t status;
52
53 struct rse_crypto_pack_iovec iov = {
54 .function_id = RSE_CRYPTO_EXPORT_PUBLIC_KEY_SID,
55 .key_id = key,
56 };
57
58 psa_invec in_vec[] = {
59 {.base = &iov, .len = sizeof(struct rse_crypto_pack_iovec)},
60 };
61 psa_outvec out_vec[] = {
62 {.base = data, .len = data_size}
63 };
64
65 status = psa_call(RSE_CRYPTO_HANDLE, PSA_IPC_CALL,
66 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 }
73
74 psa_status_t
rse_platform_get_entropy(uint8_t * data,size_t data_size)75 rse_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 }
96 #endif
97