blob: a658ac2318fa82398a6d22b012732e56b7c97323 [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#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 Hall6e02acf2022-02-22 16:25:03 +0000148 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
149 const struct attest_provider_serializer *serializer = get_attest_serializer(context, req);
Julian Hall482fd2f2021-05-17 16:34:48 +0100150
Julian Hall5a2e5782021-12-09 17:10:44 +0000151 if (serializer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100152
Julian Hall5a2e5782021-12-09 17:10:44 +0000153 size_t max_key_size = attest_key_mngr_max_iak_export_size();
154 uint8_t *key_buffer = malloc(max_key_size);
Julian Hall482fd2f2021-05-17 16:34:48 +0100155
Julian Hall5a2e5782021-12-09 17:10:44 +0000156 if (key_buffer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100157
Julian Hall5a2e5782021-12-09 17:10:44 +0000158 size_t export_size = 0;
159 rpc_opstatus_t opstatus =
160 attest_key_mngr_export_iak_public_key(key_buffer, max_key_size, &export_size);
Julian Hall482fd2f2021-05-17 16:34:48 +0100161
Julian Hall5a2e5782021-12-09 17:10:44 +0000162 rpc_status = TS_RPC_CALL_ACCEPTED;
Julian Hall482fd2f2021-05-17 16:34:48 +0100163
Julian Hall5a2e5782021-12-09 17:10:44 +0000164 if (opstatus == PSA_SUCCESS) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100165
Julian Hall5a2e5782021-12-09 17:10:44 +0000166 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
167 rpc_status =
168 serializer->serialize_export_iak_public_key_resp(resp_buf,
169 key_buffer, export_size);
170 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100171
Julian Hall5a2e5782021-12-09 17:10:44 +0000172 free(key_buffer);
173 call_req_set_opstatus(req, opstatus);
174 }
175 else {
176 /* Failed to allocate key buffer */
177 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
178 }
179 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100180
Julian Hall5a2e5782021-12-09 17:10:44 +0000181 return rpc_status;
Julian Hall482fd2f2021-05-17 16:34:48 +0100182}
183
184static rpc_status_t import_iak_handler(void *context, struct call_req* req)
185{
Julian Hall5a2e5782021-12-09 17:10:44 +0000186 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
187 struct call_param_buf *req_buf = call_req_get_req_buf(req);
188 const struct attest_provider_serializer *serializer = get_attest_serializer(context, req);
Julian Hall482fd2f2021-05-17 16:34:48 +0100189
Julian Hall5a2e5782021-12-09 17:10:44 +0000190 if (serializer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100191
Julian Hall5a2e5782021-12-09 17:10:44 +0000192 size_t key_data_len = attest_key_mngr_max_iak_import_size();
193 uint8_t *key_buffer = malloc(key_data_len);
Julian Hall482fd2f2021-05-17 16:34:48 +0100194
Julian Hall5a2e5782021-12-09 17:10:44 +0000195 if (key_buffer) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100196
Julian Hall5a2e5782021-12-09 17:10:44 +0000197 rpc_status =
198 serializer->deserialize_import_iak_req(req_buf, key_buffer, &key_data_len);
Julian Hall482fd2f2021-05-17 16:34:48 +0100199
Julian Hall5a2e5782021-12-09 17:10:44 +0000200 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hall482fd2f2021-05-17 16:34:48 +0100201
Julian Hall5a2e5782021-12-09 17:10:44 +0000202 rpc_opstatus_t opstatus;
203 opstatus = attest_key_mngr_import_iak(key_buffer, key_data_len);
204 call_req_set_opstatus(req, opstatus);
205 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100206
Julian Hall5a2e5782021-12-09 17:10:44 +0000207 free(key_buffer);
208 }
209 else {
Julian Hall482fd2f2021-05-17 16:34:48 +0100210
Julian Hall5a2e5782021-12-09 17:10:44 +0000211 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
212 }
213 }
Julian Hall482fd2f2021-05-17 16:34:48 +0100214
Julian Hall5a2e5782021-12-09 17:10:44 +0000215 return rpc_status;
Julian Hall482fd2f2021-05-17 16:34:48 +0100216}
Julian Hallcaa4af82021-05-19 12:02:36 +0100217
218static rpc_status_t iak_exists_handler(void *context, struct call_req* req)
219{
Julian Hall6e02acf2022-02-22 16:25:03 +0000220 (void)context;
221
222 rpc_opstatus_t opstatus = PSA_ERROR_DOES_NOT_EXIST;
Julian Hallcaa4af82021-05-19 12:02:36 +0100223
Julian Hall5a2e5782021-12-09 17:10:44 +0000224 if (attest_key_mngr_iak_exists()) {
Julian Hallcaa4af82021-05-19 12:02:36 +0100225
Julian Hall5a2e5782021-12-09 17:10:44 +0000226 opstatus = PSA_SUCCESS;
227 }
Julian Hallcaa4af82021-05-19 12:02:36 +0100228
Julian Hall5a2e5782021-12-09 17:10:44 +0000229 call_req_set_opstatus(req, opstatus);
Julian Hallcaa4af82021-05-19 12:02:36 +0100230
Julian Hall5a2e5782021-12-09 17:10:44 +0000231 return TS_RPC_CALL_ACCEPTED;
Julian Hallcaa4af82021-05-19 12:02:36 +0100232}