blob: 4ad4be00702aa8a2cfd1b9bf552c67ee2498ca84 [file] [log] [blame]
Brad Bishopbec4ebc2022-08-03 09:55:16 -04001From 55463b12cca39d2c6a3fd18bbd3d28ae95dff8cf Mon Sep 17 00:00:00 2001
2From: Satish Kumar <satish.kumar01@arm.com>
3Date: Mon, 14 Feb 2022 08:22:25 +0000
4Subject: [PATCH] Fixes in AEAD for psa-arch test 54 and 58.
5
6Signed-off-by: Satish Kumar <satish.kumar01@arm.com>
7
8Upstream-Status: Pending [Not submitted to upstream yet]
9Signed-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
21diff --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
22index 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 */
33diff --git a/components/service/crypto/include/psa/crypto_sizes.h b/components/service/crypto/include/psa/crypto_sizes.h
34index 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 *
46diff --git a/components/service/crypto/provider/extension/aead/aead_provider.c b/components/service/crypto/provider/extension/aead/aead_provider.c
47index 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,
77diff --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
78index 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,
89diff --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
90index 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,
109diff --git a/protocols/service/crypto/packed-c/aead.h b/protocols/service/crypto/packed-c/aead.h
110index 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 */