blob: 0f6377e5650a48bd0c503b3bbae68787640f2fc6 [file] [log] [blame]
Tamas Ban48a0eb52018-08-17 12:48:05 +01001/*
Tamas Banb6b80562019-01-04 22:49:24 +00002 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
Tamas Ban48a0eb52018-08-17 12:48:05 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Jamie Foxcc31d402019-01-28 17:13:52 +00008#include "psa/initial_attestation.h"
Tamas Banb6b80562019-01-04 22:49:24 +00009#include "tfm_veneers.h"
Antonio de Angelis05b24192019-07-04 15:28:46 +010010#include "tfm_ns_interface.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000011#include "psa/client.h"
Kevin Peng2ed30222019-04-30 09:26:11 +080012#ifdef TFM_PSA_API
Edison Ai870abb42019-06-21 11:14:08 +080013#include "psa_manifest/sid.h"
Kevin Peng2ed30222019-04-30 09:26:11 +080014#endif
15
16#define IOVEC_LEN(x) (sizeof(x)/sizeof(x[0]))
Tamas Ban48a0eb52018-08-17 12:48:05 +010017
18enum psa_attest_err_t
19psa_initial_attest_get_token(const uint8_t *challenge_obj,
20 uint32_t challenge_size,
21 uint8_t *token,
22 uint32_t *token_size)
23{
Kevin Peng2ed30222019-04-30 09:26:11 +080024#ifdef TFM_PSA_API
25 psa_handle_t handle = PSA_NULL_HANDLE;
26 psa_status_t status;
27#else
Hugues de Valonba1fa9a2019-06-18 16:12:54 +010028 int32_t res;
Kevin Peng2ed30222019-04-30 09:26:11 +080029#endif
30 psa_invec in_vec[] = {
31 {challenge_obj, challenge_size}
32 };
33 psa_outvec out_vec[] = {
34 {token, *token_size}
35 };
Tamas Ban48a0eb52018-08-17 12:48:05 +010036
Kevin Peng2ed30222019-04-30 09:26:11 +080037#ifdef TFM_PSA_API
38 handle = psa_connect(TFM_ATTEST_GET_TOKEN_SID,
Edison Ai870abb42019-06-21 11:14:08 +080039 TFM_ATTEST_GET_TOKEN_VERSION);
Kevin Peng2ed30222019-04-30 09:26:11 +080040 if (handle <= 0) {
41 return PSA_ATTEST_ERR_GENERAL;
42 }
Tamas Ban48a0eb52018-08-17 12:48:05 +010043
Kevin Peng2ed30222019-04-30 09:26:11 +080044 status = psa_call(handle,
45 in_vec, IOVEC_LEN(in_vec),
46 out_vec, IOVEC_LEN(out_vec));
47 psa_close(handle);
Tamas Ban48a0eb52018-08-17 12:48:05 +010048
Kevin Peng2ed30222019-04-30 09:26:11 +080049 if (status < PSA_SUCCESS) {
50 return PSA_ATTEST_ERR_GENERAL;
51 }
52
53 if (status == PSA_SUCCESS) {
54 *token_size = out_vec[0].len;
55 }
56
57 return (enum psa_attest_err_t)status;
58#else
Antonio de Angelis05b24192019-07-04 15:28:46 +010059 res = tfm_ns_interface_dispatch(
60 (veneer_fn)tfm_initial_attest_get_token_veneer,
Kevin Peng2ed30222019-04-30 09:26:11 +080061 (uint32_t)in_vec, IOVEC_LEN(in_vec),
62 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Tamas Banb6b80562019-01-04 22:49:24 +000063
Hugues de Valonba1fa9a2019-06-18 16:12:54 +010064 if (res == (int32_t)PSA_ATTEST_ERR_SUCCESS) {
Kevin Peng2ed30222019-04-30 09:26:11 +080065 *token_size = out_vec[0].len;
66 }
Tamas Banb6b80562019-01-04 22:49:24 +000067
Kevin Peng2ed30222019-04-30 09:26:11 +080068 return (enum psa_attest_err_t)res;
69#endif
Tamas Banb6b80562019-01-04 22:49:24 +000070}
71
72enum psa_attest_err_t
73psa_initial_attest_get_token_size(uint32_t challenge_size,
74 uint32_t *token_size)
75{
Kevin Peng2ed30222019-04-30 09:26:11 +080076#ifdef TFM_PSA_API
77 psa_handle_t handle = PSA_NULL_HANDLE;
78 psa_status_t status;
79#endif
80 psa_invec in_vec[] = {
81 {&challenge_size, sizeof(challenge_size)}
82 };
83 psa_outvec out_vec[] = {
84 {token_size, sizeof(uint32_t)}
85 };
Tamas Banb6b80562019-01-04 22:49:24 +000086
Kevin Peng2ed30222019-04-30 09:26:11 +080087#ifdef TFM_PSA_API
88 handle = psa_connect(TFM_ATTEST_GET_TOKEN_SIZE_SID,
Edison Ai870abb42019-06-21 11:14:08 +080089 TFM_ATTEST_GET_TOKEN_SIZE_VERSION);
Kevin Peng2ed30222019-04-30 09:26:11 +080090 if (handle <= 0) {
91 return PSA_ATTEST_ERR_GENERAL;
92 }
Tamas Banb6b80562019-01-04 22:49:24 +000093
Kevin Peng2ed30222019-04-30 09:26:11 +080094 status = psa_call(handle,
95 in_vec, IOVEC_LEN(in_vec),
96 out_vec, IOVEC_LEN(out_vec));
97 psa_close(handle);
Tamas Banb6b80562019-01-04 22:49:24 +000098
Kevin Peng2ed30222019-04-30 09:26:11 +080099 if (status < PSA_SUCCESS) {
100 return PSA_ATTEST_ERR_GENERAL;
101 }
102
103 return (enum psa_attest_err_t)status;
104#else
Antonio de Angelis05b24192019-07-04 15:28:46 +0100105 return (enum psa_attest_err_t)tfm_ns_interface_dispatch(
Kevin Peng2ed30222019-04-30 09:26:11 +0800106 (veneer_fn)tfm_initial_attest_get_token_size_veneer,
107 (uint32_t)in_vec, IOVEC_LEN(in_vec),
108 (uint32_t)out_vec, IOVEC_LEN(out_vec));
109#endif
Tamas Ban48a0eb52018-08-17 12:48:05 +0100110}