Fix pointer aliasing in bignum tests

Signed-off-by: Felix Conway <felix.conway@arm.com>
diff --git a/include/mbedtls/bignum.h b/include/mbedtls/bignum.h
index c67d653..b06aec9 100644
--- a/include/mbedtls/bignum.h
+++ b/include/mbedtls/bignum.h
@@ -993,9 +993,7 @@
  *                 to an initialized MPI. This value can be negative, in which
  *                 case a positive answer will still be returned in \p X.
  * \param N        The base of the modular inversion. This must point to an
- *                 initialized MPI and be greater than one. If this points to
- *                 the same MPI as \p X, then the value returned in \p X will
- *                 be incorrect.
+ *                 initialized MPI and be greater than one.
  *
  * \return         \c 0 if successful.
  * \return         #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed.
diff --git a/tests/suites/test_suite_bignum.function b/tests/suites/test_suite_bignum.function
index c94e7cc..e2b9517 100644
--- a/tests/suites/test_suite_bignum.function
+++ b/tests/suites/test_suite_bignum.function
@@ -397,15 +397,16 @@
     TEST_ASSERT(sign_is_valid(&Z));
     TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &A), 0);
 
-    mbedtls_mpi *Z_alias_X = &X;
-    TEST_EQUAL(mbedtls_mpi_gcd(Z_alias_X, &X, &Y), 0);
-    TEST_ASSERT(sign_is_valid(Z_alias_X));
-    TEST_EQUAL(mbedtls_mpi_cmp_mpi(Z_alias_X, &A), 0);
+    /* Test pointer aliasing where &Z == &X and &Z == &Y. */
+    TEST_EQUAL(mbedtls_test_read_mpi(&Z, input_X), 0);
+    TEST_EQUAL(mbedtls_mpi_gcd(&Z, /* X */ &Z, &Y), 0);
+    TEST_ASSERT(sign_is_valid(&Z));
+    TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &A), 0);
 
-    mbedtls_mpi *Z_alias_Y = &Y;
-    TEST_EQUAL(mbedtls_mpi_gcd(Z_alias_Y, &X, &Y), 0);
-    TEST_ASSERT(sign_is_valid(Z_alias_Y));
-    TEST_EQUAL(mbedtls_mpi_cmp_mpi(Z_alias_Y, &A), 0);
+    TEST_EQUAL(mbedtls_test_read_mpi(&Z, input_Y), 0);
+    TEST_EQUAL(mbedtls_mpi_gcd(&Z, &X, /* Y */ &Z), 0);
+    TEST_ASSERT(sign_is_valid(&Z));
+    TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &A), 0);
 
 
 exit:
@@ -1155,22 +1156,21 @@
         TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &A), 0);
     }
 
-    mbedtls_mpi *Z_alias_X = &X;
-    res = mbedtls_mpi_inv_mod(Z_alias_X, &X, &Y);
+    /* Test pointer aliasing where &Z == &X and &Z == &Y. */
+    TEST_EQUAL(mbedtls_test_read_mpi(&Z, input_X), 0);
+    res = mbedtls_mpi_inv_mod(&Z, /* X */ &Z, &Y);
     TEST_EQUAL(res, div_result);
     if (res == 0) {
-        TEST_ASSERT(sign_is_valid(Z_alias_X));
-        TEST_EQUAL(mbedtls_mpi_cmp_mpi(Z_alias_X, &A), 0);
+        TEST_ASSERT(sign_is_valid(&Z));
+        TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &A), 0);
     }
 
-    /* When Z is an alias of Y, the answer returned in Z is normally incorrect. */
-    mbedtls_mpi *Z_alias_Y = &Y;
-    res = mbedtls_mpi_inv_mod(Z_alias_Y, &X, &Y);
+    TEST_EQUAL(mbedtls_test_read_mpi(&Z, input_Y), 0);
+    res = mbedtls_mpi_inv_mod(&Z, &X, /* Y */ &Z);
     TEST_EQUAL(res, div_result);
     if (res == 0) {
-        TEST_ASSERT(sign_is_valid(Z_alias_Y));
-        /* Testing if Z_alias_Y == &A is not useful as it is true sometimes, but is
-           often false. */
+        TEST_ASSERT(sign_is_valid(&Z));
+        TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &A), 0);
     }
 
 exit: