Example #1
0
static void
barrett_mulm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2	)
{
    mpi_mul(w, u, v);
    if( calc_barrett( w, w, m, y, k, r1, r2 ) )
	mpi_fdiv_r( w, w, m );
}
Example #2
0
/****************
 * Find the greatest common divisor G of A and B.
 * Return: true if this 1, false in all other cases
 */
int
mpi_gcd( MPI g, const MPI xa, const MPI xb )
{
    MPI a = NULL, b = NULL;

    if (mpi_copy(&a, xa) < 0)
	    goto nomem;

    if (mpi_copy(&b, xb) < 0)
	    goto nomem;

    /* TAOCP Vol II, 4.5.2, Algorithm A */
    a->sign = 0;
    b->sign = 0;
    while( mpi_cmp_ui( b, 0 ) ) {
	    if (mpi_fdiv_r( g, a, b ) < 0) /* g used as temorary variable */
		    goto nomem;
	    if (mpi_set(a,b) < 0)
		    goto nomem;
	    if (mpi_set(b,g) < 0)
		    goto nomem;
    }
    if (mpi_set(g, a) < 0)
	    goto nomem;

    mpi_free(a);
    mpi_free(b);
    return !mpi_cmp_ui( g, 1);

 nomem:
    mpi_free(a);
    mpi_free(b);
    return -ENOMEM;
}
Example #3
0
static void
do_rem(void)
{
    if( stackidx < 2 ) {
	fputs("stack underflow\n", stderr);
	return;
    }
    mpi_fdiv_r( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] );
    stackidx--;
}
/****************
 * Find the greatest common divisor G of A and B.
 * Return: true if this 1, false in all other cases
 */
int
mpi_gcd( MPI g, MPI xa, MPI xb )
{
    MPI a, b;

    a = mpi_copy(xa);
    b = mpi_copy(xb);

    /* TAOCP Vol II, 4.5.2, Algorithm A */
    a->sign = 0;
    b->sign = 0;
    while( mpi_cmp_ui( b, 0 ) ) {
	mpi_fdiv_r( g, a, b ); /* g used as temorary variable */
	mpi_set(a,b);
	mpi_set(b,g);
    }
    mpi_set(g, a);

    mpi_free(a);
    mpi_free(b);
    return !mpi_cmp_ui( g, 1);
}
Example #5
0
void
mpi_mulm( MPI w, MPI u, MPI v, MPI m)
{
    mpi_mul(w, u, v);
    mpi_fdiv_r( w, w, m );
}
int mpi_subm(MPI w, MPI u, MPI v, MPI m)
{
	if (mpi_sub(w, u, v) < 0 || mpi_fdiv_r(w, w, m) < 0)
		return -ENOMEM;
	return 0;
}
Example #7
0
void
mpi_subm( MPI w, MPI u, MPI v, MPI m)
{
    mpi_sub(w, u, v);
    mpi_fdiv_r( w, w, m );
}
Example #8
0
void
mpi_addm( MPI w, MPI u, MPI v, MPI m)
{
    mpi_add(w, u, v);
    mpi_fdiv_r( w, w, m );
}
int mpi_mulm(MPI w, MPI u, MPI v, MPI m)
{
	if (mpi_mul(w, u, v) < 0)
		return -ENOMEM;
	return mpi_fdiv_r(w, w, m);
}