blob: c3d55b5ccae20b78d02663aa53c91b9d446921b8 [file] [log] [blame]
Julian Hallc02fffb2020-11-23 18:22:06 +01001/*
julhal01c3f4e9a2020-12-15 13:39:01 +00002 * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
Julian Hallc02fffb2020-11-23 18:22:06 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <stdint.h>
7#include <stdlib.h>
8#include <protocols/service/crypto/packed-c/opcodes.h>
Julian Hall9061e6c2021-06-29 14:24:20 +01009#include <service/crypto/provider/crypto_provider.h>
Julian Hallc02fffb2020-11-23 18:22:06 +010010#include <protocols/rpc/common/packed-c/status.h>
11#include <psa/crypto.h>
12
13/* Service request handlers */
14static rpc_status_t nop_handler(void *context, struct call_req* req);
15static rpc_status_t generate_key_handler(void *context, struct call_req* req);
16static rpc_status_t destroy_key_handler(void *context, struct call_req* req);
Julian Hallc02fffb2020-11-23 18:22:06 +010017static rpc_status_t export_key_handler(void *context, struct call_req* req);
18static rpc_status_t export_public_key_handler(void *context, struct call_req* req);
19static rpc_status_t import_key_handler(void *context, struct call_req* req);
20static rpc_status_t sign_hash_handler(void *context, struct call_req* req);
21static rpc_status_t verify_hash_handler(void *context, struct call_req* req);
22static rpc_status_t asymmetric_decrypt_handler(void *context, struct call_req* req);
23static rpc_status_t asymmetric_encrypt_handler(void *context, struct call_req* req);
24static rpc_status_t generate_random_handler(void *context, struct call_req* req);
Julian Hallf5728962021-06-24 09:40:23 +010025static rpc_status_t hash_setup_handler(void *context, struct call_req* req);
26static rpc_status_t hash_update_handler(void *context, struct call_req* req);
27static rpc_status_t hash_finish_handler(void *context, struct call_req* req);
Julian Hall8359a632021-07-08 15:10:30 +010028static rpc_status_t copy_key_handler(void *context, struct call_req* req);
29static rpc_status_t purge_key_handler(void *context, struct call_req* req);
30static rpc_status_t get_key_attributes_handler(void *context, struct call_req* req);
Julian Hallc02fffb2020-11-23 18:22:06 +010031
32/* Handler mapping table for service */
33static const struct service_handler handler_table[] = {
Julian Hallf5728962021-06-24 09:40:23 +010034 {TS_CRYPTO_OPCODE_NOP, nop_handler},
35 {TS_CRYPTO_OPCODE_GENERATE_KEY, generate_key_handler},
36 {TS_CRYPTO_OPCODE_DESTROY_KEY, destroy_key_handler},
37 {TS_CRYPTO_OPCODE_EXPORT_KEY, export_key_handler},
38 {TS_CRYPTO_OPCODE_EXPORT_PUBLIC_KEY, export_public_key_handler},
39 {TS_CRYPTO_OPCODE_IMPORT_KEY, import_key_handler},
40 {TS_CRYPTO_OPCODE_SIGN_HASH, sign_hash_handler},
41 {TS_CRYPTO_OPCODE_VERIFY_HASH, verify_hash_handler},
42 {TS_CRYPTO_OPCODE_ASYMMETRIC_DECRYPT, asymmetric_decrypt_handler},
43 {TS_CRYPTO_OPCODE_ASYMMETRIC_ENCRYPT, asymmetric_encrypt_handler},
44 {TS_CRYPTO_OPCODE_GENERATE_RANDOM, generate_random_handler},
45 {TS_CRYPTO_OPCODE_HASH_SETUP, hash_setup_handler},
46 {TS_CRYPTO_OPCODE_HASH_UPDATE, hash_update_handler},
Julian Hall8359a632021-07-08 15:10:30 +010047 {TS_CRYPTO_OPCODE_HASH_FINISH, hash_finish_handler},
48 {TS_CRYPTO_OPCODE_COPY_KEY, copy_key_handler},
49 {TS_CRYPTO_OPCODE_PURGE_KEY, purge_key_handler},
50 {TS_CRYPTO_OPCODE_GET_KEY_ATTRIBUTES, get_key_attributes_handler},
Julian Hallc02fffb2020-11-23 18:22:06 +010051};
52
Julian Hall9061e6c2021-06-29 14:24:20 +010053struct rpc_interface *crypto_provider_init(struct crypto_provider *context)
Julian Hallc02fffb2020-11-23 18:22:06 +010054{
Julian Hallf5728962021-06-24 09:40:23 +010055 crypto_context_pool_init(&context->context_pool);
julhal01ffa98d82021-01-20 13:51:58 +000056
Julian Hall9061e6c2021-06-29 14:24:20 +010057 for (size_t encoding = 0; encoding < TS_RPC_ENCODING_LIMIT; ++encoding)
58 context->serializers[encoding] = NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +010059
Julian Hall9061e6c2021-06-29 14:24:20 +010060 service_provider_init(&context->base_provider, context,
Julian Hallf5728962021-06-24 09:40:23 +010061 handler_table, sizeof(handler_table)/sizeof(struct service_handler));
Julian Hallc02fffb2020-11-23 18:22:06 +010062
Julian Hall9061e6c2021-06-29 14:24:20 +010063 return service_provider_get_rpc_interface(&context->base_provider);
Julian Hallc02fffb2020-11-23 18:22:06 +010064}
65
Julian Hall9061e6c2021-06-29 14:24:20 +010066void crypto_provider_deinit(struct crypto_provider *context)
Julian Hallc02fffb2020-11-23 18:22:06 +010067{
Julian Hallf5728962021-06-24 09:40:23 +010068 crypto_context_pool_deinit(&context->context_pool);
Julian Hallc02fffb2020-11-23 18:22:06 +010069}
70
Julian Hall9061e6c2021-06-29 14:24:20 +010071void crypto_provider_register_serializer(struct crypto_provider *context,
72 unsigned int encoding, const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010073{
Julian Hallf5728962021-06-24 09:40:23 +010074 if (encoding < TS_RPC_ENCODING_LIMIT)
75 context->serializers[encoding] = serializer;
julhal01c3f4e9a2020-12-15 13:39:01 +000076}
77
78static const struct crypto_provider_serializer* get_crypto_serializer(void *context,
Julian Hallf5728962021-06-24 09:40:23 +010079 const struct call_req *req)
julhal01c3f4e9a2020-12-15 13:39:01 +000080{
Julian Hall9061e6c2021-06-29 14:24:20 +010081 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +010082 const struct crypto_provider_serializer* serializer = NULL;
83 unsigned int encoding = call_req_get_encoding(req);
julhal01c3f4e9a2020-12-15 13:39:01 +000084
Julian Hallf5728962021-06-24 09:40:23 +010085 if (encoding < TS_RPC_ENCODING_LIMIT) serializer = this_instance->serializers[encoding];
julhal01c3f4e9a2020-12-15 13:39:01 +000086
Julian Hallf5728962021-06-24 09:40:23 +010087 return serializer;
Julian Hallc02fffb2020-11-23 18:22:06 +010088}
89
90static rpc_status_t nop_handler(void *context, struct call_req* req)
91{
Julian Hallf5728962021-06-24 09:40:23 +010092 /* Responds to a request by returning success */
93 rpc_status_t rpc_status = TS_RPC_CALL_ACCEPTED;
94 psa_status_t psa_status = PSA_SUCCESS;
Julian Hallc02fffb2020-11-23 18:22:06 +010095
Julian Hallf5728962021-06-24 09:40:23 +010096 (void)context;
97 call_req_set_opstatus(req, psa_status);
Julian Hallc02fffb2020-11-23 18:22:06 +010098
Julian Hallf5728962021-06-24 09:40:23 +010099 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100100}
101
102static rpc_status_t generate_key_handler(void *context, struct call_req* req)
103{
Julian Hallf5728962021-06-24 09:40:23 +0100104 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
105 struct call_param_buf *req_buf = call_req_get_req_buf(req);
106 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100107
Julian Hallf5728962021-06-24 09:40:23 +0100108 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100109
Julian Hallf5728962021-06-24 09:40:23 +0100110 if (serializer)
111 rpc_status = serializer->deserialize_generate_key_req(req_buf, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100112
Julian Hallf5728962021-06-24 09:40:23 +0100113 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100114
Julian Hallf5728962021-06-24 09:40:23 +0100115 psa_status_t psa_status;
116 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100117
Julian Hallf5728962021-06-24 09:40:23 +0100118 psa_status = psa_generate_key(&attributes, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100119
Julian Hallf5728962021-06-24 09:40:23 +0100120 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100121
Julian Hallf5728962021-06-24 09:40:23 +0100122 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
123 rpc_status = serializer->serialize_generate_key_resp(resp_buf, id);
124 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100125
Julian Hallf5728962021-06-24 09:40:23 +0100126 call_req_set_opstatus(req, psa_status);
127 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100128
Julian Hallf5728962021-06-24 09:40:23 +0100129 psa_reset_key_attributes(&attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100130
Julian Hallf5728962021-06-24 09:40:23 +0100131 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100132}
133
134static rpc_status_t destroy_key_handler(void *context, struct call_req* req)
135{
Julian Hallf5728962021-06-24 09:40:23 +0100136 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
137 struct call_param_buf *req_buf = call_req_get_req_buf(req);
138 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100139
Julian Hallf5728962021-06-24 09:40:23 +0100140 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100141
Julian Hallf5728962021-06-24 09:40:23 +0100142 if (serializer)
143 rpc_status = serializer->deserialize_destroy_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100144
Julian Hallf5728962021-06-24 09:40:23 +0100145 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100146
Julian Hallf5728962021-06-24 09:40:23 +0100147 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100148
Julian Hallf5728962021-06-24 09:40:23 +0100149 psa_status = psa_destroy_key(id);
150 call_req_set_opstatus(req, psa_status);
151 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100152
Julian Hallf5728962021-06-24 09:40:23 +0100153 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100154}
155
156static rpc_status_t export_key_handler(void *context, struct call_req* req)
157{
Julian Hallf5728962021-06-24 09:40:23 +0100158 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
159 struct call_param_buf *req_buf = call_req_get_req_buf(req);
160 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100161
Julian Hallf5728962021-06-24 09:40:23 +0100162 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100163
Julian Hallf5728962021-06-24 09:40:23 +0100164 if (serializer)
165 rpc_status = serializer->deserialize_export_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100166
Julian Hallf5728962021-06-24 09:40:23 +0100167 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100168
Julian Hallf5728962021-06-24 09:40:23 +0100169 psa_status_t psa_status;
170 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100171
Julian Hallf5728962021-06-24 09:40:23 +0100172 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100173
Julian Hallf5728962021-06-24 09:40:23 +0100174 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100175
Julian Hallf5728962021-06-24 09:40:23 +0100176 size_t max_export_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
177 psa_get_key_type(&attributes),
178 psa_get_key_bits(&attributes));
Julian Hallc02fffb2020-11-23 18:22:06 +0100179
Julian Hallec81a502021-07-12 11:36:37 +0100180 if (max_export_size) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100181
Julian Hallec81a502021-07-12 11:36:37 +0100182 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100183
Julian Hallec81a502021-07-12 11:36:37 +0100184 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100185
Julian Hallec81a502021-07-12 11:36:37 +0100186 size_t export_size;
187 psa_status_t psa_status = psa_export_key(id, key_buffer,
188 max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100189
Julian Hallec81a502021-07-12 11:36:37 +0100190 if (psa_status == PSA_SUCCESS) {
191
192 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
193 rpc_status = serializer->serialize_export_key_resp(resp_buf,
194 key_buffer, export_size);
195 }
196
197 free(key_buffer);
Julian Hallf5728962021-06-24 09:40:23 +0100198 }
Julian Hallec81a502021-07-12 11:36:37 +0100199 else {
200 /* Failed to allocate key buffer */
201 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
202 }
Julian Hallf5728962021-06-24 09:40:23 +0100203 }
204 else {
Julian Hallec81a502021-07-12 11:36:37 +0100205
206 /* No sensible export size was returned so
207 * key attributes must be in an invalid state.
208 */
209 psa_status = PSA_ERROR_GENERIC_ERROR;
Julian Hallf5728962021-06-24 09:40:23 +0100210 }
211 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100212
Julian Hallf5728962021-06-24 09:40:23 +0100213 call_req_set_opstatus(req, psa_status);
214 psa_reset_key_attributes(&attributes);
215 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100216
Julian Hallf5728962021-06-24 09:40:23 +0100217 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100218}
219
220static rpc_status_t export_public_key_handler(void *context, struct call_req* req)
221{
Julian Hallf5728962021-06-24 09:40:23 +0100222 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
223 struct call_param_buf *req_buf = call_req_get_req_buf(req);
224 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100225
Julian Hallf5728962021-06-24 09:40:23 +0100226 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100227
Julian Hallf5728962021-06-24 09:40:23 +0100228 if (serializer)
229 rpc_status = serializer->deserialize_export_public_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100230
Julian Hallf5728962021-06-24 09:40:23 +0100231 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100232
Julian Hallec81a502021-07-12 11:36:37 +0100233 size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_MAX_SIZE;
234 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100235
Julian Hallec81a502021-07-12 11:36:37 +0100236 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100237
Julian Hallec81a502021-07-12 11:36:37 +0100238 size_t export_size;
239 psa_status_t psa_status = psa_export_public_key(id, key_buffer,
240 max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100241
Julian Hallec81a502021-07-12 11:36:37 +0100242 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100243
Julian Hallec81a502021-07-12 11:36:37 +0100244 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
245 rpc_status = serializer->serialize_export_public_key_resp(resp_buf,
246 key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100247 }
Julian Hallec81a502021-07-12 11:36:37 +0100248
249 free(key_buffer);
250 call_req_set_opstatus(req, psa_status);
Julian Hallf5728962021-06-24 09:40:23 +0100251 }
Julian Hallec81a502021-07-12 11:36:37 +0100252 else {
253 /* Failed to allocate key buffer */
254 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
255 }
Julian Hallf5728962021-06-24 09:40:23 +0100256 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100257
Julian Hallf5728962021-06-24 09:40:23 +0100258 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100259}
260
261static rpc_status_t import_key_handler(void *context, struct call_req* req)
262{
Julian Hallf5728962021-06-24 09:40:23 +0100263 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
264 struct call_param_buf *req_buf = call_req_get_req_buf(req);
265 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100266
Julian Hallf5728962021-06-24 09:40:23 +0100267 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100268
Julian Hallf5728962021-06-24 09:40:23 +0100269 size_t key_data_len = serializer->max_deserialised_parameter_size(req_buf);
270 uint8_t *key_buffer = malloc(key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100271
Julian Hallf5728962021-06-24 09:40:23 +0100272 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100273
Julian Hallf5728962021-06-24 09:40:23 +0100274 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallec81a502021-07-12 11:36:37 +0100275 rpc_status = serializer->deserialize_import_key_req(req_buf, &attributes,
276 key_buffer, &key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100277
Julian Hallf5728962021-06-24 09:40:23 +0100278 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100279
Julian Hallf5728962021-06-24 09:40:23 +0100280 psa_status_t psa_status;
281 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100282
Julian Hallf5728962021-06-24 09:40:23 +0100283 psa_status = psa_import_key(&attributes, key_buffer, key_data_len, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100284
Julian Hallf5728962021-06-24 09:40:23 +0100285 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000286
Julian Hallf5728962021-06-24 09:40:23 +0100287 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
288 rpc_status = serializer->serialize_import_key_resp(resp_buf, id);
289 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000290
Julian Hallf5728962021-06-24 09:40:23 +0100291 call_req_set_opstatus(req, psa_status);
292 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100293
Julian Hallf5728962021-06-24 09:40:23 +0100294 psa_reset_key_attributes(&attributes);
295 free(key_buffer);
296 }
297 else {
Julian Hallc02fffb2020-11-23 18:22:06 +0100298
Julian Hallf5728962021-06-24 09:40:23 +0100299 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
300 }
301 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100302
Julian Hallf5728962021-06-24 09:40:23 +0100303 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100304}
305
306static rpc_status_t sign_hash_handler(void *context, struct call_req* req)
307{
Julian Hallf5728962021-06-24 09:40:23 +0100308 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
309 struct call_param_buf *req_buf = call_req_get_req_buf(req);
310 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100311
Julian Hallf5728962021-06-24 09:40:23 +0100312 psa_key_id_t id;
313 psa_algorithm_t alg;
314 size_t hash_len = PSA_HASH_MAX_SIZE;
315 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100316
Julian Hallf5728962021-06-24 09:40:23 +0100317 if (serializer)
318 rpc_status = serializer->deserialize_sign_hash_req(req_buf, &id, &alg, hash_buffer, &hash_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100319
Julian Hallf5728962021-06-24 09:40:23 +0100320 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100321
Julian Hallf5728962021-06-24 09:40:23 +0100322 psa_status_t psa_status;
323 size_t sig_len;
324 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100325
Julian Hallf5728962021-06-24 09:40:23 +0100326 psa_status = psa_sign_hash(id, alg,
327 hash_buffer, hash_len,
328 sig_buffer, sizeof(sig_buffer), &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100329
Julian Hallf5728962021-06-24 09:40:23 +0100330 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100331
Julian Hallf5728962021-06-24 09:40:23 +0100332 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
333 rpc_status = serializer->serialize_sign_hash_resp(resp_buf, sig_buffer, sig_len);
334 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100335
Julian Hallf5728962021-06-24 09:40:23 +0100336 call_req_set_opstatus(req, psa_status);
337 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100338
Julian Hallf5728962021-06-24 09:40:23 +0100339 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100340}
341
342static rpc_status_t verify_hash_handler(void *context, struct call_req* req)
343{
Julian Hallf5728962021-06-24 09:40:23 +0100344 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
345 struct call_param_buf *req_buf = call_req_get_req_buf(req);
346 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100347
Julian Hallf5728962021-06-24 09:40:23 +0100348 psa_key_id_t id;
349 psa_algorithm_t alg;
350 size_t hash_len = PSA_HASH_MAX_SIZE;
351 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
352 size_t sig_len = PSA_SIGNATURE_MAX_SIZE;
353 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100354
Julian Hallf5728962021-06-24 09:40:23 +0100355 if (serializer)
356 rpc_status = serializer->deserialize_verify_hash_req(req_buf, &id, &alg,
357 hash_buffer, &hash_len,
358 sig_buffer, &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100359
Julian Hallf5728962021-06-24 09:40:23 +0100360 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100361
Julian Hallf5728962021-06-24 09:40:23 +0100362 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100363
Julian Hallf5728962021-06-24 09:40:23 +0100364 psa_status = psa_verify_hash(id, alg,
365 hash_buffer, hash_len,
366 sig_buffer, sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100367
Julian Hallf5728962021-06-24 09:40:23 +0100368 call_req_set_opstatus(req, psa_status);
369 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100370
Julian Hallf5728962021-06-24 09:40:23 +0100371 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100372}
373
374static rpc_status_t asymmetric_decrypt_handler(void *context, struct call_req* req)
375{
Julian Hallf5728962021-06-24 09:40:23 +0100376 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
377 struct call_param_buf *req_buf = call_req_get_req_buf(req);
378 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100379
Julian Hallf5728962021-06-24 09:40:23 +0100380 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100381
Julian Hallf5728962021-06-24 09:40:23 +0100382 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100383
Julian Hallf5728962021-06-24 09:40:23 +0100384 psa_key_id_t id;
385 psa_algorithm_t alg;
386 size_t ciphertext_len = max_param_size;
387 uint8_t *ciphertext_buffer = malloc(ciphertext_len);
388 size_t salt_len = max_param_size;
389 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100390
Julian Hallf5728962021-06-24 09:40:23 +0100391 if (ciphertext_buffer && salt_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100392
Julian Hallf5728962021-06-24 09:40:23 +0100393 rpc_status = serializer->deserialize_asymmetric_decrypt_req(req_buf,
394 &id, &alg,
395 ciphertext_buffer, &ciphertext_len,
396 salt_buffer, &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100397
Julian Hallf5728962021-06-24 09:40:23 +0100398 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100399
Julian Hallf5728962021-06-24 09:40:23 +0100400 psa_status_t psa_status;
401 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100402
Julian Hallf5728962021-06-24 09:40:23 +0100403 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100404
Julian Hallf5728962021-06-24 09:40:23 +0100405 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100406
Julian Hallf5728962021-06-24 09:40:23 +0100407 size_t max_decrypt_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(
408 psa_get_key_type(&attributes),
409 psa_get_key_bits(&attributes),
410 alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100411
Julian Hallf5728962021-06-24 09:40:23 +0100412 size_t plaintext_len;
413 uint8_t *plaintext_buffer = malloc(max_decrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100414
Julian Hallf5728962021-06-24 09:40:23 +0100415 if (plaintext_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100416
Julian Hallf5728962021-06-24 09:40:23 +0100417 /* Salt is an optional parameter */
418 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100419
Julian Hallf5728962021-06-24 09:40:23 +0100420 psa_status = psa_asymmetric_decrypt(id, alg,
421 ciphertext_buffer, ciphertext_len,
422 salt, salt_len,
423 plaintext_buffer, max_decrypt_size, &plaintext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000424
Julian Hallf5728962021-06-24 09:40:23 +0100425 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000426
Julian Hallf5728962021-06-24 09:40:23 +0100427 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
428 rpc_status = serializer->serialize_asymmetric_decrypt_resp(resp_buf,
429 plaintext_buffer, plaintext_len);
430 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000431
Julian Hallf5728962021-06-24 09:40:23 +0100432 free(plaintext_buffer);
433 }
434 else {
435 /* Failed to allocate ouptput buffer */
436 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
437 }
438 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100439
Julian Hallf5728962021-06-24 09:40:23 +0100440 call_req_set_opstatus(req, psa_status);
441 psa_reset_key_attributes(&attributes);
442 }
443 }
444 else {
445 /* Failed to allocate buffers */
446 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
447 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100448
Julian Hallf5728962021-06-24 09:40:23 +0100449 free(ciphertext_buffer);
450 free(salt_buffer);
451 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100452
Julian Hallf5728962021-06-24 09:40:23 +0100453 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100454}
455
456static rpc_status_t asymmetric_encrypt_handler(void *context, struct call_req* req)
457{
Julian Hallf5728962021-06-24 09:40:23 +0100458 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
459 struct call_param_buf *req_buf = call_req_get_req_buf(req);
460 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100461
Julian Hallf5728962021-06-24 09:40:23 +0100462 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100463
Julian Hallf5728962021-06-24 09:40:23 +0100464 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100465
Julian Hallf5728962021-06-24 09:40:23 +0100466 psa_key_id_t id;
467 psa_algorithm_t alg;
468 size_t plaintext_len = max_param_size;
469 uint8_t *plaintext_buffer = malloc(plaintext_len);
470 size_t salt_len = max_param_size;
471 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100472
Julian Hallf5728962021-06-24 09:40:23 +0100473 if (plaintext_buffer && salt_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100474
Julian Hallf5728962021-06-24 09:40:23 +0100475 rpc_status = serializer->deserialize_asymmetric_encrypt_req(req_buf,
476 &id, &alg,
477 plaintext_buffer, &plaintext_len,
478 salt_buffer, &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100479
Julian Hallf5728962021-06-24 09:40:23 +0100480 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100481
Julian Hallf5728962021-06-24 09:40:23 +0100482 psa_status_t psa_status;
483 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100484
Julian Hallf5728962021-06-24 09:40:23 +0100485 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100486
Julian Hallf5728962021-06-24 09:40:23 +0100487 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100488
Julian Hallf5728962021-06-24 09:40:23 +0100489 size_t max_encrypt_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(
490 psa_get_key_type(&attributes),
491 psa_get_key_bits(&attributes),
492 alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100493
Julian Hallf5728962021-06-24 09:40:23 +0100494 size_t ciphertext_len;
495 uint8_t *ciphertext_buffer = malloc(max_encrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100496
Julian Hallf5728962021-06-24 09:40:23 +0100497 if (ciphertext_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100498
Julian Hallf5728962021-06-24 09:40:23 +0100499 /* Salt is an optional parameter */
500 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100501
Julian Hallf5728962021-06-24 09:40:23 +0100502 psa_status = psa_asymmetric_encrypt(id, alg,
503 plaintext_buffer, plaintext_len,
504 salt, salt_len,
505 ciphertext_buffer, max_encrypt_size, &ciphertext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000506
Julian Hallf5728962021-06-24 09:40:23 +0100507 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000508
Julian Hallf5728962021-06-24 09:40:23 +0100509 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
510 rpc_status = serializer->serialize_asymmetric_encrypt_resp(resp_buf,
511 ciphertext_buffer, ciphertext_len);
512 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000513
Julian Hallf5728962021-06-24 09:40:23 +0100514 free(ciphertext_buffer);
515 }
516 else {
517 /* Failed to allocate ouptput buffer */
518 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
519 }
520 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100521
Julian Hallf5728962021-06-24 09:40:23 +0100522 call_req_set_opstatus(req, psa_status);
523 psa_reset_key_attributes(&attributes);
524 }
525 }
526 else {
527 /* Failed to allocate buffers */
528 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
529 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100530
Julian Hallf5728962021-06-24 09:40:23 +0100531 free(plaintext_buffer);
532 free(salt_buffer);
533 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100534
Julian Hallf5728962021-06-24 09:40:23 +0100535 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100536}
537
538static rpc_status_t generate_random_handler(void *context, struct call_req* req)
539{
Julian Hallf5728962021-06-24 09:40:23 +0100540 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
541 struct call_param_buf *req_buf = call_req_get_req_buf(req);
542 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100543
Julian Hallf5728962021-06-24 09:40:23 +0100544 size_t output_size;
Julian Hallc02fffb2020-11-23 18:22:06 +0100545
Julian Hallf5728962021-06-24 09:40:23 +0100546 if (serializer)
547 rpc_status = serializer->deserialize_generate_random_req(req_buf, &output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100548
Julian Hallf5728962021-06-24 09:40:23 +0100549 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100550
Julian Hallf5728962021-06-24 09:40:23 +0100551 psa_status_t psa_status;
552 uint8_t *output_buffer = malloc(output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100553
Julian Hallf5728962021-06-24 09:40:23 +0100554 if (output_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100555
Julian Hallf5728962021-06-24 09:40:23 +0100556 psa_status = psa_generate_random(output_buffer, output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100557
Julian Hallf5728962021-06-24 09:40:23 +0100558 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100559
Julian Hallf5728962021-06-24 09:40:23 +0100560 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
561 rpc_status = serializer->serialize_generate_random_resp(resp_buf,
562 output_buffer, output_size);
563 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100564
Julian Hallf5728962021-06-24 09:40:23 +0100565 call_req_set_opstatus(req, psa_status);
566 free(output_buffer);
567 }
568 else {
569 /* Failed to allocate output buffer */
570 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
571 }
572 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100573
Julian Hallf5728962021-06-24 09:40:23 +0100574 return rpc_status;
575}
576
Julian Hall8359a632021-07-08 15:10:30 +0100577static rpc_status_t copy_key_handler(void *context, struct call_req* req)
578{
579 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
580 struct call_param_buf *req_buf = call_req_get_req_buf(req);
581 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
582
583 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
584 psa_key_id_t source_key_id;
585
586 if (serializer)
587 rpc_status = serializer->deserialize_copy_key_req(req_buf, &attributes, &source_key_id);
588
589 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
590
591 psa_key_id_t target_key_id;
592
593 psa_status_t psa_status = psa_copy_key(source_key_id, &attributes, &target_key_id);
594
595 if (psa_status == PSA_SUCCESS) {
596
597 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
598 rpc_status = serializer->serialize_copy_key_resp(resp_buf, target_key_id);
599 }
600
601 call_req_set_opstatus(req, psa_status);
602 }
603
604 psa_reset_key_attributes(&attributes);
605
606 return rpc_status;
607}
608
609static rpc_status_t purge_key_handler(void *context, struct call_req* req)
610{
611 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
612 struct call_param_buf *req_buf = call_req_get_req_buf(req);
613 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
614
615 psa_key_id_t id;
616
617 if (serializer)
618 rpc_status = serializer->deserialize_purge_key_req(req_buf, &id);
619
620 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
621
622 psa_status_t psa_status = psa_purge_key(id);
623 call_req_set_opstatus(req, psa_status);
624 }
625
626 return rpc_status;
627}
628
629static rpc_status_t get_key_attributes_handler(void *context, struct call_req* req)
630{
631 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
632 struct call_param_buf *req_buf = call_req_get_req_buf(req);
633 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
634
635 psa_key_id_t id;
636
637 if (serializer)
638 rpc_status = serializer->deserialize_get_key_attributes_req(req_buf, &id);
639
640 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
641
642 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
643
644 psa_status_t psa_status = psa_get_key_attributes(id, &attributes);
645
646 if (psa_status == PSA_SUCCESS) {
647
648 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
649 rpc_status = serializer->serialize_get_key_attributes_resp(resp_buf, &attributes);
650 }
651
652 psa_reset_key_attributes(&attributes);
653 call_req_set_opstatus(req, psa_status);
654 }
655
656 return rpc_status;
657}
658
Julian Hallf5728962021-06-24 09:40:23 +0100659static rpc_status_t hash_setup_handler(void *context, struct call_req* req)
660{
661 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
662 struct call_param_buf *req_buf = call_req_get_req_buf(req);
663 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100664 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100665
666 psa_algorithm_t alg;
667
668 if (serializer)
669 rpc_status = serializer->deserialize_hash_setup_req(req_buf, &alg);
670
671 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
672
673 uint32_t op_handle;
674
675 struct crypto_context *crypto_context =
676 crypto_context_pool_alloc(&this_instance->context_pool,
677 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
678 &op_handle);
679
680 if (crypto_context) {
681
682 psa_status_t psa_status;
683
684 crypto_context->op.hash = psa_hash_operation_init();
685 psa_status = psa_hash_setup(&crypto_context->op.hash, alg);
686
687 if (psa_status == PSA_SUCCESS) {
688
689 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
690 rpc_status = serializer->serialize_hash_setup_resp(resp_buf, op_handle);
691 }
692
693 if ((psa_status != PSA_SUCCESS) || (rpc_status != TS_RPC_CALL_ACCEPTED)) {
694
695 crypto_context_pool_free(&this_instance->context_pool, crypto_context);
696 }
697
698 call_req_set_opstatus(req, psa_status);
699 }
700 else {
701 /* Failed to allocate crypto context for transaction */
702 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
703 }
704 }
705
706 return rpc_status;
707}
708
709static rpc_status_t hash_update_handler(void *context, struct call_req* req)
710{
711 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
712 struct call_param_buf *req_buf = call_req_get_req_buf(req);
713 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100714 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100715
716 uint32_t op_handle;
717 const uint8_t *data;
718 size_t data_len;
719
720 if (serializer)
721 rpc_status = serializer->deserialize_hash_update_req(req_buf, &op_handle, &data, &data_len);
722
723 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
724
725 struct crypto_context *crypto_context =
726 crypto_context_pool_find(&this_instance->context_pool,
727 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
728 op_handle);
729
730 if (crypto_context) {
731
732 psa_status_t psa_status = psa_hash_update(&crypto_context->op.hash, data, data_len);
733 call_req_set_opstatus(req, psa_status);
734 }
735 else {
736 /* Requested context doesn't exist */
737 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
738 }
739 }
740
741 return rpc_status;
742}
743
744static rpc_status_t hash_finish_handler(void *context, struct call_req* req)
745{
746 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
747 struct call_param_buf *req_buf = call_req_get_req_buf(req);
748 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100749 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100750
751 uint32_t op_handle;
752
753 if (serializer)
754 rpc_status = serializer->deserialize_hash_finish_req(req_buf, &op_handle);
755
756 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
757
758 struct crypto_context *crypto_context =
759 crypto_context_pool_find(&this_instance->context_pool,
760 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
761 op_handle);
762
763 if (crypto_context) {
764
765 psa_status_t psa_status;
766 size_t hash_len;
767 uint8_t hash[PSA_HASH_MAX_SIZE];
768
769 psa_status = psa_hash_finish(&crypto_context->op.hash, hash, sizeof(hash), &hash_len);
770
771 if (psa_status == PSA_SUCCESS) {
772
773 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
774 rpc_status = serializer->serialize_hash_finish_resp(resp_buf, hash, hash_len);
775 }
776
777 crypto_context_pool_free(&this_instance->context_pool, crypto_context);
778
779 call_req_set_opstatus(req, psa_status);
780 }
781 else {
782 /* Requested context doesn't exist */
783 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
784 }
785 }
786
787 return rpc_status;
julhal01c3f4e9a2020-12-15 13:39:01 +0000788}