mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-10-23 01:52:40 +03:00
Adjust mpi_gcd_modinv_odd() internals
Signed-off-by: Felix Conway <felix.conway@arm.com>
This commit is contained in:
@@ -1774,11 +1774,11 @@ int mbedtls_mpi_gcd_modinv_odd(mbedtls_mpi *G,
|
|||||||
G = &local_g;
|
G = &local_g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We can't modify the values of G or I before use in the main function,
|
||||||
|
* as they could be aliased to A or N. */
|
||||||
MBEDTLS_MPI_CHK(mbedtls_mpi_grow(G, N->n));
|
MBEDTLS_MPI_CHK(mbedtls_mpi_grow(G, N->n));
|
||||||
G->s = 1;
|
|
||||||
if (I != NULL) {
|
if (I != NULL) {
|
||||||
MBEDTLS_MPI_CHK(mbedtls_mpi_grow(I, N->n));
|
MBEDTLS_MPI_CHK(mbedtls_mpi_grow(I, N->n));
|
||||||
I->s = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
T = mbedtls_calloc(sizeof(mbedtls_mpi_uint) * N->n, T_factor);
|
T = mbedtls_calloc(sizeof(mbedtls_mpi_uint) * N->n, T_factor);
|
||||||
@@ -1787,16 +1787,19 @@ int mbedtls_mpi_gcd_modinv_odd(mbedtls_mpi *G,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We have to handle G and I carefully as they could be aliased
|
|
||||||
* to A or N. */
|
|
||||||
mbedtls_mpi_uint *Ip = I != NULL ? I->p : NULL;
|
mbedtls_mpi_uint *Ip = I != NULL ? I->p : NULL;
|
||||||
/* If A is 0 (null), then A->p would be null, which would be an issue if
|
/* If A is 0 (null), then A->p would be null, and A->n would be 0,
|
||||||
* A->p was passed to mbedtls_mpi_core_gcd_modinv_odd below. */
|
* which would be an issue if A->p and A->n were passed to
|
||||||
|
* mbedtls_mpi_core_gcd_modinv_odd below. */
|
||||||
const mbedtls_mpi_uint *Ap = A->p != NULL ? A->p : &zero;
|
const mbedtls_mpi_uint *Ap = A->p != NULL ? A->p : &zero;
|
||||||
size_t An = A->p == NULL ? 0 : A->n;
|
size_t An = A->n >= N->n ? N->n : A->p != NULL ? A->n : 1;
|
||||||
An = A->n <= N->n ? A->n : N->n;
|
|
||||||
mbedtls_mpi_core_gcd_modinv_odd(G->p, Ip, Ap, An, N->p, N->n, T);
|
mbedtls_mpi_core_gcd_modinv_odd(G->p, Ip, Ap, An, N->p, N->n, T);
|
||||||
|
|
||||||
|
G->s = 1;
|
||||||
|
if (I != NULL) {
|
||||||
|
I->s = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (G->n > N->n) {
|
if (G->n > N->n) {
|
||||||
memset(G->p + N->n, 0, ciL * (G->n - N->n));
|
memset(G->p + N->n, 0, ciL * (G->n - N->n));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user