@@ -1632,14 +1632,25 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
1632
1632
int ret ;
1633
1633
size_t i , n , t , k ;
1634
1634
mbedtls_mpi X , Y , Z , T1 , T2 ;
1635
+ mbedtls_mpi_uint TP2 [3 ];
1635
1636
MPI_VALIDATE_RET ( A != NULL );
1636
1637
MPI_VALIDATE_RET ( B != NULL );
1637
1638
1638
1639
if ( mbedtls_mpi_cmp_int ( B , 0 ) == 0 )
1639
1640
return ( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
1640
1641
1641
1642
mbedtls_mpi_init ( & X ); mbedtls_mpi_init ( & Y ); mbedtls_mpi_init ( & Z );
1642
- mbedtls_mpi_init ( & T1 ); mbedtls_mpi_init ( & T2 );
1643
+ mbedtls_mpi_init ( & T1 );
1644
+ /*
1645
+ * Avoid dynamic memory allocations for constant-size T2.
1646
+ *
1647
+ * T2 is used for comparison only and the 3 limbs are assigned explicitly,
1648
+ * so nobody increase the size of the MPI and we're safe to use an on-stack
1649
+ * buffer.
1650
+ */
1651
+ T2 .s = 1 ;
1652
+ T2 .n = sizeof ( TP2 ) / sizeof ( * TP2 );
1653
+ T2 .p = TP2 ;
1643
1654
1644
1655
if ( mbedtls_mpi_cmp_abs ( A , B ) < 0 )
1645
1656
{
@@ -1655,7 +1666,6 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
1655
1666
MBEDTLS_MPI_CHK ( mbedtls_mpi_grow ( & Z , A -> n + 2 ) );
1656
1667
MBEDTLS_MPI_CHK ( mbedtls_mpi_lset ( & Z , 0 ) );
1657
1668
MBEDTLS_MPI_CHK ( mbedtls_mpi_grow ( & T1 , 2 ) );
1658
- MBEDTLS_MPI_CHK ( mbedtls_mpi_grow ( & T2 , 3 ) );
1659
1669
1660
1670
k = mbedtls_mpi_bitlen ( & Y ) % biL ;
1661
1671
if ( k < biL - 1 )
@@ -1687,6 +1697,10 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
1687
1697
Y .p [t ], NULL );
1688
1698
}
1689
1699
1700
+ T2 .p [0 ] = ( i < 2 ) ? 0 : X .p [i - 2 ];
1701
+ T2 .p [1 ] = ( i < 1 ) ? 0 : X .p [i - 1 ];
1702
+ T2 .p [2 ] = X .p [i ];
1703
+
1690
1704
Z .p [i - t - 1 ]++ ;
1691
1705
do
1692
1706
{
@@ -1696,11 +1710,6 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
1696
1710
T1 .p [0 ] = ( t < 1 ) ? 0 : Y .p [t - 1 ];
1697
1711
T1 .p [1 ] = Y .p [t ];
1698
1712
MBEDTLS_MPI_CHK ( mbedtls_mpi_mul_int ( & T1 , & T1 , Z .p [i - t - 1 ] ) );
1699
-
1700
- MBEDTLS_MPI_CHK ( mbedtls_mpi_lset ( & T2 , 0 ) );
1701
- T2 .p [0 ] = ( i < 2 ) ? 0 : X .p [i - 2 ];
1702
- T2 .p [1 ] = ( i < 1 ) ? 0 : X .p [i - 1 ];
1703
- T2 .p [2 ] = X .p [i ];
1704
1713
}
1705
1714
while ( mbedtls_mpi_cmp_mpi ( & T1 , & T2 ) > 0 );
1706
1715
@@ -1736,7 +1745,8 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
1736
1745
cleanup :
1737
1746
1738
1747
mbedtls_mpi_free ( & X ); mbedtls_mpi_free ( & Y ); mbedtls_mpi_free ( & Z );
1739
- mbedtls_mpi_free ( & T1 ); mbedtls_mpi_free ( & T2 );
1748
+ mbedtls_mpi_free ( & T1 );
1749
+ mbedtls_platform_zeroize ( TP2 , sizeof ( TP2 ) );
1740
1750
1741
1751
return ( ret );
1742
1752
}
0 commit comments