blob: 407572b353ac968cfd94afe3860a5102a12208d9 [file] [log] [blame]
Julian Hall700aa362021-05-13 15:30:39 +01001/*
Julian Hall6e02acf2022-02-22 16:25:03 +00002 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
Julian Hall700aa362021-05-13 15:30:39 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <stddef.h>
8#include <string.h>
9#include "iat_client.h"
Imre Kisd5d16022023-07-04 13:28:18 +020010#include "rpc_caller_session.h"
Julian Hall700aa362021-05-13 15:30:39 +010011#include <common/tlv/tlv.h>
12#include <psa/initial_attestation.h>
Julian Hall99a57e32021-07-28 14:18:50 +010013#include <service/common/client/service_client.h>
Julian Hall700aa362021-05-13 15:30:39 +010014#include <protocols/service/attestation/packed-c/get_token.h>
15#include <protocols/service/attestation/packed-c/get_token_size.h>
16#include <protocols/service/attestation/packed-c/opcodes.h>
17#include <protocols/rpc/common/packed-c/status.h>
18
19/**
20 * @brief The singleton psa_iat_client instance
21 *
Julian Hall99a57e32021-07-28 14:18:50 +010022 * The psa attestation C API assumes a single backend service provider.
Julian Hall700aa362021-05-13 15:30:39 +010023 */
Julian Hall99a57e32021-07-28 14:18:50 +010024static struct service_client instance;
Julian Hall700aa362021-05-13 15:30:39 +010025
26
Imre Kisd5d16022023-07-04 13:28:18 +020027psa_status_t psa_iat_client_init(struct rpc_caller_session *session)
Julian Hall700aa362021-05-13 15:30:39 +010028{
Imre Kisd5d16022023-07-04 13:28:18 +020029 return service_client_init(&instance, session);
Julian Hall700aa362021-05-13 15:30:39 +010030}
31
32void psa_iat_client_deinit(void)
33{
Julian Hall99a57e32021-07-28 14:18:50 +010034 service_client_deinit(&instance);
Julian Hall700aa362021-05-13 15:30:39 +010035}
36
37int psa_iat_client_rpc_status(void)
38{
39 return instance.rpc_status;
40}
41
42psa_status_t psa_initial_attest_get_token(
43 const uint8_t *auth_challenge, size_t challenge_size,
Imre Kisd5d16022023-07-04 13:28:18 +020044 uint8_t *token_buf, size_t token_buf_size, size_t *token_size)
Julian Hall700aa362021-05-13 15:30:39 +010045{
Imre Kisd5d16022023-07-04 13:28:18 +020046 psa_status_t psa_status = PSA_ERROR_INVALID_ARGUMENT;
47 size_t req_len = tlv_required_space(challenge_size);
48 struct tlv_record challenge_record = { 0 };
49 rpc_call_handle call_handle;
50 uint8_t *req_buf;
Julian Hall700aa362021-05-13 15:30:39 +010051
Imre Kisd5d16022023-07-04 13:28:18 +020052 if (!token_buf || !token_buf_size)
53 return PSA_ERROR_INVALID_ARGUMENT;
Julian Hallb7db5802021-07-26 16:20:40 +010054
Imre Kisd5d16022023-07-04 13:28:18 +020055 challenge_record.tag = TS_ATTESTATION_GET_TOKEN_IN_TAG_AUTH_CHALLENGE;
56 challenge_record.length = challenge_size;
57 challenge_record.value = auth_challenge;
Julian Hall700aa362021-05-13 15:30:39 +010058
59 *token_size = 0;
60
Imre Kisd5d16022023-07-04 13:28:18 +020061 call_handle = rpc_caller_session_begin(instance.session, &req_buf, req_len,
62 tlv_required_space(token_buf_size));
Julian Hall700aa362021-05-13 15:30:39 +010063
Imre Kisd5d16022023-07-04 13:28:18 +020064 if (call_handle) {
Julian Hall700aa362021-05-13 15:30:39 +010065
Imre Kisd5d16022023-07-04 13:28:18 +020066 uint8_t *resp_buf;
67 size_t resp_len;
68 service_status_t service_status;
69 struct tlv_iterator req_iter;
Julian Hall700aa362021-05-13 15:30:39 +010070
Imre Kisd5d16022023-07-04 13:28:18 +020071 tlv_iterator_begin(&req_iter, req_buf, req_len);
72 tlv_encode(&req_iter, &challenge_record);
Julian Hall700aa362021-05-13 15:30:39 +010073
Imre Kisd5d16022023-07-04 13:28:18 +020074 instance.rpc_status =
75 rpc_caller_session_invoke(call_handle, TS_ATTESTATION_OPCODE_GET_TOKEN,
76 &resp_buf, &resp_len, &service_status);
Julian Hall700aa362021-05-13 15:30:39 +010077
Imre Kisd5d16022023-07-04 13:28:18 +020078 if (instance.rpc_status == RPC_SUCCESS) {
Julian Hall700aa362021-05-13 15:30:39 +010079
Imre Kisd5d16022023-07-04 13:28:18 +020080 psa_status = service_status;
Julian Hall700aa362021-05-13 15:30:39 +010081
Imre Kisd5d16022023-07-04 13:28:18 +020082 if (psa_status == PSA_SUCCESS) {
83 struct tlv_const_iterator resp_iter;
84 struct tlv_record decoded_record;
Julian Hall700aa362021-05-13 15:30:39 +010085
Imre Kisd5d16022023-07-04 13:28:18 +020086 tlv_const_iterator_begin(&resp_iter, resp_buf, resp_len);
Julian Hall700aa362021-05-13 15:30:39 +010087
Imre Kisd5d16022023-07-04 13:28:18 +020088 if (tlv_find_decode(&resp_iter,
89 TS_ATTESTATION_GET_TOKEN_OUT_TAG_TOKEN, &decoded_record)) {
Julian Hall700aa362021-05-13 15:30:39 +010090
Imre Kisd5d16022023-07-04 13:28:18 +020091 if (decoded_record.length <= token_buf_size) {
Julian Hall700aa362021-05-13 15:30:39 +010092
Imre Kisd5d16022023-07-04 13:28:18 +020093 memcpy(token_buf, decoded_record.value,
94 decoded_record.length);
95 *token_size = decoded_record.length;
96 } else {
97 /* Provided buffer is too small */
98 psa_status = PSA_ERROR_BUFFER_TOO_SMALL;
99 }
100 } else {
101 /* Mandatory response parameter missing */
102 psa_status = PSA_ERROR_GENERIC_ERROR;
103 }
Julian Hall700aa362021-05-13 15:30:39 +0100104 }
Imre Kisd5d16022023-07-04 13:28:18 +0200105 }
Julian Hall700aa362021-05-13 15:30:39 +0100106
Imre Kisd5d16022023-07-04 13:28:18 +0200107 rpc_caller_session_end(call_handle);
108 }
Julian Hall700aa362021-05-13 15:30:39 +0100109
Imre Kisd5d16022023-07-04 13:28:18 +0200110 return psa_status;
Julian Hall700aa362021-05-13 15:30:39 +0100111}
112
113psa_status_t psa_initial_attest_get_token_size(
114 size_t challenge_size, size_t *token_size)
115{
Imre Kisd5d16022023-07-04 13:28:18 +0200116 psa_status_t psa_status = PSA_ERROR_INVALID_ARGUMENT;
117 struct ts_attestation_get_token_size_in req_msg;
118 size_t req_len = sizeof(struct ts_attestation_get_token_size_in);
Julian Hall700aa362021-05-13 15:30:39 +0100119
Imre Kisd5d16022023-07-04 13:28:18 +0200120 *token_size = 0; /* For failure case */
Julian Hall700aa362021-05-13 15:30:39 +0100121
Imre Kisd5d16022023-07-04 13:28:18 +0200122 req_msg.challenge_size = challenge_size;
Julian Hall700aa362021-05-13 15:30:39 +0100123
Imre Kisd5d16022023-07-04 13:28:18 +0200124 rpc_call_handle call_handle;
125 uint8_t *req_buf;
Julian Hall700aa362021-05-13 15:30:39 +0100126
Imre Kisd5d16022023-07-04 13:28:18 +0200127 call_handle = rpc_caller_session_begin(instance.session, &req_buf, req_len,
128 sizeof(struct ts_attestation_get_token_size_out));
Julian Hall700aa362021-05-13 15:30:39 +0100129
Imre Kisd5d16022023-07-04 13:28:18 +0200130 if (call_handle) {
Julian Hall700aa362021-05-13 15:30:39 +0100131
Imre Kisd5d16022023-07-04 13:28:18 +0200132 uint8_t *resp_buf;
133 size_t resp_len;
134 service_status_t service_status;
Julian Hall700aa362021-05-13 15:30:39 +0100135
Imre Kisd5d16022023-07-04 13:28:18 +0200136 memcpy(req_buf, &req_msg, req_len);
Julian Hall700aa362021-05-13 15:30:39 +0100137
Imre Kisd5d16022023-07-04 13:28:18 +0200138 instance.rpc_status =
139 rpc_caller_session_invoke(call_handle, TS_ATTESTATION_OPCODE_GET_TOKEN_SIZE,
140 &resp_buf, &resp_len, &service_status);
Julian Hall700aa362021-05-13 15:30:39 +0100141
Imre Kisd5d16022023-07-04 13:28:18 +0200142 if (instance.rpc_status == RPC_SUCCESS) {
Julian Hall700aa362021-05-13 15:30:39 +0100143
Imre Kisd5d16022023-07-04 13:28:18 +0200144 psa_status = service_status;
Julian Hall700aa362021-05-13 15:30:39 +0100145
Imre Kisd5d16022023-07-04 13:28:18 +0200146 if (psa_status == PSA_SUCCESS) {
Julian Hall700aa362021-05-13 15:30:39 +0100147
148 if (resp_len >= sizeof(struct ts_attestation_get_token_size_out)) {
149
150 struct ts_attestation_get_token_size_out resp_msg;
151 memcpy(&resp_msg, resp_buf, sizeof(struct ts_attestation_get_token_size_out));
152 *token_size = resp_msg.token_size;
153 }
154 else {
155 /* Failed to decode response message */
156 psa_status = PSA_ERROR_GENERIC_ERROR;
157 }
Imre Kisd5d16022023-07-04 13:28:18 +0200158 }
159 }
Julian Hall700aa362021-05-13 15:30:39 +0100160
Imre Kisd5d16022023-07-04 13:28:18 +0200161 rpc_caller_session_end(call_handle);
162 }
Julian Hall700aa362021-05-13 15:30:39 +0100163
Imre Kisd5d16022023-07-04 13:28:18 +0200164 return psa_status;
Julian Hall700aa362021-05-13 15:30:39 +0100165}