Crypto: tfm_crypto_api_dispatcher() is non-public
The tfm_crypto_api_dispatcher() function is called by
code serving the SFN requests coming from the SPM so
it does not need to be a public function documented in
the tfm_crypto_api.h header.
Signed-off-by: Antonio de Angelis <antonio.deangelis@arm.com>
Change-Id: If5d0dc0bf9427a7dcaa65505d22be6084895ef91
diff --git a/secure_fw/partitions/crypto/crypto_init.c b/secure_fw/partitions/crypto/crypto_init.c
index 1854b8f..e6557c8 100644
--- a/secure_fw/partitions/crypto/crypto_init.c
+++ b/secure_fw/partitions/crypto/crypto_init.c
@@ -187,6 +187,71 @@
}
#endif /* PSA_FRAMEWORK_HAS_MM_IOVEC == 1 */
+static psa_status_t tfm_crypto_api_dispatcher(psa_invec in_vec[],
+ size_t in_len,
+ psa_outvec out_vec[],
+ size_t out_len)
+{
+ psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
+ const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
+ int32_t caller_id = 0;
+ struct tfm_crypto_key_id_s encoded_key = TFM_CRYPTO_KEY_ID_S_INIT;
+ bool is_key_required = false;
+ enum tfm_crypto_group_id_t group_id;
+
+ if (in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) {
+ return PSA_ERROR_PROGRAMMER_ERROR;
+ }
+
+ group_id = TFM_CRYPTO_GET_GROUP_ID(iov->function_id);
+
+ is_key_required = !((group_id == TFM_CRYPTO_GROUP_ID_HASH) ||
+ (group_id == TFM_CRYPTO_GROUP_ID_RANDOM));
+
+ if (is_key_required) {
+ status = tfm_crypto_get_caller_id(&caller_id);
+ if (status != PSA_SUCCESS) {
+ return status;
+ }
+ /* The caller_id being set in the owner field is the partition ID
+ * of the calling partition
+ */
+ encoded_key.key_id = iov->key_id;
+ encoded_key.owner = caller_id;
+ }
+
+ /* Dispatch to each sub-module based on the Group ID */
+ switch (group_id) {
+ case TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT:
+ return tfm_crypto_key_management_interface(in_vec, out_vec,
+ &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_HASH:
+ return tfm_crypto_hash_interface(in_vec, out_vec);
+ case TFM_CRYPTO_GROUP_ID_MAC:
+ return tfm_crypto_mac_interface(in_vec, out_vec, &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_CIPHER:
+ return tfm_crypto_cipher_interface(in_vec, out_vec, &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_AEAD:
+ return tfm_crypto_aead_interface(in_vec, out_vec, &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_ASYM_SIGN:
+ return tfm_crypto_asymmetric_sign_interface(in_vec, out_vec,
+ &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_ASYM_ENCRYPT:
+ return tfm_crypto_asymmetric_encrypt_interface(in_vec, out_vec,
+ &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_KEY_DERIVATION:
+ return tfm_crypto_key_derivation_interface(in_vec, out_vec,
+ &encoded_key);
+ case TFM_CRYPTO_GROUP_ID_RANDOM:
+ return tfm_crypto_random_interface(in_vec, out_vec);
+ default:
+ LOG_ERRFMT("[ERR][Crypto] Unsupported request!\r\n");
+ return PSA_ERROR_NOT_SUPPORTED;
+ }
+
+ return PSA_ERROR_NOT_SUPPORTED;
+}
+
static psa_status_t tfm_crypto_call_srv(const psa_msg_t *msg)
{
psa_status_t status = PSA_SUCCESS;
@@ -298,6 +363,18 @@
return tfm_crypto_init_alloc();
}
+/*!
+ * \defgroup init This group implements the partition initilisation
+ * function to be called during TF-M boot, and the SFN
+ * servicing call to be called when a SFN request needs
+ * to be handled by the SPM. When built in IPC mode, the
+ * SPM directly provides a scheduling handler that deals
+ * with messages and calls the SFN entry point below just
+ * when needed, i.e. no need for a dedicated message handler
+ * needs to be implemented here
+ */
+
+/*!@{*/
psa_status_t tfm_crypto_init(void)
{
psa_status_t status;
@@ -329,68 +406,4 @@
return PSA_ERROR_GENERIC_ERROR;
}
-
-psa_status_t tfm_crypto_api_dispatcher(psa_invec in_vec[],
- size_t in_len,
- psa_outvec out_vec[],
- size_t out_len)
-{
- psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
- const struct tfm_crypto_pack_iovec *iov = in_vec[0].base;
- int32_t caller_id = 0;
- struct tfm_crypto_key_id_s encoded_key = TFM_CRYPTO_KEY_ID_S_INIT;
- bool is_key_required = false;
- enum tfm_crypto_group_id_t group_id;
-
- if (in_vec[0].len != sizeof(struct tfm_crypto_pack_iovec)) {
- return PSA_ERROR_PROGRAMMER_ERROR;
- }
-
- group_id = TFM_CRYPTO_GET_GROUP_ID(iov->function_id);
-
- is_key_required = !((group_id == TFM_CRYPTO_GROUP_ID_HASH) ||
- (group_id == TFM_CRYPTO_GROUP_ID_RANDOM));
-
- if (is_key_required) {
- status = tfm_crypto_get_caller_id(&caller_id);
- if (status != PSA_SUCCESS) {
- return status;
- }
- /* The caller_id being set in the owner field is the partition ID
- * of the calling partition
- */
- encoded_key.key_id = iov->key_id;
- encoded_key.owner = caller_id;
- }
-
- /* Dispatch to each sub-module based on the Group ID */
- switch (group_id) {
- case TFM_CRYPTO_GROUP_ID_KEY_MANAGEMENT:
- return tfm_crypto_key_management_interface(in_vec, out_vec,
- &encoded_key);
- case TFM_CRYPTO_GROUP_ID_HASH:
- return tfm_crypto_hash_interface(in_vec, out_vec);
- case TFM_CRYPTO_GROUP_ID_MAC:
- return tfm_crypto_mac_interface(in_vec, out_vec, &encoded_key);
- case TFM_CRYPTO_GROUP_ID_CIPHER:
- return tfm_crypto_cipher_interface(in_vec, out_vec, &encoded_key);
- case TFM_CRYPTO_GROUP_ID_AEAD:
- return tfm_crypto_aead_interface(in_vec, out_vec, &encoded_key);
- case TFM_CRYPTO_GROUP_ID_ASYM_SIGN:
- return tfm_crypto_asymmetric_sign_interface(in_vec, out_vec,
- &encoded_key);
- case TFM_CRYPTO_GROUP_ID_ASYM_ENCRYPT:
- return tfm_crypto_asymmetric_encrypt_interface(in_vec, out_vec,
- &encoded_key);
- case TFM_CRYPTO_GROUP_ID_KEY_DERIVATION:
- return tfm_crypto_key_derivation_interface(in_vec, out_vec,
- &encoded_key);
- case TFM_CRYPTO_GROUP_ID_RANDOM:
- return tfm_crypto_random_interface(in_vec, out_vec);
- default:
- LOG_ERRFMT("[ERR][Crypto] Unsupported request!\r\n");
- return PSA_ERROR_NOT_SUPPORTED;
- }
-
- return PSA_ERROR_NOT_SUPPORTED;
-}
+/*!@}*/