blob: bc0e90e2af03567da552dd734904f3a529c7fe11 [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>
Balint Dobszaydc945e92024-01-15 16:07:21 +010011#include <service/crypto/backend/crypto_backend.h>
Imre Kis6d867d82023-07-04 13:29:33 +020012#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
Balint Dobszaydc945e92024-01-15 16:07:21 +010016#include "crypto_partition.h"
Imre Kis6d867d82023-07-04 13:29:33 +020017#include "crypto_uuid.h"
Julian Hallc02fffb2020-11-23 18:22:06 +010018
19/* Service request handlers */
Imre Kis6d867d82023-07-04 13:29:33 +020020static rpc_status_t generate_key_handler(void *context, struct rpc_request *req);
21static rpc_status_t destroy_key_handler(void *context, struct rpc_request *req);
22static rpc_status_t export_key_handler(void *context, struct rpc_request *req);
23static rpc_status_t export_public_key_handler(void *context, struct rpc_request *req);
24static rpc_status_t import_key_handler(void *context, struct rpc_request *req);
25static rpc_status_t asymmetric_sign_handler(void *context, struct rpc_request *req);
26static rpc_status_t asymmetric_verify_handler(void *context, struct rpc_request *req);
27static rpc_status_t asymmetric_decrypt_handler(void *context, struct rpc_request *req);
28static rpc_status_t asymmetric_encrypt_handler(void *context, struct rpc_request *req);
29static rpc_status_t generate_random_handler(void *context, struct rpc_request *req);
30static rpc_status_t copy_key_handler(void *context, struct rpc_request *req);
31static rpc_status_t purge_key_handler(void *context, struct rpc_request *req);
32static rpc_status_t get_key_attributes_handler(void *context, struct rpc_request *req);
Gabor Tothab7db212023-08-18 16:08:12 +020033static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req);
Julian Hallc02fffb2020-11-23 18:22:06 +010034
35/* Handler mapping table for service */
36static const struct service_handler handler_table[] = {
Gabor Tothab7db212023-08-18 16:08:12 +020037 { TS_CRYPTO_OPCODE_GENERATE_KEY, generate_key_handler },
38 { TS_CRYPTO_OPCODE_DESTROY_KEY, destroy_key_handler },
39 { TS_CRYPTO_OPCODE_EXPORT_KEY, export_key_handler },
40 { TS_CRYPTO_OPCODE_EXPORT_PUBLIC_KEY, export_public_key_handler },
41 { TS_CRYPTO_OPCODE_IMPORT_KEY, import_key_handler },
42 { TS_CRYPTO_OPCODE_SIGN_HASH, asymmetric_sign_handler },
43 { TS_CRYPTO_OPCODE_VERIFY_HASH, asymmetric_verify_handler },
44 { TS_CRYPTO_OPCODE_ASYMMETRIC_DECRYPT, asymmetric_decrypt_handler },
45 { TS_CRYPTO_OPCODE_ASYMMETRIC_ENCRYPT, asymmetric_encrypt_handler },
46 { TS_CRYPTO_OPCODE_GENERATE_RANDOM, generate_random_handler },
47 { TS_CRYPTO_OPCODE_COPY_KEY, copy_key_handler },
48 { TS_CRYPTO_OPCODE_PURGE_KEY, purge_key_handler },
49 { TS_CRYPTO_OPCODE_GET_KEY_ATTRIBUTES, get_key_attributes_handler },
50 { TS_CRYPTO_OPCODE_SIGN_MESSAGE, asymmetric_sign_handler },
51 { TS_CRYPTO_OPCODE_VERIFY_MESSAGE, asymmetric_verify_handler },
52 { TS_CRYPTO_OPCODE_VERIFY_PKCS7_SIGNATURE, verify_pkcs7_signature_handler },
Julian Hallc02fffb2020-11-23 18:22:06 +010053};
54
Imre Kis6d867d82023-07-04 13:29:33 +020055struct rpc_service_interface *
56crypto_provider_init(struct crypto_provider *context, unsigned int encoding,
57 const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010058{
Imre Kis6d867d82023-07-04 13:29:33 +020059 const struct rpc_uuid crypto_service_uuid[2] = {
60 { .uuid = TS_PSA_CRYPTO_SERVICE_UUID },
61 { .uuid = TS_PSA_CRYPTO_PROTOBUF_SERVICE_UUID },
62 };
Julian Hallc02fffb2020-11-23 18:22:06 +010063
Imre Kis6d867d82023-07-04 13:29:33 +020064 if (encoding >= TS_RPC_ENCODING_LIMIT)
65 return NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +010066
Imre Kis6d867d82023-07-04 13:29:33 +020067 context->serializer = serializer;
68
69 service_provider_init(&context->base_provider, context, &crypto_service_uuid[encoding],
70 handler_table,
71 sizeof(handler_table) / sizeof(struct service_handler));
Julian Hall3e614542021-07-29 11:47:47 +010072
Julian Hall9061e6c2021-06-29 14:24:20 +010073 return service_provider_get_rpc_interface(&context->base_provider);
Julian Hallc02fffb2020-11-23 18:22:06 +010074}
75
Julian Hall9061e6c2021-06-29 14:24:20 +010076void crypto_provider_deinit(struct crypto_provider *context)
Julian Hallc02fffb2020-11-23 18:22:06 +010077{
Imre Kis6d867d82023-07-04 13:29:33 +020078 (void)context;
Julian Hallc02fffb2020-11-23 18:22:06 +010079}
80
Julian Hall9061e6c2021-06-29 14:24:20 +010081void crypto_provider_register_serializer(struct crypto_provider *context,
Imre Kis6d867d82023-07-04 13:29:33 +020082 const struct crypto_provider_serializer *serializer)
Julian Hallc02fffb2020-11-23 18:22:06 +010083{
Imre Kis6d867d82023-07-04 13:29:33 +020084 context->serializer = serializer;
julhal01c3f4e9a2020-12-15 13:39:01 +000085}
86
Imre Kis6d867d82023-07-04 13:29:33 +020087void crypto_provider_extend(struct crypto_provider *context, struct service_provider *sub_provider)
Julian Hall13e76952021-07-13 12:17:09 +010088{
89 service_provider_extend(&context->base_provider, sub_provider);
90}
91
Imre Kis6d867d82023-07-04 13:29:33 +020092static const struct crypto_provider_serializer *get_crypto_serializer(void *context,
93 const struct rpc_request *req)
julhal01c3f4e9a2020-12-15 13:39:01 +000094{
Imre Kis6d867d82023-07-04 13:29:33 +020095 struct crypto_provider *this_instance = (struct crypto_provider *)context;
julhal01c3f4e9a2020-12-15 13:39:01 +000096
Imre Kis6d867d82023-07-04 13:29:33 +020097 return this_instance->serializer;
Julian Hallc02fffb2020-11-23 18:22:06 +010098}
99
Imre Kis6d867d82023-07-04 13:29:33 +0200100static rpc_status_t generate_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100101{
Imre Kis6d867d82023-07-04 13:29:33 +0200102 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
103 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100104 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100105
Julian Hallf5728962021-06-24 09:40:23 +0100106 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100107
Julian Hallf5728962021-06-24 09:40:23 +0100108 if (serializer)
109 rpc_status = serializer->deserialize_generate_key_req(req_buf, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100110
Imre Kis6d867d82023-07-04 13:29:33 +0200111 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100112 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100113 namespaced_key_id_t ns_key_id = NAMESPACED_KEY_ID_INIT;
Julian Hallc02fffb2020-11-23 18:22:06 +0100114
Balint Dobszaydc945e92024-01-15 16:07:21 +0100115 crypto_partition_bind_to_owner(&attributes, req->source_id);
116
117 psa_status = psa_generate_key(&attributes, &ns_key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100118
Julian Hallf5728962021-06-24 09:40:23 +0100119 if (psa_status == PSA_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100120 psa_key_id_t key_id = namespaced_key_id_get_key_id(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200121 struct rpc_buffer *resp_buf = &req->response;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100122 rpc_status = serializer->serialize_generate_key_resp(resp_buf, key_id);
Julian Hallf5728962021-06-24 09:40:23 +0100123 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100124
Imre Kis6d867d82023-07-04 13:29:33 +0200125 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100126 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100127
Julian Hallf5728962021-06-24 09:40:23 +0100128 psa_reset_key_attributes(&attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100129
Julian Hallf5728962021-06-24 09:40:23 +0100130 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100131}
132
Imre Kis6d867d82023-07-04 13:29:33 +0200133static rpc_status_t destroy_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100134{
Imre Kis6d867d82023-07-04 13:29:33 +0200135 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
136 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100137 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100138
Balint Dobszaydc945e92024-01-15 16:07:21 +0100139 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +0100140
Julian Hallf5728962021-06-24 09:40:23 +0100141 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100142 rpc_status = serializer->deserialize_destroy_key_req(req_buf, &key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100143
Imre Kis6d867d82023-07-04 13:29:33 +0200144 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100145 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100146 namespaced_key_id_t ns_key_id =
147 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100148
Balint Dobszaydc945e92024-01-15 16:07:21 +0100149 psa_status = psa_destroy_key(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200150 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100151 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100152
Julian Hallf5728962021-06-24 09:40:23 +0100153 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100154}
155
Imre Kis6d867d82023-07-04 13:29:33 +0200156static rpc_status_t export_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100157{
Imre Kis6d867d82023-07-04 13:29:33 +0200158 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
159 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100160 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100161
Balint Dobszaydc945e92024-01-15 16:07:21 +0100162 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +0100163
Julian Hallf5728962021-06-24 09:40:23 +0100164 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100165 rpc_status = serializer->deserialize_export_key_req(req_buf, &key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100166
Imre Kis6d867d82023-07-04 13:29:33 +0200167 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100168 namespaced_key_id_t ns_key_id =
169 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hall464021a2021-07-29 15:20:10 +0100170 size_t max_export_size = PSA_EXPORT_KEY_PAIR_MAX_SIZE;
171 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100172
Julian Hall464021a2021-07-29 15:20:10 +0100173 if (key_buffer) {
Julian Hall464021a2021-07-29 15:20:10 +0100174 size_t export_size;
Imre Kis6d867d82023-07-04 13:29:33 +0200175 psa_status_t psa_status =
Balint Dobszaydc945e92024-01-15 16:07:21 +0100176 psa_export_key(ns_key_id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100177
Julian Hall464021a2021-07-29 15:20:10 +0100178 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200179 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100180
Imre Kis6d867d82023-07-04 13:29:33 +0200181 rpc_status = serializer->serialize_export_key_resp(
182 resp_buf, key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100183 }
Julian Hallec81a502021-07-12 11:36:37 +0100184
Julian Hall464021a2021-07-29 15:20:10 +0100185 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200186 req->service_status = psa_status;
187 } else {
Julian Hall464021a2021-07-29 15:20:10 +0100188 /* Failed to allocate key buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200189 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hall464021a2021-07-29 15:20:10 +0100190 }
Julian Hallf5728962021-06-24 09:40:23 +0100191 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100192
Julian Hallf5728962021-06-24 09:40:23 +0100193 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100194}
195
Imre Kis6d867d82023-07-04 13:29:33 +0200196static rpc_status_t export_public_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100197{
Imre Kis6d867d82023-07-04 13:29:33 +0200198 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
199 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100200 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100201
Balint Dobszaydc945e92024-01-15 16:07:21 +0100202 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallc02fffb2020-11-23 18:22:06 +0100203
Julian Hallf5728962021-06-24 09:40:23 +0100204 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100205 rpc_status = serializer->deserialize_export_public_key_req(req_buf, &key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100206
Imre Kis6d867d82023-07-04 13:29:33 +0200207 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100208 namespaced_key_id_t ns_key_id =
209 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallec81a502021-07-12 11:36:37 +0100210 size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_MAX_SIZE;
211 uint8_t *key_buffer = malloc(max_export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100212
Julian Hallec81a502021-07-12 11:36:37 +0100213 if (key_buffer) {
Julian Hallec81a502021-07-12 11:36:37 +0100214 size_t export_size;
Imre Kis6d867d82023-07-04 13:29:33 +0200215 psa_status_t psa_status = psa_export_public_key(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100216 ns_key_id, key_buffer, max_export_size, &export_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100217
Julian Hallec81a502021-07-12 11:36:37 +0100218 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200219 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100220
Imre Kis6d867d82023-07-04 13:29:33 +0200221 rpc_status = serializer->serialize_export_public_key_resp(
222 resp_buf, key_buffer, export_size);
Julian Hallf5728962021-06-24 09:40:23 +0100223 }
Julian Hallec81a502021-07-12 11:36:37 +0100224
225 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200226 req->service_status = psa_status;
227 } else {
Julian Hallec81a502021-07-12 11:36:37 +0100228 /* Failed to allocate key buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200229 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallec81a502021-07-12 11:36:37 +0100230 }
Julian Hallf5728962021-06-24 09:40:23 +0100231 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100232
Julian Hallf5728962021-06-24 09:40:23 +0100233 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100234}
235
Imre Kis6d867d82023-07-04 13:29:33 +0200236static rpc_status_t import_key_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100237{
Imre Kis6d867d82023-07-04 13:29:33 +0200238 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
239 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100240 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100241
Julian Hallf5728962021-06-24 09:40:23 +0100242 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100243 size_t key_data_len = serializer->max_deserialised_parameter_size(req_buf);
244 uint8_t *key_buffer = malloc(key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100245
Julian Hallf5728962021-06-24 09:40:23 +0100246 if (key_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100247 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Imre Kis6d867d82023-07-04 13:29:33 +0200248 rpc_status = serializer->deserialize_import_key_req(
249 req_buf, &attributes, key_buffer, &key_data_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100250
Imre Kis6d867d82023-07-04 13:29:33 +0200251 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100252 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100253 namespaced_key_id_t ns_key_id = NAMESPACED_KEY_ID_INIT;
254
255 crypto_partition_bind_to_owner(&attributes, req->source_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100256
Imre Kis6d867d82023-07-04 13:29:33 +0200257 psa_status =
Balint Dobszaydc945e92024-01-15 16:07:21 +0100258 psa_import_key(&attributes, key_buffer, key_data_len, &ns_key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100259
Julian Hallf5728962021-06-24 09:40:23 +0100260 if (psa_status == PSA_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100261 psa_key_id_t key_id =
262 namespaced_key_id_get_key_id(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200263 struct rpc_buffer *resp_buf = &req->response;
julhal01c3f4e9a2020-12-15 13:39:01 +0000264
Imre Kis6d867d82023-07-04 13:29:33 +0200265 rpc_status =
Balint Dobszaydc945e92024-01-15 16:07:21 +0100266 serializer->serialize_import_key_resp(resp_buf, key_id);
Julian Hallf5728962021-06-24 09:40:23 +0100267 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000268
Imre Kis6d867d82023-07-04 13:29:33 +0200269 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100270 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100271
Julian Hallf5728962021-06-24 09:40:23 +0100272 psa_reset_key_attributes(&attributes);
273 free(key_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200274 } else {
275 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100276 }
277 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100278
Julian Hallf5728962021-06-24 09:40:23 +0100279 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100280}
281
Imre Kis6d867d82023-07-04 13:29:33 +0200282static rpc_status_t asymmetric_sign_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100283{
Imre Kis6d867d82023-07-04 13:29:33 +0200284 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
285 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100286 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100287
Balint Dobszaydc945e92024-01-15 16:07:21 +0100288 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100289 psa_algorithm_t alg;
290 size_t hash_len = PSA_HASH_MAX_SIZE;
291 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100292
Julian Hallf5728962021-06-24 09:40:23 +0100293 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100294 rpc_status = serializer->deserialize_asymmetric_sign_req(req_buf, &key_id, &alg,
Imre Kis6d867d82023-07-04 13:29:33 +0200295 hash_buffer, &hash_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100296
Imre Kis6d867d82023-07-04 13:29:33 +0200297 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100298 namespaced_key_id_t ns_key_id =
299 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallf5728962021-06-24 09:40:23 +0100300 psa_status_t psa_status;
301 size_t sig_len;
302 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100303
Imre Kis6d867d82023-07-04 13:29:33 +0200304 psa_status = (req->opcode == TS_CRYPTO_OPCODE_SIGN_HASH) ?
Balint Dobszaydc945e92024-01-15 16:07:21 +0100305 psa_sign_hash(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sizeof(sig_buffer), &sig_len) :
306 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 +0100307
Julian Hallf5728962021-06-24 09:40:23 +0100308 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200309 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100310
Imre Kis6d867d82023-07-04 13:29:33 +0200311 rpc_status = serializer->serialize_asymmetric_sign_resp(
312 resp_buf, sig_buffer, sig_len);
Julian Hallf5728962021-06-24 09:40:23 +0100313 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100314
Imre Kis6d867d82023-07-04 13:29:33 +0200315 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100316 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100317
Julian Hallf5728962021-06-24 09:40:23 +0100318 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100319}
320
Imre Kis6d867d82023-07-04 13:29:33 +0200321static rpc_status_t asymmetric_verify_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100322{
Imre Kis6d867d82023-07-04 13:29:33 +0200323 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
324 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100325 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100326
Balint Dobszaydc945e92024-01-15 16:07:21 +0100327 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100328 psa_algorithm_t alg;
329 size_t hash_len = PSA_HASH_MAX_SIZE;
330 uint8_t hash_buffer[PSA_HASH_MAX_SIZE];
331 size_t sig_len = PSA_SIGNATURE_MAX_SIZE;
332 uint8_t sig_buffer[PSA_SIGNATURE_MAX_SIZE];
Julian Hallc02fffb2020-11-23 18:22:06 +0100333
Julian Hallf5728962021-06-24 09:40:23 +0100334 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200335 rpc_status = serializer->deserialize_asymmetric_verify_req(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100336 req_buf, &key_id, &alg, hash_buffer, &hash_len, sig_buffer, &sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100337
Imre Kis6d867d82023-07-04 13:29:33 +0200338 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100339 psa_status_t psa_status;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100340 namespaced_key_id_t ns_key_id =
341 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100342
Imre Kis6d867d82023-07-04 13:29:33 +0200343 psa_status = (req->opcode == TS_CRYPTO_OPCODE_VERIFY_HASH) ?
Balint Dobszaydc945e92024-01-15 16:07:21 +0100344 psa_verify_hash(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sig_len) :
345 psa_verify_message(ns_key_id, alg, hash_buffer, hash_len, sig_buffer, sig_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100346
Imre Kis6d867d82023-07-04 13:29:33 +0200347 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100348 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100349
Julian Hallf5728962021-06-24 09:40:23 +0100350 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100351}
352
Imre Kis6d867d82023-07-04 13:29:33 +0200353static rpc_status_t asymmetric_decrypt_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100354{
Imre Kis6d867d82023-07-04 13:29:33 +0200355 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
356 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100357 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100358
Julian Hallf5728962021-06-24 09:40:23 +0100359 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100360 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100361
Balint Dobszaydc945e92024-01-15 16:07:21 +0100362 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100363 psa_algorithm_t alg;
364 size_t ciphertext_len = max_param_size;
365 uint8_t *ciphertext_buffer = malloc(ciphertext_len);
366 size_t salt_len = max_param_size;
367 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100368
Julian Hallf5728962021-06-24 09:40:23 +0100369 if (ciphertext_buffer && salt_buffer) {
Imre Kis6d867d82023-07-04 13:29:33 +0200370 rpc_status = serializer->deserialize_asymmetric_decrypt_req(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100371 req_buf, &key_id, &alg, ciphertext_buffer, &ciphertext_len, salt_buffer,
Imre Kis6d867d82023-07-04 13:29:33 +0200372 &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100373
Imre Kis6d867d82023-07-04 13:29:33 +0200374 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100375 psa_status_t psa_status;
376 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100377 namespaced_key_id_t ns_key_id =
378 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100379
Balint Dobszaydc945e92024-01-15 16:07:21 +0100380 psa_status = psa_get_key_attributes(ns_key_id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100381
Julian Hallf5728962021-06-24 09:40:23 +0100382 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200383 size_t max_decrypt_size =
384 PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(
385 psa_get_key_type(&attributes),
386 psa_get_key_bits(&attributes), alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100387
Julian Hallf5728962021-06-24 09:40:23 +0100388 size_t plaintext_len;
389 uint8_t *plaintext_buffer = malloc(max_decrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100390
Julian Hallf5728962021-06-24 09:40:23 +0100391 if (plaintext_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100392 /* Salt is an optional parameter */
393 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100394
Imre Kis6d867d82023-07-04 13:29:33 +0200395 psa_status = psa_asymmetric_decrypt(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100396 ns_key_id, alg, ciphertext_buffer, ciphertext_len,
Imre Kis6d867d82023-07-04 13:29:33 +0200397 salt, salt_len, plaintext_buffer,
398 max_decrypt_size, &plaintext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000399
Julian Hallf5728962021-06-24 09:40:23 +0100400 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200401 struct rpc_buffer *resp_buf =
402 &req->response;
403 rpc_status = serializer->serialize_asymmetric_decrypt_resp(
404 resp_buf, plaintext_buffer, plaintext_len);
Julian Hallf5728962021-06-24 09:40:23 +0100405 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000406
Julian Hallf5728962021-06-24 09:40:23 +0100407 free(plaintext_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200408 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100409 /* Failed to allocate ouptput buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200410 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100411 }
412 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100413
Imre Kis6d867d82023-07-04 13:29:33 +0200414 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100415 psa_reset_key_attributes(&attributes);
416 }
Imre Kis6d867d82023-07-04 13:29:33 +0200417 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100418 /* Failed to allocate buffers */
Imre Kis6d867d82023-07-04 13:29:33 +0200419 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100420 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100421
Julian Hallf5728962021-06-24 09:40:23 +0100422 free(ciphertext_buffer);
423 free(salt_buffer);
424 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100425
Julian Hallf5728962021-06-24 09:40:23 +0100426 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100427}
428
Imre Kis6d867d82023-07-04 13:29:33 +0200429static rpc_status_t asymmetric_encrypt_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100430{
Imre Kis6d867d82023-07-04 13:29:33 +0200431 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
432 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100433 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100434
Julian Hallf5728962021-06-24 09:40:23 +0100435 if (serializer) {
Julian Hallf5728962021-06-24 09:40:23 +0100436 size_t max_param_size = serializer->max_deserialised_parameter_size(req_buf);
Julian Hallc02fffb2020-11-23 18:22:06 +0100437
Balint Dobszaydc945e92024-01-15 16:07:21 +0100438 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hallf5728962021-06-24 09:40:23 +0100439 psa_algorithm_t alg;
440 size_t plaintext_len = max_param_size;
441 uint8_t *plaintext_buffer = malloc(plaintext_len);
442 size_t salt_len = max_param_size;
443 uint8_t *salt_buffer = malloc(salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100444
Julian Hallf5728962021-06-24 09:40:23 +0100445 if (plaintext_buffer && salt_buffer) {
Imre Kis6d867d82023-07-04 13:29:33 +0200446 rpc_status = serializer->deserialize_asymmetric_encrypt_req(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100447 req_buf, &key_id, &alg, plaintext_buffer, &plaintext_len, salt_buffer,
Imre Kis6d867d82023-07-04 13:29:33 +0200448 &salt_len);
Julian Hallc02fffb2020-11-23 18:22:06 +0100449
Imre Kis6d867d82023-07-04 13:29:33 +0200450 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100451 psa_status_t psa_status;
452 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100453 namespaced_key_id_t ns_key_id =
454 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hallc02fffb2020-11-23 18:22:06 +0100455
Balint Dobszaydc945e92024-01-15 16:07:21 +0100456 psa_status = psa_get_key_attributes(ns_key_id, &attributes);
Julian Hallc02fffb2020-11-23 18:22:06 +0100457
Julian Hallf5728962021-06-24 09:40:23 +0100458 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200459 size_t max_encrypt_size =
460 PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(
461 psa_get_key_type(&attributes),
462 psa_get_key_bits(&attributes), alg);
Julian Hallc02fffb2020-11-23 18:22:06 +0100463
Julian Hallf5728962021-06-24 09:40:23 +0100464 size_t ciphertext_len;
465 uint8_t *ciphertext_buffer = malloc(max_encrypt_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100466
Julian Hallf5728962021-06-24 09:40:23 +0100467 if (ciphertext_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100468 /* Salt is an optional parameter */
469 uint8_t *salt = (salt_len) ? salt_buffer : NULL;
Julian Hallf688a0b2021-04-09 11:58:30 +0100470
Imre Kis6d867d82023-07-04 13:29:33 +0200471 psa_status = psa_asymmetric_encrypt(
Balint Dobszaydc945e92024-01-15 16:07:21 +0100472 ns_key_id, alg, plaintext_buffer, plaintext_len,
Imre Kis6d867d82023-07-04 13:29:33 +0200473 salt, salt_len, ciphertext_buffer,
474 max_encrypt_size, &ciphertext_len);
julhal01c3f4e9a2020-12-15 13:39:01 +0000475
Julian Hallf5728962021-06-24 09:40:23 +0100476 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200477 struct rpc_buffer *resp_buf =
478 &req->response;
julhal01c3f4e9a2020-12-15 13:39:01 +0000479
Imre Kis6d867d82023-07-04 13:29:33 +0200480 rpc_status = serializer->serialize_asymmetric_encrypt_resp(
481 resp_buf, ciphertext_buffer, ciphertext_len);
Julian Hallf5728962021-06-24 09:40:23 +0100482 }
julhal01c3f4e9a2020-12-15 13:39:01 +0000483
Julian Hallf5728962021-06-24 09:40:23 +0100484 free(ciphertext_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200485 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100486 /* Failed to allocate ouptput buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200487 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100488 }
489 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100490
Imre Kis6d867d82023-07-04 13:29:33 +0200491 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100492 psa_reset_key_attributes(&attributes);
493 }
Imre Kis6d867d82023-07-04 13:29:33 +0200494 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100495 /* Failed to allocate buffers */
Imre Kis6d867d82023-07-04 13:29:33 +0200496 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100497 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100498
Julian Hallf5728962021-06-24 09:40:23 +0100499 free(plaintext_buffer);
500 free(salt_buffer);
501 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100502
Julian Hallf5728962021-06-24 09:40:23 +0100503 return rpc_status;
Julian Hallc02fffb2020-11-23 18:22:06 +0100504}
505
Imre Kis6d867d82023-07-04 13:29:33 +0200506static rpc_status_t generate_random_handler(void *context, struct rpc_request *req)
Julian Hallc02fffb2020-11-23 18:22:06 +0100507{
Imre Kis6d867d82023-07-04 13:29:33 +0200508 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
509 struct rpc_buffer *req_buf = &req->request;
Julian Hallf5728962021-06-24 09:40:23 +0100510 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
Julian Hallc02fffb2020-11-23 18:22:06 +0100511
Julian Hallf5728962021-06-24 09:40:23 +0100512 size_t output_size;
Julian Hallc02fffb2020-11-23 18:22:06 +0100513
Julian Hallf5728962021-06-24 09:40:23 +0100514 if (serializer)
515 rpc_status = serializer->deserialize_generate_random_req(req_buf, &output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100516
Imre Kis6d867d82023-07-04 13:29:33 +0200517 if (rpc_status == RPC_SUCCESS) {
Julian Hallf5728962021-06-24 09:40:23 +0100518 psa_status_t psa_status;
519 uint8_t *output_buffer = malloc(output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100520
Julian Hallf5728962021-06-24 09:40:23 +0100521 if (output_buffer) {
Julian Hallf5728962021-06-24 09:40:23 +0100522 psa_status = psa_generate_random(output_buffer, output_size);
Julian Hallc02fffb2020-11-23 18:22:06 +0100523
Julian Hallf5728962021-06-24 09:40:23 +0100524 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200525 struct rpc_buffer *resp_buf = &req->response;
Julian Hallc02fffb2020-11-23 18:22:06 +0100526
Imre Kis6d867d82023-07-04 13:29:33 +0200527 rpc_status = serializer->serialize_generate_random_resp(
528 resp_buf, output_buffer, output_size);
Julian Hallf5728962021-06-24 09:40:23 +0100529 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100530
Imre Kis6d867d82023-07-04 13:29:33 +0200531 req->service_status = psa_status;
Julian Hallf5728962021-06-24 09:40:23 +0100532 free(output_buffer);
Imre Kis6d867d82023-07-04 13:29:33 +0200533 } else {
Julian Hallf5728962021-06-24 09:40:23 +0100534 /* Failed to allocate output buffer */
Imre Kis6d867d82023-07-04 13:29:33 +0200535 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
Julian Hallf5728962021-06-24 09:40:23 +0100536 }
537 }
Julian Hallc02fffb2020-11-23 18:22:06 +0100538
Julian Hallf5728962021-06-24 09:40:23 +0100539 return rpc_status;
540}
541
Imre Kis6d867d82023-07-04 13:29:33 +0200542static rpc_status_t copy_key_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100543{
Imre Kis6d867d82023-07-04 13:29:33 +0200544 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
545 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100546 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
547
548 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100549 psa_key_id_t source_key_id = PSA_KEY_ID_NULL;
Julian Hall8359a632021-07-08 15:10:30 +0100550
551 if (serializer)
Imre Kis6d867d82023-07-04 13:29:33 +0200552 rpc_status =
553 serializer->deserialize_copy_key_req(req_buf, &attributes, &source_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100554
Imre Kis6d867d82023-07-04 13:29:33 +0200555 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100556 namespaced_key_id_t target_ns_key_id = NAMESPACED_KEY_ID_INIT;
557 namespaced_key_id_t source_ns_key_id =
558 crypto_partition_get_namespaced_key_id(req->source_id, source_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100559
Balint Dobszaydc945e92024-01-15 16:07:21 +0100560 crypto_partition_bind_to_owner(&attributes, req->source_id);
561
562 psa_status_t psa_status = psa_copy_key(source_ns_key_id, &attributes, &target_ns_key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100563
564 if (psa_status == PSA_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100565 psa_key_id_t target_key_id = namespaced_key_id_get_key_id(target_ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200566 struct rpc_buffer *resp_buf = &req->response;
Julian Hall8359a632021-07-08 15:10:30 +0100567 rpc_status = serializer->serialize_copy_key_resp(resp_buf, target_key_id);
568 }
569
Imre Kis6d867d82023-07-04 13:29:33 +0200570 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100571 }
572
573 psa_reset_key_attributes(&attributes);
574
575 return rpc_status;
576}
577
Imre Kis6d867d82023-07-04 13:29:33 +0200578static rpc_status_t purge_key_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100579{
Imre Kis6d867d82023-07-04 13:29:33 +0200580 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
581 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100582 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
583
Balint Dobszaydc945e92024-01-15 16:07:21 +0100584 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hall8359a632021-07-08 15:10:30 +0100585
586 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100587 rpc_status = serializer->deserialize_purge_key_req(req_buf, &key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100588
Imre Kis6d867d82023-07-04 13:29:33 +0200589 if (rpc_status == RPC_SUCCESS) {
Balint Dobszaydc945e92024-01-15 16:07:21 +0100590 namespaced_key_id_t ns_key_id =
591 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
592 psa_status_t psa_status = psa_purge_key(ns_key_id);
Imre Kis6d867d82023-07-04 13:29:33 +0200593 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100594 }
595
596 return rpc_status;
597}
598
Imre Kis6d867d82023-07-04 13:29:33 +0200599static rpc_status_t get_key_attributes_handler(void *context, struct rpc_request *req)
Julian Hall8359a632021-07-08 15:10:30 +0100600{
Imre Kis6d867d82023-07-04 13:29:33 +0200601 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
602 struct rpc_buffer *req_buf = &req->request;
Julian Hall8359a632021-07-08 15:10:30 +0100603 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
604
Balint Dobszaydc945e92024-01-15 16:07:21 +0100605 psa_key_id_t key_id = PSA_KEY_ID_NULL;
Julian Hall8359a632021-07-08 15:10:30 +0100606
607 if (serializer)
Balint Dobszaydc945e92024-01-15 16:07:21 +0100608 rpc_status = serializer->deserialize_get_key_attributes_req(req_buf, &key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100609
Imre Kis6d867d82023-07-04 13:29:33 +0200610 if (rpc_status == RPC_SUCCESS) {
Julian Hall8359a632021-07-08 15:10:30 +0100611 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
Balint Dobszaydc945e92024-01-15 16:07:21 +0100612 namespaced_key_id_t ns_key_id =
613 crypto_partition_get_namespaced_key_id(req->source_id, key_id);
Julian Hall8359a632021-07-08 15:10:30 +0100614
Balint Dobszaydc945e92024-01-15 16:07:21 +0100615 psa_status_t psa_status = psa_get_key_attributes(ns_key_id, &attributes);
Julian Hall8359a632021-07-08 15:10:30 +0100616
617 if (psa_status == PSA_SUCCESS) {
Imre Kis6d867d82023-07-04 13:29:33 +0200618 struct rpc_buffer *resp_buf = &req->response;
Julian Hall8359a632021-07-08 15:10:30 +0100619
Imre Kis6d867d82023-07-04 13:29:33 +0200620 rpc_status = serializer->serialize_get_key_attributes_resp(resp_buf,
621 &attributes);
Julian Hall8359a632021-07-08 15:10:30 +0100622 }
623
624 psa_reset_key_attributes(&attributes);
Imre Kis6d867d82023-07-04 13:29:33 +0200625 req->service_status = psa_status;
Julian Hall8359a632021-07-08 15:10:30 +0100626 }
627
628 return rpc_status;
629}
Gabor Tothab7db212023-08-18 16:08:12 +0200630
631static rpc_status_t verify_pkcs7_signature_handler(void *context, struct rpc_request *req)
632{
633 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
634 struct rpc_buffer *req_buf = &req->request;
635 const struct crypto_provider_serializer *serializer = get_crypto_serializer(context, req);
636
637 int mbedtls_status = MBEDTLS_ERR_PKCS7_VERIFY_FAIL;
638
639 uint8_t *signature_cert = NULL;
640 uint64_t signature_cert_len = 0;
641 uint8_t *hash = NULL;
642 uint64_t hash_len = 0;
643 uint8_t *public_key_cert = NULL;
644 uint64_t public_key_cert_len = 0;
645
646 if (serializer) {
647 /* First collect the lengths of the fields */
648 rpc_status = serializer->deserialize_verify_pkcs7_signature_req(
649 req_buf, NULL, &signature_cert_len, NULL, &hash_len, NULL,
650 &public_key_cert_len);
651
652 if (rpc_status == RPC_SUCCESS) {
653 /* Allocate the needed space and get the data */
654 signature_cert = (uint8_t *)malloc(signature_cert_len);
655 hash = (uint8_t *)malloc(hash_len);
656 public_key_cert = (uint8_t *)malloc(public_key_cert_len);
657
658 if (signature_cert && hash && public_key_cert) {
659 rpc_status = serializer->deserialize_verify_pkcs7_signature_req(
660 req_buf, signature_cert, &signature_cert_len, hash,
661 &hash_len, public_key_cert, &public_key_cert_len);
662 } else {
663 rpc_status = RPC_ERROR_RESOURCE_FAILURE;
664 }
665 }
666 }
667
668 if (rpc_status == RPC_SUCCESS) {
669 /* Parse the public key certificate */
670 mbedtls_x509_crt signer_certificate;
671
672 mbedtls_x509_crt_init(&signer_certificate);
673
674 mbedtls_status = mbedtls_x509_crt_parse_der(&signer_certificate, public_key_cert,
675 public_key_cert_len);
676
677 if (mbedtls_status == 0) {
678 /* Parse the PKCS#7 DER encoded signature block */
679 mbedtls_pkcs7 pkcs7_structure;
680
681 mbedtls_pkcs7_init(&pkcs7_structure);
682
683 mbedtls_status = mbedtls_pkcs7_parse_der(&pkcs7_structure, signature_cert,
684 signature_cert_len);
685
686 if (mbedtls_status == MBEDTLS_PKCS7_SIGNED_DATA) {
687 /* Verify hash against signed hash */
688 mbedtls_status = mbedtls_pkcs7_signed_hash_verify(
689 &pkcs7_structure, &signer_certificate, hash, hash_len);
690 }
691
692 mbedtls_pkcs7_free(&pkcs7_structure);
693 }
694
695 mbedtls_x509_crt_free(&signer_certificate);
696 }
697
698 free(signature_cert);
699 free(hash);
700 free(public_key_cert);
701
702 /* Provide the result of the verification */
703 req->service_status = mbedtls_status;
704
705 return rpc_status;
706}