📄 miracl.h
字号:
/* main MIRACL instance structure */
typedef struct {
mr_small base; /* number base */
mr_small apbase; /* apparent base */
int pack; /* packing density */
int lg2b; /* bits in base */
mr_small base2; /* 2^mr_lg2b */
BOOL (*user)(void); /* pointer to user supplied function */
int nib; /* length of bigs */
#ifndef MR_STRIPPED_DOWN
int depth; /* error tracing ..*/
int trace[MR_MAXDEPTH]; /* .. mechanism */
#endif
BOOL check; /* overflow check */
BOOL fout; /* Output to file */
BOOL fin; /* Input from file */
BOOL active;
#ifndef MR_NO_FILE_IO
FILE *infile; /* Input file */
FILE *otfile; /* Output file */
#endif
mr_unsign32 ira[NK]; /* random number... */
int rndptr; /* ...array & pointer */
mr_unsign32 borrow;
/* Montgomery constants */
mr_small ndash;
big modulus;
BOOL ACTIVE;
BOOL MONTY;
/* Elliptic Curve details */
BOOL SS; /* True for Super-Singular */
#ifndef MR_AFFINE_ONLY
int coord;
#endif
int Asize,Bsize;
int M,AA,BB,CC; /* for GF(2^m) curves */
/*
mr_small pm,mask;
int e,k,Me,m; for GF(p^m) curves */
#ifndef MR_STATIC
int logN; /* constants for fast fourier fft multiplication */
int nprimes,degree;
mr_utype *prime,*cr;
mr_utype *inverse,**roots;
small_chinese chin;
mr_utype const1,const2,const3;
mr_small msw,lsw;
mr_utype **s1,**s2; /* pre-computed tables for polynomial reduction */
mr_utype **t; /* workspace */
mr_utype *wa;
mr_utype *wb;
mr_utype *wc;
#endif
BOOL same;
BOOL first_one;
BOOL debug;
big w0; /* workspace bigs */
big w1,w2,w3,w4;
big w5,w6,w7;
big w8,w9,w10,w11;
big w12,w13,w14,w15;
big w16,w17;
big big_ndash;
big ws;
big A,B,C;
/* User modifiables */
int IOBSIZ; /* size of i/o buffer */
BOOL ERCON; /* error control */
int ERNUM; /* last error code */
int NTRY; /* no. of tries for probablistic primality testing */
int IOBASE; /* base for input and output */
BOOL EXACT; /* exact flag */
BOOL RPOINT; /* =ON for radix point, =OFF for fractions in output */
BOOL TRACER; /* turns trace tracker on/off */
int INPLEN; /* input length */
#ifdef MR_STATIC
const int *PRIMES; /* small primes array */
char IOBUFF[MR_DEFAULT_BUFFER_SIZE]; /* i/o buffer */
#else
int *PRIMES; /* small primes array */
char *IOBUFF; /* i/o buffer */
#endif
#ifdef MR_FLASH
int workprec;
int stprec; /* start precision */
int RS,RD;
double D;
double db,n,p;
int a,b,c,d,r,q,oldn,ndig;
mr_small u,v,ku,kv;
BOOL last,carryon;
flash pi;
#endif
#ifdef MR_FP_ROUNDING
mr_large inverse_base;
#endif
#ifndef MR_STATIC
char *workspace;
#else
char workspace[MR_BIG_RESERVE(MR_SPACES)];
#endif
BOOL TWIST; /* set to twisted curve */
int qnr; /* a QNR -1 for p=3 mod 4, -2 for p=5 mod 8, 0 otherwise */
int pmod8;
} miracl;
#ifndef MR_GENERIC_MT
#ifdef MR_WINDOWS_MT
#define MR_OS_THREADS
#endif
#ifdef MR_UNIX_MT
#define MR_OS_THREADS
#endif
#ifndef MR_OS_THREADS
extern miracl *mr_mip; /* pointer to MIRACL's only global variable */
#endif
#endif
#ifdef MR_GENERIC_MT
#define _MIPT_ miracl *,
#define _MIPTO_ miracl *
#define _MIPD_ miracl *mr_mip,
#define _MIPDO_ miracl *mr_mip
#define _MIPP_ mr_mip,
#define _MIPPO_ mr_mip
#else
#define _MIPT_
#define _MIPTO_ void
#define _MIPD_
#define _MIPDO_ void
#define _MIPP_
#define _MIPPO_
#endif
/* Preamble and exit code for MIRACL routines. *
* Not used if MR_STRIPPED_DOWN is defined */
#ifdef MR_STRIPPED_DOWN
#define MR_OUT
#define MR_IN(N)
#else
#define MR_OUT mr_mip->depth--;
#define MR_IN(N) mr_mip->depth++; if (mr_mip->depth<MR_MAXDEPTH) {mr_mip->trace[mr_mip->depth]=(N); if (mr_mip->TRACER) mr_track(_MIPPO_); }
#endif
/* Function definitions */
/* Group 0 - Internal routines */
extern void mr_berror(_MIPT_ int);
extern mr_small mr_shiftbits(mr_small,int);
extern mr_small mr_setbase(_MIPT_ mr_small);
extern void mr_track(_MIPTO_ );
extern void mr_lzero(big);
extern BOOL mr_notint(flash);
extern int mr_lent(flash);
extern void mr_padd(_MIPT_ big,big,big);
extern void mr_psub(_MIPT_ big,big,big);
extern void mr_pmul(_MIPT_ big,mr_small,big);
#ifdef MR_FP_ROUNDING
extern mr_large mr_invert(mr_small);
extern mr_small imuldiv(mr_small,mr_small,mr_small,mr_small,mr_large,mr_small *);
extern mr_small mr_sdiv(_MIPT_ big,mr_small,mr_large,big);
#else
extern mr_small mr_sdiv(_MIPT_ big,mr_small,big);
#endif
extern void mr_shift(_MIPT_ big,int,big);
extern miracl *mr_first_alloc(void);
extern void *mr_alloc(_MIPT_ int,int);
extern void mr_free(void *);
extern void set_user_function(_MIPT_ BOOL (*)(void));
extern void set_io_buffer_size(_MIPT_ int);
extern int mr_testbit(_MIPT_ big,int);
extern int mr_window(_MIPT_ big,int,int *,int *);
extern int mr_window2(_MIPT_ big,big,int,int *,int *);
extern int mr_naf_window(_MIPT_ big,big,int,int *,int *);
extern int mr_fft_init(_MIPT_ int,big,big,BOOL);
extern void mr_dif_fft(_MIPT_ int,int,mr_utype *);
extern void mr_dit_fft(_MIPT_ int,int,mr_utype *);
extern void fft_reset(_MIPTO_);
extern int mr_poly_mul(_MIPT_ int,big*,int,big*,big*);
extern int mr_poly_sqr(_MIPT_ int,big*,big*);
extern void mr_polymod_set(_MIPT_ int,big*,big*);
extern int mr_poly_rem(_MIPT_ int,big *,big *);
extern int mr_ps_big_mul(_MIPT_ int,big *,big *,big *);
extern int mr_ps_zzn_mul(_MIPT_ int,big *,big *,big *);
extern mr_small muldiv(mr_small,mr_small,mr_small,mr_small,mr_small *);
extern mr_small muldvm(mr_small,mr_small,mr_small,mr_small *);
extern mr_small muldvd(mr_small,mr_small,mr_small,mr_small *);
extern void muldvd2(mr_small,mr_small,mr_small *,mr_small *);
extern flash mirvar_mem_variable(char *,int,int);
extern epoint* epoint_init_mem_variable(char *,int,int);
/* Group 1 - General purpose, I/O and basic arithmetic routines */
extern unsigned int igcd(unsigned int,unsigned int);
extern mr_small sgcd(mr_small,mr_small);
extern unsigned int isqrt(unsigned int,unsigned int);
extern void irand(_MIPT_ mr_unsign32);
extern mr_small brand(_MIPTO_ );
extern void zero(flash);
extern void convert(_MIPT_ int,big);
extern void uconvert(_MIPT_ unsigned int,big);
extern void lgconv(_MIPT_ long,big);
#ifdef mr_dltype
extern void dlconv(_MIPT_ mr_dltype,big);
#endif
extern flash mirvar(_MIPT_ int);
extern flash mirvar_mem(_MIPT_ char *,int);
extern void mirkill(big);
extern void *memalloc(_MIPT_ int);
extern void memkill(_MIPT_ char *,int);
extern void mr_init_threading(void);
extern void mr_end_threading(void);
extern miracl *get_mip(_MIPTO_ );
extern miracl *mirsys(_MIPT_ int,mr_small);
extern void mirexit(_MIPTO_ );
extern int exsign(flash);
extern void insign(int,flash);
extern int getdig(_MIPT_ big,int);
extern int numdig(_MIPT_ big);
extern void putdig(_MIPT_ int,big,int);
extern void copy(flash,flash);
extern void negify(flash,flash);
extern void absol(flash,flash);
extern int size(big);
extern int compare(big,big);
extern void add(_MIPT_ big,big,big);
extern void subtract(_MIPT_ big,big,big);
extern void incr(_MIPT_ big,int,big);
extern void decr(_MIPT_ big,int,big);
extern void premult(_MIPT_ big,int,big);
extern int subdiv(_MIPT_ big,int,big);
extern BOOL subdivisible(_MIPT_ big,int);
extern int remain(_MIPT_ big,int);
extern void bytes_to_big(_MIPT_ int,char *,big);
extern int big_to_bytes(_MIPT_ int,big,char *,BOOL);
extern mr_small normalise(_MIPT_ big,big);
extern void multiply(_MIPT_ big,big,big);
extern void fft_mult(_MIPT_ big,big,big);
extern BOOL fastmultop(_MIPT_ int,big,big,big);
extern void divide(_MIPT_ big,big,big);
extern BOOL divisible(_MIPT_ big,big);
extern void mad(_MIPT_ big,big,big,big,big,big);
extern int instr(_MIPT_ flash,char *);
extern int otstr(_MIPT_ flash,char *);
extern int cinstr(_MIPT_ flash,char *);
extern int cotstr(_MIPT_ flash,char *);
extern epoint* epoint_init(_MIPTO_ );
extern epoint* epoint_init_mem(_MIPT_ char *,int);
extern void* ecp_memalloc(_MIPT_ int);
void ecp_memkill(_MIPT_ char *,int);
BOOL init_big_from_rom(big,int,const mr_small *,int ,int *);
BOOL init_point_from_rom(epoint *,int,const mr_small *,int,int *);
#ifndef MR_NO_FILE_IO
extern int innum(_MIPT_ flash,FILE *);
extern int otnum(_MIPT_ flash,FILE *);
extern int cinnum(_MIPT_ flash,FILE *);
extern int cotnum(_MIPT_ flash,FILE *);
#endif
/* Group 2 - Advanced arithmetic routines */
extern mr_small smul(mr_small,mr_small,mr_small);
extern mr_small spmd(mr_small,mr_small,mr_small);
extern mr_small invers(mr_small,mr_small);
extern mr_small sqrmp(mr_small,mr_small);
extern int jac(mr_small,mr_small);
extern void gprime(_MIPT_ int);
extern int jack(_MIPT_ big,big);
extern int egcd(_MIPT_ big,big,big);
extern int xgcd(_MIPT_ big,big,big,big,big);
extern int logb2(_MIPT_ big);
extern int hamming(_MIPT_ big);
extern void expb2(_MIPT_ int,big);
extern void bigbits(_MIPT_ int,big);
extern void expint(_MIPT_ int,int,big);
extern void sftbit(_MIPT_ big,int,big);
extern void power(_MIPT_ big,long,big,big);
extern void powmod(_MIPT_ big,big,big,big);
extern void powmod2(_MIPT_ big,big,big,big,big,big);
extern void powmodn(_MIPT_ int,big *,big *,big,big);
extern int powltr(_MIPT_ int,big,big,big);
extern BOOL double_inverse(_MIPT_ big,big,big,big,big);
extern BOOL multi_inverse(_MIPT_ int,big*,big,big*);
extern void lucas(_MIPT_ big,big,big,big,big);
extern BOOL nroot(_MIPT_ big,int,big);
extern BOOL sqroot(_MIPT_ big,big,big);
extern void bigrand(_MIPT_ big,big);
extern void bigdig(_MIPT_ int,int,big);
extern int trial_division(_MIPT_ big,big);
extern BOOL isprime(_MIPT_ big);
extern BOOL nxprime(_MIPT_ big,big);
extern BOOL nxsafeprime(_MIPT_ int,int,big,big);
extern BOOL crt_init(_MIPT_ big_chinese *,int,big *);
extern void crt(_MIPT_ big_chinese *,big *,big);
extern void crt_end(big_chinese *);
extern BOOL scrt_init(_MIPT_ small_chinese *,int,mr_utype *);
extern void scrt(_MIPT_ small_chinese*,mr_utype *,big);
extern void scrt_end(small_chinese *);
extern BOOL brick_init(_MIPT_ brick *,big,big,int);
extern void pow_brick(_MIPT_ brick *,big,big);
extern void brick_end(brick *);
extern BOOL ebrick_init(_MIPT_ ebrick *,big,big,big,big,big,int);
extern void ebrick_end(ebrick *);
extern int mul_brick(_MIPT_ ebrick*,big,big,big);
extern BOOL ebrick2_init(_MIPT_ ebrick2 *,big,big,big,big,int,int,int,int,int);
extern void ebrick2_end(ebrick2 *);
extern int mul2_brick(_MIPT_ ebrick2*,big,big,big);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -