blob: 8992b93c6df7fd185196dc4ab1c8695787546ff7 [file] [log] [blame]
Julian Hallc02fffb2020-11-23 18:22:06 +01001/*
Gabor Tothab7db212023-08-18 16:08:12 +02002 * Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved.
Julian Hallc02fffb2020-11-23 18:22:06 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
Gabor Tothab7db212023-08-18 16:08:12 +02006#include <mbedtls/build_info.h>
7#include <mbedtls/pkcs7.h>
8#include <mbedtls/x509_crt.h>
Imre Kis6d867d82023-07-04 13:29:33 +02009#include <protocols/rpc/common/packed-c/status.h>
10#include <protocols/service/crypto/packed-c/opcodes.h>
11#include <psa/crypto.h>
12#include <service/crypto/provider/crypto_provider.h>
Julian Hallc02fffb2020-11-23 18:22:06 +010013#include <stdint.h>
14#include <stdlib.h>
Imre Kis6d867d82023-07-04 13:29:33 +020015
16#include "crypto_uuid.h"
Julian Hallc02fffb2020-11-23 18:22:06 +010017
18/* Service request handlers */
Imre Kis6d867d82023-07-04 13:29:33 +020019static rpc_status_t generate_key_handler(void *context, struct rpc_request *req);
20static rpc_status_t destroy_key_handler(void *context, struct rpc_request *req);
21static rpc_status_t export_key_handler(void *context, struct rpc_request *req);
22static rpc_status_t export_public_key_handler(void *context, struct rpc_request *req);
23static rpc_status_t import_key_handler(void *context, struct rpc_request *req);
24static rpc_status_t asymmetric_sign_handler(void *context, struct rpc_request *req);
25static rpc_status_t asymmetric_verify_handler(void *context, struct rpc_request *req);
26static rpc_status_t asymmetric_decrypt_handler(void *context, struct rpc_request *req);
27static rpc_status_t asymmetric_encrypt_handler(void *context, struct rpc_request *req);
28static rpc_status_t generate_random_handler(void *context, struct rpc_request *req);
29static rpc_status_t copy_key_handler(void *context, struct rpc_request *req);
30static rpc_status_t purge_key_handler(void *context, struct rpc_request *req);
31static rpc_status_t get_key_attributes_handler(void *context, struct rpc_request *req);
Gabor Tothab7db212023-08-18 16:08:12 +020032static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req);
Julian Hallc02fffb2020-11-23 18:22:06 +010033
34/* Handler mapping table for service */
35static const struct service_handler handler_table[] = {
Gabor Tothab7db212023-08-18 16:08:12 +020036 { TS_CRYPTO_OPCODE_GENERATE_KEY, generate_key_handler },
37 { TS_CRYPTO_OPCODE_DESTROY_KEY, destroy_key_handler },
38 { TS_CRYPTO_OPCODE_EXPORT_KEY, export_key_handler },
39 { TS_CRYPTO_OPCODE_EXPORT_PUBLIC_KEY, export_public_key_handler },
40 { TS_CRYPTO_OPCODE_IMPORT_KEY, import_key_handler },
41 { TS_CRYPTO_OPCODE_SIGN_HASH, asymmetric_sign_handler },
42 { TS_CRYPTO_OPCODE_VERIFY_HASH, asymmetric_verify_handler },
43 { TS_CRYPTO_OPCODE_ASYMMETRIC_DECRYPT, asymmetric_decrypt_handler },
44 { TS_CRYPTO_OPCODE_ASYMMETRIC_ENCRYPT, asymmetric_encrypt_handler },
45 { TS_CRYPTO_OPCODE_GENERATE_RANDOM, generate_random_handler },
46 { TS_CRYPTO_OPCODE_COPY_KEY, copy_key_handler },
47 { TS_CRYPTO_OPCODE_PURGE_KEY, purge_key_handler },
48 { TS_CRYPTO_OPCODE_GET_KEY_ATTRIBUTES, get_key_attributes_handler },
49 { TS_CRYPTO_OPCODE_SIGN_MESSAGE, asymmetric_sign_handler },
50 { TS_CRYPTO_OPCODE_VERIFY_MESSAGE, asymmetric_verify_handler },
51 { TS_CRYPTO_OPCODE_VERIFY_PKCS7_SIGNATURE, verify_pkcs7_signature_handler },
Julian Hallc02fffb2020-11-23 18:22:06 +010052};
53
Imre Kis6d867d82023-07-04 13:29:33 +020054struct rpc_service_interface *
55crypto_provider_init(struct crypto_provider *context, unsigned int encoding,
56 const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010057{
Imre Kis6d867d82023-07-04 13:29:33 +020058 const struct rpc_uuid crypto_service_uuid[2] = {
59 { .uuid = TS_PSA_CRYPTO_SERVICE_UUID },
60 { .uuid = TS_PSA_CRYPTO_PROTOBUF_SERVICE_UUID },
61 };
Julian Hallc02fffb2020-11-23 18:22:06 +010062
Imre Kis6d867d82023-07-04 13:29:33 +020063 if (encoding >= TS_RPC_ENCODING_LIMIT)
64 return NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +010065
Imre Kis6d867d82023-07-04 13:29:33 +020066 context->serializer = serializer;
67
68 service_provider_init(&context->base_provider, context, &crypto_service_uuid[encoding],
69 handler_table,
70 sizeof(handler_table) / sizeof(struct service_handler));
Julian Hall3e614542021-07-29 11:47:47 +010071
Julian Hall9061e6c2021-06-29 14:24:20 +010072 return service_provider_get_rpc_interface(&context->base_provider);
Julian Hallc02fffb2020-11-23 18:22:06 +010073}
74
Julian Hall9061e6c2021-06-29 14:24:20 +010075void crypto_provider_deinit(struct crypto_provider *context)
Julian Hallc02fffb2020-11-23 18:22:06 +010076{
Imre Kis6d867d82023-07-04 13:29:33 +020077 (void)context;
Julian Hallc02fffb2020-11-23 18:22:06 +010078}
79
Julian Hall9061e6c2021-06-29 14:24:20 +010080void crypto_provider_register_serializer(struct crypto_provider *context,
Imre Kis6d867d82023-07-04 13:29:33 +020081 const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010082{
Imre Kis6d867d82023-07-04 13:29:33 +020083 context->serializer = serializer;
julhal01c3f4e9a2020-12-15 13:39:01 +000084}
85
Imre Kis6d867d82023-07-04 13:29:33 +020086void crypto_provider_extend(struct crypto_provider *context, struct service_provider *sub_provider)
Julian Hall13e76952021-07-13 12:17:09 +010087{
88 service_provider_extend(&context->base_provider, sub_provider);
89}
90
Imre Kis6d867d82023-07-04 13:29:33 +020091static const struct crypto_provider_serializer *get_crypto_serializer(void *context,
92 const struct rpc_request *req)
julhal01c3f4e9a2020-12-15 13:39:01 +000093{
Imre Kis6d867d82023-07-04 13:29:33 +020094 struct crypto_provider *this_instance = (struct crypto_provider *)context;
julhal01c3f4e9a2020-12-15 13:39:01 +000095
Imre Kis6d867d82023-07-04 13:29:33 +020096 return this_instance->serializer;
Julian Hallc02fffb2020-11-23 18:22:06 +010097}
98
Imre Kis6d867d82023-07-04 13:29:33 +020099static rpc_status_t generate_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100100{
Imre Kis6d867d82023-07-04 13:29:33 +0200101 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
102 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100103 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100104
Julian Hallf5728962021-06-24 09:40:23 +0100105 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100106
Julian Hallf5728962021-06-24 09:40:23 +0100107 if (serializer)
108 rpc_status = serializer->deserialize_generate_key_req(req_buf, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100109
Imre Kis6d867d82023-07-04 13:29:33 +0200110 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100111 psa_status_t psa_status;
112 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100113
Julian Hallf5728962021-06-24 09:40:23 +0100114 psa_status = psa_generate_key(&attributes, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100115
Julian Hallf5728962021-06-24 09:40:23 +0100116 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200117 struct rpc_buffer *resp_buf = &req->response;
Julian Hallf5728962021-06-24 09:40:23 +0100118 rpc_status = serializer->serialize_generate_key_resp(resp_buf, id);
119 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100120
Imre Kis6d867d82023-07-04 13:29:33 +0200121 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100122 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100123
Julian Hallf5728962021-06-24 09:40:23 +0100124 psa_reset_key_attributes(&attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100125
Julian Hallf5728962021-06-24 09:40:23 +0100126 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100127}
128
Imre Kis6d867d82023-07-04 13:29:33 +0200129static rpc_status_t destroy_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100130{
Imre Kis6d867d82023-07-04 13:29:33 +0200131 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
132 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100133 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100134
Julian Hallf5728962021-06-24 09:40:23 +0100135 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100136
Julian Hallf5728962021-06-24 09:40:23 +0100137 if (serializer)
138 rpc_status = serializer->deserialize_destroy_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100139
Imre Kis6d867d82023-07-04 13:29:33 +0200140 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100141 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100142
Julian Hallf5728962021-06-24 09:40:23 +0100143 psa_status = psa_destroy_key(id);
Imre Kis6d867d82023-07-04 13:29:33 +0200144 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100145 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100146
Julian Hallf5728962021-06-24 09:40:23 +0100147 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100148}
149
Imre Kis6d867d82023-07-04 13:29:33 +0200150static rpc_status_t export_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100151{
Imre Kis6d867d82023-07-04 13:29:33 +0200152 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
153 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100154 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100155
Julian Hallf5728962021-06-24 09:40:23 +0100156 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100157
Julian Hallf5728962021-06-24 09:40:23 +0100158 if (serializer)
159 rpc_status = serializer->deserialize_export_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100160
Imre Kis6d867d82023-07-04 13:29:33 +0200161 if (rpc_status == RPC_SUCCESS) {
Julian Hall464021a2021-07-29 15:20:10 +0100162 size_t max_export_size = PSA_EXPORT_KEY_PAIR_MAX_SIZE;
163 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100164
Julian Hall464021a2021-07-29 15:20:10 +0100165 if (key_buffer) {
Julian Hall464021a2021-07-29 15:20:10 +0100166 size_t export_size;
Imre Kis6d867d82023-07-04 13:29:33 +0200167 psa_status_t psa_status =
168 psa_export_key(id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100169
Julian Hall464021a2021-07-29 15:20:10 +0100170 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200171 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100172
Imre Kis6d867d82023-07-04 13:29:33 +0200173 rpc_status = serializer->serialize_export_key_resp(
174 resp_buf, key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100175 }
Julian Hallec81a502021-07-12 11:36:37 +0100176
Julian Hall464021a2021-07-29 15:20:10 +0100177 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200178 req->service_status = psa_status;
179 } else {
Julian Hall464021a2021-07-29 15:20:10 +0100180 /* Failed to allocate key buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200181 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hall464021a2021-07-29 15:20:10 +0100182 }
Julian Hallf5728962021-06-24 09:40:23 +0100183 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100184
Julian Hallf5728962021-06-24 09:40:23 +0100185 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100186}
187
Imre Kis6d867d82023-07-04 13:29:33 +0200188static rpc_status_t export_public_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100189{
Imre Kis6d867d82023-07-04 13:29:33 +0200190 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
191 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100192 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100193
Julian Hallf5728962021-06-24 09:40:23 +0100194 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100195
Julian Hallf5728962021-06-24 09:40:23 +0100196 if (serializer)
197 rpc_status = serializer->deserialize_export_public_key_req(req_buf, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100198
Imre Kis6d867d82023-07-04 13:29:33 +0200199 if (rpc_status == RPC_SUCCESS) {
Julian Hallec81a502021-07-12 11:36:37 +0100200 size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_MAX_SIZE;
201 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100202
Julian Hallec81a502021-07-12 11:36:37 +0100203 if (key_buffer) {
Julian Hallec81a502021-07-12 11:36:37 +0100204 size_t export_size;
Imre Kis6d867d82023-07-04 13:29:33 +0200205 psa_status_t psa_status = psa_export_public_key(
206 id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100207
Julian Hallec81a502021-07-12 11:36:37 +0100208 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200209 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100210
Imre Kis6d867d82023-07-04 13:29:33 +0200211 rpc_status = serializer->serialize_export_public_key_resp(
212 resp_buf, key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100213 }
Julian Hallec81a502021-07-12 11:36:37 +0100214
215 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200216 req->service_status = psa_status;
217 } else {
Julian Hallec81a502021-07-12 11:36:37 +0100218 /* Failed to allocate key buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200219 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallec81a502021-07-12 11:36:37 +0100220 }
Julian Hallf5728962021-06-24 09:40:23 +0100221 }
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
Imre Kis6d867d82023-07-04 13:29:33 +0200226static rpc_status_t import_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100227{
Imre Kis6d867d82023-07-04 13:29:33 +0200228 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
229 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100230 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 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100233 size_t key_data_len = serializer->max_deserialised_parameter_size(req_buf);
234 uint8_t *key_buffer = malloc(key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100235
Julian Hallf5728962021-06-24 09:40:23 +0100236 if (key_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100237 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Imre Kis6d867d82023-07-04 13:29:33 +0200238 rpc_status = serializer->deserialize_import_key_req(
239 req_buf, &attributes, key_buffer, &key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100240
Imre Kis6d867d82023-07-04 13:29:33 +0200241 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100242 psa_status_t psa_status;
243 psa_key_id_t id;
Julian Hallc02fffb2020-11-23 18:22:06 +0100244
Imre Kis6d867d82023-07-04 13:29:33 +0200245 psa_status =
246 psa_import_key(&attributes, key_buffer, key_data_len, &id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100247
Julian Hallf5728962021-06-24 09:40:23 +0100248 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200249 struct rpc_buffer *resp_buf = &req->response;
julhal01c3f4e9a2020-12-15 13:39:01 +0000250
Imre Kis6d867d82023-07-04 13:29:33 +0200251 rpc_status =
252 serializer->serialize_import_key_resp(resp_buf, id);
Julian Hallf5728962021-06-24 09:40:23 +0100253 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000254
Imre Kis6d867d82023-07-04 13:29:33 +0200255 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100256 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100257
Julian Hallf5728962021-06-24 09:40:23 +0100258 psa_reset_key_attributes(&attributes);
259 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200260 } else {
261 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100262 }
263 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100264
Julian Hallf5728962021-06-24 09:40:23 +0100265 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100266}
267
Imre Kis6d867d82023-07-04 13:29:33 +0200268static rpc_status_t asymmetric_sign_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100269{
Imre Kis6d867d82023-07-04 13:29:33 +0200270 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
271 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100272 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100273
Julian Hallf5728962021-06-24 09:40:23 +0100274 psa_key_id_t id;
275 psa_algorithm_t alg;
276 size_t hash_len = PSA_HASH_MAX_SIZE;
277 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100278
Julian Hallf5728962021-06-24 09:40:23 +0100279 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200280 rpc_status = serializer->deserialize_asymmetric_sign_req(req_buf, &id, &alg,
281 hash_buffer, &hash_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100282
Imre Kis6d867d82023-07-04 13:29:33 +0200283 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100284 psa_status_t psa_status;
285 size_t sig_len;
286 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100287
Imre Kis6d867d82023-07-04 13:29:33 +0200288 psa_status = (req->opcode == TS_CRYPTO_OPCODE_SIGN_HASH) ?
289 psa_sign_hash(id, alg, hash_buffer, hash_len, sig_buffer,
290 sizeof(sig_buffer), &sig_len) :
291 psa_sign_message(id, alg, hash_buffer, hash_len, sig_buffer,
292 sizeof(sig_buffer), &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100293
Julian Hallf5728962021-06-24 09:40:23 +0100294 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200295 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100296
Imre Kis6d867d82023-07-04 13:29:33 +0200297 rpc_status = serializer->serialize_asymmetric_sign_resp(
298 resp_buf, sig_buffer, sig_len);
Julian Hallf5728962021-06-24 09:40:23 +0100299 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100300
Imre Kis6d867d82023-07-04 13:29:33 +0200301 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100302 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100303
Julian Hallf5728962021-06-24 09:40:23 +0100304 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100305}
306
Imre Kis6d867d82023-07-04 13:29:33 +0200307static rpc_status_t asymmetric_verify_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100308{
Imre Kis6d867d82023-07-04 13:29:33 +0200309 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
310 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100311 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100312
Julian Hallf5728962021-06-24 09:40:23 +0100313 psa_key_id_t id;
314 psa_algorithm_t alg;
315 size_t hash_len = PSA_HASH_MAX_SIZE;
316 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
317 size_t sig_len = PSA_SIGNATURE_MAX_SIZE;
318 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100319
Julian Hallf5728962021-06-24 09:40:23 +0100320 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200321 rpc_status = serializer->deserialize_asymmetric_verify_req(
322 req_buf, &id, &alg, hash_buffer, &hash_len, sig_buffer, &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100323
Imre Kis6d867d82023-07-04 13:29:33 +0200324 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100325 psa_status_t psa_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100326
Imre Kis6d867d82023-07-04 13:29:33 +0200327 psa_status = (req->opcode == TS_CRYPTO_OPCODE_VERIFY_HASH) ?
328 psa_verify_hash(id, alg, hash_buffer, hash_len, sig_buffer,
329 sig_len) :
330 psa_verify_message(id, alg, hash_buffer, hash_len, sig_buffer,
331 sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100332
Imre Kis6d867d82023-07-04 13:29:33 +0200333 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100334 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100335
Julian Hallf5728962021-06-24 09:40:23 +0100336 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100337}
338
Imre Kis6d867d82023-07-04 13:29:33 +0200339static rpc_status_t asymmetric_decrypt_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100340{
Imre Kis6d867d82023-07-04 13:29:33 +0200341 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
342 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100343 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100344
Julian Hallf5728962021-06-24 09:40:23 +0100345 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100346 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
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 ciphertext_len = max_param_size;
351 uint8_t *ciphertext_buffer = malloc(ciphertext_len);
352 size_t salt_len = max_param_size;
353 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100354
Julian Hallf5728962021-06-24 09:40:23 +0100355 if (ciphertext_buffer && salt_buffer) {
Imre Kis6d867d82023-07-04 13:29:33 +0200356 rpc_status = serializer->deserialize_asymmetric_decrypt_req(
357 req_buf, &id, &alg, ciphertext_buffer, &ciphertext_len, salt_buffer,
358 &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100359
Imre Kis6d867d82023-07-04 13:29:33 +0200360 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100361 psa_status_t psa_status;
362 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100363
Julian Hallf5728962021-06-24 09:40:23 +0100364 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100365
Julian Hallf5728962021-06-24 09:40:23 +0100366 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200367 size_t max_decrypt_size =
368 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(
369 psa_get_key_type(&attributes),
370 psa_get_key_bits(&attributes), alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100371
Julian Hallf5728962021-06-24 09:40:23 +0100372 size_t plaintext_len;
373 uint8_t *plaintext_buffer = malloc(max_decrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100374
Julian Hallf5728962021-06-24 09:40:23 +0100375 if (plaintext_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100376 /* Salt is an optional parameter */
377 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100378
Imre Kis6d867d82023-07-04 13:29:33 +0200379 psa_status = psa_asymmetric_decrypt(
380 id, alg, ciphertext_buffer, ciphertext_len,
381 salt, salt_len, plaintext_buffer,
382 max_decrypt_size, &plaintext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000383
Julian Hallf5728962021-06-24 09:40:23 +0100384 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200385 struct rpc_buffer *resp_buf =
386 &req->response;
387 rpc_status = serializer->serialize_asymmetric_decrypt_resp(
388 resp_buf, plaintext_buffer, plaintext_len);
Julian Hallf5728962021-06-24 09:40:23 +0100389 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000390
Julian Hallf5728962021-06-24 09:40:23 +0100391 free(plaintext_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200392 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100393 /* Failed to allocate ouptput buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200394 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100395 }
396 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100397
Imre Kis6d867d82023-07-04 13:29:33 +0200398 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100399 psa_reset_key_attributes(&attributes);
400 }
Imre Kis6d867d82023-07-04 13:29:33 +0200401 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100402 /* Failed to allocate buffers */
Imre Kis6d867d82023-07-04 13:29:33 +0200403 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100404 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100405
Julian Hallf5728962021-06-24 09:40:23 +0100406 free(ciphertext_buffer);
407 free(salt_buffer);
408 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100409
Julian Hallf5728962021-06-24 09:40:23 +0100410 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100411}
412
Imre Kis6d867d82023-07-04 13:29:33 +0200413static rpc_status_t asymmetric_encrypt_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100414{
Imre Kis6d867d82023-07-04 13:29:33 +0200415 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
416 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100417 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100418
Julian Hallf5728962021-06-24 09:40:23 +0100419 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100420 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100421
Julian Hallf5728962021-06-24 09:40:23 +0100422 psa_key_id_t id;
423 psa_algorithm_t alg;
424 size_t plaintext_len = max_param_size;
425 uint8_t *plaintext_buffer = malloc(plaintext_len);
426 size_t salt_len = max_param_size;
427 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100428
Julian Hallf5728962021-06-24 09:40:23 +0100429 if (plaintext_buffer && salt_buffer) {
Imre Kis6d867d82023-07-04 13:29:33 +0200430 rpc_status = serializer->deserialize_asymmetric_encrypt_req(
431 req_buf, &id, &alg, plaintext_buffer, &plaintext_len, salt_buffer,
432 &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100433
Imre Kis6d867d82023-07-04 13:29:33 +0200434 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100435 psa_status_t psa_status;
436 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100437
Julian Hallf5728962021-06-24 09:40:23 +0100438 psa_status = psa_get_key_attributes(id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100439
Julian Hallf5728962021-06-24 09:40:23 +0100440 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200441 size_t max_encrypt_size =
442 PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(
443 psa_get_key_type(&attributes),
444 psa_get_key_bits(&attributes), alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100445
Julian Hallf5728962021-06-24 09:40:23 +0100446 size_t ciphertext_len;
447 uint8_t *ciphertext_buffer = malloc(max_encrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100448
Julian Hallf5728962021-06-24 09:40:23 +0100449 if (ciphertext_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100450 /* Salt is an optional parameter */
451 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100452
Imre Kis6d867d82023-07-04 13:29:33 +0200453 psa_status = psa_asymmetric_encrypt(
454 id, alg, plaintext_buffer, plaintext_len,
455 salt, salt_len, ciphertext_buffer,
456 max_encrypt_size, &ciphertext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000457
Julian Hallf5728962021-06-24 09:40:23 +0100458 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200459 struct rpc_buffer *resp_buf =
460 &req->response;
julhal01c3f4e9a2020-12-15 13:39:01 +0000461
Imre Kis6d867d82023-07-04 13:29:33 +0200462 rpc_status = serializer->serialize_asymmetric_encrypt_resp(
463 resp_buf, ciphertext_buffer, ciphertext_len);
Julian Hallf5728962021-06-24 09:40:23 +0100464 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000465
Julian Hallf5728962021-06-24 09:40:23 +0100466 free(ciphertext_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200467 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100468 /* Failed to allocate ouptput buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200469 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100470 }
471 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100472
Imre Kis6d867d82023-07-04 13:29:33 +0200473 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100474 psa_reset_key_attributes(&attributes);
475 }
Imre Kis6d867d82023-07-04 13:29:33 +0200476 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100477 /* Failed to allocate buffers */
Imre Kis6d867d82023-07-04 13:29:33 +0200478 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100479 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100480
Julian Hallf5728962021-06-24 09:40:23 +0100481 free(plaintext_buffer);
482 free(salt_buffer);
483 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100484
Julian Hallf5728962021-06-24 09:40:23 +0100485 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100486}
487
Imre Kis6d867d82023-07-04 13:29:33 +0200488static rpc_status_t generate_random_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100489{
Imre Kis6d867d82023-07-04 13:29:33 +0200490 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
491 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100492 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100493
Julian Hallf5728962021-06-24 09:40:23 +0100494 size_t output_size;
Julian Hallc02fffb2020-11-23 18:22:06 +0100495
Julian Hallf5728962021-06-24 09:40:23 +0100496 if (serializer)
497 rpc_status = serializer->deserialize_generate_random_req(req_buf, &output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100498
Imre Kis6d867d82023-07-04 13:29:33 +0200499 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100500 psa_status_t psa_status;
501 uint8_t *output_buffer = malloc(output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100502
Julian Hallf5728962021-06-24 09:40:23 +0100503 if (output_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100504 psa_status = psa_generate_random(output_buffer, output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100505
Julian Hallf5728962021-06-24 09:40:23 +0100506 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200507 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100508
Imre Kis6d867d82023-07-04 13:29:33 +0200509 rpc_status = serializer->serialize_generate_random_resp(
510 resp_buf, output_buffer, output_size);
Julian Hallf5728962021-06-24 09:40:23 +0100511 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100512
Imre Kis6d867d82023-07-04 13:29:33 +0200513 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100514 free(output_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200515 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100516 /* Failed to allocate output buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200517 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100518 }
519 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100520
Julian Hallf5728962021-06-24 09:40:23 +0100521 return rpc_status;
522}
523
Imre Kis6d867d82023-07-04 13:29:33 +0200524static rpc_status_t copy_key_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100525{
Imre Kis6d867d82023-07-04 13:29:33 +0200526 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
527 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100528 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
529
530 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
531 psa_key_id_t source_key_id;
532
533 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200534 rpc_status =
535 serializer->deserialize_copy_key_req(req_buf, &attributes, &source_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100536
Imre Kis6d867d82023-07-04 13:29:33 +0200537 if (rpc_status == RPC_SUCCESS) {
Julian Hall8359a632021-07-08 15:10:30 +0100538 psa_key_id_t target_key_id;
539
540 psa_status_t psa_status = psa_copy_key(source_key_id, &attributes, &target_key_id);
541
542 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200543 struct rpc_buffer *resp_buf = &req->response;
Julian Hall8359a632021-07-08 15:10:30 +0100544 rpc_status = serializer->serialize_copy_key_resp(resp_buf, target_key_id);
545 }
546
Imre Kis6d867d82023-07-04 13:29:33 +0200547 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100548 }
549
550 psa_reset_key_attributes(&attributes);
551
552 return rpc_status;
553}
554
Imre Kis6d867d82023-07-04 13:29:33 +0200555static rpc_status_t purge_key_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100556{
Imre Kis6d867d82023-07-04 13:29:33 +0200557 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
558 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100559 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
560
561 psa_key_id_t id;
562
563 if (serializer)
564 rpc_status = serializer->deserialize_purge_key_req(req_buf, &id);
565
Imre Kis6d867d82023-07-04 13:29:33 +0200566 if (rpc_status == RPC_SUCCESS) {
Julian Hall8359a632021-07-08 15:10:30 +0100567 psa_status_t psa_status = psa_purge_key(id);
Imre Kis6d867d82023-07-04 13:29:33 +0200568 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100569 }
570
571 return rpc_status;
572}
573
Imre Kis6d867d82023-07-04 13:29:33 +0200574static rpc_status_t get_key_attributes_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100575{
Imre Kis6d867d82023-07-04 13:29:33 +0200576 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
577 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100578 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
579
580 psa_key_id_t id;
581
582 if (serializer)
583 rpc_status = serializer->deserialize_get_key_attributes_req(req_buf, &id);
584
Imre Kis6d867d82023-07-04 13:29:33 +0200585 if (rpc_status == RPC_SUCCESS) {
Julian Hall8359a632021-07-08 15:10:30 +0100586 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
587
588 psa_status_t psa_status = psa_get_key_attributes(id, &attributes);
589
590 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200591 struct rpc_buffer *resp_buf = &req->response;
Julian Hall8359a632021-07-08 15:10:30 +0100592
Imre Kis6d867d82023-07-04 13:29:33 +0200593 rpc_status = serializer->serialize_get_key_attributes_resp(resp_buf,
594 &attributes);
Julian Hall8359a632021-07-08 15:10:30 +0100595 }
596
597 psa_reset_key_attributes(&attributes);
Imre Kis6d867d82023-07-04 13:29:33 +0200598 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100599 }
600
601 return rpc_status;
602}
Gabor Tothab7db212023-08-18 16:08:12 +0200603
604static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req)
605{
606 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
607 struct rpc_buffer *req_buf = &req->request;
608 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
609
610 int mbedtls_status = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
611
612 uint8_t *signature_cert = NULL;
613 uint64_t signature_cert_len = 0;
614 uint8_t *hash = NULL;
615 uint64_t hash_len = 0;
616 uint8_t *public_key_cert = NULL;
617 uint64_t public_key_cert_len = 0;
618
619 if (serializer) {
620 /* First collect the lengths of the fields */
621 rpc_status = serializer->deserialize_verify_pkcs7_signature_req(
622 req_buf, NULL, &signature_cert_len, NULL, &hash_len, NULL,
623 &public_key_cert_len);
624
625 if (rpc_status == RPC_SUCCESS) {
626 /* Allocate the needed space and get the data */
627 signature_cert = (uint8_t *)malloc(signature_cert_len);
628 hash = (uint8_t *)malloc(hash_len);
629 public_key_cert = (uint8_t *)malloc(public_key_cert_len);
630
631 if (signature_cert && hash && public_key_cert) {
632 rpc_status = serializer->deserialize_verify_pkcs7_signature_req(
633 req_buf, signature_cert, &signature_cert_len, hash,
634 &hash_len, public_key_cert, &public_key_cert_len);
635 } else {
636 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
637 }
638 }
639 }
640
641 if (rpc_status == RPC_SUCCESS) {
642 /* Parse the public key certificate */
643 mbedtls_x509_crt signer_certificate;
644
645 mbedtls_x509_crt_init(&signer_certificate);
646
647 mbedtls_status = mbedtls_x509_crt_parse_der(&signer_certificate, public_key_cert,
648 public_key_cert_len);
649
650 if (mbedtls_status == 0) {
651 /* Parse the PKCS#7 DER encoded signature block */
652 mbedtls_pkcs7 pkcs7_structure;
653
654 mbedtls_pkcs7_init(&pkcs7_structure);
655
656 mbedtls_status = mbedtls_pkcs7_parse_der(&pkcs7_structure, signature_cert,
657 signature_cert_len);
658
659 if (mbedtls_status == MBEDTLS_PKCS7_SIGNED_DATA) {
660 /* Verify hash against signed hash */
661 mbedtls_status = mbedtls_pkcs7_signed_hash_verify(
662 &pkcs7_structure, &signer_certificate, hash, hash_len);
663 }
664
665 mbedtls_pkcs7_free(&pkcs7_structure);
666 }
667
668 mbedtls_x509_crt_free(&signer_certificate);
669 }
670
671 free(signature_cert);
672 free(hash);
673 free(public_key_cert);
674
675 /* Provide the result of the verification */
676 req->service_status = mbedtls_status;
677
678 return rpc_status;
679}