Fix key export handling in crypto provider
Running PSA arch tests has identified a bug in the error handling
for the export key operation. This commit fixes the error
handling.
Signed-off-by: Julian Hall <julian.hall@arm.com>
Change-Id: I8a6d10ebe7b50a8c02a6ed50a4fcb56e2f5708ad
diff --git a/components/service/crypto/provider/crypto_provider.c b/components/service/crypto/provider/crypto_provider.c
index ea9cce6..d0fc7ca 100644
--- a/components/service/crypto/provider/crypto_provider.c
+++ b/components/service/crypto/provider/crypto_provider.c
@@ -158,52 +158,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_KEY_PAIR_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_key(id, key_buffer,
+ max_export_size, &export_size);
- size_t max_export_size = PSA_EXPORT_KEY_OUTPUT_SIZE(
- psa_get_key_type(&attributes),
- psa_get_key_bits(&attributes));
+ if (psa_status == PSA_SUCCESS) {
- if (max_export_size) {
-
- uint8_t *key_buffer = malloc(max_export_size);
-
- if (key_buffer) {
-
- size_t export_size;
- psa_status_t psa_status = psa_export_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_key_resp(resp_buf,
- key_buffer, export_size);
- }
-
- free(key_buffer);
- }
- else {
- /* Failed to allocate key buffer */
- rpc_status = TS_RPC_ERROR_RESOURCE_FAILURE;
- }
+ 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);
}
- else {
- /* No sensible export size was returned so
- * key attributes must be in an invalid state.
- */
- psa_status = PSA_ERROR_GENERIC_ERROR;
- }
+ 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;