mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-29 15:54:30 +01:00
Tune T ownership code + comments
Don't miss the little code changes among all those comments change :)
This commit is contained in:
parent
085b1dff40
commit
07bf6f52c1
@ -1618,8 +1618,17 @@ static unsigned char ecp_pick_window_size( const mbedtls_ecp_group *grp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Multiplication using the comb method,
|
* Multiplication using the comb method - for curves in short Weierstrass form
|
||||||
* for curves in short Weierstrass form
|
*
|
||||||
|
* This function is mainly responsible for administrative work:
|
||||||
|
* - managing the restart context if enabled
|
||||||
|
* - managing the table of precomputed points (passed between the above two
|
||||||
|
* functions): allocation, computation, ownership tranfer, freeing.
|
||||||
|
*
|
||||||
|
* It delegates the actual arithmetic work to:
|
||||||
|
* ecp_precompute_comb() and ecp_mul_comb_with_precomp()
|
||||||
|
*
|
||||||
|
* See comments on ecp_comb_recode_core() regarding the computation strategy.
|
||||||
*/
|
*/
|
||||||
static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
||||||
const mbedtls_mpi *m, const mbedtls_ecp_point *P,
|
const mbedtls_mpi *m, const mbedtls_ecp_point *P,
|
||||||
@ -1657,7 +1666,7 @@ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
|||||||
MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &grp->rs->P, P ) );
|
MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &grp->rs->P, P ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* new start for ops counts */
|
/* reset ops count for this call */
|
||||||
if( grp->rs != NULL )
|
if( grp->rs != NULL )
|
||||||
grp->rs->ops_done = 0;
|
grp->rs->ops_done = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -1676,6 +1685,8 @@ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
|||||||
/* Pre-computed table: do we have it already for the base point? */
|
/* Pre-computed table: do we have it already for the base point? */
|
||||||
if( p_eq_g && grp->T != NULL )
|
if( p_eq_g && grp->T != NULL )
|
||||||
{
|
{
|
||||||
|
/* second pointer to the same table
|
||||||
|
* no ownership transfer as other threads might be using T too */
|
||||||
T = grp->T;
|
T = grp->T;
|
||||||
T_ok = 1;
|
T_ok = 1;
|
||||||
}
|
}
|
||||||
@ -1684,7 +1695,7 @@ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
|||||||
/* Pre-computed table: do we have one in progress? complete? */
|
/* Pre-computed table: do we have one in progress? complete? */
|
||||||
if( grp->rs != NULL && grp->rs->T != NULL && T == NULL )
|
if( grp->rs != NULL && grp->rs->T != NULL && T == NULL )
|
||||||
{
|
{
|
||||||
/* transfer "ownership" of T from rs to local function */
|
/* transfer ownership of T from rs to local function */
|
||||||
T = grp->rs->T;
|
T = grp->rs->T;
|
||||||
grp->rs->T = NULL;
|
grp->rs->T = NULL;
|
||||||
grp->rs->T_size = 0;
|
grp->rs->T_size = 0;
|
||||||
@ -1714,6 +1725,7 @@ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
|||||||
{
|
{
|
||||||
grp->T = T;
|
grp->T = T;
|
||||||
grp->T_size = pre_len;
|
grp->T_size = pre_len;
|
||||||
|
/* now have two pointers to the same table */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1724,17 +1736,23 @@ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
|
/* does T belong to the group? */
|
||||||
|
if( T == grp->T )
|
||||||
|
T = NULL;
|
||||||
|
|
||||||
|
/* does T belong to the restart context? */
|
||||||
#if defined(MBEDTLS_ECP_EARLY_RETURN)
|
#if defined(MBEDTLS_ECP_EARLY_RETURN)
|
||||||
if( grp->rs != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS && T != grp->T )
|
if( grp->rs != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS && T != NULL )
|
||||||
{
|
{
|
||||||
/* transfer "ownership" of T from local function to rs */
|
/* transfer ownership of T from local function to rs */
|
||||||
grp->rs->T_size = pre_len;
|
grp->rs->T_size = pre_len;
|
||||||
grp->rs->T = T;
|
grp->rs->T = T;
|
||||||
T = NULL;
|
T = NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( T != NULL && ! p_eq_g )
|
/* did T belong to us? then let's destroy it! */
|
||||||
|
if( T != NULL )
|
||||||
{
|
{
|
||||||
for( i = 0; i < pre_len; i++ )
|
for( i = 0; i < pre_len; i++ )
|
||||||
mbedtls_ecp_point_free( &T[i] );
|
mbedtls_ecp_point_free( &T[i] );
|
||||||
@ -1745,9 +1763,11 @@ cleanup:
|
|||||||
#if defined(MBEDTLS_ECP_EARLY_RETURN)
|
#if defined(MBEDTLS_ECP_EARLY_RETURN)
|
||||||
if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
|
if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
|
||||||
#endif
|
#endif
|
||||||
|
/* prevent caller from using invalid value */
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
mbedtls_ecp_point_free( R );
|
mbedtls_ecp_point_free( R );
|
||||||
|
|
||||||
|
/* clear restart context when not in progress (done or error) */
|
||||||
#if defined(MBEDTLS_ECP_EARLY_RETURN)
|
#if defined(MBEDTLS_ECP_EARLY_RETURN)
|
||||||
if( grp->rs != NULL && ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) {
|
if( grp->rs != NULL && ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) {
|
||||||
ecp_restart_free( grp->rs );
|
ecp_restart_free( grp->rs );
|
||||||
|
Loading…
Reference in New Issue
Block a user