Brad Bishop | bec4ebc | 2022-08-03 09:55:16 -0400 | [diff] [blame] | 1 | From 55463b12cca39d2c6a3fd18bbd3d28ae95dff8cf Mon Sep 17 00:00:00 2001 |
| 2 | From: Satish Kumar <satish.kumar01@arm.com> |
| 3 | Date: Mon, 14 Feb 2022 08:22:25 +0000 |
| 4 | Subject: [PATCH] Fixes in AEAD for psa-arch test 54 and 58. |
| 5 | |
| 6 | Signed-off-by: Satish Kumar <satish.kumar01@arm.com> |
| 7 | |
| 8 | Upstream-Status: Pending [Not submitted to upstream yet] |
| 9 | Signed-off-by: Emekcan Aras <Emekcan.Aras@arm.com> |
| 10 | |
| 11 | |
| 12 | --- |
| 13 | .../crypto/client/caller/packed-c/crypto_caller_aead.h | 1 + |
| 14 | components/service/crypto/include/psa/crypto_sizes.h | 2 +- |
| 15 | .../crypto/provider/extension/aead/aead_provider.c | 8 ++++++-- |
| 16 | .../extension/aead/serializer/aead_provider_serializer.h | 1 + |
| 17 | .../packed-c/packedc_aead_provider_serializer.c | 2 ++ |
| 18 | protocols/service/crypto/packed-c/aead.h | 1 + |
| 19 | 6 files changed, 12 insertions(+), 3 deletions(-) |
| 20 | |
| 21 | diff --git a/components/service/crypto/client/caller/packed-c/crypto_caller_aead.h b/components/service/crypto/client/caller/packed-c/crypto_caller_aead.h |
| 22 | index c4ffb20c..a91f66c1 100644 |
| 23 | --- a/components/service/crypto/client/caller/packed-c/crypto_caller_aead.h |
| 24 | +++ b/components/service/crypto/client/caller/packed-c/crypto_caller_aead.h |
| 25 | @@ -309,6 +309,7 @@ static inline psa_status_t crypto_caller_aead_update(struct service_client *cont |
| 26 | size_t req_len = req_fixed_len; |
| 27 | |
| 28 | *output_length = 0; |
| 29 | + req_msg.output_size = output_size; |
| 30 | req_msg.op_handle = op_handle; |
| 31 | |
| 32 | /* Mandatory input data parameter */ |
| 33 | diff --git a/components/service/crypto/include/psa/crypto_sizes.h b/components/service/crypto/include/psa/crypto_sizes.h |
| 34 | index 4d7bf6e9..e3c4df29 100644 |
| 35 | --- a/components/service/crypto/include/psa/crypto_sizes.h |
| 36 | +++ b/components/service/crypto/include/psa/crypto_sizes.h |
| 37 | @@ -351,7 +351,7 @@ |
| 38 | * just the largest size that may be generated by |
| 39 | * #psa_aead_generate_nonce(). |
| 40 | */ |
| 41 | -#define PSA_AEAD_NONCE_MAX_SIZE 12 |
| 42 | +#define PSA_AEAD_NONCE_MAX_SIZE 16 |
| 43 | |
| 44 | /** A sufficient output buffer size for psa_aead_update(). |
| 45 | * |
| 46 | diff --git a/components/service/crypto/provider/extension/aead/aead_provider.c b/components/service/crypto/provider/extension/aead/aead_provider.c |
| 47 | index 14a25436..6b144db8 100644 |
| 48 | --- a/components/service/crypto/provider/extension/aead/aead_provider.c |
| 49 | +++ b/components/service/crypto/provider/extension/aead/aead_provider.c |
| 50 | @@ -283,10 +283,11 @@ static rpc_status_t aead_update_handler(void *context, struct call_req *req) |
| 51 | uint32_t op_handle; |
| 52 | const uint8_t *input; |
| 53 | size_t input_len; |
| 54 | + uint32_t recv_output_size; |
| 55 | |
| 56 | if (serializer) |
| 57 | rpc_status = serializer->deserialize_aead_update_req(req_buf, &op_handle, |
| 58 | - &input, &input_len); |
| 59 | + &recv_output_size, &input, &input_len); |
| 60 | |
| 61 | if (rpc_status == TS_RPC_CALL_ACCEPTED) { |
| 62 | |
| 63 | @@ -300,9 +301,12 @@ static rpc_status_t aead_update_handler(void *context, struct call_req *req) |
| 64 | if (crypto_context) { |
| 65 | |
| 66 | size_t output_len = 0; |
| 67 | - size_t output_size = PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(input_len); |
| 68 | + size_t output_size = PSA_AEAD_UPDATE_OUTPUT_MAX_SIZE(24); |
| 69 | uint8_t *output = malloc(output_size); |
| 70 | |
| 71 | + if (recv_output_size < output_size) { |
| 72 | + output_size = recv_output_size; |
| 73 | + } |
| 74 | if (output) { |
| 75 | |
| 76 | psa_status = psa_aead_update(&crypto_context->op.aead, |
| 77 | diff --git a/components/service/crypto/provider/extension/aead/serializer/aead_provider_serializer.h b/components/service/crypto/provider/extension/aead/serializer/aead_provider_serializer.h |
| 78 | index bb1a2a97..0156aaba 100644 |
| 79 | --- a/components/service/crypto/provider/extension/aead/serializer/aead_provider_serializer.h |
| 80 | +++ b/components/service/crypto/provider/extension/aead/serializer/aead_provider_serializer.h |
| 81 | @@ -51,6 +51,7 @@ struct aead_provider_serializer { |
| 82 | /* Operation: aead_update */ |
| 83 | rpc_status_t (*deserialize_aead_update_req)(const struct call_param_buf *req_buf, |
| 84 | uint32_t *op_handle, |
| 85 | + uint32_t *output_size, |
| 86 | const uint8_t **input, size_t *input_len); |
| 87 | |
| 88 | rpc_status_t (*serialize_aead_update_resp)(struct call_param_buf *resp_buf, |
| 89 | diff --git a/components/service/crypto/provider/extension/aead/serializer/packed-c/packedc_aead_provider_serializer.c b/components/service/crypto/provider/extension/aead/serializer/packed-c/packedc_aead_provider_serializer.c |
| 90 | index 6f00b3e3..45c739ab 100644 |
| 91 | --- a/components/service/crypto/provider/extension/aead/serializer/packed-c/packedc_aead_provider_serializer.c |
| 92 | +++ b/components/service/crypto/provider/extension/aead/serializer/packed-c/packedc_aead_provider_serializer.c |
| 93 | @@ -192,6 +192,7 @@ static rpc_status_t deserialize_aead_update_ad_req(const struct call_param_buf * |
| 94 | /* Operation: aead_update */ |
| 95 | static rpc_status_t deserialize_aead_update_req(const struct call_param_buf *req_buf, |
| 96 | uint32_t *op_handle, |
| 97 | + uint32_t *output_size, |
| 98 | const uint8_t **input, size_t *input_len) |
| 99 | { |
| 100 | rpc_status_t rpc_status = TS_RPC_ERROR_INVALID_REQ_BODY; |
| 101 | @@ -208,6 +209,7 @@ static rpc_status_t deserialize_aead_update_req(const struct call_param_buf *req |
| 102 | memcpy(&recv_msg, req_buf->data, expected_fixed_len); |
| 103 | |
| 104 | *op_handle = recv_msg.op_handle; |
| 105 | + *output_size = recv_msg.output_size; |
| 106 | |
| 107 | tlv_const_iterator_begin(&req_iter, |
| 108 | (uint8_t*)req_buf->data + expected_fixed_len, |
| 109 | diff --git a/protocols/service/crypto/packed-c/aead.h b/protocols/service/crypto/packed-c/aead.h |
| 110 | index 0be266b5..435fd3b5 100644 |
| 111 | --- a/protocols/service/crypto/packed-c/aead.h |
| 112 | +++ b/protocols/service/crypto/packed-c/aead.h |
| 113 | @@ -98,6 +98,7 @@ enum |
| 114 | struct __attribute__ ((__packed__)) ts_crypto_aead_update_in |
| 115 | { |
| 116 | uint32_t op_handle; |
| 117 | + uint32_t output_size; |
| 118 | }; |
| 119 | |
| 120 | /* Variable length input parameter tags */ |