blob: 9cd520859996b5544077a29ef9ab2ee3395972a4 [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 */
Imre Kis6d867d82023-07-04 13:29:33 +02006#include <protocols/rpc/common/packed-c/status.h>
7#include <protocols/service/crypto/packed-c/opcodes.h>
Balint Dobszaydc945e92024-01-15 16:07:21 +01008#include <service/crypto/backend/crypto_backend.h>
Imre Kis6d867d82023-07-04 13:29:33 +02009#include <service/crypto/provider/crypto_provider.h>
Julian Hallc02fffb2020-11-23 18:22:06 +010010#include <stdint.h>
11#include <stdlib.h>
Imre Kis6d867d82023-07-04 13:29:33 +020012
Balint Dobszaydc945e92024-01-15 16:07:21 +010013#include "crypto_partition.h"
Imre Kis6d867d82023-07-04 13:29:33 +020014#include "crypto_uuid.h"
Julian Hallc02fffb2020-11-23 18:22:06 +010015
16/* Service request handlers */
Imre Kis6d867d82023-07-04 13:29:33 +020017static rpc_status_t generate_key_handler(void *context, struct rpc_request *req);
18static rpc_status_t destroy_key_handler(void *context, struct rpc_request *req);
19static rpc_status_t export_key_handler(void *context, struct rpc_request *req);
20static rpc_status_t export_public_key_handler(void *context, struct rpc_request *req);
21static rpc_status_t import_key_handler(void *context, struct rpc_request *req);
22static rpc_status_t asymmetric_sign_handler(void *context, struct rpc_request *req);
23static rpc_status_t asymmetric_verify_handler(void *context, struct rpc_request *req);
24static rpc_status_t asymmetric_decrypt_handler(void *context, struct rpc_request *req);
25static rpc_status_t asymmetric_encrypt_handler(void *context, struct rpc_request *req);
26static rpc_status_t generate_random_handler(void *context, struct rpc_request *req);
27static rpc_status_t copy_key_handler(void *context, struct rpc_request *req);
28static rpc_status_t purge_key_handler(void *context, struct rpc_request *req);
29static rpc_status_t get_key_attributes_handler(void *context, struct rpc_request *req);
Gabor Tothab7db212023-08-18 16:08:12 +020030static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req);
Julian Hallc02fffb2020-11-23 18:22:06 +010031
32/* Handler mapping table for service */
33static const struct service_handler handler_table[] = {
Gabor Tothab7db212023-08-18 16:08:12 +020034 { TS_CRYPTO_OPCODE_GENERATE_KEY, generate_key_handler },
35 { TS_CRYPTO_OPCODE_DESTROY_KEY, destroy_key_handler },
36 { TS_CRYPTO_OPCODE_EXPORT_KEY, export_key_handler },
37 { TS_CRYPTO_OPCODE_EXPORT_PUBLIC_KEY, export_public_key_handler },
38 { TS_CRYPTO_OPCODE_IMPORT_KEY, import_key_handler },
39 { TS_CRYPTO_OPCODE_SIGN_HASH, asymmetric_sign_handler },
40 { TS_CRYPTO_OPCODE_VERIFY_HASH, asymmetric_verify_handler },
41 { TS_CRYPTO_OPCODE_ASYMMETRIC_DECRYPT, asymmetric_decrypt_handler },
42 { TS_CRYPTO_OPCODE_ASYMMETRIC_ENCRYPT, asymmetric_encrypt_handler },
43 { TS_CRYPTO_OPCODE_GENERATE_RANDOM, generate_random_handler },
44 { TS_CRYPTO_OPCODE_COPY_KEY, copy_key_handler },
45 { TS_CRYPTO_OPCODE_PURGE_KEY, purge_key_handler },
46 { TS_CRYPTO_OPCODE_GET_KEY_ATTRIBUTES, get_key_attributes_handler },
47 { TS_CRYPTO_OPCODE_SIGN_MESSAGE, asymmetric_sign_handler },
48 { TS_CRYPTO_OPCODE_VERIFY_MESSAGE, asymmetric_verify_handler },
49 { TS_CRYPTO_OPCODE_VERIFY_PKCS7_SIGNATURE, verify_pkcs7_signature_handler },
Julian Hallc02fffb2020-11-23 18:22:06 +010050};
51
Imre Kis6d867d82023-07-04 13:29:33 +020052struct rpc_service_interface *
53crypto_provider_init(struct crypto_provider *context, unsigned int encoding,
54 const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010055{
Imre Kis6d867d82023-07-04 13:29:33 +020056 const struct rpc_uuid crypto_service_uuid[2] = {
57 { .uuid = TS_PSA_CRYPTO_SERVICE_UUID },
58 { .uuid = TS_PSA_CRYPTO_PROTOBUF_SERVICE_UUID },
59 };
Julian Hallc02fffb2020-11-23 18:22:06 +010060
Imre Kis6d867d82023-07-04 13:29:33 +020061 if (encoding >= TS_RPC_ENCODING_LIMIT)
62 return NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +010063
Imre Kis6d867d82023-07-04 13:29:33 +020064 context->serializer = serializer;
65
66 service_provider_init(&context->base_provider, context, &crypto_service_uuid[encoding],
67 handler_table,
68 sizeof(handler_table) / sizeof(struct service_handler));
Julian Hall3e614542021-07-29 11:47:47 +010069
Julian Hall9061e6c2021-06-29 14:24:20 +010070 return service_provider_get_rpc_interface(&context->base_provider);
Julian Hallc02fffb2020-11-23 18:22:06 +010071}
72
Julian Hall9061e6c2021-06-29 14:24:20 +010073void crypto_provider_deinit(struct crypto_provider *context)
Julian Hallc02fffb2020-11-23 18:22:06 +010074{
Imre Kis6d867d82023-07-04 13:29:33 +020075 (void)context;
Julian Hallc02fffb2020-11-23 18:22:06 +010076}
77
Julian Hall9061e6c2021-06-29 14:24:20 +010078void crypto_provider_register_serializer(struct crypto_provider *context,
Imre Kis6d867d82023-07-04 13:29:33 +020079 const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010080{
Imre Kis6d867d82023-07-04 13:29:33 +020081 context->serializer = serializer;
julhal01c3f4e9a2020-12-15 13:39:01 +000082}
83
Imre Kis6d867d82023-07-04 13:29:33 +020084void crypto_provider_extend(struct crypto_provider *context, struct service_provider *sub_provider)
Julian Hall13e76952021-07-13 12:17:09 +010085{
86 service_provider_extend(&context->base_provider, sub_provider);
87}
88
Imre Kis6d867d82023-07-04 13:29:33 +020089static const struct crypto_provider_serializer *get_crypto_serializer(void *context,
90 const struct rpc_request *req)
julhal01c3f4e9a2020-12-15 13:39:01 +000091{
Imre Kis6d867d82023-07-04 13:29:33 +020092 struct crypto_provider *this_instance = (struct crypto_provider *)context;
julhal01c3f4e9a2020-12-15 13:39:01 +000093
Imre Kis6d867d82023-07-04 13:29:33 +020094 return this_instance->serializer;
Julian Hallc02fffb2020-11-23 18:22:06 +010095}
96
Imre Kis6d867d82023-07-04 13:29:33 +020097static rpc_status_t generate_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +010098{
Imre Kis6d867d82023-07-04 13:29:33 +020099 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
100 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100101 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100102
Julian Hallf5728962021-06-24 09:40:23 +0100103 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100104
Julian Hallf5728962021-06-24 09:40:23 +0100105 if (serializer)
106 rpc_status = serializer->deserialize_generate_key_req(req_buf, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100107
Imre Kis6d867d82023-07-04 13:29:33 +0200108 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100109 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100110 namespaced_key_id_t ns_key_id = NAMESPACED_KEY_ID_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100111
Balint Dobszaydc945e92024-01-15 16:07:21 +0100112 crypto_partition_bind_to_owner(&attributes, req->source_id);
113
114 psa_status = psa_generate_key(&attributes, &ns_key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100115
Julian Hallf5728962021-06-24 09:40:23 +0100116 if (psa_status == PSA_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100117 psa_key_id_t key_id = namespaced_key_id_get_key_id(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200118 struct rpc_buffer *resp_buf = &req->response;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100119 rpc_status = serializer->serialize_generate_key_resp(resp_buf, key_id);
Julian Hallf5728962021-06-24 09:40:23 +0100120 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100121
Imre Kis6d867d82023-07-04 13:29:33 +0200122 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100123 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100124
Julian Hallf5728962021-06-24 09:40:23 +0100125 psa_reset_key_attributes(&attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100126
Julian Hallf5728962021-06-24 09:40:23 +0100127 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100128}
129
Imre Kis6d867d82023-07-04 13:29:33 +0200130static rpc_status_t destroy_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100131{
Imre Kis6d867d82023-07-04 13:29:33 +0200132 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
133 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100134 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100135
Balint Dobszaydc945e92024-01-15 16:07:21 +0100136 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +0100137
Julian Hallf5728962021-06-24 09:40:23 +0100138 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100139 rpc_status = serializer->deserialize_destroy_key_req(req_buf, &key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100140
Imre Kis6d867d82023-07-04 13:29:33 +0200141 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100142 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100143 namespaced_key_id_t ns_key_id =
144 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100145
Balint Dobszaydc945e92024-01-15 16:07:21 +0100146 psa_status = psa_destroy_key(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200147 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100148 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100149
Julian Hallf5728962021-06-24 09:40:23 +0100150 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100151}
152
Imre Kis6d867d82023-07-04 13:29:33 +0200153static rpc_status_t export_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100154{
Imre Kis6d867d82023-07-04 13:29:33 +0200155 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
156 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100157 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100158
Balint Dobszaydc945e92024-01-15 16:07:21 +0100159 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +0100160
Julian Hallf5728962021-06-24 09:40:23 +0100161 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100162 rpc_status = serializer->deserialize_export_key_req(req_buf, &key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100163
Imre Kis6d867d82023-07-04 13:29:33 +0200164 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100165 namespaced_key_id_t ns_key_id =
166 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hall464021a2021-07-29 15:20:10 +0100167 size_t max_export_size = PSA_EXPORT_KEY_PAIR_MAX_SIZE;
168 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100169
Julian Hall464021a2021-07-29 15:20:10 +0100170 if (key_buffer) {
Julian Hall464021a2021-07-29 15:20:10 +0100171 size_t export_size;
Imre Kis6d867d82023-07-04 13:29:33 +0200172 psa_status_t psa_status =
Balint Dobszaydc945e92024-01-15 16:07:21 +0100173 psa_export_key(ns_key_id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100174
Julian Hall464021a2021-07-29 15:20:10 +0100175 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200176 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100177
Imre Kis6d867d82023-07-04 13:29:33 +0200178 rpc_status = serializer->serialize_export_key_resp(
179 resp_buf, key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100180 }
Julian Hallec81a502021-07-12 11:36:37 +0100181
Julian Hall464021a2021-07-29 15:20:10 +0100182 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200183 req->service_status = psa_status;
184 } else {
Julian Hall464021a2021-07-29 15:20:10 +0100185 /* Failed to allocate key buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200186 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hall464021a2021-07-29 15:20:10 +0100187 }
Julian Hallf5728962021-06-24 09:40:23 +0100188 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100189
Julian Hallf5728962021-06-24 09:40:23 +0100190 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100191}
192
Imre Kis6d867d82023-07-04 13:29:33 +0200193static rpc_status_t export_public_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100194{
Imre Kis6d867d82023-07-04 13:29:33 +0200195 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
196 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100197 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100198
Balint Dobszaydc945e92024-01-15 16:07:21 +0100199 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +0100200
Julian Hallf5728962021-06-24 09:40:23 +0100201 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100202 rpc_status = serializer->deserialize_export_public_key_req(req_buf, &key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100203
Imre Kis6d867d82023-07-04 13:29:33 +0200204 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100205 namespaced_key_id_t ns_key_id =
206 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallec81a502021-07-12 11:36:37 +0100207 size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_MAX_SIZE;
208 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100209
Julian Hallec81a502021-07-12 11:36:37 +0100210 if (key_buffer) {
Julian Hallec81a502021-07-12 11:36:37 +0100211 size_t export_size;
Imre Kis6d867d82023-07-04 13:29:33 +0200212 psa_status_t psa_status = psa_export_public_key(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100213 ns_key_id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100214
Julian Hallec81a502021-07-12 11:36:37 +0100215 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200216 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100217
Imre Kis6d867d82023-07-04 13:29:33 +0200218 rpc_status = serializer->serialize_export_public_key_resp(
219 resp_buf, key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100220 }
Julian Hallec81a502021-07-12 11:36:37 +0100221
222 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200223 req->service_status = psa_status;
224 } else {
Julian Hallec81a502021-07-12 11:36:37 +0100225 /* Failed to allocate key buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200226 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallec81a502021-07-12 11:36:37 +0100227 }
Julian Hallf5728962021-06-24 09:40:23 +0100228 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100229
Julian Hallf5728962021-06-24 09:40:23 +0100230 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100231}
232
Imre Kis6d867d82023-07-04 13:29:33 +0200233static rpc_status_t import_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100234{
Imre Kis6d867d82023-07-04 13:29:33 +0200235 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
236 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100237 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100238
Julian Hallf5728962021-06-24 09:40:23 +0100239 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100240 size_t key_data_len = serializer->max_deserialised_parameter_size(req_buf);
241 uint8_t *key_buffer = malloc(key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100242
Julian Hallf5728962021-06-24 09:40:23 +0100243 if (key_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100244 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Imre Kis6d867d82023-07-04 13:29:33 +0200245 rpc_status = serializer->deserialize_import_key_req(
246 req_buf, &attributes, key_buffer, &key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100247
Imre Kis6d867d82023-07-04 13:29:33 +0200248 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100249 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100250 namespaced_key_id_t ns_key_id = NAMESPACED_KEY_ID_INIT;
251
252 crypto_partition_bind_to_owner(&attributes, req->source_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100253
Imre Kis6d867d82023-07-04 13:29:33 +0200254 psa_status =
Balint Dobszaydc945e92024-01-15 16:07:21 +0100255 psa_import_key(&attributes, key_buffer, key_data_len, &ns_key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100256
Julian Hallf5728962021-06-24 09:40:23 +0100257 if (psa_status == PSA_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100258 psa_key_id_t key_id =
259 namespaced_key_id_get_key_id(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200260 struct rpc_buffer *resp_buf = &req->response;
julhal01c3f4e9a2020-12-15 13:39:01 +0000261
Imre Kis6d867d82023-07-04 13:29:33 +0200262 rpc_status =
Balint Dobszaydc945e92024-01-15 16:07:21 +0100263 serializer->serialize_import_key_resp(resp_buf, key_id);
Julian Hallf5728962021-06-24 09:40:23 +0100264 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000265
Imre Kis6d867d82023-07-04 13:29:33 +0200266 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100267 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100268
Julian Hallf5728962021-06-24 09:40:23 +0100269 psa_reset_key_attributes(&attributes);
270 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200271 } else {
272 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100273 }
274 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100275
Julian Hallf5728962021-06-24 09:40:23 +0100276 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100277}
278
Imre Kis6d867d82023-07-04 13:29:33 +0200279static rpc_status_t asymmetric_sign_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100280{
Imre Kis6d867d82023-07-04 13:29:33 +0200281 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
282 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100283 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100284
Balint Dobszaydc945e92024-01-15 16:07:21 +0100285 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100286 psa_algorithm_t alg;
287 size_t hash_len = PSA_HASH_MAX_SIZE;
288 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100289
Julian Hallf5728962021-06-24 09:40:23 +0100290 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100291 rpc_status = serializer->deserialize_asymmetric_sign_req(req_buf, &key_id, &alg,
Imre Kis6d867d82023-07-04 13:29:33 +0200292 hash_buffer, &hash_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100293
Imre Kis6d867d82023-07-04 13:29:33 +0200294 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100295 namespaced_key_id_t ns_key_id =
296 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallf5728962021-06-24 09:40:23 +0100297 psa_status_t psa_status;
298 size_t sig_len;
299 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100300
Imre Kis6d867d82023-07-04 13:29:33 +0200301 psa_status = (req->opcode == TS_CRYPTO_OPCODE_SIGN_HASH) ?
Balint Dobszaydc945e92024-01-15 16:07:21 +0100302 psa_sign_hash(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sizeof(sig_buffer), &sig_len) :
303 psa_sign_message(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sizeof(sig_buffer), &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100304
Julian Hallf5728962021-06-24 09:40:23 +0100305 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200306 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100307
Imre Kis6d867d82023-07-04 13:29:33 +0200308 rpc_status = serializer->serialize_asymmetric_sign_resp(
309 resp_buf, sig_buffer, sig_len);
Julian Hallf5728962021-06-24 09:40:23 +0100310 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100311
Imre Kis6d867d82023-07-04 13:29:33 +0200312 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100313 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100314
Julian Hallf5728962021-06-24 09:40:23 +0100315 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100316}
317
Imre Kis6d867d82023-07-04 13:29:33 +0200318static rpc_status_t asymmetric_verify_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100319{
Imre Kis6d867d82023-07-04 13:29:33 +0200320 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
321 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100322 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100323
Balint Dobszaydc945e92024-01-15 16:07:21 +0100324 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100325 psa_algorithm_t alg;
326 size_t hash_len = PSA_HASH_MAX_SIZE;
327 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
328 size_t sig_len = PSA_SIGNATURE_MAX_SIZE;
329 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100330
Julian Hallf5728962021-06-24 09:40:23 +0100331 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200332 rpc_status = serializer->deserialize_asymmetric_verify_req(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100333 req_buf, &key_id, &alg, hash_buffer, &hash_len, sig_buffer, &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100334
Imre Kis6d867d82023-07-04 13:29:33 +0200335 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100336 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100337 namespaced_key_id_t ns_key_id =
338 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100339
Imre Kis6d867d82023-07-04 13:29:33 +0200340 psa_status = (req->opcode == TS_CRYPTO_OPCODE_VERIFY_HASH) ?
Balint Dobszaydc945e92024-01-15 16:07:21 +0100341 psa_verify_hash(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sig_len) :
342 psa_verify_message(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100343
Imre Kis6d867d82023-07-04 13:29:33 +0200344 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100345 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100346
Julian Hallf5728962021-06-24 09:40:23 +0100347 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100348}
349
Imre Kis6d867d82023-07-04 13:29:33 +0200350static rpc_status_t asymmetric_decrypt_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100351{
Imre Kis6d867d82023-07-04 13:29:33 +0200352 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
353 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100354 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100355
Julian Hallf5728962021-06-24 09:40:23 +0100356 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100357 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100358
Balint Dobszaydc945e92024-01-15 16:07:21 +0100359 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100360 psa_algorithm_t alg;
361 size_t ciphertext_len = max_param_size;
362 uint8_t *ciphertext_buffer = malloc(ciphertext_len);
363 size_t salt_len = max_param_size;
364 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100365
Julian Hallf5728962021-06-24 09:40:23 +0100366 if (ciphertext_buffer && salt_buffer) {
Imre Kis6d867d82023-07-04 13:29:33 +0200367 rpc_status = serializer->deserialize_asymmetric_decrypt_req(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100368 req_buf, &key_id, &alg, ciphertext_buffer, &ciphertext_len, salt_buffer,
Imre Kis6d867d82023-07-04 13:29:33 +0200369 &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100370
Imre Kis6d867d82023-07-04 13:29:33 +0200371 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100372 psa_status_t psa_status;
373 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100374 namespaced_key_id_t ns_key_id =
375 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100376
Balint Dobszaydc945e92024-01-15 16:07:21 +0100377 psa_status = psa_get_key_attributes(ns_key_id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100378
Julian Hallf5728962021-06-24 09:40:23 +0100379 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200380 size_t max_decrypt_size =
381 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(
382 psa_get_key_type(&attributes),
383 psa_get_key_bits(&attributes), alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100384
Julian Hallf5728962021-06-24 09:40:23 +0100385 size_t plaintext_len;
386 uint8_t *plaintext_buffer = malloc(max_decrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100387
Julian Hallf5728962021-06-24 09:40:23 +0100388 if (plaintext_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100389 /* Salt is an optional parameter */
390 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100391
Imre Kis6d867d82023-07-04 13:29:33 +0200392 psa_status = psa_asymmetric_decrypt(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100393 ns_key_id, alg, ciphertext_buffer, ciphertext_len,
Imre Kis6d867d82023-07-04 13:29:33 +0200394 salt, salt_len, plaintext_buffer,
395 max_decrypt_size, &plaintext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000396
Julian Hallf5728962021-06-24 09:40:23 +0100397 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200398 struct rpc_buffer *resp_buf =
399 &req->response;
400 rpc_status = serializer->serialize_asymmetric_decrypt_resp(
401 resp_buf, plaintext_buffer, plaintext_len);
Julian Hallf5728962021-06-24 09:40:23 +0100402 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000403
Julian Hallf5728962021-06-24 09:40:23 +0100404 free(plaintext_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200405 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100406 /* Failed to allocate ouptput buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200407 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100408 }
409 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100410
Imre Kis6d867d82023-07-04 13:29:33 +0200411 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100412 psa_reset_key_attributes(&attributes);
413 }
Imre Kis6d867d82023-07-04 13:29:33 +0200414 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100415 /* Failed to allocate buffers */
Imre Kis6d867d82023-07-04 13:29:33 +0200416 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100417 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100418
Julian Hallf5728962021-06-24 09:40:23 +0100419 free(ciphertext_buffer);
420 free(salt_buffer);
421 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100422
Julian Hallf5728962021-06-24 09:40:23 +0100423 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100424}
425
Imre Kis6d867d82023-07-04 13:29:33 +0200426static rpc_status_t asymmetric_encrypt_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100427{
Imre Kis6d867d82023-07-04 13:29:33 +0200428 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
429 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100430 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100431
Julian Hallf5728962021-06-24 09:40:23 +0100432 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100433 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100434
Balint Dobszaydc945e92024-01-15 16:07:21 +0100435 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100436 psa_algorithm_t alg;
437 size_t plaintext_len = max_param_size;
438 uint8_t *plaintext_buffer = malloc(plaintext_len);
439 size_t salt_len = max_param_size;
440 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100441
Julian Hallf5728962021-06-24 09:40:23 +0100442 if (plaintext_buffer && salt_buffer) {
Imre Kis6d867d82023-07-04 13:29:33 +0200443 rpc_status = serializer->deserialize_asymmetric_encrypt_req(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100444 req_buf, &key_id, &alg, plaintext_buffer, &plaintext_len, salt_buffer,
Imre Kis6d867d82023-07-04 13:29:33 +0200445 &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100446
Imre Kis6d867d82023-07-04 13:29:33 +0200447 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100448 psa_status_t psa_status;
449 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100450 namespaced_key_id_t ns_key_id =
451 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100452
Balint Dobszaydc945e92024-01-15 16:07:21 +0100453 psa_status = psa_get_key_attributes(ns_key_id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100454
Julian Hallf5728962021-06-24 09:40:23 +0100455 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200456 size_t max_encrypt_size =
457 PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(
458 psa_get_key_type(&attributes),
459 psa_get_key_bits(&attributes), alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100460
Julian Hallf5728962021-06-24 09:40:23 +0100461 size_t ciphertext_len;
462 uint8_t *ciphertext_buffer = malloc(max_encrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100463
Julian Hallf5728962021-06-24 09:40:23 +0100464 if (ciphertext_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100465 /* Salt is an optional parameter */
466 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100467
Imre Kis6d867d82023-07-04 13:29:33 +0200468 psa_status = psa_asymmetric_encrypt(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100469 ns_key_id, alg, plaintext_buffer, plaintext_len,
Imre Kis6d867d82023-07-04 13:29:33 +0200470 salt, salt_len, ciphertext_buffer,
471 max_encrypt_size, &ciphertext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000472
Julian Hallf5728962021-06-24 09:40:23 +0100473 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200474 struct rpc_buffer *resp_buf =
475 &req->response;
julhal01c3f4e9a2020-12-15 13:39:01 +0000476
Imre Kis6d867d82023-07-04 13:29:33 +0200477 rpc_status = serializer->serialize_asymmetric_encrypt_resp(
478 resp_buf, ciphertext_buffer, ciphertext_len);
Julian Hallf5728962021-06-24 09:40:23 +0100479 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000480
Julian Hallf5728962021-06-24 09:40:23 +0100481 free(ciphertext_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200482 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100483 /* Failed to allocate ouptput buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200484 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100485 }
486 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100487
Imre Kis6d867d82023-07-04 13:29:33 +0200488 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100489 psa_reset_key_attributes(&attributes);
490 }
Imre Kis6d867d82023-07-04 13:29:33 +0200491 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100492 /* Failed to allocate buffers */
Imre Kis6d867d82023-07-04 13:29:33 +0200493 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100494 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100495
Julian Hallf5728962021-06-24 09:40:23 +0100496 free(plaintext_buffer);
497 free(salt_buffer);
498 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100499
Julian Hallf5728962021-06-24 09:40:23 +0100500 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100501}
502
Imre Kis6d867d82023-07-04 13:29:33 +0200503static rpc_status_t generate_random_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100504{
Imre Kis6d867d82023-07-04 13:29:33 +0200505 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
506 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100507 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100508
Julian Hallf5728962021-06-24 09:40:23 +0100509 size_t output_size;
Julian Hallc02fffb2020-11-23 18:22:06 +0100510
Julian Hallf5728962021-06-24 09:40:23 +0100511 if (serializer)
512 rpc_status = serializer->deserialize_generate_random_req(req_buf, &output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100513
Imre Kis6d867d82023-07-04 13:29:33 +0200514 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100515 psa_status_t psa_status;
516 uint8_t *output_buffer = malloc(output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100517
Julian Hallf5728962021-06-24 09:40:23 +0100518 if (output_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100519 psa_status = psa_generate_random(output_buffer, output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100520
Julian Hallf5728962021-06-24 09:40:23 +0100521 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200522 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100523
Imre Kis6d867d82023-07-04 13:29:33 +0200524 rpc_status = serializer->serialize_generate_random_resp(
525 resp_buf, output_buffer, output_size);
Julian Hallf5728962021-06-24 09:40:23 +0100526 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100527
Imre Kis6d867d82023-07-04 13:29:33 +0200528 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100529 free(output_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200530 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100531 /* Failed to allocate output buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200532 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100533 }
534 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100535
Julian Hallf5728962021-06-24 09:40:23 +0100536 return rpc_status;
537}
538
Imre Kis6d867d82023-07-04 13:29:33 +0200539static rpc_status_t copy_key_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100540{
Imre Kis6d867d82023-07-04 13:29:33 +0200541 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
542 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100543 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
544
545 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100546 psa_key_id_t source_key_id = PSA_KEY_ID_NULL;
Julian Hall8359a632021-07-08 15:10:30 +0100547
548 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200549 rpc_status =
550 serializer->deserialize_copy_key_req(req_buf, &attributes, &source_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100551
Imre Kis6d867d82023-07-04 13:29:33 +0200552 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100553 namespaced_key_id_t target_ns_key_id = NAMESPACED_KEY_ID_INIT;
554 namespaced_key_id_t source_ns_key_id =
555 crypto_partition_get_namespaced_key_id(req->source_id, source_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100556
Balint Dobszaydc945e92024-01-15 16:07:21 +0100557 crypto_partition_bind_to_owner(&attributes, req->source_id);
558
559 psa_status_t psa_status = psa_copy_key(source_ns_key_id, &attributes, &target_ns_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100560
561 if (psa_status == PSA_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100562 psa_key_id_t target_key_id = namespaced_key_id_get_key_id(target_ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200563 struct rpc_buffer *resp_buf = &req->response;
Julian Hall8359a632021-07-08 15:10:30 +0100564 rpc_status = serializer->serialize_copy_key_resp(resp_buf, target_key_id);
565 }
566
Imre Kis6d867d82023-07-04 13:29:33 +0200567 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100568 }
569
570 psa_reset_key_attributes(&attributes);
571
572 return rpc_status;
573}
574
Imre Kis6d867d82023-07-04 13:29:33 +0200575static rpc_status_t purge_key_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100576{
Imre Kis6d867d82023-07-04 13:29:33 +0200577 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
578 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100579 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
580
Balint Dobszaydc945e92024-01-15 16:07:21 +0100581 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hall8359a632021-07-08 15:10:30 +0100582
583 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100584 rpc_status = serializer->deserialize_purge_key_req(req_buf, &key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100585
Imre Kis6d867d82023-07-04 13:29:33 +0200586 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100587 namespaced_key_id_t ns_key_id =
588 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
589 psa_status_t psa_status = psa_purge_key(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200590 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100591 }
592
593 return rpc_status;
594}
595
Imre Kis6d867d82023-07-04 13:29:33 +0200596static rpc_status_t get_key_attributes_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100597{
Imre Kis6d867d82023-07-04 13:29:33 +0200598 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
599 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100600 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
601
Balint Dobszaydc945e92024-01-15 16:07:21 +0100602 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hall8359a632021-07-08 15:10:30 +0100603
604 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100605 rpc_status = serializer->deserialize_get_key_attributes_req(req_buf, &key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100606
Imre Kis6d867d82023-07-04 13:29:33 +0200607 if (rpc_status == RPC_SUCCESS) {
Julian Hall8359a632021-07-08 15:10:30 +0100608 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100609 namespaced_key_id_t ns_key_id =
610 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100611
Balint Dobszaydc945e92024-01-15 16:07:21 +0100612 psa_status_t psa_status = psa_get_key_attributes(ns_key_id, &attributes);
Julian Hall8359a632021-07-08 15:10:30 +0100613
614 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200615 struct rpc_buffer *resp_buf = &req->response;
Julian Hall8359a632021-07-08 15:10:30 +0100616
Imre Kis6d867d82023-07-04 13:29:33 +0200617 rpc_status = serializer->serialize_get_key_attributes_resp(resp_buf,
618 &attributes);
Julian Hall8359a632021-07-08 15:10:30 +0100619 }
620
621 psa_reset_key_attributes(&attributes);
Imre Kis6d867d82023-07-04 13:29:33 +0200622 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100623 }
624
625 return rpc_status;
626}
Gabor Tothab7db212023-08-18 16:08:12 +0200627
Balint Dobszay77183322024-01-25 16:17:16 +0100628#if defined(MBEDTLS_PKCS7_C) && defined(MBEDTLS_X509_CRT_PARSE_C)
Gabor Tothab7db212023-08-18 16:08:12 +0200629static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req)
630{
631 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
632 struct rpc_buffer *req_buf = &req->request;
633 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
634
635 int mbedtls_status = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
636
637 uint8_t *signature_cert = NULL;
638 uint64_t signature_cert_len = 0;
639 uint8_t *hash = NULL;
640 uint64_t hash_len = 0;
641 uint8_t *public_key_cert = NULL;
642 uint64_t public_key_cert_len = 0;
643
644 if (serializer) {
645 /* First collect the lengths of the fields */
646 rpc_status = serializer->deserialize_verify_pkcs7_signature_req(
647 req_buf, NULL, &signature_cert_len, NULL, &hash_len, NULL,
648 &public_key_cert_len);
649
650 if (rpc_status == RPC_SUCCESS) {
651 /* Allocate the needed space and get the data */
652 signature_cert = (uint8_t *)malloc(signature_cert_len);
653 hash = (uint8_t *)malloc(hash_len);
654 public_key_cert = (uint8_t *)malloc(public_key_cert_len);
655
656 if (signature_cert && hash && public_key_cert) {
657 rpc_status = serializer->deserialize_verify_pkcs7_signature_req(
658 req_buf, signature_cert, &signature_cert_len, hash,
659 &hash_len, public_key_cert, &public_key_cert_len);
660 } else {
661 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
662 }
663 }
664 }
665
666 if (rpc_status == RPC_SUCCESS) {
667 /* Parse the public key certificate */
668 mbedtls_x509_crt signer_certificate;
669
670 mbedtls_x509_crt_init(&signer_certificate);
671
672 mbedtls_status = mbedtls_x509_crt_parse_der(&signer_certificate, public_key_cert,
673 public_key_cert_len);
674
675 if (mbedtls_status == 0) {
676 /* Parse the PKCS#7 DER encoded signature block */
677 mbedtls_pkcs7 pkcs7_structure;
678
679 mbedtls_pkcs7_init(&pkcs7_structure);
680
681 mbedtls_status = mbedtls_pkcs7_parse_der(&pkcs7_structure, signature_cert,
682 signature_cert_len);
683
684 if (mbedtls_status == MBEDTLS_PKCS7_SIGNED_DATA) {
685 /* Verify hash against signed hash */
686 mbedtls_status = mbedtls_pkcs7_signed_hash_verify(
687 &pkcs7_structure, &signer_certificate, hash, hash_len);
688 }
689
690 mbedtls_pkcs7_free(&pkcs7_structure);
691 }
692
693 mbedtls_x509_crt_free(&signer_certificate);
694 }
695
696 free(signature_cert);
697 free(hash);
698 free(public_key_cert);
699
700 /* Provide the result of the verification */
701 req->service_status = mbedtls_status;
702
703 return rpc_status;
704}
Balint Dobszay77183322024-01-25 16:17:16 +0100705#else
706static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req)
707{
708 (void)context;
709 (void)req;
710
711 return RPC_ERROR_INTERNAL;
712}
713#endif