xref: /rk3399_ARM-atf/lib/psa/rse_platform.c (revision 697290a9166a4d62f757eeefcb7376817b0f0e4a)
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