openbmc/build/tmp/deploy/sdk/witherspoon-2019-08-08/sysroots/armv6-openbmc-linux-gnueabi/usr/src/debug/libgcrypt/1.8.4-r0/libgcrypt-1.8.4/mpi/ec.c
int _gcry_mpi_ec_curve_point(gcry_mpi_point_t point, mpi_ec_t ctx)
{
    int res = 0;
    gcry_mpi_t x, y, w;

    x = mpi_new(0);
    y = mpi_new(0);
    w = mpi_new(0);

    /* Check that the point is in range.  This needs to be done here and
     * not after conversion to affine coordinates.  */
    if (mpi_cmpabs(point->x, ctx->p) >= 0)
        goto leave;
    if (mpi_cmpabs(point->y, ctx->p) >= 0)
        goto leave;
    if (mpi_cmpabs(point->z, ctx->p) >= 0)
        goto leave;

    switch (ctx->model)
    {
        case MPI_EC_WEIERSTRASS:
        {
            gcry_mpi_t xxx;

            if (_gcry_mpi_ec_get_affine(x, y, point, ctx))
                goto leave;

            xxx = mpi_new(0);

            /* y^2 == x^3 + a·x + b */
            ec_pow2(y, y, ctx);

            ec_pow3(xxx, x, ctx);
            ec_mulm(w, ctx->a, x, ctx);
            ec_addm(w, w, ctx->b, ctx);
            ec_addm(w, w, xxx, ctx);

            if (!mpi_cmp(y, w))
                res = 1;

            _gcry_mpi_release(xxx);
        }
        break;
        case MPI_EC_MONTGOMERY:
        {
#define xx y
            /* With Montgomery curve, only X-coordinate is valid.  */
            if (_gcry_mpi_ec_get_affine(x, NULL, point, ctx))
                goto leave;

            /* The equation is: b * y^2 == x^3 + a · x^2 + x */
            /* We check if right hand is quadratic residue or not by
               Euler's criterion.  */
            /* CTX->A has (a-2)/4 and CTX->B has b^-1 */
            ec_mulm(w, ctx->a, mpi_const(MPI_C_FOUR), ctx);
            ec_addm(w, w, mpi_const(MPI_C_TWO), ctx);
            ec_mulm(w, w, x, ctx);
            ec_pow2(xx, x, ctx);
            ec_addm(w, w, xx, ctx);
            ec_addm(w, w, mpi_const(MPI_C_ONE), ctx);
            ec_mulm(w, w, x, ctx);
            ec_mulm(w, w, ctx->b, ctx);
#undef xx
            /* Compute Euler's criterion: w^(p-1)/2 */
#define p_minus1 y
            ec_subm(p_minus1, ctx->p, mpi_const(MPI_C_ONE), ctx);
            mpi_rshift(p_minus1, p_minus1, 1);
            ec_powm(w, w, p_minus1, ctx);

            res = !mpi_cmp_ui(w, 1);
#undef p_minus1
        }
        break;
        case MPI_EC_EDWARDS:
        {
            if (_gcry_mpi_ec_get_affine(x, y, point, ctx))
                goto leave;

            /* a · x^2 + y^2 - 1 - b · x^2 · y^2 == 0 */
            ec_pow2(x, x, ctx);
            ec_pow2(y, y, ctx);
            if (ctx->dialect == ECC_DIALECT_ED25519)
                mpi_sub(w, ctx->p, x);
            else
                ec_mulm(w, ctx->a, x, ctx);
            ec_addm(w, w, y, ctx);
            ec_subm(w, w, mpi_const(MPI_C_ONE), ctx);
            ec_mulm(x, x, y, ctx);
            ec_mulm(x, x, ctx->b, ctx);
            ec_subm(w, w, x, ctx);
            if (!mpi_cmp_ui(w, 0))
                res = 1;
        }
        break;
    }

leave:
    _gcry_mpi_release(w);
    _gcry_mpi_release(x);
    _gcry_mpi_release(y);

    return res;
}
/* Return true if POINT is on the curve described by CTX.  */
Return true if POINT is on the curve described by CTX.
Return true if POINT is on the curve described by CTX .
int _gcry_mpi_ec_curve_point(gcry_mpi_point_t point, mpi_ec_t ctx)
{
    int res = 0;
    gcry_mpi_t x, y, w;
    x = mpi_new(0);
    y = mpi_new(0);
    w = mpi_new(0);
    if (mpi_cmpabs(point->x, ctx->p) >= 0)
        goto leave;
    if (mpi_cmpabs(point->y, ctx->p) >= 0)
        goto leave;
    if (mpi_cmpabs(point->z, ctx->p) >= 0)
        goto leave;
    switch (ctx->model)
    {
        case MPI_EC_WEIERSTRASS:
        {
            gcry_mpi_t xxx;
            if (_gcry_mpi_ec_get_affine(x, y, point, ctx))
                goto leave;
            xxx = mpi_new(0);
            ec_pow2(y, y, ctx);
            ec_pow3(xxx, x, ctx);
            ec_mulm(w, ctx->a, x, ctx);
            ec_addm(w, w, ctx->b, ctx);
            ec_addm(w, w, xxx, ctx);
            if (!mpi_cmp(y, w))
                res = 1;
            _gcry_mpi_release(xxx);
        }
        break;
        case MPI_EC_MONTGOMERY:
        {
#define xx y
            if (_gcry_mpi_ec_get_affine(x, NULL, point, ctx))
                goto leave;
            ec_mulm(w, ctx->a, mpi_const(MPI_C_FOUR), ctx);
            ec_addm(w, w, mpi_const(MPI_C_TWO), ctx);
            ec_mulm(w, w, x, ctx);
            ec_pow2(xx, x, ctx);
            ec_addm(w, w, xx, ctx);
            ec_addm(w, w, mpi_const(MPI_C_ONE), ctx);
            ec_mulm(w, w, x, ctx);
            ec_mulm(w, w, ctx->b, ctx);
#undef xx
#define p_minus1 y
            ec_subm(p_minus1, ctx->p, mpi_const(MPI_C_ONE), ctx);
            mpi_rshift(p_minus1, p_minus1, 1);
            ec_powm(w, w, p_minus1, ctx);
            res = !mpi_cmp_ui(w, 1);
#undef p_minus1
        }
        break;
        case MPI_EC_EDWARDS:
        {
            if (_gcry_mpi_ec_get_affine(x, y, point, ctx))
                goto leave;
            ec_pow2(x, x, ctx);
            ec_pow2(y, y, ctx);
            if (ctx->dialect == ECC_DIALECT_ED25519)
                mpi_sub(w, ctx->p, x);
            else
                ec_mulm(w, ctx->a, x, ctx);
            ec_addm(w, w, y, ctx);
            ec_subm(w, w, mpi_const(MPI_C_ONE), ctx);
            ec_mulm(x, x, y, ctx);
            ec_mulm(x, x, ctx->b, ctx);
            ec_subm(w, w, x, ctx);
            if (!mpi_cmp_ui(w, 0))
                res = 1;
        }
        break;
    }
leave:
    _gcry_mpi_release(w);
    _gcry_mpi_release(x);
    _gcry_mpi_release(y);
    return res;
}
int _gcry_mpi_ec_curve_point ( gcry_mpi_point_t point , mpi_ec_t ctx ) { int res = 0 ; gcry_mpi_t x , y , w ; x = mpi_new ( 0 ) ; y = mpi_new ( 0 ) ; w = mpi_new ( 0 ) ; if ( mpi_cmpabs ( point -> x , ctx -> p ) >= 0 ) goto leave ; if ( mpi_cmpabs ( point -> y , ctx -> p ) >= 0 ) goto leave ; if ( mpi_cmpabs ( point -> z , ctx -> p ) >= 0 ) goto leave ; switch ( ctx -> model ) { case MPI_EC_WEIERSTRASS : { gcry_mpi_t xxx ; if ( _gcry_mpi_ec_get_affine ( x , y , point , ctx ) ) goto leave ; xxx = mpi_new ( 0 ) ; ec_pow2 ( y , y , ctx ) ; ec_pow3 ( xxx , x , ctx ) ; ec_mulm ( w , ctx -> a , x , ctx ) ; ec_addm ( w , w , ctx -> b , ctx ) ; ec_addm ( w , w , xxx , ctx ) ; if ( ! mpi_cmp ( y , w ) ) res = 1 ; _gcry_mpi_release ( xxx ) ; } break ; case MPI_EC_MONTGOMERY : { #define xx  y if ( _gcry_mpi_ec_get_affine ( x , NULL , point , ctx ) ) goto leave ; ec_mulm ( w , ctx -> a , mpi_const ( MPI_C_FOUR ) , ctx ) ; ec_addm ( w , w , mpi_const ( MPI_C_TWO ) , ctx ) ; ec_mulm ( w , w , x , ctx ) ; ec_pow2 ( xx , x , ctx ) ; ec_addm ( w , w , xx , ctx ) ; ec_addm ( w , w , mpi_const ( MPI_C_ONE ) , ctx ) ; ec_mulm ( w , w , x , ctx ) ; ec_mulm ( w , w , ctx -> b , ctx ) ; #undef  xx #define p_minus1  y ec_subm ( p_minus1 , ctx -> p , mpi_const ( MPI_C_ONE ) , ctx ) ; mpi_rshift ( p_minus1 , p_minus1 , 1 ) ; ec_powm ( w , w , p_minus1 , ctx ) ; res = ! mpi_cmp_ui ( w , 1 ) ; #undef  p_minus1 } break ; case MPI_EC_EDWARDS : { if ( _gcry_mpi_ec_get_affine ( x , y , point , ctx ) ) goto leave ; ec_pow2 ( x , x , ctx ) ; ec_pow2 ( y , y , ctx ) ; if ( ctx -> dialect == ECC_DIALECT_ED25519 ) mpi_sub ( w , ctx -> p , x ) ; else ec_mulm ( w , ctx -> a , x , ctx ) ; ec_addm ( w , w , y , ctx ) ; ec_subm ( w , w , mpi_const ( MPI_C_ONE ) , ctx ) ; ec_mulm ( x , x , y , ctx ) ; ec_mulm ( x , x , ctx -> b , ctx ) ; ec_subm ( w , w , x , ctx ) ; if ( ! mpi_cmp_ui ( w , 0 ) ) res = 1 ; } break ; } leave : _gcry_mpi_release ( w ) ; _gcry_mpi_release ( x ) ; _gcry_mpi_release ( y ) ; return res ; }
Return true if POINT is on the curve described by CTX.
Return true if POINT is on the curve described by CTX .
/* Check that the point is in range.  This needs to be done here and
     * not after conversion to affine coordinates.  */ /* y^2 == x^3 + a·x + b */ /* With Montgomery curve, only X-coordinate is valid.  */ /* The equation is: b * y^2 == x^3 + a · x^2 + x */ /* We check if right hand is quadratic residue or not by
               Euler's criterion.  */ /* CTX->A has (a-2)/4 and CTX->B has b^-1 */ /* Compute Euler's criterion: w^(p-1)/2 */ /* a · x^2 + y^2 - 1 - b · x^2 · y^2 == 0 */