Exp mod: simplify 0 exponent handling
Removing E_core and returning early achieves the same and is simpler
(easier to read and maintain).
Signed-off-by: Janos Follath <janos.follath@arm.com>
diff --git a/library/bignum.c b/library/bignum.c
index 42b735f..0f63c31 100644
--- a/library/bignum.c
+++ b/library/bignum.c
@@ -1616,12 +1616,18 @@
return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
}
+ /*
+ * Ensure that the exponent that we are passing to the core is not NULL.
+ */
+ if (E->n == 0) {
+ ret = mbedtls_mpi_lset(X, 1);
+ return ret;
+ }
+
mbedtls_mpi RR;
mbedtls_mpi_init(&RR);
mbedtls_mpi T;
mbedtls_mpi_init(&T);
- mbedtls_mpi E_core;
- mbedtls_mpi_init(&E_core);
/*
* If 1st call, pre-compute R^2 mod N
@@ -1637,15 +1643,6 @@
}
/*
- * Ensure that the exponent that we are passing to the core is not NULL.
- */
- if (E->n == 0) {
- mbedtls_mpi_lset(&E_core, 0);
- } else {
- E_core = *E;
- }
-
- /*
* To preserve constness we need to make a copy of A. Using X for this to
* save memory.
*/
@@ -1668,21 +1665,21 @@
* Allocate working memory for mbedtls_mpi_core_exp_mod()
*/
MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&T,
- mbedtls_mpi_core_exp_mod_working_limbs(N->n, E_core.n)));
+ mbedtls_mpi_core_exp_mod_working_limbs(N->n, E->n)));
/*
* Convert to and from Montgomery around mbedtls_mpi_core_exp_mod().
*/
mbedtls_mpi_uint mm = mbedtls_mpi_core_montmul_init(N->p);
mbedtls_mpi_core_to_mont_rep(X->p, X->p, N->p, N->n, mm, RR.p, T.p);
- mbedtls_mpi_core_exp_mod(X->p, X->p, N->p, N->n, E_core.p, E_core.n, RR.p,
+ mbedtls_mpi_core_exp_mod(X->p, X->p, N->p, N->n, E->p, E->n, RR.p,
T.p);
mbedtls_mpi_core_from_mont_rep(X->p, X->p, N->p, N->n, mm, T.p);
/*
* Correct for negative A.
*/
- if (A->s == -1 && (E_core.p[0] & 1) != 0) {
+ if (A->s == -1 && (E->p[0] & 1) != 0) {
X->s = -1;
MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(X, N, X));
}
@@ -1695,10 +1692,6 @@
mbedtls_mpi_free(&RR);
}
- if (E->n == 0) {
- mbedtls_mpi_free(&E_core);
- }
-
return ret;
}