195511698STamas Ban /* 295511698STamas Ban * Copyright (c) 2022-2024, Arm Limited. All rights reserved. 395511698STamas Ban * 495511698STamas Ban * SPDX-License-Identifier: BSD-3-Clause 595511698STamas Ban * 695511698STamas Ban */ 795511698STamas Ban 895511698STamas Ban #include <assert.h> 995511698STamas Ban #include <string.h> 1095511698STamas Ban 1195511698STamas Ban #include <common/debug.h> 12*e249e569STamas Ban #include "rse_comms_protocol_common.h" 13*e249e569STamas Ban #include "rse_comms_protocol_embed.h" 1495511698STamas Ban 15*e249e569STamas Ban psa_status_t rse_protocol_embed_serialize_msg(psa_handle_t handle, 1695511698STamas Ban int16_t type, 1795511698STamas Ban const psa_invec *in_vec, 1895511698STamas Ban uint8_t in_len, 1995511698STamas Ban const psa_outvec *out_vec, 2095511698STamas Ban uint8_t out_len, 21*e249e569STamas Ban struct rse_embed_msg_t *msg, 2295511698STamas Ban size_t *msg_len) 2395511698STamas Ban { 2495511698STamas Ban uint32_t payload_size = 0; 2595511698STamas Ban uint32_t i; 2695511698STamas Ban 2795511698STamas Ban assert(msg != NULL); 2895511698STamas Ban assert(msg_len != NULL); 2995511698STamas Ban assert(in_vec != NULL); 3095511698STamas Ban 3195511698STamas Ban msg->ctrl_param = PARAM_PACK(type, in_len, out_len); 3295511698STamas Ban msg->handle = handle; 3395511698STamas Ban 3495511698STamas Ban /* Fill msg iovec lengths */ 3595511698STamas Ban for (i = 0U; i < in_len; ++i) { 3695511698STamas Ban msg->io_size[i] = in_vec[i].len; 3795511698STamas Ban } 3895511698STamas Ban for (i = 0U; i < out_len; ++i) { 3995511698STamas Ban msg->io_size[in_len + i] = out_vec[i].len; 4095511698STamas Ban } 4195511698STamas Ban 4295511698STamas Ban for (i = 0U; i < in_len; ++i) { 4395511698STamas Ban if (in_vec[i].len > sizeof(msg->trailer) - payload_size) { 4495511698STamas Ban return PSA_ERROR_INVALID_ARGUMENT; 4595511698STamas Ban } 4695511698STamas Ban memcpy(msg->trailer + payload_size, 4795511698STamas Ban in_vec[i].base, 4895511698STamas Ban in_vec[i].len); 4995511698STamas Ban payload_size += in_vec[i].len; 5095511698STamas Ban } 5195511698STamas Ban 5295511698STamas Ban /* Output the actual size of the message, to optimize sending */ 5395511698STamas Ban *msg_len = sizeof(*msg) - sizeof(msg->trailer) + payload_size; 5495511698STamas Ban 5595511698STamas Ban return PSA_SUCCESS; 5695511698STamas Ban } 5795511698STamas Ban 58*e249e569STamas Ban psa_status_t rse_protocol_embed_deserialize_reply(psa_outvec *out_vec, 5995511698STamas Ban uint8_t out_len, 6095511698STamas Ban psa_status_t *return_val, 61*e249e569STamas Ban const struct rse_embed_reply_t *reply, 6295511698STamas Ban size_t reply_size) 6395511698STamas Ban { 6495511698STamas Ban uint32_t payload_offset = 0; 6595511698STamas Ban uint32_t i; 6695511698STamas Ban 6795511698STamas Ban assert(reply != NULL); 6895511698STamas Ban assert(return_val != NULL); 6995511698STamas Ban 7095511698STamas Ban for (i = 0U; i < out_len; ++i) { 7195511698STamas Ban if ((sizeof(*reply) - sizeof(reply->trailer) + payload_offset) 7295511698STamas Ban > reply_size) { 7395511698STamas Ban return PSA_ERROR_INVALID_ARGUMENT; 7495511698STamas Ban } 7595511698STamas Ban 7695511698STamas Ban memcpy(out_vec[i].base, 7795511698STamas Ban reply->trailer + payload_offset, 7895511698STamas Ban reply->out_size[i]); 7995511698STamas Ban out_vec[i].len = reply->out_size[i]; 8095511698STamas Ban payload_offset += reply->out_size[i]; 8195511698STamas Ban } 8295511698STamas Ban 8395511698STamas Ban *return_val = reply->return_val; 8495511698STamas Ban 8595511698STamas Ban return PSA_SUCCESS; 8695511698STamas Ban } 87