bignum_mod_raw: Adjusted OPT_RED limb size requirements for mod_raw_mul().

Signed-off-by: Minos Galanakis <minos.galanakis@arm.com>
diff --git a/library/bignum_mod_raw.c b/library/bignum_mod_raw.c
index 5c855d0..3de5940 100644
--- a/library/bignum_mod_raw.c
+++ b/library/bignum_mod_raw.c
@@ -130,18 +130,25 @@
                              const mbedtls_mpi_mod_modulus *N,
                              mbedtls_mpi_uint *T)
 {
-    const size_t T_limbs = (N->limbs * 2);
+    /* Standard (A * B) multiplication stored into pre-allocated T
+     *  buffer of fixed limb size of (2N + 1).
+
+     *  The space may not not fully filled by when
+     *  MBEDTLS_MPI_MOD_REP_OPT_RED is used, with most
+     *  curves using (2N) limbs.
+     *
+     *  The 521-bit Weierstrass curve is the only
+     *  that which requires a limb size of (2N + 1). */
+    const size_t T_limbs = (N->bits == 521) ?
+                           BITS_TO_LIMBS(N->bits * 2) + 1 :
+                           BITS_TO_LIMBS(N->bits * 2);
+
     switch (N->int_rep) {
         case MBEDTLS_MPI_MOD_REP_MONTGOMERY:
             mbedtls_mpi_core_montmul(X, A, B, N->limbs, N->p, N->limbs,
                                      N->rep.mont.mm, T);
             break;
         case MBEDTLS_MPI_MOD_REP_OPT_RED:
-            /* Standard (A * B) multiplication stored into pre-allocated T
-             *  buffer of fixed size of ((2N + 1) * ciL) bytes.
-
-             *  The space is not fully filled by MBEDTLS_MPI_MOD_REP_OPT_RED
-             *  which requires at max (2N * ciL) bytes. */
             mbedtls_mpi_core_mul(T, A, N->limbs, B, N->limbs);
 
             /* Optimised Reduction */