blob: 6777fd248eb28ce2251c1302d2bec6ee7886e01f [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
Julian Hall13e76952021-07-13 12:17:09 +010078void crypto_provider_extend(struct crypto_provider *context,
79 struct service_provider *sub_provider)
80{
81 service_provider_extend(&context->base_provider, sub_provider);
82}
83
julhal01c3f4e9a2020-12-15 13:39:01 +000084static const struct crypto_provider_serializer* get_crypto_serializer(void *context,
Julian Hallf5728962021-06-24 09:40:23 +010085 const struct call_req *req)
julhal01c3f4e9a2020-12-15 13:39:01 +000086{
Julian Hall9061e6c2021-06-29 14:24:20 +010087 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +010088 const struct crypto_provider_serializer* serializer = NULL;
89 unsigned int encoding = call_req_get_encoding(req);
julhal01c3f4e9a2020-12-15 13:39:01 +000090
Julian Hallf5728962021-06-24 09:40:23 +010091 if (encoding < TS_RPC_ENCODING_LIMIT) serializer = this_instance->serializers[encoding];
julhal01c3f4e9a2020-12-15 13:39:01 +000092
Julian Hallf5728962021-06-24 09:40:23 +010093 return serializer;
Julian Hallc02fffb2020-11-23 18:22:06 +010094}
95
96static rpc_status_t nop_handler(void *context, struct call_req* req)
97{
Julian Hallf5728962021-06-24 09:40:23 +010098 /* Responds to a request by returning success */
99 rpc_status_t rpc_status = TS_RPC_CALL_ACCEPTED;
100 psa_status_t psa_status = PSA_SUCCESS;
Julian Hallc02fffb2020-11-23 18:22:06 +0100101
Julian Hallf5728962021-06-24 09:40:23 +0100102 (void)context;
103 call_req_set_opstatus(req, psa_status);
Julian Hallc02fffb2020-11-23 18:22:06 +0100104
Julian Hallf5728962021-06-24 09:40:23 +0100105 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100106}
107
108static rpc_status_t generate_key_handler(void *context, struct call_req* req)
109{
Julian Hallf5728962021-06-24 09:40:23 +0100110 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
111 struct call_param_buf *req_buf = call_req_get_req_buf(req);
112 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100113
Julian Hallf5728962021-06-24 09:40:23 +0100114 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100115
Julian Hallf5728962021-06-24 09:40:23 +0100116 if (serializer)
117 rpc_status = serializer->deserialize_generate_key_req(req_buf, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100118
Julian Hallf5728962021-06-24 09:40:23 +0100119 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100120
Julian Hallf5728962021-06-24 09:40:23 +0100121 psa_status_t psa_status;
122 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100123
Julian Hallf5728962021-06-24 09:40:23 +0100124 psa_status = psa_generate_key(&attributes, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100125
Julian Hallf5728962021-06-24 09:40:23 +0100126 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100127
Julian Hallf5728962021-06-24 09:40:23 +0100128 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
129 rpc_status = serializer->serialize_generate_key_resp(resp_buf, id);
130 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100131
Julian Hallf5728962021-06-24 09:40:23 +0100132 call_req_set_opstatus(req, psa_status);
133 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100134
Julian Hallf5728962021-06-24 09:40:23 +0100135 psa_reset_key_attributes(&attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100136
Julian Hallf5728962021-06-24 09:40:23 +0100137 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100138}
139
140static rpc_status_t destroy_key_handler(void *context, struct call_req* req)
141{
Julian Hallf5728962021-06-24 09:40:23 +0100142 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
143 struct call_param_buf *req_buf = call_req_get_req_buf(req);
144 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100145
Julian Hallf5728962021-06-24 09:40:23 +0100146 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100147
Julian Hallf5728962021-06-24 09:40:23 +0100148 if (serializer)
149 rpc_status = serializer->deserialize_destroy_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100150
Julian Hallf5728962021-06-24 09:40:23 +0100151 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100152
Julian Hallf5728962021-06-24 09:40:23 +0100153 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100154
Julian Hallf5728962021-06-24 09:40:23 +0100155 psa_status = psa_destroy_key(id);
156 call_req_set_opstatus(req, psa_status);
157 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100158
Julian Hallf5728962021-06-24 09:40:23 +0100159 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100160}
161
162static rpc_status_t export_key_handler(void *context, struct call_req* req)
163{
Julian Hallf5728962021-06-24 09:40:23 +0100164 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
165 struct call_param_buf *req_buf = call_req_get_req_buf(req);
166 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100167
Julian Hallf5728962021-06-24 09:40:23 +0100168 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100169
Julian Hallf5728962021-06-24 09:40:23 +0100170 if (serializer)
171 rpc_status = serializer->deserialize_export_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100172
Julian Hallf5728962021-06-24 09:40:23 +0100173 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100174
Julian Hallf5728962021-06-24 09:40:23 +0100175 psa_status_t psa_status;
176 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100177
Julian Hallf5728962021-06-24 09:40:23 +0100178 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100179
Julian Hallf5728962021-06-24 09:40:23 +0100180 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100181
Julian Hallf5728962021-06-24 09:40:23 +0100182 size_t max_export_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
183 psa_get_key_type(&attributes),
184 psa_get_key_bits(&attributes));
Julian Hallc02fffb2020-11-23 18:22:06 +0100185
Julian Hallec81a502021-07-12 11:36:37 +0100186 if (max_export_size) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100187
Julian Hallec81a502021-07-12 11:36:37 +0100188 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100189
Julian Hallec81a502021-07-12 11:36:37 +0100190 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100191
Julian Hallec81a502021-07-12 11:36:37 +0100192 size_t export_size;
193 psa_status_t psa_status = psa_export_key(id, key_buffer,
194 max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100195
Julian Hallec81a502021-07-12 11:36:37 +0100196 if (psa_status == PSA_SUCCESS) {
197
198 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
199 rpc_status = serializer->serialize_export_key_resp(resp_buf,
200 key_buffer, export_size);
201 }
202
203 free(key_buffer);
Julian Hallf5728962021-06-24 09:40:23 +0100204 }
Julian Hallec81a502021-07-12 11:36:37 +0100205 else {
206 /* Failed to allocate key buffer */
207 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
208 }
Julian Hallf5728962021-06-24 09:40:23 +0100209 }
210 else {
Julian Hallec81a502021-07-12 11:36:37 +0100211
212 /* No sensible export size was returned so
213 * key attributes must be in an invalid state.
214 */
215 psa_status = PSA_ERROR_GENERIC_ERROR;
Julian Hallf5728962021-06-24 09:40:23 +0100216 }
217 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100218
Julian Hallf5728962021-06-24 09:40:23 +0100219 call_req_set_opstatus(req, psa_status);
220 psa_reset_key_attributes(&attributes);
221 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100222
Julian Hallf5728962021-06-24 09:40:23 +0100223 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100224}
225
226static rpc_status_t export_public_key_handler(void *context, struct call_req* req)
227{
Julian Hallf5728962021-06-24 09:40:23 +0100228 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
229 struct call_param_buf *req_buf = call_req_get_req_buf(req);
230 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100231
Julian Hallf5728962021-06-24 09:40:23 +0100232 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100233
Julian Hallf5728962021-06-24 09:40:23 +0100234 if (serializer)
235 rpc_status = serializer->deserialize_export_public_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100236
Julian Hallf5728962021-06-24 09:40:23 +0100237 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100238
Julian Hallec81a502021-07-12 11:36:37 +0100239 size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_MAX_SIZE;
240 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100241
Julian Hallec81a502021-07-12 11:36:37 +0100242 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100243
Julian Hallec81a502021-07-12 11:36:37 +0100244 size_t export_size;
245 psa_status_t psa_status = psa_export_public_key(id, key_buffer,
246 max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100247
Julian Hallec81a502021-07-12 11:36:37 +0100248 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100249
Julian Hallec81a502021-07-12 11:36:37 +0100250 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
251 rpc_status = serializer->serialize_export_public_key_resp(resp_buf,
252 key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100253 }
Julian Hallec81a502021-07-12 11:36:37 +0100254
255 free(key_buffer);
256 call_req_set_opstatus(req, psa_status);
Julian Hallf5728962021-06-24 09:40:23 +0100257 }
Julian Hallec81a502021-07-12 11:36:37 +0100258 else {
259 /* Failed to allocate key buffer */
260 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
261 }
Julian Hallf5728962021-06-24 09:40:23 +0100262 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100263
Julian Hallf5728962021-06-24 09:40:23 +0100264 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100265}
266
267static rpc_status_t import_key_handler(void *context, struct call_req* req)
268{
Julian Hallf5728962021-06-24 09:40:23 +0100269 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
270 struct call_param_buf *req_buf = call_req_get_req_buf(req);
271 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100272
Julian Hallf5728962021-06-24 09:40:23 +0100273 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100274
Julian Hallf5728962021-06-24 09:40:23 +0100275 size_t key_data_len = serializer->max_deserialised_parameter_size(req_buf);
276 uint8_t *key_buffer = malloc(key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100277
Julian Hallf5728962021-06-24 09:40:23 +0100278 if (key_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100279
Julian Hallf5728962021-06-24 09:40:23 +0100280 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallec81a502021-07-12 11:36:37 +0100281 rpc_status = serializer->deserialize_import_key_req(req_buf, &attributes,
282 key_buffer, &key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100283
Julian Hallf5728962021-06-24 09:40:23 +0100284 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100285
Julian Hallf5728962021-06-24 09:40:23 +0100286 psa_status_t psa_status;
287 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100288
Julian Hallf5728962021-06-24 09:40:23 +0100289 psa_status = psa_import_key(&attributes, key_buffer, key_data_len, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100290
Julian Hallf5728962021-06-24 09:40:23 +0100291 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000292
Julian Hallf5728962021-06-24 09:40:23 +0100293 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
294 rpc_status = serializer->serialize_import_key_resp(resp_buf, id);
295 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000296
Julian Hallf5728962021-06-24 09:40:23 +0100297 call_req_set_opstatus(req, psa_status);
298 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100299
Julian Hallf5728962021-06-24 09:40:23 +0100300 psa_reset_key_attributes(&attributes);
301 free(key_buffer);
302 }
303 else {
Julian Hallc02fffb2020-11-23 18:22:06 +0100304
Julian Hallf5728962021-06-24 09:40:23 +0100305 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
306 }
307 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100308
Julian Hallf5728962021-06-24 09:40:23 +0100309 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100310}
311
312static rpc_status_t sign_hash_handler(void *context, struct call_req* req)
313{
Julian Hallf5728962021-06-24 09:40:23 +0100314 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
315 struct call_param_buf *req_buf = call_req_get_req_buf(req);
316 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100317
Julian Hallf5728962021-06-24 09:40:23 +0100318 psa_key_id_t id;
319 psa_algorithm_t alg;
320 size_t hash_len = PSA_HASH_MAX_SIZE;
321 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100322
Julian Hallf5728962021-06-24 09:40:23 +0100323 if (serializer)
324 rpc_status = serializer->deserialize_sign_hash_req(req_buf, &id, &alg, hash_buffer, &hash_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100325
Julian Hallf5728962021-06-24 09:40:23 +0100326 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100327
Julian Hallf5728962021-06-24 09:40:23 +0100328 psa_status_t psa_status;
329 size_t sig_len;
330 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100331
Julian Hallf5728962021-06-24 09:40:23 +0100332 psa_status = psa_sign_hash(id, alg,
333 hash_buffer, hash_len,
334 sig_buffer, sizeof(sig_buffer), &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100335
Julian Hallf5728962021-06-24 09:40:23 +0100336 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100337
Julian Hallf5728962021-06-24 09:40:23 +0100338 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
339 rpc_status = serializer->serialize_sign_hash_resp(resp_buf, sig_buffer, sig_len);
340 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100341
Julian Hallf5728962021-06-24 09:40:23 +0100342 call_req_set_opstatus(req, psa_status);
343 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100344
Julian Hallf5728962021-06-24 09:40:23 +0100345 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100346}
347
348static rpc_status_t verify_hash_handler(void *context, struct call_req* req)
349{
Julian Hallf5728962021-06-24 09:40:23 +0100350 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
351 struct call_param_buf *req_buf = call_req_get_req_buf(req);
352 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100353
Julian Hallf5728962021-06-24 09:40:23 +0100354 psa_key_id_t id;
355 psa_algorithm_t alg;
356 size_t hash_len = PSA_HASH_MAX_SIZE;
357 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
358 size_t sig_len = PSA_SIGNATURE_MAX_SIZE;
359 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100360
Julian Hallf5728962021-06-24 09:40:23 +0100361 if (serializer)
362 rpc_status = serializer->deserialize_verify_hash_req(req_buf, &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 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100367
Julian Hallf5728962021-06-24 09:40:23 +0100368 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100369
Julian Hallf5728962021-06-24 09:40:23 +0100370 psa_status = psa_verify_hash(id, alg,
371 hash_buffer, hash_len,
372 sig_buffer, sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100373
Julian Hallf5728962021-06-24 09:40:23 +0100374 call_req_set_opstatus(req, psa_status);
375 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100376
Julian Hallf5728962021-06-24 09:40:23 +0100377 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100378}
379
380static rpc_status_t asymmetric_decrypt_handler(void *context, struct call_req* req)
381{
Julian Hallf5728962021-06-24 09:40:23 +0100382 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
383 struct call_param_buf *req_buf = call_req_get_req_buf(req);
384 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100385
Julian Hallf5728962021-06-24 09:40:23 +0100386 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100387
Julian Hallf5728962021-06-24 09:40:23 +0100388 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100389
Julian Hallf5728962021-06-24 09:40:23 +0100390 psa_key_id_t id;
391 psa_algorithm_t alg;
392 size_t ciphertext_len = max_param_size;
393 uint8_t *ciphertext_buffer = malloc(ciphertext_len);
394 size_t salt_len = max_param_size;
395 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100396
Julian Hallf5728962021-06-24 09:40:23 +0100397 if (ciphertext_buffer && salt_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100398
Julian Hallf5728962021-06-24 09:40:23 +0100399 rpc_status = serializer->deserialize_asymmetric_decrypt_req(req_buf,
400 &id, &alg,
401 ciphertext_buffer, &ciphertext_len,
402 salt_buffer, &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100403
Julian Hallf5728962021-06-24 09:40:23 +0100404 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100405
Julian Hallf5728962021-06-24 09:40:23 +0100406 psa_status_t psa_status;
407 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100408
Julian Hallf5728962021-06-24 09:40:23 +0100409 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100410
Julian Hallf5728962021-06-24 09:40:23 +0100411 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100412
Julian Hallf5728962021-06-24 09:40:23 +0100413 size_t max_decrypt_size = PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(
414 psa_get_key_type(&attributes),
415 psa_get_key_bits(&attributes),
416 alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100417
Julian Hallf5728962021-06-24 09:40:23 +0100418 size_t plaintext_len;
419 uint8_t *plaintext_buffer = malloc(max_decrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100420
Julian Hallf5728962021-06-24 09:40:23 +0100421 if (plaintext_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100422
Julian Hallf5728962021-06-24 09:40:23 +0100423 /* Salt is an optional parameter */
424 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100425
Julian Hallf5728962021-06-24 09:40:23 +0100426 psa_status = psa_asymmetric_decrypt(id, alg,
427 ciphertext_buffer, ciphertext_len,
428 salt, salt_len,
429 plaintext_buffer, max_decrypt_size, &plaintext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000430
Julian Hallf5728962021-06-24 09:40:23 +0100431 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000432
Julian Hallf5728962021-06-24 09:40:23 +0100433 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
434 rpc_status = serializer->serialize_asymmetric_decrypt_resp(resp_buf,
435 plaintext_buffer, plaintext_len);
436 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000437
Julian Hallf5728962021-06-24 09:40:23 +0100438 free(plaintext_buffer);
439 }
440 else {
441 /* Failed to allocate ouptput buffer */
442 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
443 }
444 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100445
Julian Hallf5728962021-06-24 09:40:23 +0100446 call_req_set_opstatus(req, psa_status);
447 psa_reset_key_attributes(&attributes);
448 }
449 }
450 else {
451 /* Failed to allocate buffers */
452 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
453 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100454
Julian Hallf5728962021-06-24 09:40:23 +0100455 free(ciphertext_buffer);
456 free(salt_buffer);
457 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100458
Julian Hallf5728962021-06-24 09:40:23 +0100459 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100460}
461
462static rpc_status_t asymmetric_encrypt_handler(void *context, struct call_req* req)
463{
Julian Hallf5728962021-06-24 09:40:23 +0100464 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
465 struct call_param_buf *req_buf = call_req_get_req_buf(req);
466 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100467
Julian Hallf5728962021-06-24 09:40:23 +0100468 if (serializer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100469
Julian Hallf5728962021-06-24 09:40:23 +0100470 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100471
Julian Hallf5728962021-06-24 09:40:23 +0100472 psa_key_id_t id;
473 psa_algorithm_t alg;
474 size_t plaintext_len = max_param_size;
475 uint8_t *plaintext_buffer = malloc(plaintext_len);
476 size_t salt_len = max_param_size;
477 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100478
Julian Hallf5728962021-06-24 09:40:23 +0100479 if (plaintext_buffer && salt_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100480
Julian Hallf5728962021-06-24 09:40:23 +0100481 rpc_status = serializer->deserialize_asymmetric_encrypt_req(req_buf,
482 &id, &alg,
483 plaintext_buffer, &plaintext_len,
484 salt_buffer, &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100485
Julian Hallf5728962021-06-24 09:40:23 +0100486 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100487
Julian Hallf5728962021-06-24 09:40:23 +0100488 psa_status_t psa_status;
489 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100490
Julian Hallf5728962021-06-24 09:40:23 +0100491 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100492
Julian Hallf5728962021-06-24 09:40:23 +0100493 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100494
Julian Hallf5728962021-06-24 09:40:23 +0100495 size_t max_encrypt_size = PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(
496 psa_get_key_type(&attributes),
497 psa_get_key_bits(&attributes),
498 alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100499
Julian Hallf5728962021-06-24 09:40:23 +0100500 size_t ciphertext_len;
501 uint8_t *ciphertext_buffer = malloc(max_encrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100502
Julian Hallf5728962021-06-24 09:40:23 +0100503 if (ciphertext_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100504
Julian Hallf5728962021-06-24 09:40:23 +0100505 /* Salt is an optional parameter */
506 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100507
Julian Hallf5728962021-06-24 09:40:23 +0100508 psa_status = psa_asymmetric_encrypt(id, alg,
509 plaintext_buffer, plaintext_len,
510 salt, salt_len,
511 ciphertext_buffer, max_encrypt_size, &ciphertext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000512
Julian Hallf5728962021-06-24 09:40:23 +0100513 if (psa_status == PSA_SUCCESS) {
julhal01c3f4e9a2020-12-15 13:39:01 +0000514
Julian Hallf5728962021-06-24 09:40:23 +0100515 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
516 rpc_status = serializer->serialize_asymmetric_encrypt_resp(resp_buf,
517 ciphertext_buffer, ciphertext_len);
518 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000519
Julian Hallf5728962021-06-24 09:40:23 +0100520 free(ciphertext_buffer);
521 }
522 else {
523 /* Failed to allocate ouptput buffer */
524 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
525 }
526 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100527
Julian Hallf5728962021-06-24 09:40:23 +0100528 call_req_set_opstatus(req, psa_status);
529 psa_reset_key_attributes(&attributes);
530 }
531 }
532 else {
533 /* Failed to allocate buffers */
534 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
535 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100536
Julian Hallf5728962021-06-24 09:40:23 +0100537 free(plaintext_buffer);
538 free(salt_buffer);
539 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100540
Julian Hallf5728962021-06-24 09:40:23 +0100541 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100542}
543
544static rpc_status_t generate_random_handler(void *context, struct call_req* req)
545{
Julian Hallf5728962021-06-24 09:40:23 +0100546 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
547 struct call_param_buf *req_buf = call_req_get_req_buf(req);
548 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100549
Julian Hallf5728962021-06-24 09:40:23 +0100550 size_t output_size;
Julian Hallc02fffb2020-11-23 18:22:06 +0100551
Julian Hallf5728962021-06-24 09:40:23 +0100552 if (serializer)
553 rpc_status = serializer->deserialize_generate_random_req(req_buf, &output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100554
Julian Hallf5728962021-06-24 09:40:23 +0100555 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100556
Julian Hallf5728962021-06-24 09:40:23 +0100557 psa_status_t psa_status;
558 uint8_t *output_buffer = malloc(output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100559
Julian Hallf5728962021-06-24 09:40:23 +0100560 if (output_buffer) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100561
Julian Hallf5728962021-06-24 09:40:23 +0100562 psa_status = psa_generate_random(output_buffer, output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100563
Julian Hallf5728962021-06-24 09:40:23 +0100564 if (psa_status == PSA_SUCCESS) {
Julian Hallc02fffb2020-11-23 18:22:06 +0100565
Julian Hallf5728962021-06-24 09:40:23 +0100566 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
567 rpc_status = serializer->serialize_generate_random_resp(resp_buf,
568 output_buffer, output_size);
569 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100570
Julian Hallf5728962021-06-24 09:40:23 +0100571 call_req_set_opstatus(req, psa_status);
572 free(output_buffer);
573 }
574 else {
575 /* Failed to allocate output buffer */
576 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
577 }
578 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100579
Julian Hallf5728962021-06-24 09:40:23 +0100580 return rpc_status;
581}
582
Julian Hall8359a632021-07-08 15:10:30 +0100583static rpc_status_t copy_key_handler(void *context, struct call_req* req)
584{
585 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
586 struct call_param_buf *req_buf = call_req_get_req_buf(req);
587 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
588
589 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
590 psa_key_id_t source_key_id;
591
592 if (serializer)
593 rpc_status = serializer->deserialize_copy_key_req(req_buf, &attributes, &source_key_id);
594
595 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
596
597 psa_key_id_t target_key_id;
598
599 psa_status_t psa_status = psa_copy_key(source_key_id, &attributes, &target_key_id);
600
601 if (psa_status == PSA_SUCCESS) {
602
603 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
604 rpc_status = serializer->serialize_copy_key_resp(resp_buf, target_key_id);
605 }
606
607 call_req_set_opstatus(req, psa_status);
608 }
609
610 psa_reset_key_attributes(&attributes);
611
612 return rpc_status;
613}
614
615static rpc_status_t purge_key_handler(void *context, struct call_req* req)
616{
617 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
618 struct call_param_buf *req_buf = call_req_get_req_buf(req);
619 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
620
621 psa_key_id_t id;
622
623 if (serializer)
624 rpc_status = serializer->deserialize_purge_key_req(req_buf, &id);
625
626 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
627
628 psa_status_t psa_status = psa_purge_key(id);
629 call_req_set_opstatus(req, psa_status);
630 }
631
632 return rpc_status;
633}
634
635static rpc_status_t get_key_attributes_handler(void *context, struct call_req* req)
636{
637 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
638 struct call_param_buf *req_buf = call_req_get_req_buf(req);
639 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
640
641 psa_key_id_t id;
642
643 if (serializer)
644 rpc_status = serializer->deserialize_get_key_attributes_req(req_buf, &id);
645
646 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
647
648 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
649
650 psa_status_t psa_status = psa_get_key_attributes(id, &attributes);
651
652 if (psa_status == PSA_SUCCESS) {
653
654 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
655 rpc_status = serializer->serialize_get_key_attributes_resp(resp_buf, &attributes);
656 }
657
658 psa_reset_key_attributes(&attributes);
659 call_req_set_opstatus(req, psa_status);
660 }
661
662 return rpc_status;
663}
664
Julian Hallf5728962021-06-24 09:40:23 +0100665static rpc_status_t hash_setup_handler(void *context, struct call_req* req)
666{
667 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
668 struct call_param_buf *req_buf = call_req_get_req_buf(req);
669 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100670 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100671
672 psa_algorithm_t alg;
673
674 if (serializer)
675 rpc_status = serializer->deserialize_hash_setup_req(req_buf, &alg);
676
677 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
678
679 uint32_t op_handle;
680
681 struct crypto_context *crypto_context =
682 crypto_context_pool_alloc(&this_instance->context_pool,
683 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
684 &op_handle);
685
686 if (crypto_context) {
687
688 psa_status_t psa_status;
689
690 crypto_context->op.hash = psa_hash_operation_init();
691 psa_status = psa_hash_setup(&crypto_context->op.hash, alg);
692
693 if (psa_status == PSA_SUCCESS) {
694
695 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
696 rpc_status = serializer->serialize_hash_setup_resp(resp_buf, op_handle);
697 }
698
699 if ((psa_status != PSA_SUCCESS) || (rpc_status != TS_RPC_CALL_ACCEPTED)) {
700
701 crypto_context_pool_free(&this_instance->context_pool, crypto_context);
702 }
703
704 call_req_set_opstatus(req, psa_status);
705 }
706 else {
707 /* Failed to allocate crypto context for transaction */
708 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
709 }
710 }
711
712 return rpc_status;
713}
714
715static rpc_status_t hash_update_handler(void *context, struct call_req* req)
716{
717 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
718 struct call_param_buf *req_buf = call_req_get_req_buf(req);
719 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100720 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100721
722 uint32_t op_handle;
723 const uint8_t *data;
724 size_t data_len;
725
726 if (serializer)
727 rpc_status = serializer->deserialize_hash_update_req(req_buf, &op_handle, &data, &data_len);
728
729 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
730
731 struct crypto_context *crypto_context =
732 crypto_context_pool_find(&this_instance->context_pool,
733 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
734 op_handle);
735
736 if (crypto_context) {
737
738 psa_status_t psa_status = psa_hash_update(&crypto_context->op.hash, data, data_len);
739 call_req_set_opstatus(req, psa_status);
740 }
741 else {
742 /* Requested context doesn't exist */
743 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
744 }
745 }
746
747 return rpc_status;
748}
749
750static rpc_status_t hash_finish_handler(void *context, struct call_req* req)
751{
752 rpc_status_t rpc_status = TS_RPC_ERROR_SERIALIZATION_NOT_SUPPORTED;
753 struct call_param_buf *req_buf = call_req_get_req_buf(req);
754 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hall9061e6c2021-06-29 14:24:20 +0100755 struct crypto_provider *this_instance = (struct crypto_provider*)context;
Julian Hallf5728962021-06-24 09:40:23 +0100756
757 uint32_t op_handle;
758
759 if (serializer)
760 rpc_status = serializer->deserialize_hash_finish_req(req_buf, &op_handle);
761
762 if (rpc_status == TS_RPC_CALL_ACCEPTED) {
763
764 struct crypto_context *crypto_context =
765 crypto_context_pool_find(&this_instance->context_pool,
766 CRYPTO_CONTEXT_OP_ID_HASH, call_req_get_caller_id(req),
767 op_handle);
768
769 if (crypto_context) {
770
771 psa_status_t psa_status;
772 size_t hash_len;
773 uint8_t hash[PSA_HASH_MAX_SIZE];
774
775 psa_status = psa_hash_finish(&crypto_context->op.hash, hash, sizeof(hash), &hash_len);
776
777 if (psa_status == PSA_SUCCESS) {
778
779 struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
780 rpc_status = serializer->serialize_hash_finish_resp(resp_buf, hash, hash_len);
781 }
782
783 crypto_context_pool_free(&this_instance->context_pool, crypto_context);
784
785 call_req_set_opstatus(req, psa_status);
786 }
787 else {
788 /* Requested context doesn't exist */
789 rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
790 }
791 }
792
793 return rpc_status;
julhal01c3f4e9a2020-12-15 13:39:01 +0000794}