blob: 9d002142ffb4d1a25979873c08661cc28b93e2de [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"
Tamas Ban48a0eb52018-08-17 12:48:05 +010010#include "tfm_ns_lock.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
13#include "tfm_attest_defs.h"
14#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,
39 TFM_ATTEST_GET_TOKEN_MINOR_VER);
40 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
Tamas Banb6b80562019-01-04 22:49:24 +000059 res = tfm_ns_lock_dispatch((veneer_fn)tfm_initial_attest_get_token_veneer,
Kevin Peng2ed30222019-04-30 09:26:11 +080060 (uint32_t)in_vec, IOVEC_LEN(in_vec),
61 (uint32_t)out_vec, IOVEC_LEN(out_vec));
Tamas Banb6b80562019-01-04 22:49:24 +000062
Hugues de Valonba1fa9a2019-06-18 16:12:54 +010063 if (res == (int32_t)PSA_ATTEST_ERR_SUCCESS) {
Kevin Peng2ed30222019-04-30 09:26:11 +080064 *token_size = out_vec[0].len;
65 }
Tamas Banb6b80562019-01-04 22:49:24 +000066
Kevin Peng2ed30222019-04-30 09:26:11 +080067 return (enum psa_attest_err_t)res;
68#endif
Tamas Banb6b80562019-01-04 22:49:24 +000069}
70
71enum psa_attest_err_t
72psa_initial_attest_get_token_size(uint32_t challenge_size,
73 uint32_t *token_size)
74{
Kevin Peng2ed30222019-04-30 09:26:11 +080075#ifdef TFM_PSA_API
76 psa_handle_t handle = PSA_NULL_HANDLE;
77 psa_status_t status;
78#endif
79 psa_invec in_vec[] = {
80 {&challenge_size, sizeof(challenge_size)}
81 };
82 psa_outvec out_vec[] = {
83 {token_size, sizeof(uint32_t)}
84 };
Tamas Banb6b80562019-01-04 22:49:24 +000085
Kevin Peng2ed30222019-04-30 09:26:11 +080086#ifdef TFM_PSA_API
87 handle = psa_connect(TFM_ATTEST_GET_TOKEN_SIZE_SID,
88 TFM_ATTEST_GET_TOKEN_SIZE_MINOR_VER);
89 if (handle <= 0) {
90 return PSA_ATTEST_ERR_GENERAL;
91 }
Tamas Banb6b80562019-01-04 22:49:24 +000092
Kevin Peng2ed30222019-04-30 09:26:11 +080093 status = psa_call(handle,
94 in_vec, IOVEC_LEN(in_vec),
95 out_vec, IOVEC_LEN(out_vec));
96 psa_close(handle);
Tamas Banb6b80562019-01-04 22:49:24 +000097
Kevin Peng2ed30222019-04-30 09:26:11 +080098 if (status < PSA_SUCCESS) {
99 return PSA_ATTEST_ERR_GENERAL;
100 }
101
102 return (enum psa_attest_err_t)status;
103#else
104 return (enum psa_attest_err_t)tfm_ns_lock_dispatch(
105 (veneer_fn)tfm_initial_attest_get_token_size_veneer,
106 (uint32_t)in_vec, IOVEC_LEN(in_vec),
107 (uint32_t)out_vec, IOVEC_LEN(out_vec));
108#endif
Tamas Ban48a0eb52018-08-17 12:48:05 +0100109}