1 /*
2  * SPDX-FileCopyrightText: Copyright The TrustedFirmware-M Contributors
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "psa/initial_attestation.h"
9 #include "psa/client.h"
10 #include "psa_manifest/sid.h"
11 #include "tfm_attest_defs.h"
12 
13 psa_status_t
psa_initial_attest_get_token(const uint8_t * auth_challenge,size_t challenge_size,uint8_t * token_buf,size_t token_buf_size,size_t * token_size)14 psa_initial_attest_get_token(const uint8_t *auth_challenge,
15                              size_t         challenge_size,
16                              uint8_t       *token_buf,
17                              size_t         token_buf_size,
18                              size_t        *token_size)
19 {
20     psa_status_t status;
21 
22     psa_invec in_vec[] = {
23         {auth_challenge, challenge_size}
24     };
25     psa_outvec out_vec[] = {
26         {token_buf, token_buf_size}
27     };
28 
29     status = psa_call(TFM_ATTESTATION_SERVICE_HANDLE, TFM_ATTEST_GET_TOKEN,
30                       in_vec, IOVEC_LEN(in_vec),
31                       out_vec, IOVEC_LEN(out_vec));
32 
33     if (status == PSA_SUCCESS) {
34         *token_size = out_vec[0].len;
35     }
36 
37     return status;
38 }
39 
40 psa_status_t
psa_initial_attest_get_token_size(size_t challenge_size,size_t * token_size)41 psa_initial_attest_get_token_size(size_t  challenge_size,
42                                   size_t *token_size)
43 {
44     psa_status_t status;
45     rot_size_t challenge_size_param;
46     rot_size_t token_size_param = 0;
47 
48     psa_invec in_vec[] = {
49         {&challenge_size_param, sizeof(challenge_size_param)}
50     };
51     psa_outvec out_vec[] = {
52         {&token_size_param, sizeof(token_size_param)}
53     };
54 
55     if (challenge_size > ROT_SIZE_MAX) {
56         return PSA_ERROR_INVALID_ARGUMENT;
57     }
58     challenge_size_param = (rot_size_t)challenge_size;
59 
60     if (token_size == NULL) {
61         return PSA_ERROR_INVALID_ARGUMENT;
62     }
63 
64     status = psa_call(TFM_ATTESTATION_SERVICE_HANDLE, TFM_ATTEST_GET_TOKEN_SIZE,
65                       in_vec, IOVEC_LEN(in_vec),
66                       out_vec, IOVEC_LEN(out_vec));
67 
68     *token_size = token_size_param;
69 
70     return status;
71 }
72