xref: /arm-trusted-firmware/lib/psa/rss_platform.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2023, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <psa/client.h>
9*91f16700Schasinglulu #include <psa_manifest/sid.h>
10*91f16700Schasinglulu #include <rss_crypto_defs.h>
11*91f16700Schasinglulu #include <rss_platform_api.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu psa_status_t
14*91f16700Schasinglulu rss_platform_nv_counter_increment(uint32_t counter_id)
15*91f16700Schasinglulu {
16*91f16700Schasinglulu 	struct psa_invec in_vec[1];
17*91f16700Schasinglulu 
18*91f16700Schasinglulu 	in_vec[0].base = &counter_id;
19*91f16700Schasinglulu 	in_vec[0].len = sizeof(counter_id);
20*91f16700Schasinglulu 
21*91f16700Schasinglulu 	return psa_call(RSS_PLATFORM_SERVICE_HANDLE,
22*91f16700Schasinglulu 			RSS_PLATFORM_API_ID_NV_INCREMENT,
23*91f16700Schasinglulu 			in_vec, 1, NULL, 0);
24*91f16700Schasinglulu }
25*91f16700Schasinglulu 
26*91f16700Schasinglulu psa_status_t
27*91f16700Schasinglulu rss_platform_nv_counter_read(uint32_t counter_id,
28*91f16700Schasinglulu 		uint32_t size, uint8_t *val)
29*91f16700Schasinglulu {
30*91f16700Schasinglulu 	struct psa_invec in_vec[1];
31*91f16700Schasinglulu 	struct psa_outvec out_vec[1];
32*91f16700Schasinglulu 
33*91f16700Schasinglulu 	in_vec[0].base = &counter_id;
34*91f16700Schasinglulu 	in_vec[0].len = sizeof(counter_id);
35*91f16700Schasinglulu 
36*91f16700Schasinglulu 	out_vec[0].base = val;
37*91f16700Schasinglulu 	out_vec[0].len = size;
38*91f16700Schasinglulu 
39*91f16700Schasinglulu 	return psa_call(RSS_PLATFORM_SERVICE_HANDLE,
40*91f16700Schasinglulu 			RSS_PLATFORM_API_ID_NV_READ,
41*91f16700Schasinglulu 			in_vec, 1, out_vec, 1);
42*91f16700Schasinglulu }
43*91f16700Schasinglulu 
44*91f16700Schasinglulu psa_status_t
45*91f16700Schasinglulu rss_platform_key_read(enum rss_key_id_builtin_t key, uint8_t *data,
46*91f16700Schasinglulu 		size_t data_size, size_t *data_length)
47*91f16700Schasinglulu {
48*91f16700Schasinglulu 	psa_status_t status;
49*91f16700Schasinglulu 
50*91f16700Schasinglulu 	struct rss_crypto_pack_iovec iov = {
51*91f16700Schasinglulu 		.function_id = RSS_CRYPTO_EXPORT_PUBLIC_KEY_SID,
52*91f16700Schasinglulu 		.key_id = key,
53*91f16700Schasinglulu 	};
54*91f16700Schasinglulu 
55*91f16700Schasinglulu 	psa_invec in_vec[] = {
56*91f16700Schasinglulu 		{.base = &iov, .len = sizeof(struct rss_crypto_pack_iovec)},
57*91f16700Schasinglulu 	};
58*91f16700Schasinglulu 	psa_outvec out_vec[] = {
59*91f16700Schasinglulu 		{.base = data, .len = data_size}
60*91f16700Schasinglulu 	};
61*91f16700Schasinglulu 
62*91f16700Schasinglulu 	status = psa_call(RSS_CRYPTO_HANDLE, PSA_IPC_CALL,
63*91f16700Schasinglulu 			in_vec, IOVEC_LEN(in_vec),
64*91f16700Schasinglulu 			out_vec, IOVEC_LEN(out_vec));
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 	*data_length = out_vec[0].len;
67*91f16700Schasinglulu 
68*91f16700Schasinglulu 	return status;
69*91f16700Schasinglulu }
70