Crypto: Further optimize crypto interface
- Simplify crypto function SID. Each uint16_t SID consists of function
ID and group ID, without multi-part operation flags.
- Remove multi-part operation flags and relevant functions.
- Simplify group interface dispatcher in crypto_init.c
- Simplify operation handlings for multi-part steps to make the logic
more reader friendly.
- Refine the input/output vectors in psa_hash_clone() otherwise the
frontend and backend operation definitions will be mixed.
Change-Id: If45bd1c5e84364e4a4424c5d2843e151e1161d1a
Signed-off-by: David Hu <david.hu@arm.com>
diff --git a/interface/include/tfm_crypto_defs.h b/interface/include/tfm_crypto_defs.h
index 1d26c06..b5e65d5 100644
--- a/interface/include/tfm_crypto_defs.h
+++ b/interface/include/tfm_crypto_defs.h
@@ -33,10 +33,6 @@
*
*/
struct tfm_crypto_pack_iovec {
- uint32_t function_id; /*!< Used to identify the function in the
- * API dispatcher to the service backend
- */
- uint16_t step; /*!< Key derivation step */
psa_key_id_t key_id; /*!< Key id */
psa_algorithm_t alg; /*!< Algorithm */
uint32_t op_handle; /*!< Frontend context handle associated to a
@@ -47,220 +43,211 @@
size_t plaintext_length; /*!< Plaintext length for multipart AEAD */
struct tfm_crypto_aead_pack_input aead_in; /*!< Packs AEAD-related inputs */
+
+ uint16_t function_id; /*!< Used to identify the function in the
+ * API dispatcher to the service backend
+ * See tfm_crypto_func_sid for detail
+ */
+ uint16_t step; /*!< Key derivation step */
};
/**
- * \brief X macro describing each of the available PSA Crypto APIs in terms of
- * group ID (\ref tfm_crypto_group_id) and multipart function type
- * (\ref tfm_crypto_function_type)
+ * \brief Type associated to the group of a function encoding. There can be
+ * nine groups (Random, Key management, Hash, MAC, Cipher, AEAD,
+ * Asym sign, Asym encrypt, Key derivation).
*/
-#define TFM_CRYPTO_SERVICE_API_DESCRIPTION \
- X(TFM_CRYPTO_GET_KEY_ATTRIBUTES_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_RESET_KEY_ATTRIBUTES_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_OPEN_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_CLOSE_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_IMPORT_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_DESTROY_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_EXPORT_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_EXPORT_PUBLIC_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_PURGE_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_COPY_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_GENERATE_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_HASH_COMPUTE_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_HASH_COMPARE_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_HASH_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_HASH_UPDATE_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_HASH_CLONE_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_HASH_FINISH_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_HASH_VERIFY_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_HASH_ABORT_SID, \
- TFM_CRYPTO_GROUP_ID_HASH, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_MAC_COMPUTE_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_MAC_VERIFY_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_MAC_SIGN_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_MAC_VERIFY_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_MAC_UPDATE_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_MAC_SIGN_FINISH_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_MAC_VERIFY_FINISH_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_MAC_ABORT_SID, \
- TFM_CRYPTO_GROUP_ID_MAC, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_CIPHER_ENCRYPT_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_CIPHER_DECRYPT_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_CIPHER_ENCRYPT_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_CIPHER_DECRYPT_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_CIPHER_GENERATE_IV_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_CIPHER_SET_IV_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_CIPHER_UPDATE_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_CIPHER_FINISH_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_CIPHER_ABORT_SID, \
- TFM_CRYPTO_GROUP_ID_CIPHER, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_ENCRYPT_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_AEAD_DECRYPT_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_AEAD_ENCRYPT_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_AEAD_DECRYPT_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_AEAD_GENERATE_NONCE_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_SET_NONCE_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_SET_LENGTHS_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_UPDATE_AD_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_UPDATE_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_FINISH_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_VERIFY_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_AEAD_ABORT_SID, \
- TFM_CRYPTO_GROUP_ID_AEAD, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE_SID, \
- TFM_CRYPTO_GROUP_ID_ASYM_SIGN, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE_SID, \
- TFM_CRYPTO_GROUP_ID_ASYM_SIGN, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_ASYMMETRIC_SIGN_HASH_SID, \
- TFM_CRYPTO_GROUP_ID_ASYM_SIGN, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH_SID, \
- TFM_CRYPTO_GROUP_ID_ASYM_SIGN, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_ASYMMETRIC_ENCRYPT_SID, \
- TFM_CRYPTO_GROUP_ID_ASYM_ENCRYPT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_ASYMMETRIC_DECRYPT_SID, \
- TFM_CRYPTO_GROUP_ID_ASYM_ENCRYPT, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_RAW_KEY_AGREEMENT_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_KEY_DERIVATION_SETUP_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_SETUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_KEY_DERIVATION_ABORT_SID, \
- TFM_CRYPTO_GROUP_ID_KEY_DERIVATION, \
- TFM_CRYPTO_FUNCTION_TYPE_LOOKUP) \
- X(TFM_CRYPTO_GENERATE_RANDOM_SID, \
- TFM_CRYPTO_GROUP_ID_RANDOM, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
- X(TFM_CRYPTO_API_DISPATCHER_SID, \
- TFM_CRYPTO_GROUP_ID_RANDOM, \
- TFM_CRYPTO_FUNCTION_TYPE_NON_MULTIPART) \
-/**
- * \brief Numerical progressive value identifying a function API exposed through
- * the interfaces (S or NS). It's used to dispatch the requests from S/NS
- * to the corresponding API implementation in the Crypto service backend.
+enum tfm_crypto_group_id {
+ TFM_CRYPTO_GROUP_ID_RANDOM = 0x0,
+ TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT,
+ TFM_CRYPTO_GROUP_ID_HASH,
+ TFM_CRYPTO_GROUP_ID_MAC,
+ TFM_CRYPTO_GROUP_ID_CIPHER,
+ TFM_CRYPTO_GROUP_ID_AEAD,
+ TFM_CRYPTO_GROUP_ID_ASYM_SIGN,
+ TFM_CRYPTO_GROUP_ID_ASYM_ENCRYPT,
+ TFM_CRYPTO_GROUP_ID_KEY_DERIVATION,
+};
+
+/* X macro describing each of the available PSA Crypto APIs */
+#define KEY_MANAGEMENT_FUNCS \
+ X(TFM_CRYPTO_GET_KEY_ATTRIBUTES) \
+ X(TFM_CRYPTO_RESET_KEY_ATTRIBUTES) \
+ X(TFM_CRYPTO_OPEN_KEY) \
+ X(TFM_CRYPTO_CLOSE_KEY) \
+ X(TFM_CRYPTO_IMPORT_KEY) \
+ X(TFM_CRYPTO_DESTROY_KEY) \
+ X(TFM_CRYPTO_EXPORT_KEY) \
+ X(TFM_CRYPTO_EXPORT_PUBLIC_KEY) \
+ X(TFM_CRYPTO_PURGE_KEY) \
+ X(TFM_CRYPTO_COPY_KEY) \
+ X(TFM_CRYPTO_GENERATE_KEY)
+
+#define HASH_FUNCS \
+ X(TFM_CRYPTO_HASH_COMPUTE) \
+ X(TFM_CRYPTO_HASH_COMPARE) \
+ X(TFM_CRYPTO_HASH_SETUP) \
+ X(TFM_CRYPTO_HASH_UPDATE) \
+ X(TFM_CRYPTO_HASH_CLONE) \
+ X(TFM_CRYPTO_HASH_FINISH) \
+ X(TFM_CRYPTO_HASH_VERIFY) \
+ X(TFM_CRYPTO_HASH_ABORT)
+
+#define MAC_FUNCS \
+ X(TFM_CRYPTO_MAC_COMPUTE) \
+ X(TFM_CRYPTO_MAC_VERIFY) \
+ X(TFM_CRYPTO_MAC_SIGN_SETUP) \
+ X(TFM_CRYPTO_MAC_VERIFY_SETUP) \
+ X(TFM_CRYPTO_MAC_UPDATE) \
+ X(TFM_CRYPTO_MAC_SIGN_FINISH) \
+ X(TFM_CRYPTO_MAC_VERIFY_FINISH) \
+ X(TFM_CRYPTO_MAC_ABORT)
+
+#define CIPHER_FUNCS \
+ X(TFM_CRYPTO_CIPHER_ENCRYPT) \
+ X(TFM_CRYPTO_CIPHER_DECRYPT) \
+ X(TFM_CRYPTO_CIPHER_ENCRYPT_SETUP) \
+ X(TFM_CRYPTO_CIPHER_DECRYPT_SETUP) \
+ X(TFM_CRYPTO_CIPHER_GENERATE_IV) \
+ X(TFM_CRYPTO_CIPHER_SET_IV) \
+ X(TFM_CRYPTO_CIPHER_UPDATE) \
+ X(TFM_CRYPTO_CIPHER_FINISH) \
+ X(TFM_CRYPTO_CIPHER_ABORT)
+
+#define AEAD_FUNCS \
+ X(TFM_CRYPTO_AEAD_ENCRYPT) \
+ X(TFM_CRYPTO_AEAD_DECRYPT) \
+ X(TFM_CRYPTO_AEAD_ENCRYPT_SETUP) \
+ X(TFM_CRYPTO_AEAD_DECRYPT_SETUP) \
+ X(TFM_CRYPTO_AEAD_GENERATE_NONCE) \
+ X(TFM_CRYPTO_AEAD_SET_NONCE) \
+ X(TFM_CRYPTO_AEAD_SET_LENGTHS) \
+ X(TFM_CRYPTO_AEAD_UPDATE_AD) \
+ X(TFM_CRYPTO_AEAD_UPDATE) \
+ X(TFM_CRYPTO_AEAD_FINISH) \
+ X(TFM_CRYPTO_AEAD_VERIFY) \
+ X(TFM_CRYPTO_AEAD_ABORT)
+
+#define ASYMMETRIC_SIGN_FUNCS \
+ X(TFM_CRYPTO_ASYMMETRIC_SIGN_MESSAGE) \
+ X(TFM_CRYPTO_ASYMMETRIC_VERIFY_MESSAGE) \
+ X(TFM_CRYPTO_ASYMMETRIC_SIGN_HASH) \
+ X(TFM_CRYPTO_ASYMMETRIC_VERIFY_HASH)
+
+#define AYSMMETRIC_ENCRYPT_FUNCS \
+ X(TFM_CRYPTO_ASYMMETRIC_ENCRYPT) \
+ X(TFM_CRYPTO_ASYMMETRIC_DECRYPT)
+
+#define KEY_DERIVATION_FUNCS \
+ X(TFM_CRYPTO_RAW_KEY_AGREEMENT) \
+ X(TFM_CRYPTO_KEY_DERIVATION_SETUP) \
+ X(TFM_CRYPTO_KEY_DERIVATION_GET_CAPACITY) \
+ X(TFM_CRYPTO_KEY_DERIVATION_SET_CAPACITY) \
+ X(TFM_CRYPTO_KEY_DERIVATION_INPUT_BYTES) \
+ X(TFM_CRYPTO_KEY_DERIVATION_INPUT_KEY) \
+ X(TFM_CRYPTO_KEY_DERIVATION_KEY_AGREEMENT) \
+ X(TFM_CRYPTO_KEY_DERIVATION_OUTPUT_BYTES) \
+ X(TFM_CRYPTO_KEY_DERIVATION_OUTPUT_KEY) \
+ X(TFM_CRYPTO_KEY_DERIVATION_ABORT)
+
+#define RANDOM_FUNCS \
+ X(TFM_CRYPTO_GENERATE_RANDOM)
+
+/*
+ * Define function IDs in each group. The function ID will be encoded into
+ * tfm_crypto_func_sid below.
+ * Each group is defined as a dedicated enum in case the total number of
+ * PSA Crypto APIs exceeds 256.
*/
-#define X(function_id, group_id, function_type) function_id,
-enum tfm_crypto_function_id {
- TFM_CRYPTO_SERVICE_API_DESCRIPTION
+#define X(func_id) func_id,
+enum tfm_crypto_key_management_func_id {
+ KEY_MANAGEMENT_FUNCS
+};
+enum tfm_crypto_hash_func_id {
+ HASH_FUNCS
+};
+enum tfm_crypto_mac_func_id {
+ MAC_FUNCS
+};
+enum tfm_crypto_cipher_func_id {
+ CIPHER_FUNCS
+};
+enum tfm_crypto_aead_func_id {
+ AEAD_FUNCS
+};
+enum tfm_crypto_asym_sign_func_id {
+ ASYMMETRIC_SIGN_FUNCS
+};
+enum tfm_crypto_asym_encrypt_func_id {
+ AYSMMETRIC_ENCRYPT_FUNCS
+};
+enum tfm_crypto_key_derivation_func_id {
+ KEY_DERIVATION_FUNCS
+};
+enum tfm_crypto_random_func_id {
+ RANDOM_FUNCS
+};
+#undef X
+
+#define FUNC_ID(func_id) (((func_id) & 0xFF) << 8)
+
+/*
+ * Numerical progressive value identifying a function API exposed through
+ * the interfaces (S or NS). It's used to dispatch the requests from S/NS
+ * to the corresponding API implementation in the Crypto service backend.
+ *
+ * Each function SID is encoded as uint16_t.
+ * | Func ID | Group ID |
+ * 15 8 7 0
+ * Func ID is defined in each group func_id enum above
+ * Group ID is defined in tfm_crypto_group_id.
+ */
+enum tfm_crypto_func_sid {
+
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT & 0xFF)),
+
+ KEY_MANAGEMENT_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_HASH & 0xFF)),
+ HASH_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_MAC & 0xFF)),
+ MAC_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_CIPHER & 0xFF)),
+ CIPHER_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_AEAD & 0xFF)),
+ AEAD_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_ASYM_SIGN & 0xFF)),
+ ASYMMETRIC_SIGN_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_ASYM_ENCRYPT & 0xFF)),
+ AYSMMETRIC_ENCRYPT_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_KEY_DERIVATION & 0xFF)),
+ KEY_DERIVATION_FUNCS
+
+#undef X
+#define X(func_id) func_id ## _SID = (uint16_t)((FUNC_ID(func_id)) | \
+ (TFM_CRYPTO_GROUP_ID_RANDOM & 0xFF)),
+ RANDOM_FUNCS
+
};
#undef X
diff --git a/interface/src/tfm_crypto_func_api.c b/interface/src/tfm_crypto_func_api.c
index 66615fd..12a3ef4 100644
--- a/interface/src/tfm_crypto_func_api.c
+++ b/interface/src/tfm_crypto_func_api.c
@@ -469,17 +469,20 @@
.op_handle = source_operation->handle,
};
- psa_invec in_vec[] = {
- {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
- };
- psa_outvec out_vec[] = {
- {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
- };
-
if (target_operation && (target_operation->handle != 0)) {
return PSA_ERROR_BAD_STATE;
}
+ psa_invec in_vec[] = {
+ {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
+ {.base = &(target_operation->handle),
+ .len = sizeof(target_operation->handle)},
+ };
+ psa_outvec out_vec[] = {
+ {.base = &(target_operation->handle),
+ .len = sizeof(target_operation->handle)},
+ };
+
return API_DISPATCH(in_vec, out_vec);
}
diff --git a/interface/src/tfm_crypto_ipc_api.c b/interface/src/tfm_crypto_ipc_api.c
index cd1f7f5..833e948 100644
--- a/interface/src/tfm_crypto_ipc_api.c
+++ b/interface/src/tfm_crypto_ipc_api.c
@@ -469,17 +469,20 @@
.op_handle = source_operation->handle,
};
- psa_invec in_vec[] = {
- {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
- };
- psa_outvec out_vec[] = {
- {.base = target_operation, .len = sizeof(psa_hash_operation_t)},
- };
-
if (target_operation && (target_operation->handle != 0)) {
return PSA_ERROR_BAD_STATE;
}
+ psa_invec in_vec[] = {
+ {.base = &iov, .len = sizeof(struct tfm_crypto_pack_iovec)},
+ {.base = &(target_operation->handle),
+ .len = sizeof(target_operation->handle)},
+ };
+ psa_outvec out_vec[] = {
+ {.base = &(target_operation->handle),
+ .len = sizeof(target_operation->handle)},
+ };
+
return API_DISPATCH(in_vec, out_vec);
}