xref: /arm-trusted-firmware/lib/psa/delegated_attestation.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022-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 <delegated_attestation.h>
9*91f16700Schasinglulu #include <psa/client.h>
10*91f16700Schasinglulu #include <psa_manifest/sid.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu psa_status_t
13*91f16700Schasinglulu rss_delegated_attest_get_delegated_key(uint8_t   ecc_curve,
14*91f16700Schasinglulu 				       uint32_t  key_bits,
15*91f16700Schasinglulu 				       uint8_t  *key_buf,
16*91f16700Schasinglulu 				       size_t    key_buf_size,
17*91f16700Schasinglulu 				       size_t   *key_size,
18*91f16700Schasinglulu 				       uint32_t  hash_algo)
19*91f16700Schasinglulu {
20*91f16700Schasinglulu 	psa_status_t status;
21*91f16700Schasinglulu 	psa_invec in_vec[] = {
22*91f16700Schasinglulu 		{&ecc_curve, sizeof(ecc_curve)},
23*91f16700Schasinglulu 		{&key_bits,  sizeof(key_bits)},
24*91f16700Schasinglulu 		{&hash_algo, sizeof(hash_algo)}
25*91f16700Schasinglulu 	};
26*91f16700Schasinglulu 	psa_outvec out_vec[] = {
27*91f16700Schasinglulu 		{key_buf, key_buf_size}
28*91f16700Schasinglulu 	};
29*91f16700Schasinglulu 
30*91f16700Schasinglulu 	if (key_size == NULL) {
31*91f16700Schasinglulu 		return PSA_ERROR_INVALID_ARGUMENT;
32*91f16700Schasinglulu 	}
33*91f16700Schasinglulu 
34*91f16700Schasinglulu 	status = psa_call(RSS_DELEGATED_SERVICE_HANDLE,
35*91f16700Schasinglulu 			  RSS_DELEGATED_ATTEST_GET_DELEGATED_KEY,
36*91f16700Schasinglulu 			  in_vec,  IOVEC_LEN(in_vec),
37*91f16700Schasinglulu 			  out_vec, IOVEC_LEN(out_vec));
38*91f16700Schasinglulu 	if (status == PSA_SUCCESS) {
39*91f16700Schasinglulu 		*key_size = out_vec[0].len;
40*91f16700Schasinglulu 	}
41*91f16700Schasinglulu 
42*91f16700Schasinglulu 	return status;
43*91f16700Schasinglulu }
44*91f16700Schasinglulu 
45*91f16700Schasinglulu psa_status_t
46*91f16700Schasinglulu rss_delegated_attest_get_token(const uint8_t *dak_pub_hash,
47*91f16700Schasinglulu 			       size_t         dak_pub_hash_size,
48*91f16700Schasinglulu 			       uint8_t       *token_buf,
49*91f16700Schasinglulu 			       size_t         token_buf_size,
50*91f16700Schasinglulu 			       size_t        *token_size)
51*91f16700Schasinglulu {
52*91f16700Schasinglulu 	psa_status_t status;
53*91f16700Schasinglulu 	psa_invec in_vec[] = {
54*91f16700Schasinglulu 		{dak_pub_hash, dak_pub_hash_size}
55*91f16700Schasinglulu 	};
56*91f16700Schasinglulu 	psa_outvec out_vec[] = {
57*91f16700Schasinglulu 		{token_buf, token_buf_size}
58*91f16700Schasinglulu 	};
59*91f16700Schasinglulu 
60*91f16700Schasinglulu 	if (token_size == NULL) {
61*91f16700Schasinglulu 		return PSA_ERROR_INVALID_ARGUMENT;
62*91f16700Schasinglulu 	}
63*91f16700Schasinglulu 
64*91f16700Schasinglulu 	status = psa_call(RSS_DELEGATED_SERVICE_HANDLE,
65*91f16700Schasinglulu 			  RSS_DELEGATED_ATTEST_GET_PLATFORM_TOKEN,
66*91f16700Schasinglulu 			  in_vec, IOVEC_LEN(in_vec),
67*91f16700Schasinglulu 			  out_vec, IOVEC_LEN(out_vec));
68*91f16700Schasinglulu 	if (status == PSA_SUCCESS) {
69*91f16700Schasinglulu 		*token_size = out_vec[0].len;
70*91f16700Schasinglulu 	}
71*91f16700Schasinglulu 
72*91f16700Schasinglulu 	return status;
73*91f16700Schasinglulu }
74