Factor hash operations to sub-provider

To allow for per-deployment configuration of supported crypto
operations, hash operations have been factored to a separate
sub-provider.  This approach allows extended operations to
be supported without bloating the base crypto provider.

Signed-off-by: Julian Hall <julian.hall@arm.com>
Change-Id: I7a785762e8958c916a2668dba96efb533908bc8a
diff --git a/deployments/component-test/component-test.cmake b/deployments/component-test/component-test.cmake
index 7c82cb7..e1855a3 100644
--- a/deployments/component-test/component-test.cmake
+++ b/deployments/component-test/component-test.cmake
@@ -69,8 +69,11 @@
 		"components/service/crypto/provider"
 		"components/service/crypto/provider/serializer/protobuf"
 		"components/service/crypto/provider/serializer/packed-c"
+		"components/service/crypto/provider/extension/hash"
+		"components/service/crypto/provider/extension/hash/serializer/packed-c"
 		"components/service/crypto/provider/test"
 		"components/service/crypto/backend/mbedcrypto"
+		"components/service/crypto/factory/full"
 		"components/service/crypto/test/unit"
 		"components/service/crypto/test/service"
 		"components/service/crypto/test/service/protobuf"
diff --git a/deployments/crypto/opteesp/CMakeLists.txt b/deployments/crypto/opteesp/CMakeLists.txt
index ee2c3dc..cbc1d73 100644
--- a/deployments/crypto/opteesp/CMakeLists.txt
+++ b/deployments/crypto/opteesp/CMakeLists.txt
@@ -48,6 +48,9 @@
 		"components/service/crypto/provider"
 		"components/service/crypto/provider/serializer/protobuf"
 		"components/service/crypto/provider/serializer/packed-c"
+		"components/service/crypto/provider/extension/hash"
+		"components/service/crypto/provider/extension/hash/serializer/packed-c"
+		"components/service/crypto/factory/full"
 		"components/service/crypto/backend/mbedcrypto"
 		"components/service/crypto/backend/mbedcrypto/trng_adapter/platform"
 		"components/service/secure_storage/include"
diff --git a/deployments/crypto/opteesp/crypto_sp.c b/deployments/crypto/opteesp/crypto_sp.c
index bca971b..ce236d9 100644
--- a/deployments/crypto/opteesp/crypto_sp.c
+++ b/deployments/crypto/opteesp/crypto_sp.c
@@ -6,9 +6,7 @@
 
 #include <rpc/ffarpc/endpoint/ffarpc_call_ep.h>
 #include <service/secure_storage/factory/storage_factory.h>
-#include <service/crypto/provider/crypto_provider.h>
-#include <service/crypto/provider/serializer/protobuf/pb_crypto_provider_serializer.h>
-#include <service/crypto/provider/serializer/packed-c/packedc_crypto_provider_serializer.h>
+#include <service/crypto/factory/crypto_provider_factory.h>
 #include <service/crypto/backend/mbedcrypto/mbedcrypto_backend.h>
 #include <protocols/rpc/common/packed-c/status.h>
 #include <config/ramstore/config_ramstore.h>
@@ -27,7 +25,7 @@
 
 void __noreturn sp_main(struct ffa_init_info *init_info)
 {
-	struct crypto_provider crypto_provider;
+	struct crypto_provider *crypto_provider;
 	struct ffa_call_ep ffarpc_call_ep;
 	struct rpc_interface *crypto_iface;
 	struct sp_msg req_msg = { 0 };
@@ -47,15 +45,10 @@
 	/* Initialize the crypto service */
 	crypto_iface = NULL;
 
-    if (mbedcrypto_backend_init(storage_backend, 0) == PSA_SUCCESS) {
+	if (mbedcrypto_backend_init(storage_backend, 0) == PSA_SUCCESS) {
 
-        crypto_iface = crypto_provider_init(&crypto_provider);
-
-		crypto_provider_register_serializer(&crypto_provider,
-                    TS_RPC_ENCODING_PROTOBUF, pb_crypto_provider_serializer_instance());
-
-		crypto_provider_register_serializer(&crypto_provider,
-                    TS_RPC_ENCODING_PACKED_C, packedc_crypto_provider_serializer_instance());
+		crypto_provider = crypto_provider_factory_create();
+		crypto_iface = service_provider_get_rpc_interface(&crypto_provider->base_provider);
 	}
 
 	ffa_call_ep_init(&ffarpc_call_ep, crypto_iface);
diff --git a/deployments/libts/linux-pc/CMakeLists.txt b/deployments/libts/linux-pc/CMakeLists.txt
index f8ab349..b4d39a1 100644
--- a/deployments/libts/linux-pc/CMakeLists.txt
+++ b/deployments/libts/linux-pc/CMakeLists.txt
@@ -57,6 +57,9 @@
 		"components/service/crypto/provider"
 		"components/service/crypto/provider/serializer/protobuf"
 		"components/service/crypto/provider/serializer/packed-c"
+		"components/service/crypto/provider/extension/hash"
+		"components/service/crypto/provider/extension/hash/serializer/packed-c"
+		"components/service/crypto/factory/full"
 		"components/service/crypto/backend/mbedcrypto"
 		"components/service/crypto/backend/mbedcrypto/trng_adapter/linux"
 		"components/service/secure_storage/include"
diff --git a/deployments/se-proxy/opteesp/CMakeLists.txt b/deployments/se-proxy/opteesp/CMakeLists.txt
index 29d2edc..af25f39 100644
--- a/deployments/se-proxy/opteesp/CMakeLists.txt
+++ b/deployments/se-proxy/opteesp/CMakeLists.txt
@@ -60,6 +60,9 @@
 		"components/service/crypto/provider"
 		"components/service/crypto/provider/serializer/protobuf"
 		"components/service/crypto/provider/serializer/packed-c"
+		"components/service/crypto/provider/extension/hash"
+		"components/service/crypto/provider/extension/hash/serializer/packed-c"
+		"components/service/crypto/factory/full"
 		"components/service/secure_storage/include"
 		"components/service/secure_storage/frontend/secure_storage_provider"
 		"components/service/attestation/include"
diff --git a/deployments/se-proxy/opteesp/service_proxy_factory.c b/deployments/se-proxy/opteesp/service_proxy_factory.c
index 6bbee65..6261128 100644
--- a/deployments/se-proxy/opteesp/service_proxy_factory.c
+++ b/deployments/se-proxy/opteesp/service_proxy_factory.c
@@ -8,9 +8,7 @@
 #include <rpc/common/endpoint/rpc_interface.h>
 #include <service/attestation/provider/attest_provider.h>
 #include <service/attestation/provider/serializer/packed-c/packedc_attest_provider_serializer.h>
-#include <service/crypto/provider/crypto_provider.h>
-#include <service/crypto/provider/serializer/protobuf/pb_crypto_provider_serializer.h>
-#include <service/crypto/provider/serializer/packed-c/packedc_crypto_provider_serializer.h>
+#include <service/crypto/factory/crypto_provider_factory.h>
 #include <components/service/secure_storage/frontend/secure_storage_provider/secure_storage_provider.h>
 
 /* Not needed once proxy backends added */
@@ -74,19 +72,12 @@
 struct rpc_interface *crypto_proxy_create(void)
 {
 	struct rpc_interface *crypto_iface = NULL;
-
-	/* Static objects for proxy instance */
-	static struct crypto_provider crypto_provider;
+	struct crypto_provider *crypto_provider;
 
 	if (mbedcrypto_backend_init(shared_storage_backend, 0) == PSA_SUCCESS) {
 
-		crypto_iface = crypto_provider_init(&crypto_provider);
-
-		crypto_provider_register_serializer(&crypto_provider,
-					TS_RPC_ENCODING_PROTOBUF, pb_crypto_provider_serializer_instance());
-
-		crypto_provider_register_serializer(&crypto_provider,
-					TS_RPC_ENCODING_PACKED_C, packedc_crypto_provider_serializer_instance());
+		crypto_provider = crypto_provider_factory_create();
+		crypto_iface = service_provider_get_rpc_interface(&crypto_provider->base_provider);
 	}
 
 	return crypto_iface;