|
|
|
@ -81,36 +81,60 @@ void mpmove(size_t size, /*@out@*/ mpw* dst, const mpw* src)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function zeroes a multi-precision integer of a given size.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
void mpzero(size_t size, /*@out@*/ mpw* data)
|
|
|
|
|
/*@modifies data @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function fills each word of a multi-precision integer with a
|
|
|
|
|
* given value.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @param fill The value fill the data with.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
void mpfill(size_t size, /*@out@*/ mpw* data, mpw fill)
|
|
|
|
|
/*@modifies data @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if a multi-precision integer is odd.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if odd, 0 if even
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpodd (size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if a multi-precision integer is even.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if even, 0 if odd
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpeven(size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if a multi-precision integer is zero.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if zero, 0 if not zero
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpz (size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if a multi-precision integer is not zero.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if not zero, 0 if zero
|
|
|
|
|
*/
|
|
|
|
|
/*@-exportlocal@*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
@ -119,12 +143,24 @@ int mpnz (size_t size, const mpw* data)
|
|
|
|
|
/*@=exportlocal@*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if two multi-precision integers of the same size
|
|
|
|
|
* are equal.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if equal, 0 if not equal
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpeq (size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if two multi-precision integers of the same size
|
|
|
|
|
* differ.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if not equal, 0 if equal
|
|
|
|
|
*/
|
|
|
|
|
/*@-exportlocal@*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
@ -133,6 +169,13 @@ int mpne (size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@=exportlocal@*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of the same size is greater than the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if greater, 0 if less or equal
|
|
|
|
|
*/
|
|
|
|
|
/*@-exportlocal@*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
@ -141,6 +184,13 @@ int mpgt (size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@=exportlocal@*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of the same size is less than the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if less, 0 if greater or equal
|
|
|
|
|
*/
|
|
|
|
|
/*@-exportlocal@*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
@ -149,108 +199,208 @@ int mplt (size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@=exportlocal@*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of the same size is greater than or equal to the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if greater or equal, 0 if less
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpge (size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of the same size is less than or equal to the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if less or equal, 0 if greater
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mple (size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if two multi-precision integers of different
|
|
|
|
|
* size are equal.
|
|
|
|
|
* @param xsize The size of the first multi-precision integer.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ysize The size of the first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if equal, 0 if not equal
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpeqx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if two multi-precision integers of different
|
|
|
|
|
* size differ.
|
|
|
|
|
* @param xsize The size of the first multi-precision integer.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ysize The size of the first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if not equal, 0 if equal
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
int mpnex(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of different size is greater than the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param xsize The size of the first multi-precision integer.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ysize The size of the second multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if greater, 0 if less or equal
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
int mpgtx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of different size is less than the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param xsize The size of the first multi-precision integer.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ysize The size of the second multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if less, 0 if greater or equal
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
int mpltx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of different size is greater than or equal to the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param xsize The size of the first multi-precision integer.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ysize The size of the second multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if greater or equal, 0 if less
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpgex(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the first of two multi-precision integers
|
|
|
|
|
* of different size is less than or equal to the second.
|
|
|
|
|
* @note The comparison treats the arguments as unsigned.
|
|
|
|
|
* @param xsize The size of the first multi-precision integer.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ysize The size of the second multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if less or equal, 0 if greater
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mplex(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the value of a multi-precision integer is
|
|
|
|
|
* equal to one.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if equal to one, 0 otherwise.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpisone(size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the value of a multi-precision integer is
|
|
|
|
|
* equal to two.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if equal to two, 0 otherwise.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpistwo(size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if the value of a multi-precision integer is
|
|
|
|
|
* less than or equal to one.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if less than or equal to one, 0 otherwise.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpleone(size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests if multi-precision integer x is equal to y minus one.
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return 1 if less than or equal to (y-1), 0 otherwise.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
int mpeqmone(size_t size, const mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests the most significant bit of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if set, 0 if not set
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpmsbset(size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function tests the least significant bit of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
* @return 1 if set, 0 if not set
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
int mplsbset(size_t size, const mpw* data)
|
|
|
|
|
/*@*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets the most significant bit of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
void mpsetmsb(size_t size, mpw* data)
|
|
|
|
|
/*@modifies data @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function sets the least significant bit of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
void mpsetlsb(size_t size, mpw* data)
|
|
|
|
|
/*@modifies data @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function clears the most significant bit of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
void mpclrmsb(size_t size, mpw* data)
|
|
|
|
|
/*@modifies data @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function clears the least significant bit of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI /*@unused@*/
|
|
|
|
|
void mpclrlsb(size_t size, mpw* data)
|
|
|
|
@ -275,6 +425,9 @@ void mpor(size_t size, mpw* xdata, const mpw* ydata)
|
|
|
|
|
/*@modifies xdata @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function flips all bits of a multi-precision integer.
|
|
|
|
|
* @param size The size of the multi-precision integer.
|
|
|
|
|
* @param data The multi-precision integer data.
|
|
|
|
|
*/
|
|
|
|
|
/*@-exportlocal@*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
@ -301,6 +454,12 @@ int mpaddw(size_t size, mpw* xdata, mpw y)
|
|
|
|
|
/*@modifies xdata @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function adds two multi-precision integers of equal size.
|
|
|
|
|
* The performed operation is in pseudocode: x += y
|
|
|
|
|
* @param size The size of the multi-precision integers.
|
|
|
|
|
* @param xdata The first multi-precision integer.
|
|
|
|
|
* @param ydata The second multi-precision integer.
|
|
|
|
|
* @return The carry-over value of the operation (either 0 or 1).
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
int mpadd (size_t size, mpw* xdata, const mpw* ydata)
|
|
|
|
@ -411,32 +570,59 @@ void mpsdivtwo(size_t size, mpw* data)
|
|
|
|
|
/*@modifies data @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function performs a multi-precision multiply-setup.
|
|
|
|
|
*
|
|
|
|
|
* This function is used in the computation of a full multi-precision
|
|
|
|
|
* multiplication. By using it we can shave off a few cycles; otherwise we'd
|
|
|
|
|
* have to zero the least significant half of the result first and use
|
|
|
|
|
* another call to the slightly slower mpaddmul function.
|
|
|
|
|
*
|
|
|
|
|
* @param size The size of multi-precision integer multiplier.
|
|
|
|
|
* @param result The place where result will be accumulated.
|
|
|
|
|
* @param data The multi-precision integer multiplier.
|
|
|
|
|
* @param y The multiplicand.
|
|
|
|
|
* @return The carry-over multi-precision word.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
mpw mpsetmul (size_t size, /*@out@*/ mpw* result, const mpw* data, mpw y)
|
|
|
|
|
/*@modifies result @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function performs a mult-precision multiply-accumulate.
|
|
|
|
|
*
|
|
|
|
|
* This function is used in the computation of a full multi-precision
|
|
|
|
|
* multiplication. It computes the product-by-one-word and accumulates it with
|
|
|
|
|
* the previous result.
|
|
|
|
|
*
|
|
|
|
|
* @param size The size of multi-precision integer multiplier.
|
|
|
|
|
* @param result The place where result will be accumulated.
|
|
|
|
|
* @param data The multi-precision integer multiplier.
|
|
|
|
|
* @param y The multiplicand.
|
|
|
|
|
* @return The carry-over multi-precision word.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
mpw mpaddmul (size_t size, /*@out@*/ mpw* result, const mpw* data, mpw y)
|
|
|
|
|
/*@modifies result @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function is used in the calculation of a multi-precision
|
|
|
|
|
* squaring.
|
|
|
|
|
*/
|
|
|
|
|
/*@-exportlocal@*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
mpw mpaddsqrtrc(size_t size, /*@out@*/ mpw* result, const mpw* data)
|
|
|
|
|
void mpaddsqrtrc(size_t size, /*@out@*/ mpw* result, const mpw* data)
|
|
|
|
|
/*@modifies result @*/;
|
|
|
|
|
/*@=exportlocal@*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function computes a full multi-precision product.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
void mpmul(/*@out@*/ mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata)
|
|
|
|
|
/*@modifies result @*/;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This function computes a full multi-precision square.
|
|
|
|
|
*/
|
|
|
|
|
BEECRYPTAPI
|
|
|
|
|
void mpsqr(/*@out@*/ mpw* result, size_t size, const mpw* data)
|
|
|
|
|