Move num_ops ECP abstraction fully into internal implementation
Signed-off-by: Paul Elliott <paul.elliott@arm.com>
diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index 2c6f108..39da74b 100644
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -3487,13 +3487,16 @@
}
uint32_t mbedtls_psa_sign_hash_get_num_ops(
- const mbedtls_psa_sign_hash_interruptible_operation_t *operation)
+ mbedtls_psa_sign_hash_interruptible_operation_t *operation)
{
#if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
defined(MBEDTLS_ECP_RESTARTABLE)
- return operation->restart_ctx.ecp.ops_done;
+ /* Hide the fact that the restart context only holds a delta of number of
+ * ops done during the last operation, not an absolute value. */
+ operation->num_ops += operation->restart_ctx.ecp.ops_done;
+ return operation->num_ops;
#else
(void) operation;
return 0;
@@ -3503,13 +3506,16 @@
}
uint32_t mbedtls_psa_verify_hash_get_num_ops(
- const mbedtls_psa_verify_hash_interruptible_operation_t *operation)
+ mbedtls_psa_verify_hash_interruptible_operation_t *operation)
{
#if (defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)) && \
defined(MBEDTLS_ECP_RESTARTABLE)
- return operation->restart_ctx.ecp.ops_done;
+ /* Hide the fact that the restart context only holds a delta of number of
+ * ops done during the last operation, not an absolute value. */
+ operation->num_ops += operation->restart_ctx.ecp.ops_done;
+ return operation->num_ops;
#else
(void) operation;
return 0;
@@ -3541,6 +3547,9 @@
mbedtls_ecdsa_restart_init(&operation->restart_ctx);
+ /* Ensure num_ops is zero'ed in case of context re-use. */
+ operation->num_ops = 0;
+
/* Ensure default is set even if
* mbedtls_psa_interruptible_set_max_ops() has not been called. */
mbedtls_psa_interruptible_set_max_ops(
@@ -3706,6 +3715,8 @@
mbedtls_ecdsa_restart_free(&operation->restart_ctx);
+ operation->num_ops = 0;
+
return PSA_SUCCESS;
#else
@@ -3747,6 +3758,9 @@
mbedtls_mpi_init(&operation->r);
mbedtls_mpi_init(&operation->s);
+ /* Ensure num_ops is zero'ed in case of context re-use. */
+ operation->num_ops = 0;
+
/* Ensure default is set even if
* mbedtls_psa_interruptible_set_max_ops() has not been called. */
mbedtls_psa_interruptible_set_max_ops(
@@ -3864,6 +3878,8 @@
mbedtls_ecdsa_restart_free(&operation->restart_ctx);
+ operation->num_ops = 0;
+
mbedtls_mpi_free(&operation->r);
mbedtls_mpi_free(&operation->s);
diff --git a/library/psa_crypto_core.h b/library/psa_crypto_core.h
index 5648321..0ef0131 100644
--- a/library/psa_crypto_core.h
+++ b/library/psa_crypto_core.h
@@ -643,12 +643,11 @@
* zero.
*
* \note The signature of this function is that of a PSA driver
- * sign_get_num_ops entry point, however it differs in behaviour from the
- * driver function in that this function returns a delta of work done in
- * the last call rather than all of the ops done ever by the whole
- * operation, due to internal implementation differences.
+ * sign_hash_get_num_ops entry point. This function behaves as an
+ * sign_hash_get_num_ops entry point as defined in the PSA driver
+ * interface specification for transparent drivers.
*
- * \param[in] operation The \c
+ * \param operation The \c
* mbedtls_psa_sign_hash_interruptible_operation_t
* to use. This must be initialized first.
*
@@ -657,7 +656,7 @@
* mbedtls_psa_sign_hash_complete().
*/
uint32_t mbedtls_psa_sign_hash_get_num_ops(
- const mbedtls_psa_sign_hash_interruptible_operation_t *operation);
+ mbedtls_psa_sign_hash_interruptible_operation_t *operation);
/**
* \brief Get the number of ops that a hash verification operation has taken for
@@ -665,12 +664,11 @@
* return zero.
*
* \note The signature of this function is that of a PSA driver
- * verify_get_num_ops entry point however it differs in behaviour from the
- * driver function in that this function returns a delta of work done in
- * the last call rather than all of the ops done ever by the whole
- * operation, due to internal implementation differences.
+ * verify_hash_get_num_ops entry point. This function behaves as an
+ * verify_hash_get_num_ops entry point as defined in the PSA driver
+ * interface specification for transparent drivers.
*
- * \param[in] operation The \c
+ * \param operation The \c
* mbedtls_psa_verify_hash_interruptible_operation_t
* to use. This must be initialized first.
*
@@ -679,7 +677,7 @@
* mbedtls_psa_verify_hash_complete().
*/
uint32_t mbedtls_psa_verify_hash_get_num_ops(
- const mbedtls_psa_verify_hash_interruptible_operation_t *operation);
+ mbedtls_psa_verify_hash_interruptible_operation_t *operation);
/**
* \brief Start signing a hash or short message with a private key, in an
diff --git a/library/psa_crypto_driver_wrappers.h b/library/psa_crypto_driver_wrappers.h
index 26df088..e3edec7 100644
--- a/library/psa_crypto_driver_wrappers.h
+++ b/library/psa_crypto_driver_wrappers.h
@@ -75,10 +75,10 @@
uint32_t psa_driver_wrapper_interruptible_get_max_ops(void);
uint32_t psa_driver_wrapper_sign_hash_get_num_ops(
- const psa_sign_hash_interruptible_operation_t *operation);
+ psa_sign_hash_interruptible_operation_t *operation);
uint32_t psa_driver_wrapper_verify_hash_get_num_ops(
- const psa_verify_hash_interruptible_operation_t *operation);
+ psa_verify_hash_interruptible_operation_t *operation);
psa_status_t psa_driver_wrapper_sign_hash_start(
psa_sign_hash_interruptible_operation_t *operation,