blob: 5f3c8566a298d944e5ea5584ffc36c4cb03addb3 [file] [log] [blame]
#ifndef FF_WWW_H
#define FF_WWW_H
#include "big_XXX.h"
#include "config_ff_WWW.h"
using namespace amcl;
#define HFLEN_WWW (FFLEN_WWW/2) /**< Useful for half-size RSA private key operations */
#define P_MBITS_WWW (MODBYTES_XXX*8)
#define P_TBITS_WWW (P_MBITS_WWW%BASEBITS_XXX)
#define P_EXCESS_WWW(a) (((a[NLEN_XXX-1])>>(P_TBITS_WWW))+1)
#define P_FEXCESS_WWW ((chunk)1<<(BASEBITS_XXX*NLEN_XXX-P_MBITS_WWW-1))
namespace WWW {
/* Finite Field Prototypes */
/** @brief Copy one FF element of given length to another
*
@param x FF instance to be copied to, on exit = y
@param y FF instance to be copied from
@param n size of FF in BIGs
*/
extern void FF_copy(XXX::BIG *x,XXX::BIG *y,int n);
/** @brief Initialize an FF element of given length from a 32-bit integer m
*
@param x FF instance to be copied to, on exit = m
@param m integer
@param n size of FF in BIGs
*/
extern void FF_init(XXX::BIG *x,sign32 m,int n);
/** @brief Set FF element of given size to zero
*
@param x FF instance to be set to zero
@param n size of FF in BIGs
*/
extern void FF_zero(XXX::BIG *x,int n);
/** @brief Tests for FF element equal to zero
*
@param x FF number to be tested
@param n size of FF in BIGs
@return 1 if zero, else returns 0
*/
extern int FF_iszilch(XXX::BIG *x,int n);
/** @brief return parity of an FF, that is the least significant bit
*
@param x FF number
@return 0 or 1
*/
extern int FF_parity(XXX::BIG *x);
/** @brief return least significant m bits of an FF
*
@param x FF number
@param m number of bits to return. Assumed to be less than BASEBITS.
@return least significant n bits as an integer
*/
extern int FF_lastbits(XXX::BIG *x,int m);
/** @brief Set FF element of given size to unity
*
@param x FF instance to be set to unity
@param n size of FF in BIGs
*/
extern void FF_one(XXX::BIG *x,int n);
/** @brief Compares two FF numbers. Inputs must be normalised externally
*
@param x first FF number to be compared
@param y second FF number to be compared
@param n size of FF in BIGs
@return -1 is x<y, 0 if x=y, 1 if x>y
*/
extern int FF_comp(XXX::BIG *x,XXX::BIG *y,int n);
/** @brief addition of two FFs
*
@param x FF instance, on exit = y+z
@param y FF instance
@param z FF instance
@param n size of FF in BIGs
*/
extern void FF_add(XXX::BIG *x,XXX::BIG *y,XXX::BIG *z,int n);
/** @brief subtraction of two FFs
*
@param x FF instance, on exit = y-z
@param y FF instance
@param z FF instance
@param n size of FF in BIGs
*/
extern void FF_sub(XXX::BIG *x,XXX::BIG *y,XXX::BIG *z,int n);
/** @brief increment an FF by an integer,and normalise
*
@param x FF instance, on exit = x+m
@param m an integer to be added to x
@param n size of FF in BIGs
*/
extern void FF_inc(XXX::BIG *x,int m,int n);
/** @brief Decrement an FF by an integer,and normalise
*
@param x FF instance, on exit = x-m
@param m an integer to be subtracted from x
@param n size of FF in BIGs
*/
extern void FF_dec(XXX::BIG *x,int m,int n);
/** @brief Normalises the components of an FF
*
@param x FF instance to be normalised
@param n size of FF in BIGs
*/
extern void FF_norm(XXX::BIG *x,int n);
/** @brief Shift left an FF by 1 bit
*
@param x FF instance to be shifted left
@param n size of FF in BIGs
*/
extern void FF_shl(XXX::BIG *x,int n);
/** @brief Shift right an FF by 1 bit
*
@param x FF instance to be shifted right
@param n size of FF in BIGs
*/
extern void FF_shr(XXX::BIG *x,int n);
/** @brief Formats and outputs an FF to the console
*
@param x FF instance to be printed
@param n size of FF in BIGs
*/
extern void FF_output(XXX::BIG *x,int n);
/** @brief Formats and outputs an FF to the console, in raw form
*
@param x FF instance to be printed
@param n size of FF in BIGs
*/
extern void FF_rawoutput(XXX::BIG *x,int n);
/** @brief Formats and outputs an FF instance to an octet string
*
Converts an FF to big-endian base 256 form.
@param S output octet string
@param x FF instance to be converted to an octet string
@param n size of FF in BIGs
*/
extern void FF_toOctet(octet *S,XXX::BIG *x,int n);
/** @brief Populates an FF instance from an octet string
*
Creates FF from big-endian base 256 form.
@param x FF instance to be created from an octet string
@param S input octet string
@param n size of FF in BIGs
*/
extern void FF_fromOctet(XXX::BIG *x,octet *S,int n);
/** @brief Multiplication of two FFs
*
Uses Karatsuba method internally
@param x FF instance, on exit = y*z
@param y FF instance
@param z FF instance
@param n size of FF in BIGs
*/
extern void FF_mul(XXX::BIG *x,XXX::BIG *y,XXX::BIG *z,int n);
/** @brief Reduce FF mod a modulus
*
This is slow
@param x FF instance to be reduced mod m - on exit = x mod m
@param m FF modulus
@param n size of FF in BIGs
*/
extern void FF_mod(XXX::BIG *x,XXX::BIG *m,int n);
/** @brief Square an FF
*
Uses Karatsuba method internally
@param x FF instance, on exit = y^2
@param y FF instance to be squared
@param n size of FF in BIGs
*/
extern void FF_sqr(XXX::BIG *x,XXX::BIG *y,int n);
/** @brief Reduces a double-length FF with respect to a given modulus
*
This is slow
@param x FF instance, on exit = y mod z
@param y FF instance, of double length 2*n
@param z FF modulus
@param n size of FF in BIGs
*/
extern void FF_dmod(XXX::BIG *x,XXX::BIG *y,XXX::BIG *z,int n);
/** @brief Invert an FF mod a prime modulus
*
@param x FF instance, on exit = 1/y mod z
@param y FF instance
@param z FF prime modulus
@param n size of FF in BIGs
*/
extern void FF_invmodp(XXX::BIG *x,XXX::BIG *y,XXX::BIG *z,int n);
/** @brief Create an FF from a random number generator
*
@param x FF instance, on exit x is a random number of length n BIGs with most significant bit a 1
@param R an instance of a Cryptographically Secure Random Number Generator
@param n size of FF in BIGs
*/
extern void FF_random(XXX::BIG *x,csprng *R,int n);
/** @brief Create a random FF less than a given modulus from a random number generator
*
@param x FF instance, on exit x is a random number < y
@param y FF instance, the modulus
@param R an instance of a Cryptographically Secure Random Number Generator
@param n size of FF in BIGs
*/
extern void FF_randomnum(XXX::BIG *x,XXX::BIG *y,csprng *R,int n);
/** @brief Calculate r=x^e mod m, side channel resistant
*
@param r FF instance, on exit = x^e mod p
@param x FF instance
@param e FF exponent
@param m FF modulus
@param n size of FF in BIGs
*/
extern void FF_skpow(XXX::BIG *r,XXX::BIG *x,XXX::BIG * e,XXX::BIG *m,int n);
/** @brief Calculate r=x^e mod m, side channel resistant
*
For short BIG exponent
@param r FF instance, on exit = x^e mod p
@param x FF instance
@param e BIG exponent
@param m FF modulus
@param n size of FF in BIGs
*/
extern void FF_skspow(XXX::BIG *r,XXX::BIG *x,XXX::BIG e,XXX::BIG *m,int n);
/** @brief Calculate r=x^e mod m
*
For very short integer exponent
@param r FF instance, on exit = x^e mod p
@param x FF instance
@param e integer exponent
@param m FF modulus
@param n size of FF in BIGs
*/
extern void FF_power(XXX::BIG *r,XXX::BIG *x,int e,XXX::BIG *m,int n);
/** @brief Calculate r=x^e mod m
*
@param r FF instance, on exit = x^e mod p
@param x FF instance
@param e FF exponent
@param m FF modulus
@param n size of FF in BIGs
*/
extern void FF_pow(XXX::BIG *r,XXX::BIG *x,XXX::BIG *e,XXX::BIG *m,int n);
/** @brief Test if an FF has factor in common with integer s
*
@param x FF instance to be tested
@param s the supplied integer
@param n size of FF in BIGs
@return 1 if gcd(x,s)!=1, else return 0
*/
extern int FF_cfactor(XXX::BIG *x,sign32 s,int n);
/** @brief Test if an FF is prime
*
Uses Miller-Rabin Method
@param x FF instance to be tested
@param R an instance of a Cryptographically Secure Random Number Generator
@param n size of FF in BIGs
@return 1 if x is (almost certainly) prime, else return 0
*/
extern int FF_prime(XXX::BIG *x,csprng *R,int n);
/** @brief Calculate r=x^e.y^f mod m
*
@param r FF instance, on exit = x^e.y^f mod p
@param x FF instance
@param e BIG exponent
@param y FF instance
@param f BIG exponent
@param m FF modulus
@param n size of FF in BIGs
*/
extern void FF_pow2(XXX::BIG *r,XXX::BIG *x,XXX::BIG e,XXX::BIG *y,XXX::BIG f,XXX::BIG *m,int n);
}
#endif