blob: fafd6c775663ddadb3c63076151c1e755a416c1a [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 Hallf5728962021-06-24 09:40:23 +0100180 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100181
Julian Hallf5728962021-06-24 09:40:23 +0100182 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100183
Julian Hallf5728962021-06-24 09:40:23 +0100184 size_t export_size;
185 psa_status = psa_export_key(id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100186
Julian Hallf5728962021-06-24 09:40:23 +0100187 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100188
Julian Hallf5728962021-06-24 09:40:23 +0100189 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
190 rpc_status = serializer->serialize_export_key_resp(resp_buf, key_buffer, export_size);
191 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100192
Julian Hallf5728962021-06-24 09:40:23 +0100193 free(key_buffer);
194 }
195 else {
196 /* Failed to allocate key buffer */
197 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
198 }
199 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100200
Julian Hallf5728962021-06-24 09:40:23 +0100201 call_req_set_opstatus(req, psa_status);
202 psa_reset_key_attributes(&attributes);
203 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100204
Julian Hallf5728962021-06-24 09:40:23 +0100205 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100206}
207
208static rpc_status_t export_public_key_handler(void *context, struct call_req* req)
209{
Julian Hallf5728962021-06-24 09:40:23 +0100210 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
211 struct call_param_buf *req_buf = call_req_get_req_buf(req);
212 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100213
Julian Hallf5728962021-06-24 09:40:23 +0100214 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100215
Julian Hallf5728962021-06-24 09:40:23 +0100216 if (serializer)
217 rpc_status = serializer->deserialize_export_public_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100218
Julian Hallf5728962021-06-24 09:40:23 +0100219 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100220
Julian Hallf5728962021-06-24 09:40:23 +0100221 psa_status_t psa_status;
222 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100223
Julian Hallf5728962021-06-24 09:40:23 +0100224 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100225
Julian Hallf5728962021-06-24 09:40:23 +0100226 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100227
Julian Hallf5728962021-06-24 09:40:23 +0100228 size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(
229 PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(psa_get_key_type(&attributes)),
230 psa_get_key_bits(&attributes));
Julian Hallc02fffb2020-11-23 18:22:06 +0100231
Julian Hallf5728962021-06-24 09:40:23 +0100232 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100233
Julian Hallf5728962021-06-24 09:40:23 +0100234 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100235
Julian Hallf5728962021-06-24 09:40:23 +0100236 size_t export_size;
237 psa_status = psa_export_public_key(id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100238
Julian Hallf5728962021-06-24 09:40:23 +0100239 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100240
Julian Hallf5728962021-06-24 09:40:23 +0100241 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
242 rpc_status = serializer->serialize_export_public_key_resp(resp_buf, key_buffer, export_size);
243 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100244
Julian Hallf5728962021-06-24 09:40:23 +0100245 free(key_buffer);
246 }
247 else {
248 /* Failed to allocate key buffer */
249 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
250 }
251 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100252
Julian Hallf5728962021-06-24 09:40:23 +0100253 call_req_set_opstatus(req, psa_status);
254 psa_reset_key_attributes(&attributes);
255 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100256
Julian Hallf5728962021-06-24 09:40:23 +0100257 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100258}
259
260static rpc_status_t import_key_handler(void *context, struct call_req* req)
261{
Julian Hallf5728962021-06-24 09:40:23 +0100262 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
263 struct call_param_buf *req_buf = call_req_get_req_buf(req);
264 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100265
Julian Hallf5728962021-06-24 09:40:23 +0100266 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100267
Julian Hallf5728962021-06-24 09:40:23 +0100268 size_t key_data_len = serializer->max_deserialised_parameter_size(req_buf);
269 uint8_t *key_buffer = malloc(key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100270
Julian Hallf5728962021-06-24 09:40:23 +0100271 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100272
Julian Hallf5728962021-06-24 09:40:23 +0100273 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
274 rpc_status = serializer->deserialize_import_key_req(req_buf, &attributes, key_buffer, &key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100275
Julian Hallf5728962021-06-24 09:40:23 +0100276 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100277
Julian Hallf5728962021-06-24 09:40:23 +0100278 psa_status_t psa_status;
279 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100280
Julian Hallf5728962021-06-24 09:40:23 +0100281 psa_status = psa_import_key(&attributes, key_buffer, key_data_len, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100282
Julian Hallf5728962021-06-24 09:40:23 +0100283 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000284
Julian Hallf5728962021-06-24 09:40:23 +0100285 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
286 rpc_status = serializer->serialize_import_key_resp(resp_buf, id);
287 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000288
Julian Hallf5728962021-06-24 09:40:23 +0100289 call_req_set_opstatus(req, psa_status);
290 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100291
Julian Hallf5728962021-06-24 09:40:23 +0100292 psa_reset_key_attributes(&attributes);
293 free(key_buffer);
294 }
295 else {
Julian Hallc02fffb2020-11-23 18:22:06 +0100296
Julian Hallf5728962021-06-24 09:40:23 +0100297 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
298 }
299 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100300
Julian Hallf5728962021-06-24 09:40:23 +0100301 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100302}
303
304static rpc_status_t sign_hash_handler(void *context, struct call_req* req)
305{
Julian Hallf5728962021-06-24 09:40:23 +0100306 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
307 struct call_param_buf *req_buf = call_req_get_req_buf(req);
308 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100309
Julian Hallf5728962021-06-24 09:40:23 +0100310 psa_key_id_t id;
311 psa_algorithm_t alg;
312 size_t hash_len = PSA_HASH_MAX_SIZE;
313 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100314
Julian Hallf5728962021-06-24 09:40:23 +0100315 if (serializer)
316 rpc_status = serializer->deserialize_sign_hash_req(req_buf, &id, &alg, hash_buffer, &hash_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100317
Julian Hallf5728962021-06-24 09:40:23 +0100318 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100319
Julian Hallf5728962021-06-24 09:40:23 +0100320 psa_status_t psa_status;
321 size_t sig_len;
322 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100323
Julian Hallf5728962021-06-24 09:40:23 +0100324 psa_status = psa_sign_hash(id, alg,
325 hash_buffer, hash_len,
326 sig_buffer, sizeof(sig_buffer), &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100327
Julian Hallf5728962021-06-24 09:40:23 +0100328 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100329
Julian Hallf5728962021-06-24 09:40:23 +0100330 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
331 rpc_status = serializer->serialize_sign_hash_resp(resp_buf, sig_buffer, sig_len);
332 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100333
Julian Hallf5728962021-06-24 09:40:23 +0100334 call_req_set_opstatus(req, psa_status);
335 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100336
Julian Hallf5728962021-06-24 09:40:23 +0100337 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100338}
339
340static rpc_status_t verify_hash_handler(void *context, struct call_req* req)
341{
Julian Hallf5728962021-06-24 09:40:23 +0100342 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
343 struct call_param_buf *req_buf = call_req_get_req_buf(req);
344 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100345
Julian Hallf5728962021-06-24 09:40:23 +0100346 psa_key_id_t id;
347 psa_algorithm_t alg;
348 size_t hash_len = PSA_HASH_MAX_SIZE;
349 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
350 size_t sig_len = PSA_SIGNATURE_MAX_SIZE;
351 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100352
Julian Hallf5728962021-06-24 09:40:23 +0100353 if (serializer)
354 rpc_status = serializer->deserialize_verify_hash_req(req_buf, &id, &alg,
355 hash_buffer, &hash_len,
356 sig_buffer, &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100357
Julian Hallf5728962021-06-24 09:40:23 +0100358 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100359
Julian Hallf5728962021-06-24 09:40:23 +0100360 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100361
Julian Hallf5728962021-06-24 09:40:23 +0100362 psa_status = psa_verify_hash(id, alg,
363 hash_buffer, hash_len,
364 sig_buffer, sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100365
Julian Hallf5728962021-06-24 09:40:23 +0100366 call_req_set_opstatus(req, psa_status);
367 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100368
Julian Hallf5728962021-06-24 09:40:23 +0100369 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100370}
371
372static rpc_status_t asymmetric_decrypt_handler(void *context, struct call_req* req)
373{
Julian Hallf5728962021-06-24 09:40:23 +0100374 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
375 struct call_param_buf *req_buf = call_req_get_req_buf(req);
376 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100377
Julian Hallf5728962021-06-24 09:40:23 +0100378 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100379
Julian Hallf5728962021-06-24 09:40:23 +0100380 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100381
Julian Hallf5728962021-06-24 09:40:23 +0100382 psa_key_id_t id;
383 psa_algorithm_t alg;
384 size_t ciphertext_len = max_param_size;
385 uint8_t *ciphertext_buffer = malloc(ciphertext_len);
386 size_t salt_len = max_param_size;
387 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100388
Julian Hallf5728962021-06-24 09:40:23 +0100389 if (ciphertext_buffer && salt_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100390
Julian Hallf5728962021-06-24 09:40:23 +0100391 rpc_status = serializer->deserialize_asymmetric_decrypt_req(req_buf,
392 &id, &alg,
393 ciphertext_buffer, &ciphertext_len,
394 salt_buffer, &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100395
Julian Hallf5728962021-06-24 09:40:23 +0100396 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100397
Julian Hallf5728962021-06-24 09:40:23 +0100398 psa_status_t psa_status;
399 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100400
Julian Hallf5728962021-06-24 09:40:23 +0100401 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100402
Julian Hallf5728962021-06-24 09:40:23 +0100403 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100404
Julian Hallf5728962021-06-24 09:40:23 +0100405 size_t max_decrypt_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(
406 psa_get_key_type(&attributes),
407 psa_get_key_bits(&attributes),
408 alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100409
Julian Hallf5728962021-06-24 09:40:23 +0100410 size_t plaintext_len;
411 uint8_t *plaintext_buffer = malloc(max_decrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100412
Julian Hallf5728962021-06-24 09:40:23 +0100413 if (plaintext_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100414
Julian Hallf5728962021-06-24 09:40:23 +0100415 /* Salt is an optional parameter */
416 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100417
Julian Hallf5728962021-06-24 09:40:23 +0100418 psa_status = psa_asymmetric_decrypt(id, alg,
419 ciphertext_buffer, ciphertext_len,
420 salt, salt_len,
421 plaintext_buffer, max_decrypt_size, &plaintext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000422
Julian Hallf5728962021-06-24 09:40:23 +0100423 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000424
Julian Hallf5728962021-06-24 09:40:23 +0100425 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
426 rpc_status = serializer->serialize_asymmetric_decrypt_resp(resp_buf,
427 plaintext_buffer, plaintext_len);
428 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000429
Julian Hallf5728962021-06-24 09:40:23 +0100430 free(plaintext_buffer);
431 }
432 else {
433 /* Failed to allocate ouptput buffer */
434 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
435 }
436 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100437
Julian Hallf5728962021-06-24 09:40:23 +0100438 call_req_set_opstatus(req, psa_status);
439 psa_reset_key_attributes(&attributes);
440 }
441 }
442 else {
443 /* Failed to allocate buffers */
444 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
445 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100446
Julian Hallf5728962021-06-24 09:40:23 +0100447 free(ciphertext_buffer);
448 free(salt_buffer);
449 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100450
Julian Hallf5728962021-06-24 09:40:23 +0100451 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100452}
453
454static rpc_status_t asymmetric_encrypt_handler(void *context, struct call_req* req)
455{
Julian Hallf5728962021-06-24 09:40:23 +0100456 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
457 struct call_param_buf *req_buf = call_req_get_req_buf(req);
458 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100459
Julian Hallf5728962021-06-24 09:40:23 +0100460 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100461
Julian Hallf5728962021-06-24 09:40:23 +0100462 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100463
Julian Hallf5728962021-06-24 09:40:23 +0100464 psa_key_id_t id;
465 psa_algorithm_t alg;
466 size_t plaintext_len = max_param_size;
467 uint8_t *plaintext_buffer = malloc(plaintext_len);
468 size_t salt_len = max_param_size;
469 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100470
Julian Hallf5728962021-06-24 09:40:23 +0100471 if (plaintext_buffer && salt_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100472
Julian Hallf5728962021-06-24 09:40:23 +0100473 rpc_status = serializer->deserialize_asymmetric_encrypt_req(req_buf,
474 &id, &alg,
475 plaintext_buffer, &plaintext_len,
476 salt_buffer, &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100477
Julian Hallf5728962021-06-24 09:40:23 +0100478 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100479
Julian Hallf5728962021-06-24 09:40:23 +0100480 psa_status_t psa_status;
481 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100482
Julian Hallf5728962021-06-24 09:40:23 +0100483 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100484
Julian Hallf5728962021-06-24 09:40:23 +0100485 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100486
Julian Hallf5728962021-06-24 09:40:23 +0100487 size_t max_encrypt_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(
488 psa_get_key_type(&attributes),
489 psa_get_key_bits(&attributes),
490 alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100491
Julian Hallf5728962021-06-24 09:40:23 +0100492 size_t ciphertext_len;
493 uint8_t *ciphertext_buffer = malloc(max_encrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100494
Julian Hallf5728962021-06-24 09:40:23 +0100495 if (ciphertext_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100496
Julian Hallf5728962021-06-24 09:40:23 +0100497 /* Salt is an optional parameter */
498 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100499
Julian Hallf5728962021-06-24 09:40:23 +0100500 psa_status = psa_asymmetric_encrypt(id, alg,
501 plaintext_buffer, plaintext_len,
502 salt, salt_len,
503 ciphertext_buffer, max_encrypt_size, &ciphertext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000504
Julian Hallf5728962021-06-24 09:40:23 +0100505 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000506
Julian Hallf5728962021-06-24 09:40:23 +0100507 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
508 rpc_status = serializer->serialize_asymmetric_encrypt_resp(resp_buf,
509 ciphertext_buffer, ciphertext_len);
510 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000511
Julian Hallf5728962021-06-24 09:40:23 +0100512 free(ciphertext_buffer);
513 }
514 else {
515 /* Failed to allocate ouptput buffer */
516 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
517 }
518 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100519
Julian Hallf5728962021-06-24 09:40:23 +0100520 call_req_set_opstatus(req, psa_status);
521 psa_reset_key_attributes(&attributes);
522 }
523 }
524 else {
525 /* Failed to allocate buffers */
526 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
527 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100528
Julian Hallf5728962021-06-24 09:40:23 +0100529 free(plaintext_buffer);
530 free(salt_buffer);
531 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100532
Julian Hallf5728962021-06-24 09:40:23 +0100533 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100534}
535
536static rpc_status_t generate_random_handler(void *context, struct call_req* req)
537{
Julian Hallf5728962021-06-24 09:40:23 +0100538 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
539 struct call_param_buf *req_buf = call_req_get_req_buf(req);
540 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100541
Julian Hallf5728962021-06-24 09:40:23 +0100542 size_t output_size;
Julian Hallc02fffb2020-11-23 18:22:06 +0100543
Julian Hallf5728962021-06-24 09:40:23 +0100544 if (serializer)
545 rpc_status = serializer->deserialize_generate_random_req(req_buf, &output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100546
Julian Hallf5728962021-06-24 09:40:23 +0100547 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100548
Julian Hallf5728962021-06-24 09:40:23 +0100549 psa_status_t psa_status;
550 uint8_t *output_buffer = malloc(output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100551
Julian Hallf5728962021-06-24 09:40:23 +0100552 if (output_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100553
Julian Hallf5728962021-06-24 09:40:23 +0100554 psa_status = psa_generate_random(output_buffer, output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100555
Julian Hallf5728962021-06-24 09:40:23 +0100556 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100557
Julian Hallf5728962021-06-24 09:40:23 +0100558 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
559 rpc_status = serializer->serialize_generate_random_resp(resp_buf,
560 output_buffer, output_size);
561 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100562
Julian Hallf5728962021-06-24 09:40:23 +0100563 call_req_set_opstatus(req, psa_status);
564 free(output_buffer);
565 }
566 else {
567 /* Failed to allocate output buffer */
568 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
569 }
570 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100571
Julian Hallf5728962021-06-24 09:40:23 +0100572 return rpc_status;
573}
574
Julian Hall8359a632021-07-08 15:10:30 +0100575static rpc_status_t copy_key_handler(void *context, struct call_req* req)
576{
577 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
578 struct call_param_buf *req_buf = call_req_get_req_buf(req);
579 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
580
581 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
582 psa_key_id_t source_key_id;
583
584 if (serializer)
585 rpc_status = serializer->deserialize_copy_key_req(req_buf, &attributes, &source_key_id);
586
587 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
588
589 psa_key_id_t target_key_id;
590
591 psa_status_t psa_status = psa_copy_key(source_key_id, &attributes, &target_key_id);
592
593 if (psa_status == PSA_SUCCESS) {
594
595 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
596 rpc_status = serializer->serialize_copy_key_resp(resp_buf, target_key_id);
597 }
598
599 call_req_set_opstatus(req, psa_status);
600 }
601
602 psa_reset_key_attributes(&attributes);
603
604 return rpc_status;
605}
606
607static rpc_status_t purge_key_handler(void *context, struct call_req* req)
608{
609 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
610 struct call_param_buf *req_buf = call_req_get_req_buf(req);
611 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
612
613 psa_key_id_t id;
614
615 if (serializer)
616 rpc_status = serializer->deserialize_purge_key_req(req_buf, &id);
617
618 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
619
620 psa_status_t psa_status = psa_purge_key(id);
621 call_req_set_opstatus(req, psa_status);
622 }
623
624 return rpc_status;
625}
626
627static rpc_status_t get_key_attributes_handler(void *context, struct call_req* req)
628{
629 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
630 struct call_param_buf *req_buf = call_req_get_req_buf(req);
631 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
632
633 psa_key_id_t id;
634
635 if (serializer)
636 rpc_status = serializer->deserialize_get_key_attributes_req(req_buf, &id);
637
638 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
639
640 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
641
642 psa_status_t psa_status = psa_get_key_attributes(id, &attributes);
643
644 if (psa_status == PSA_SUCCESS) {
645
646 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
647 rpc_status = serializer->serialize_get_key_attributes_resp(resp_buf, &attributes);
648 }
649
650 psa_reset_key_attributes(&attributes);
651 call_req_set_opstatus(req, psa_status);
652 }
653
654 return rpc_status;
655}
656
Julian Hallf5728962021-06-24 09:40:23 +0100657static rpc_status_t hash_setup_handler(void *context, struct call_req* req)
658{
659 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
660 struct call_param_buf *req_buf = call_req_get_req_buf(req);
661 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100662 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100663
664 psa_algorithm_t alg;
665
666 if (serializer)
667 rpc_status = serializer->deserialize_hash_setup_req(req_buf, &alg);
668
669 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
670
671 uint32_t op_handle;
672
673 struct crypto_context *crypto_context =
674 crypto_context_pool_alloc(&this_instance->context_pool,
675 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
676 &op_handle);
677
678 if (crypto_context) {
679
680 psa_status_t psa_status;
681
682 crypto_context->op.hash = psa_hash_operation_init();
683 psa_status = psa_hash_setup(&crypto_context->op.hash, alg);
684
685 if (psa_status == PSA_SUCCESS) {
686
687 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
688 rpc_status = serializer->serialize_hash_setup_resp(resp_buf, op_handle);
689 }
690
691 if ((psa_status != PSA_SUCCESS) || (rpc_status != TS_RPC_CALL_ACCEPTED)) {
692
693 crypto_context_pool_free(&this_instance->context_pool, crypto_context);
694 }
695
696 call_req_set_opstatus(req, psa_status);
697 }
698 else {
699 /* Failed to allocate crypto context for transaction */
700 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
701 }
702 }
703
704 return rpc_status;
705}
706
707static rpc_status_t hash_update_handler(void *context, struct call_req* req)
708{
709 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
710 struct call_param_buf *req_buf = call_req_get_req_buf(req);
711 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100712 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100713
714 uint32_t op_handle;
715 const uint8_t *data;
716 size_t data_len;
717
718 if (serializer)
719 rpc_status = serializer->deserialize_hash_update_req(req_buf, &op_handle, &data, &data_len);
720
721 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
722
723 struct crypto_context *crypto_context =
724 crypto_context_pool_find(&this_instance->context_pool,
725 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
726 op_handle);
727
728 if (crypto_context) {
729
730 psa_status_t psa_status = psa_hash_update(&crypto_context->op.hash, data, data_len);
731 call_req_set_opstatus(req, psa_status);
732 }
733 else {
734 /* Requested context doesn't exist */
735 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
736 }
737 }
738
739 return rpc_status;
740}
741
742static rpc_status_t hash_finish_handler(void *context, struct call_req* req)
743{
744 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
745 struct call_param_buf *req_buf = call_req_get_req_buf(req);
746 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100747 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100748
749 uint32_t op_handle;
750
751 if (serializer)
752 rpc_status = serializer->deserialize_hash_finish_req(req_buf, &op_handle);
753
754 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
755
756 struct crypto_context *crypto_context =
757 crypto_context_pool_find(&this_instance->context_pool,
758 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
759 op_handle);
760
761 if (crypto_context) {
762
763 psa_status_t psa_status;
764 size_t hash_len;
765 uint8_t hash[PSA_HASH_MAX_SIZE];
766
767 psa_status = psa_hash_finish(&crypto_context->op.hash, hash, sizeof(hash), &hash_len);
768
769 if (psa_status == PSA_SUCCESS) {
770
771 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
772 rpc_status = serializer->serialize_hash_finish_resp(resp_buf, hash, hash_len);
773 }
774
775 crypto_context_pool_free(&this_instance->context_pool, crypto_context);
776
777 call_req_set_opstatus(req, psa_status);
778 }
779 else {
780 /* Requested context doesn't exist */
781 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
782 }
783 }
784
785 return rpc_status;
julhal01c3f4e9a2020-12-15 13:39:01 +0000786}