blob: 59406f250ad40263e15a045f7455ea29ad0757f0 [file] [log] [blame]
Julian Hall700aa362021-05-13 15:30:39 +01001/*
2 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <stdlib.h>
7#include <string.h>
8#include <protocols/service/attestation/packed-c/opcodes.h>
9#include <protocols/rpc/common/packed-c/status.h>
10#include <service/attestation/key_mngr/attest_key_mngr.h>
11#include <service/attestation/reporter/attest_report.h>
12#include <psa/initial_attestation.h>
13#include "attest_provider.h"
14
15/* Service request handlers */
16static rpc_status_t get_token_handler(void *context, struct call_req* req);
17static rpc_status_t get_token_size_handler(void *context, struct call_req* req);
Julian Hall482fd2f2021-05-17 16:34:48 +010018static rpc_status_t export_iak_public_key_handler(void *context, struct call_req* req);
19static rpc_status_t import_iak_handler(void *context, struct call_req* req);
Julian Hallcaa4af82021-05-19 12:02:36 +010020static rpc_status_t iak_exists_handler(void *context, struct call_req* req);
Julian Hall700aa362021-05-13 15:30:39 +010021
22/* Handler mapping table for service */
23static const struct service_handler handler_table[] = {
Julian Hall5a2e5782021-12-09 17:10:44 +000024 {TS_ATTESTATION_OPCODE_GET_TOKEN, get_token_handler},
25 {TS_ATTESTATION_OPCODE_GET_TOKEN_SIZE, get_token_size_handler},
26 {TS_ATTESTATION_OPCODE_EXPORT_IAK_PUBLIC_KEY, export_iak_public_key_handler},
27 {TS_ATTESTATION_OPCODE_IMPORT_IAK, import_iak_handler},
28 {TS_ATTESTATION_OPCODE_IAK_EXISTS, iak_exists_handler}
Julian Hall700aa362021-05-13 15:30:39 +010029};
30
Julian Hall644b57a2021-06-30 08:45:19 +010031struct rpc_interface *attest_provider_init(struct attest_provider *context)
Julian Hall700aa362021-05-13 15:30:39 +010032{
Julian Hall5a2e5782021-12-09 17:10:44 +000033 struct rpc_interface *rpc_interface = NULL;
Julian Hall700aa362021-05-13 15:30:39 +010034
Julian Hall5a2e5782021-12-09 17:10:44 +000035 if (context) {
Julian Hall700aa362021-05-13 15:30:39 +010036
Julian Hall5a2e5782021-12-09 17:10:44 +000037 for (size_t encoding = 0; encoding < TS_RPC_ENCODING_LIMIT; ++encoding)
38 context->serializers[encoding] = NULL;
Julian Hall700aa362021-05-13 15:30:39 +010039
Julian Hall5a2e5782021-12-09 17:10:44 +000040 service_provider_init(&context->base_provider, context,
41 handler_table, sizeof(handler_table)/sizeof(struct service_handler));
Julian Hall700aa362021-05-13 15:30:39 +010042
Julian Hall5a2e5782021-12-09 17:10:44 +000043 rpc_interface = service_provider_get_rpc_interface(&context->base_provider);
44 }
Julian Hall700aa362021-05-13 15:30:39 +010045
Julian Hall5a2e5782021-12-09 17:10:44 +000046 return rpc_interface;
Julian Hall700aa362021-05-13 15:30:39 +010047}
48
49void attest_provider_deinit(struct attest_provider *context)
50{
Julian Hall5a2e5782021-12-09 17:10:44 +000051 (void)context;
Julian Hall700aa362021-05-13 15:30:39 +010052}
53
54void attest_provider_register_serializer(struct attest_provider *context,
Julian Hall5a2e5782021-12-09 17:10:44 +000055 unsigned int encoding, const struct attest_provider_serializer *serializer)
Julian Hall700aa362021-05-13 15:30:39 +010056{
Julian Hall5a2e5782021-12-09 17:10:44 +000057 if (encoding < TS_RPC_ENCODING_LIMIT)
58 context->serializers[encoding] = serializer;
Julian Hall700aa362021-05-13 15:30:39 +010059}
60
61static const struct attest_provider_serializer *get_attest_serializer(
Julian Hall5a2e5782021-12-09 17:10:44 +000062 struct attest_provider *context, const struct call_req *req)
Julian Hall700aa362021-05-13 15:30:39 +010063{
Julian Hall5a2e5782021-12-09 17:10:44 +000064 const struct attest_provider_serializer *serializer = NULL;
65 unsigned int encoding = call_req_get_encoding(req);
Julian Hall700aa362021-05-13 15:30:39 +010066
Julian Hall5a2e5782021-12-09 17:10:44 +000067 if (encoding < TS_RPC_ENCODING_LIMIT) serializer = context->serializers[encoding];
Julian Hall700aa362021-05-13 15:30:39 +010068
Julian Hall5a2e5782021-12-09 17:10:44 +000069 return serializer;
Julian Hall700aa362021-05-13 15:30:39 +010070}
71
72static rpc_status_t get_token_handler(void *context, struct call_req* req)
73{
Julian Hall5a2e5782021-12-09 17:10:44 +000074 struct attest_provider *this_instance = (struct attest_provider*)context;
75 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
Julian Hall700aa362021-05-13 15:30:39 +010076
Julian Hall5a2e5782021-12-09 17:10:44 +000077 uint8_t challenge[PSA_INITIAL_ATTEST_CHALLENGE_SIZE_64];
78 size_t challenge_len = sizeof(challenge);
Julian Hall700aa362021-05-13 15:30:39 +010079
Julian Hall5a2e5782021-12-09 17:10:44 +000080 struct call_param_buf *req_buf = call_req_get_req_buf(req);
81 const struct attest_provider_serializer *serializer = get_attest_serializer(this_instance, req);
Julian Hall700aa362021-05-13 15:30:39 +010082
Julian Hall5a2e5782021-12-09 17:10:44 +000083 if (serializer)
84 rpc_status = serializer->deserialize_get_token_req(req_buf, challenge, &challenge_len);
Julian Hall700aa362021-05-13 15:30:39 +010085
Julian Hall5a2e5782021-12-09 17:10:44 +000086 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hall700aa362021-05-13 15:30:39 +010087
Julian Hall5a2e5782021-12-09 17:10:44 +000088 const uint8_t *token = NULL;
89 size_t token_size = 0;
Julian Hall644b57a2021-06-30 08:45:19 +010090
Julian Hall5a2e5782021-12-09 17:10:44 +000091 rpc_opstatus_t opstatus = attest_report_create((int32_t)call_req_get_caller_id(req),
92 challenge, challenge_len,
93 &token, &token_size);
Julian Hall700aa362021-05-13 15:30:39 +010094
Julian Hall5a2e5782021-12-09 17:10:44 +000095 if (opstatus == PSA_SUCCESS) {
Julian Hall700aa362021-05-13 15:30:39 +010096
Julian Hall5a2e5782021-12-09 17:10:44 +000097 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
98 rpc_status = serializer->serialize_get_token_resp(resp_buf, token, token_size);
99 }
Julian Hall700aa362021-05-13 15:30:39 +0100100
Julian Hall5a2e5782021-12-09 17:10:44 +0000101 attest_report_destroy(token);
102 call_req_set_opstatus(req, opstatus);
103 }
Julian Hall700aa362021-05-13 15:30:39 +0100104
Julian Hall5a2e5782021-12-09 17:10:44 +0000105 return rpc_status;
Julian Hall700aa362021-05-13 15:30:39 +0100106}
107
108static rpc_status_t get_token_size_handler(void *context, struct call_req* req)
109{
Julian Hall5a2e5782021-12-09 17:10:44 +0000110 struct attest_provider *this_instance = (struct attest_provider*)context;
111 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
Julian Hall700aa362021-05-13 15:30:39 +0100112
Julian Hall5a2e5782021-12-09 17:10:44 +0000113 uint8_t challenge[PSA_INITIAL_ATTEST_CHALLENGE_SIZE_64];
114 size_t challenge_len = sizeof(challenge);
Julian Hall700aa362021-05-13 15:30:39 +0100115
Julian Hall5a2e5782021-12-09 17:10:44 +0000116 struct call_param_buf *req_buf = call_req_get_req_buf(req);
117 const struct attest_provider_serializer *serializer = get_attest_serializer(this_instance, req);
Julian Hall700aa362021-05-13 15:30:39 +0100118
Julian Hall5a2e5782021-12-09 17:10:44 +0000119 memset(challenge, 0, sizeof(challenge));
Julian Hall700aa362021-05-13 15:30:39 +0100120
Julian Hall5a2e5782021-12-09 17:10:44 +0000121 if (serializer)
122 rpc_status = serializer->deserialize_get_token_size_req(req_buf, &challenge_len);
Julian Hall700aa362021-05-13 15:30:39 +0100123
Julian Hall5a2e5782021-12-09 17:10:44 +0000124 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hall700aa362021-05-13 15:30:39 +0100125
Julian Hall5a2e5782021-12-09 17:10:44 +0000126 const uint8_t *token = NULL;
127 size_t token_size = 0;
Julian Hall644b57a2021-06-30 08:45:19 +0100128
Julian Hall5a2e5782021-12-09 17:10:44 +0000129 rpc_opstatus_t opstatus = attest_report_create((int32_t)call_req_get_caller_id(req),
130 challenge, challenge_len,
131 &token, &token_size);
Julian Hall700aa362021-05-13 15:30:39 +0100132
Julian Hall5a2e5782021-12-09 17:10:44 +0000133 if (opstatus == PSA_SUCCESS) {
Julian Hall700aa362021-05-13 15:30:39 +0100134
Julian Hall5a2e5782021-12-09 17:10:44 +0000135 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
136 rpc_status = serializer->serialize_get_token_size_resp(resp_buf, token_size);
137 }
Julian Hall700aa362021-05-13 15:30:39 +0100138
Julian Hall5a2e5782021-12-09 17:10:44 +0000139 attest_report_destroy(token);
140 call_req_set_opstatus(req, opstatus);
141 }
Julian Hall700aa362021-05-13 15:30:39 +0100142
Julian Hall5a2e5782021-12-09 17:10:44 +0000143 return rpc_status;
Julian Hall700aa362021-05-13 15:30:39 +0100144}
Julian Hall482fd2f2021-05-17 16:34:48 +0100145
146static rpc_status_t export_iak_public_key_handler(void *context, struct call_req* req)
147{
Julian Hall5a2e5782021-12-09 17:10:44 +0000148 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
149 struct call_param_buf *req_buf = call_req_get_req_buf(req);
150 const struct attest_provider_serializer *serializer = get_attest_serializer(context, req);
Julian Hall482fd2f2021-05-17 16:34:48 +0100151
Julian Hall5a2e5782021-12-09 17:10:44 +0000152 if (serializer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100153
Julian Hall5a2e5782021-12-09 17:10:44 +0000154 size_t max_key_size = attest_key_mngr_max_iak_export_size();
155 uint8_t *key_buffer = malloc(max_key_size);
Julian Hall482fd2f2021-05-17 16:34:48 +0100156
Julian Hall5a2e5782021-12-09 17:10:44 +0000157 if (key_buffer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100158
Julian Hall5a2e5782021-12-09 17:10:44 +0000159 size_t export_size = 0;
160 rpc_opstatus_t opstatus =
161 attest_key_mngr_export_iak_public_key(key_buffer, max_key_size, &export_size);
Julian Hall482fd2f2021-05-17 16:34:48 +0100162
Julian Hall5a2e5782021-12-09 17:10:44 +0000163 rpc_status = TS_RPC_CALL_ACCEPTED;
Julian Hall482fd2f2021-05-17 16:34:48 +0100164
Julian Hall5a2e5782021-12-09 17:10:44 +0000165 if (opstatus == PSA_SUCCESS) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100166
Julian Hall5a2e5782021-12-09 17:10:44 +0000167 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
168 rpc_status =
169 serializer->serialize_export_iak_public_key_resp(resp_buf,
170 key_buffer, export_size);
171 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100172
Julian Hall5a2e5782021-12-09 17:10:44 +0000173 free(key_buffer);
174 call_req_set_opstatus(req, opstatus);
175 }
176 else {
177 /* Failed to allocate key buffer */
178 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
179 }
180 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100181
Julian Hall5a2e5782021-12-09 17:10:44 +0000182 return rpc_status;
Julian Hall482fd2f2021-05-17 16:34:48 +0100183}
184
185static rpc_status_t import_iak_handler(void *context, struct call_req* req)
186{
Julian Hall5a2e5782021-12-09 17:10:44 +0000187 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
188 struct call_param_buf *req_buf = call_req_get_req_buf(req);
189 const struct attest_provider_serializer *serializer = get_attest_serializer(context, req);
Julian Hall482fd2f2021-05-17 16:34:48 +0100190
Julian Hall5a2e5782021-12-09 17:10:44 +0000191 if (serializer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100192
Julian Hall5a2e5782021-12-09 17:10:44 +0000193 size_t key_data_len = attest_key_mngr_max_iak_import_size();
194 uint8_t *key_buffer = malloc(key_data_len);
Julian Hall482fd2f2021-05-17 16:34:48 +0100195
Julian Hall5a2e5782021-12-09 17:10:44 +0000196 if (key_buffer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100197
Julian Hall5a2e5782021-12-09 17:10:44 +0000198 rpc_status =
199 serializer->deserialize_import_iak_req(req_buf, key_buffer, &key_data_len);
Julian Hall482fd2f2021-05-17 16:34:48 +0100200
Julian Hall5a2e5782021-12-09 17:10:44 +0000201 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100202
Julian Hall5a2e5782021-12-09 17:10:44 +0000203 rpc_opstatus_t opstatus;
204 opstatus = attest_key_mngr_import_iak(key_buffer, key_data_len);
205 call_req_set_opstatus(req, opstatus);
206 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100207
Julian Hall5a2e5782021-12-09 17:10:44 +0000208 free(key_buffer);
209 }
210 else {
Julian Hall482fd2f2021-05-17 16:34:48 +0100211
Julian Hall5a2e5782021-12-09 17:10:44 +0000212 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
213 }
214 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100215
Julian Hall5a2e5782021-12-09 17:10:44 +0000216 return rpc_status;
Julian Hall482fd2f2021-05-17 16:34:48 +0100217}
Julian Hallcaa4af82021-05-19 12:02:36 +0100218
219static rpc_status_t iak_exists_handler(void *context, struct call_req* req)
220{
Julian Hall5a2e5782021-12-09 17:10:44 +0000221 rpc_opstatus_t opstatus = PSA_ERROR_DOES_NOT_EXIST;
Julian Hallcaa4af82021-05-19 12:02:36 +0100222
Julian Hall5a2e5782021-12-09 17:10:44 +0000223 if (attest_key_mngr_iak_exists()) {
Julian Hallcaa4af82021-05-19 12:02:36 +0100224
Julian Hall5a2e5782021-12-09 17:10:44 +0000225 opstatus = PSA_SUCCESS;
226 }
Julian Hallcaa4af82021-05-19 12:02:36 +0100227
Julian Hall5a2e5782021-12-09 17:10:44 +0000228 call_req_set_opstatus(req, opstatus);
Julian Hallcaa4af82021-05-19 12:02:36 +0100229
Julian Hall5a2e5782021-12-09 17:10:44 +0000230 return TS_RPC_CALL_ACCEPTED;
Julian Hallcaa4af82021-05-19 12:02:36 +0100231}