Move loading of public part of ECP into function

Signed-off-by: Paul Elliott <paul.elliott@arm.com>
diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index 882cb96..62828bd 100644
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -3762,20 +3762,10 @@
         return status;
     }
 
-    /* Check whether the public part is loaded. If not, load it. */
-    if (mbedtls_ecp_is_zero(&operation->ctx->Q)) {
-        int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
+    int ret = mbedtls_psa_ecp_load_public_part(operation->ctx);
 
-        ret = mbedtls_ecp_mul(&operation->ctx->grp,
-                              &operation->ctx->Q,
-                              &operation->ctx->d,
-                              &operation->ctx->grp.G,
-                              mbedtls_psa_get_random,
-                              MBEDTLS_PSA_RANDOM_STATE);
-
-        if (ret != 0) {
-            return mbedtls_to_psa_error(ret);
-        }
+    if (ret != 0) {
+        return mbedtls_to_psa_error(ret);
     }
 
     mbedtls_ecdsa_restart_init(&operation->restart_ctx);
diff --git a/library/psa_crypto_ecp.c b/library/psa_crypto_ecp.c
index c4ccefd..cc80f27 100644
--- a/library/psa_crypto_ecp.c
+++ b/library/psa_crypto_ecp.c
@@ -404,6 +404,21 @@
     return mbedtls_to_psa_error(ret);
 }
 
+int mbedtls_psa_ecp_load_public_part(mbedtls_ecp_keypair *ecp)
+{
+    int ret = 0;
+
+    /* Check whether the public part is loaded. If not, load it. */
+    if (mbedtls_ecp_is_zero(&ecp->Q)) {
+        ret = mbedtls_ecp_mul(&ecp->grp, &ecp->Q,
+                              &ecp->d, &ecp->grp.G,
+                              mbedtls_psa_get_random,
+                              MBEDTLS_PSA_RANDOM_STATE);
+    }
+
+    return ret;
+}
+
 psa_status_t mbedtls_psa_ecdsa_verify_hash(
     const psa_key_attributes_t *attributes,
     const uint8_t *key_buffer, size_t key_buffer_size,
@@ -443,12 +458,8 @@
                                             signature + curve_bytes,
                                             curve_bytes));
 
-    /* Check whether the public part is loaded. If not, load it. */
-    if (mbedtls_ecp_is_zero(&ecp->Q)) {
-        MBEDTLS_MPI_CHK(
-            mbedtls_ecp_mul(&ecp->grp, &ecp->Q, &ecp->d, &ecp->grp.G,
-                            mbedtls_psa_get_random, MBEDTLS_PSA_RANDOM_STATE));
-    }
+    MBEDTLS_MPI_CHK(mbedtls_psa_ecp_load_public_part(ecp));
+
 
     ret = mbedtls_ecdsa_verify(&ecp->grp, hash, hash_length,
                                &ecp->Q, &r, &s);
diff --git a/library/psa_crypto_ecp.h b/library/psa_crypto_ecp.h
index 71f9d6a..8b567fe 100644
--- a/library/psa_crypto_ecp.h
+++ b/library/psa_crypto_ecp.h
@@ -48,6 +48,15 @@
                                                  size_t data_length,
                                                  mbedtls_ecp_keypair **p_ecp);
 
+/** Load the public part of an internal ECP, if required.
+ *
+ * \param ecp               The ECP context to load the public part for.
+ *
+ * \return 0 on success, otherwise an MPI error.
+ */
+
+int mbedtls_psa_ecp_load_public_part(mbedtls_ecp_keypair *ecp);
+
 /** Import an ECP key in binary format.
  *
  * \note The signature of this function is that of a PSA driver