📄 miracl.h
字号:
/* Montgomery stuff */
extern mr_small prepare_monty(_MIPT_ big);
extern void kill_monty(_MIPTO_ );
extern void nres(_MIPT_ big,big);
extern void redc(_MIPT_ big,big);
extern void nres_negate(_MIPT_ big,big);
extern void nres_modadd(_MIPT_ big,big,big);
extern void nres_modsub(_MIPT_ big,big,big);
extern void nres_premult(_MIPT_ big,int,big);
extern void nres_modmult(_MIPT_ big,big,big);
extern int nres_moddiv(_MIPT_ big,big,big);
extern void nres_dotprod(_MIPT_ int,big *,big *,big);
extern void nres_powmod(_MIPT_ big,big,big);
extern void nres_powltr(_MIPT_ int,big,big);
extern void nres_powmod2(_MIPT_ big,big,big,big,big);
extern void nres_powmodn(_MIPT_ int,big *,big *,big);
extern BOOL nres_sqroot(_MIPT_ big,big);
extern void nres_lucas(_MIPT_ big,big,big,big);
extern BOOL nres_double_inverse(_MIPT_ big,big,big,big);
extern BOOL nres_multi_inverse(_MIPT_ int,big *,big *);
extern void shs_init(sha *);
extern void shs_process(sha *,int);
extern void shs_hash(sha *,char *);
extern void shs256_init(sha256 *);
extern void shs256_process(sha256 *,int);
extern void shs256_hash(sha256 *,char *);
#ifdef mr_unsign64
extern void shs512_init(sha512 *);
extern void shs512_process(sha512 *,int);
extern void shs512_hash(sha512 *,char *);
extern void shs384_init(sha384 *);
extern void shs384_process(sha384 *,int);
extern void shs384_hash(sha384 *,char *);
#endif
extern BOOL aes_init(aes *,int,int,char *,char *);
extern void aes_getreg(aes *,char *);
extern mr_unsign32 aes_encrypt(aes *,char *);
extern mr_unsign32 aes_decrypt(aes *,char *);
extern void aes_reset(aes *,int,char *);
extern void aes_end(aes *);
extern void strong_init(csprng *,int,char *,mr_unsign32);
extern int strong_rng(csprng *);
extern void strong_bigrand(_MIPT_ csprng *,big,big);
extern void strong_bigdig(_MIPT_ csprng *,int,int,big);
extern void strong_kill(csprng *);
/* special modular multipliers */
extern void comba_mult(_MIPT_ big,big,big);
extern void comba_square(_MIPT_ big,big);
extern void comba_redc(_MIPT_ big,big);
extern void comba_add(_MIPT_ big,big,big);
extern void comba_sub(_MIPT_ big,big,big);
extern void comba_mult2(_MIPT_ big,big,big);
extern void fastmodmult(_MIPT_ big,big,big);
extern void fastmodsquare(_MIPT_ big,big);
extern void kcm_mul(_MIPT_ big,big,big);
extern void kcm_sqr(_MIPT_ big,big);
extern void kcm_redc(_MIPT_ big,big);
extern void kcm_multiply(_MIPT_ int,big,big,big);
extern void kcm_square(_MIPT_ int,big,big);
extern BOOL kcm_top(_MIPT_ int,big,big,big);
/* elliptic curve stuff */
extern BOOL point_at_infinity(epoint *);
extern void ecurve_init(_MIPT_ big,big,big,int);
extern big ecurve_add(_MIPT_ epoint *,epoint *);
extern big ecurve_sub(_MIPT_ epoint *,epoint *);
extern void ecurve_double_add(_MIPT_ epoint *,epoint *,epoint *,epoint *,big *,big *);
extern void ecurve_multi_add(_MIPT_ int,epoint **,epoint **);
extern void ecurve_mult(_MIPT_ big,epoint *,epoint *);
extern void ecurve_mult2(_MIPT_ big,epoint *,big,epoint *,epoint *);
extern void ecurve_multn(_MIPT_ int,big *,epoint**,epoint *);
extern BOOL epoint_x(_MIPT_ big);
extern BOOL epoint_set(_MIPT_ big,big,int,epoint*);
extern int epoint_get(_MIPT_ epoint*,big,big);
extern void epoint_getxyz(_MIPT_ epoint *,big,big,big);
extern int epoint_norm(_MIPT_ epoint *);
extern void epoint_free(epoint *);
extern void epoint_copy(epoint *,epoint *);
extern BOOL epoint_comp(_MIPT_ epoint *,epoint *);
extern void epoint_negate(_MIPT_ epoint *);
extern BOOL ecurve2_init(_MIPT_ int,int,int,int,big,big,BOOL,int);
extern big ecurve2_add(_MIPT_ epoint *,epoint *);
extern big ecurve2_sub(_MIPT_ epoint *,epoint *);
extern void ecurve2_multi_add(_MIPT_ int,epoint **,epoint **);
extern void ecurve2_mult(_MIPT_ big,epoint *,epoint *);
extern void ecurve2_mult2(_MIPT_ big,epoint *,big,epoint *,epoint *);
extern void ecurve2_multn(_MIPT_ int,big *,epoint**,epoint *);
extern epoint* epoint2_init(_MIPTO_ );
extern BOOL epoint2_set(_MIPT_ big,big,int,epoint*);
extern int epoint2_get(_MIPT_ epoint*,big,big);
extern void epoint2_getxyz(_MIPT_ epoint *,big,big,big);
extern int epoint2_norm(_MIPT_ epoint *);
extern void epoint2_free(epoint *);
extern void epoint2_copy(epoint *,epoint *);
extern BOOL epoint2_comp(_MIPT_ epoint *,epoint *);
extern void epoint2_negate(_MIPT_ epoint *);
/* GF(2) stuff */
extern BOOL prepare_basis(_MIPT_ int,int,int,int,BOOL);
extern void add2(big,big,big);
extern void incr2(big,int,big);
extern void reduce2(_MIPT_ big,big);
extern void multiply2(_MIPT_ big,big,big);
extern void modmult2(_MIPT_ big,big,big);
extern void modsquare2(_MIPT_ big,big);
extern void power2(_MIPT_ big,int,big);
extern void sqroot2(_MIPT_ big,big);
extern void halftrace2(_MIPT_ big,big);
extern BOOL quad2(_MIPT_ big,big);
extern BOOL inverse2(_MIPT_ big,big);
extern void karmul2(int,mr_small *,mr_small *,mr_small *,mr_small *);
extern void karmul2_poly(_MIPT_ int,big *,big *,big *,big *);
extern void karmul2_poly_upper(_MIPT_ int,big *,big *,big *,big *);
extern void gf2m_dotprod(_MIPT_ int,big *,big *,big);
extern int trace2(_MIPT_ big);
extern void rand2(_MIPT_ big);
extern void gcd2(_MIPT_ big,big,big);
extern int degree2(big);
/* Group 3 - Floating-slash routines */
#ifdef MR_FLASH
extern void fpack(_MIPT_ big,big,flash);
extern void numer(_MIPT_ flash,big);
extern void denom(_MIPT_ flash,big);
extern BOOL fit(big,big,int);
extern void build(_MIPT_ flash,int (*)(_MIPT_ big,int));
extern void mround(_MIPT_ big,big,flash);
extern void flop(_MIPT_ flash,flash,int *,flash);
extern void fmul(_MIPT_ flash,flash,flash);
extern void fdiv(_MIPT_ flash,flash,flash);
extern void fadd(_MIPT_ flash,flash,flash);
extern void fsub(_MIPT_ flash,flash,flash);
extern int fcomp(_MIPT_ flash,flash);
extern void fconv(_MIPT_ int,int,flash);
extern void frecip(_MIPT_ flash,flash);
extern void ftrunc(_MIPT_ flash,big,flash);
extern void fmodulo(_MIPT_ flash,flash,flash);
extern void fpmul(_MIPT_ flash,int,int,flash);
extern void fincr(_MIPT_ flash,int,int,flash);
extern void dconv(_MIPT_ double,flash);
extern double fdsize(_MIPT_ flash);
extern void frand(_MIPT_ flash);
/* Group 4 - Advanced Flash routines */
extern void fpower(_MIPT_ flash,int,flash);
extern BOOL froot(_MIPT_ flash,int,flash);
extern void fpi(_MIPT_ flash);
extern void fexp(_MIPT_ flash,flash);
extern void flog(_MIPT_ flash,flash);
extern void fpowf(_MIPT_ flash,flash,flash);
extern void ftan(_MIPT_ flash,flash);
extern void fatan(_MIPT_ flash,flash);
extern void fsin(_MIPT_ flash,flash);
extern void fasin(_MIPT_ flash,flash);
extern void fcos(_MIPT_ flash,flash);
extern void facos(_MIPT_ flash,flash);
extern void ftanh(_MIPT_ flash,flash);
extern void fatanh(_MIPT_ flash,flash);
extern void fsinh(_MIPT_ flash,flash);
extern void fasinh(_MIPT_ flash,flash);
extern void fcosh(_MIPT_ flash,flash);
extern void facosh(_MIPT_ flash,flash);
#endif
/* Test predefined Macros to determine compiler type, and hopefully
selectively use fast in-line assembler (or other compiler specific
optimisations. Note I am unsure of Microsoft version numbers. So I
suspect are Microsoft.
Note: It seems to be impossible to get the 16-bit Microsoft compiler
to allow inline 32-bit op-codes. So I suspect that INLINE_ASM == 2 will
never work with it. Pity.
#define INLINE_ASM 1 -> generates 8086 inline assembly
#define INLINE_ASM 2 -> generates mixed 8086 & 80386 inline assembly,
so you can get some benefit while running in a
16-bit environment on 32-bit hardware (DOS, Windows
3.1...)
#define INLINE_ASM 3 -> generate true 80386 inline assembly - (Using DOS
extender, Windows '95/Windows NT)
Actually optimised for Pentium
#define INLINE_ASM 4 -> 80386 code in the GNU style (for (DJGPP)
Small, medium, compact and large memory models are supported for the
first two of the above.
*/
/* To allow for inline assembly */
#ifdef __GNUC__
#define ASM __asm__ __volatile__
#endif
#ifdef __TURBOC__
#define ASM asm
#endif
#ifdef _MSC_VER
#define ASM _asm
#endif
#ifndef MR_NOASM
/* Itanium - inline the time-critical functions */
#ifdef MR_ITANIUM
#define muldvd(a,b,c,rp) (tm=_m64_xmahu((a),(b),(c)),*(rp)=_m64_xmalu((a),(b),(c)),tm)
#define muldvd2(a,b,c,rp) (tm=_m64_xmalu((a),(b),(*(c))),*(c)=_m64_xmahu((a),(b),(*(c))),tm+=*(rp),*(c)+=(tm<*(rp)),*(rp)=tm)
#endif
/*
SSE2 code. Works as for itanium - but in fact it is slower than the regular code so not recommended
Would require a call to emmintrin.h or xmmintrin.h, and an __m128i variable tm to be declared in effected
functions. But it works!
#define muldvd(a,b,c,rp) (tm=_mm_add_epi64(_mm_mul_epu32(_mm_cvtsi32_si128((a)),_mm_cvtsi32_si128((b))),_mm_cvtsi32_si128((c))),*(rp)=_mm_cvtsi128_si32(tm),_mm_cvtsi128_si32(_mm_shuffle_epi32(tm,_MM_SHUFFLE(3,2,0,1))) )
#define muldvd2(a,b,c,rp) (tm=_mm_add_epi64(_mm_add_epi64(_mm_mul_epu32(_mm_cvtsi32_si128((a)),_mm_cvtsi32_si128((b))),_mm_cvtsi32_si128(*(c))),_mm_cvtsi32_si128(*(rp))),*(rp)=_mm_cvtsi128_si32(tm),*(c)=_mm_cvtsi128_si32( _mm_shuffle_epi32(tm,_MM_SHUFFLE(3,2,0,1)) )
*/
/* Borland C/Turbo C */
#ifdef __TURBOC__
#ifndef __HUGE__
#if defined(__COMPACT__) || defined(__LARGE__)
#define MR_LMM
#endif
#if MIRACL==16
#define INLINE_ASM 1
#endif
#if __TURBOC__>=0x410
#if MIRACL==32
#if defined(__SMALL__) || defined(__MEDIUM__) || defined(__LARGE__) || defined(__COMPACT__)
#define INLINE_ASM 2
#else
#define INLINE_ASM 3
#endif
#endif
#endif
#endif
#endif
/* Microsoft C */
#ifdef _MSC_VER
#ifndef M_I86HM
#if defined(M_I86CM) || defined(M_I86LM)
#define MR_LMM
#endif
#if _MSC_VER>=600
#if _MSC_VER<1200
#if MIRACL==16
#define INLINE_ASM 1
#endif
#endif
#endif
#if _MSC_VER>=1000
#if MIRACL==32
#define INLINE_ASM 3
#endif
#endif
#endif
#endif
/* DJGPP GNU C */
#ifdef __GNUC__
#ifdef i386
#if MIRACL==32
#define INLINE_ASM 4
#endif
#endif
#endif
#endif
/*
The following contribution is from Tielo Jongmans, Netherlands
These inline assembler routines are suitable for Watcom 10.0 and up
Added into miracl.h. Notice the override of the original declarations
of these routines, which should be removed.
The following pragma is optional, it is dangerous, but it saves a
calling sequence
*/
/*
#pragma off (check_stack);
extern unsigned int muldiv(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *);
#pragma aux muldiv= \
"mul edx" \
"add eax,ebx" \
"adc edx,0" \
"div ecx" \
"mov [esi],edx" \
parm [eax] [edx] [ebx] [ecx] [esi] \
value [eax] \
modify [eax edx];
extern unsigned int muldvm(unsigned int, unsigned int, unsigned int, unsigned int *);
#pragma aux muldvm= \
"div ebx" \
"mov [ecx],edx" \
parm [edx] [eax] [ebx] [ecx] \
value [eax] \
modify [eax edx];
extern unsigned int muldvd(unsigned int, unsigned int, unsigned int, unsigned int *);
#pragma aux muldvd= \
"mul edx" \
"add eax,ebx" \
"adc edx,0" \
"mov [ecx],eax" \
"mov eax,edx" \
parm [eax] [edx] [ebx] [ecx] \
value [eax] \
modify [eax edx];
*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -