Fix initial PSA Crypto API test failures
Before adding support for new crypto operations, this commit fixes
some PSA arch test failures when run against the Crypto trusted
service. There are other test failures but these are either due
to missing functionaility or test case issues.
Signed-off-by: Julian Hall <julian.hall@arm.com>
Change-Id: I1cea59d4861c1ecbb804d5ceff69a8b7018ac62d
diff --git a/components/service/crypto/client/psa/psa_copy_key.c b/components/service/crypto/client/psa/psa_copy_key.c
index 6b95df6..3f3c46f 100644
--- a/components/service/crypto/client/psa/psa_copy_key.c
+++ b/components/service/crypto/client/psa/psa_copy_key.c
@@ -21,6 +21,9 @@
struct ts_crypto_copy_key_in req_msg;
size_t req_len = sizeof(struct ts_crypto_copy_key_in);
+ /* Set default outputs for failure case */
+ *target_key = 0;
+
if (psa_crypto_client_instance.init_status != PSA_SUCCESS)
return psa_crypto_client_instance.init_status;
diff --git a/components/service/crypto/client/psa/psa_crypto_client_key_attributes.c b/components/service/crypto/client/psa/psa_crypto_client_key_attributes.c
index 35ad8f8..b257218 100644
--- a/components/service/crypto/client/psa/psa_crypto_client_key_attributes.c
+++ b/components/service/crypto/client/psa/psa_crypto_client_key_attributes.c
@@ -35,10 +35,10 @@
/*
* The key attributes structure used on the client API doesn't
- * contain an dynamically allocated members so resetting it is
- * a nop.
+ * contain an dynamically allocated members so resetting it just
+ * requires the structure to be set to its initial value.
*/
void psa_reset_key_attributes(psa_key_attributes_t *attributes)
{
- /* Nothing to free for client structure */
+ *attributes = psa_key_attributes_init();
}
diff --git a/components/service/crypto/client/psa/psa_generate_key.c b/components/service/crypto/client/psa/psa_generate_key.c
index 425c145..1b76c87 100644
--- a/components/service/crypto/client/psa/psa_generate_key.c
+++ b/components/service/crypto/client/psa/psa_generate_key.c
@@ -21,6 +21,9 @@
struct ts_crypto_generate_key_in req_msg;
size_t req_len = sizeof(struct ts_crypto_generate_key_in);
+ /* Set default outputs for failure case */
+ *id = 0;
+
if (psa_crypto_client_instance.init_status != PSA_SUCCESS)
return psa_crypto_client_instance.init_status;
diff --git a/components/service/crypto/client/psa/psa_import_key.c b/components/service/crypto/client/psa/psa_import_key.c
index ae59693..ad2346e 100644
--- a/components/service/crypto/client/psa/psa_import_key.c
+++ b/components/service/crypto/client/psa/psa_import_key.c
@@ -24,6 +24,9 @@
size_t req_fixed_len = sizeof(struct ts_crypto_import_key_in);
size_t req_len = req_fixed_len + tlv_required_space(data_length);
+ /* Set default outputs for failure case */
+ *id = 0;
+
if (psa_crypto_client_instance.init_status != PSA_SUCCESS)
return psa_crypto_client_instance.init_status;
diff --git a/components/service/crypto/provider/crypto_provider.c b/components/service/crypto/provider/crypto_provider.c
index fafd6c7..c3d55b5 100644
--- a/components/service/crypto/provider/crypto_provider.c
+++ b/components/service/crypto/provider/crypto_provider.c
@@ -177,24 +177,36 @@
psa_get_key_type(&attributes),
psa_get_key_bits(&attributes));
- uint8_t *key_buffer = malloc(max_export_size);
+ if (max_export_size) {
- if (key_buffer) {
+ uint8_t *key_buffer = malloc(max_export_size);
- size_t export_size;
- psa_status = psa_export_key(id, key_buffer, max_export_size, &export_size);
+ if (key_buffer) {
- if (psa_status == PSA_SUCCESS) {
+ size_t export_size;
+ psa_status_t psa_status = psa_export_key(id, key_buffer,
+ max_export_size, &export_size);
- struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
- rpc_status = serializer->serialize_export_key_resp(resp_buf, key_buffer, export_size);
+ if (psa_status == PSA_SUCCESS) {
+
+ struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
+ rpc_status = serializer->serialize_export_key_resp(resp_buf,
+ key_buffer, export_size);
+ }
+
+ free(key_buffer);
}
-
- free(key_buffer);
+ else {
+ /* Failed to allocate key buffer */
+ rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
+ }
}
else {
- /* Failed to allocate key buffer */
- rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
+
+ /* No sensible export size was returned so
+ * key attributes must be in an invalid state.
+ */
+ psa_status = PSA_ERROR_GENERIC_ERROR;
}
}
@@ -218,40 +230,29 @@
if (rpc_status == TS_RPC_CALL_ACCEPTED) {
- psa_status_t psa_status;
- psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
+ size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_MAX_SIZE;
+ uint8_t *key_buffer = malloc(max_export_size);
- psa_status = psa_get_key_attributes(id, &attributes);
+ if (key_buffer) {
- if (psa_status == PSA_SUCCESS) {
+ size_t export_size;
+ psa_status_t psa_status = psa_export_public_key(id, key_buffer,
+ max_export_size, &export_size);
- size_t max_export_size = PSA_EXPORT_PUBLIC_KEY_OUTPUT_SIZE(
- PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(psa_get_key_type(&attributes)),
- psa_get_key_bits(&attributes));
+ if (psa_status == PSA_SUCCESS) {
- uint8_t *key_buffer = malloc(max_export_size);
-
- if (key_buffer) {
-
- size_t export_size;
- psa_status = psa_export_public_key(id, key_buffer, max_export_size, &export_size);
-
- if (psa_status == PSA_SUCCESS) {
-
- struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
- rpc_status = serializer->serialize_export_public_key_resp(resp_buf, key_buffer, export_size);
- }
-
- free(key_buffer);
+ struct call_param_buf *resp_buf = call_req_get_resp_buf(req);
+ rpc_status = serializer->serialize_export_public_key_resp(resp_buf,
+ key_buffer, export_size);
}
- else {
- /* Failed to allocate key buffer */
- rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
- }
+
+ free(key_buffer);
+ call_req_set_opstatus(req, psa_status);
}
-
- call_req_set_opstatus(req, psa_status);
- psa_reset_key_attributes(&attributes);
+ else {
+ /* Failed to allocate key buffer */
+ rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
+ }
}
return rpc_status;
@@ -271,7 +272,8 @@
if (key_buffer) {
psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
- rpc_status = serializer->deserialize_import_key_req(req_buf, &attributes, key_buffer, &key_data_len);
+ rpc_status = serializer->deserialize_import_key_req(req_buf, &attributes,
+ key_buffer, &key_data_len);
if (rpc_status == TS_RPC_CALL_ACCEPTED) {