📄 mrcore.c
字号:
bits=MIRACL;
while (bits>1)
{
bits/=2;
temp=((mr_small)1<<bits);
if (temp==nb)
{
fits=TRUE;
break;
}
if (temp<nb || (bits%2)!=0) break;
}
if (fits)
{
mr_mip->apbase=nb;
mr_mip->pack=MIRACL/bits;
mr_mip->base=0;
return 0;
}
#endif
mr_mip->apbase=nb;
mr_mip->pack=1;
mr_mip->base=nb;
#ifdef MR_SIMPLE_BASE
return 0;
#else
if (mr_mip->base==0) return 0;
temp=MR_DIV(MAXBASE,nb);
while (temp>=nb)
{
temp=MR_DIV(temp,nb);
mr_mip->base*=nb;
mr_mip->pack++;
}
#ifdef MR_FP_ROUNDING
mr_mip->inverse_base=mr_invert(mr_mip->base);
return mr_mip->inverse_base;
#else
return 0;
#endif
#endif
}
#ifdef MR_FLASH
BOOL fit(big x,big y,int f)
{ /* returns TRUE if x/y would fit flash format of length f */
int n,d;
n=(int)(x->len&(MR_OBITS));
d=(int)(y->len&(MR_OBITS));
if (n==1 && x->w[0]==1) n=0;
if (d==1 && y->w[0]==1) d=0;
if (n+d<=f) return TRUE;
return FALSE;
}
#endif
int mr_lent(flash x)
{ /* return length of big or flash in words */
mr_lentype lx;
lx=(x->len&(MR_OBITS));
#ifdef MR_FLASH
return (int)((lx&(MR_MSK))+((lx>>(MR_BTS))&(MR_MSK)));
#else
return (int)lx;
#endif
}
void zero(flash x)
{ /* set big/flash number to zero */
int i,n;
mr_small *g;
if (x==NULL) return;
#ifdef MR_FLASH
n=mr_lent(x);
#else
n=(x->len&MR_OBITS);
#endif
g=x->w;
for (i=0;i<n;i++)
g[i]=0;
x->len=0;
}
void uconvert(_MIPD_ unsigned int n ,big x)
{ /* convert unsigned integer n to big number format */
int m;
#ifdef MR_FP
mr_small dres;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
zero(x);
if (n==0) return;
m=0;
#ifndef MR_SIMPLE_BASE
if (mr_mip->base==0)
{
#endif
#ifndef MR_NOFULLWIDTH
#if MR_IBITS > MIRACL
while (n>0)
{
x->w[m++]=(mr_small)(n%((mr_small)1<<(MIRACL)));
n/=((mr_small)1<<(MIRACL));
}
#else
x->w[m++]=(mr_small)n;
#endif
#endif
#ifndef MR_SIMPLE_BASE
}
else while (n>0)
{
x->w[m++]=MR_REMAIN((mr_small)n,mr_mip->base);
n/=mr_mip->base;
}
#endif
x->len=m;
}
void convert(_MIPD_ int n ,big x)
{ /* convert signed integer n to big number format */
mr_lentype s;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (n==0) {zero(x); return;}
s=0;
if (n<0)
{
s=MR_MSBIT;
n=(-n);
}
uconvert(_MIPP_ (unsigned int)n,x);
x->len|=s;
}
#ifndef MR_STATIC
#ifdef mr_dltype
void dlconv(_MIPD_ mr_dltype n,big x)
{ /* convert double length integer to big number format - rarely needed */
int m;
mr_lentype s;
#ifdef MR_FP
mr_small dres;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
zero(x);
if (n==0) return;
s=0;
if (n<0)
{
s=MR_MSBIT;
n=(-n);
}
m=0;
#ifndef MR_SIMPLE_BASE
if (mr_mip->base==0)
{
#endif
#ifndef MR_NOFULLWIDTH
while (n>0)
{
x->w[m++]=(mr_small)(n%((mr_dltype)1<<(MIRACL)));
n/=((mr_dltype)1<<(MIRACL));
}
#endif
#ifndef MR_SIMPLE_BASE
}
else while (n>0)
{
x->w[m++]=(mr_small)MR_REMAIN(n,mr_mip->base);
n/=mr_mip->base;
}
#endif
x->len=(m|s);
}
#endif
void ulgconv(_MIPD_ unsigned long n,big x)
{ /* convert unsigned long integer to big number format - rarely needed */
int m;
#ifdef MR_FP
mr_small dres;
#endif
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
zero(x);
if (n==0) return;
m=0;
#ifndef MR_SIMPLE_BASE
if (mr_mip->base==0)
{
#endif
#ifndef MR_NOFULLWIDTH
#if MR_LBITS > MIRACL
while (n>0)
{
x->w[m++]=(mr_small)(n%(1L<<(MIRACL)));
n/=(1L<<(MIRACL));
}
#else
x->w[m++]=(mr_small)n;
#endif
#endif
#ifndef MR_SIMPLE_BASE
}
else while (n>0)
{
x->w[m++]=MR_REMAIN(n,mr_mip->base);
n/=mr_mip->base;
}
#endif
x->len=m;
}
void lgconv(_MIPD_ long n,big x)
{ /* convert signed long integer to big number format - rarely needed */
mr_lentype s;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (n==0) {zero(x); return;}
s=0;
if (n<0)
{
s=MR_MSBIT;
n=(-n);
}
ulgconv(_MIPP_ (unsigned long)n,x);
x->len|=s;
}
flash mirvar(_MIPD_ int iv)
{ /* initialize big/flash number */
flash x;
int align;
char *ptr;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return NULL;
MR_IN(23);
if (!(mr_mip->active))
{
mr_berror(_MIPP_ MR_ERR_NO_MIRSYS);
MR_OUT
return NULL;
}
/* OK, now I control alignment.... */
/* Allocate space for big, the length, the pointer, and the array */
/* Do it all in one memory allocation - this is quicker */
/* Ensure that the array has correct alignment */
x=(big)mr_alloc(_MIPP_ mr_size(mr_mip->nib-1),1);
if (x==NULL)
{
MR_OUT
return x;
}
ptr=(char *)&x->w;
align=(unsigned long)(ptr+sizeof(mr_small *))%sizeof(mr_small);
x->w=(mr_small *)(ptr+sizeof(mr_small *)+sizeof(mr_small)-align);
if (iv!=0) convert(_MIPP_ iv,x);
MR_OUT
return x;
}
#endif
flash mirvar_mem_variable(char *mem,int index,int sz)
{
flash x;
int align;
char *ptr;
int offset,r;
/* alignment */
offset=0;
r=(unsigned long)mem%MR_SL;
if (r>0) offset=MR_SL-r;
x=(big)&mem[offset+mr_size(sz)*index];
ptr=(char *)&x->w;
align=(unsigned long)(ptr+sizeof(mr_small *))%sizeof(mr_small);
x->w=(mr_small *)(ptr+sizeof(mr_small *)+sizeof(mr_small)-align);
return x;
}
flash mirvar_mem(_MIPD_ char *mem,int index)
{ /* initialize big/flash number from pre-allocated memory */
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return NULL;
return mirvar_mem_variable(mem,index,mr_mip->nib-1);
}
void set_user_function(_MIPD_ BOOL (*user)(void))
{
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (mr_mip->ERNUM) return;
MR_IN(111)
if (!(mr_mip->active))
{
mr_berror(_MIPP_ MR_ERR_NO_MIRSYS);
MR_OUT
return;
}
mr_mip->user=user;
MR_OUT
}
#ifndef MR_STATIC
#ifndef MR_SIMPLE_IO
void set_io_buffer_size(_MIPD_ int len)
{
int i;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
if (len<0) return;
MR_IN(142)
for (i=0;i<mr_mip->IOBSIZ;i++) mr_mip->IOBUFF[i]=0;
mr_free(mr_mip->IOBUFF);
if (len==0)
{
MR_OUT
return;
}
mr_mip->IOBSIZ=len;
mr_mip->IOBUFF=(char *)mr_alloc(_MIPP_ len+1,1);
mr_mip->IOBUFF[0]='\0';
MR_OUT
}
#endif
#endif
/* Initialise a big from ROM given its fixed length */
BOOL init_big_from_rom(big x,int len,const mr_small *rom,int romsize,int *romptr)
{
int i;
zero(x);
x->len=len;
for (i=0;i<len;i++)
{
if (*romptr>=romsize) return FALSE;
#ifdef MR_AVR
x->w[i]=pgm_read_byte_near(&rom[*romptr]);
#else
x->w[i]=rom[*romptr];
#endif
(*romptr)++;
}
mr_lzero(x);
return TRUE;
}
/* Initialise an elliptic curve point from ROM */
BOOL init_point_from_rom(epoint *P,int len,const mr_small *rom,int romsize,int *romptr)
{
if (!init_big_from_rom(P->X,len,rom,romsize,romptr)) return FALSE;
if (!init_big_from_rom(P->Y,len,rom,romsize,romptr)) return FALSE;
P->marker=MR_EPOINT_NORMALIZED;
return TRUE;
}
miracl *mirsys(_MIPD_ int nd,mr_small nb)
{ /* Initialize MIRACL system to *
* use numbers to base nb, and *
* nd digits or (-nd) bytes long */
/* In these cases mr_mip is passed as the first parameter */
#ifdef MR_GENERIC_MT
return mirsys_basic(mr_mip,nd,nb);
#else
#ifdef MR_STATIC
return mirsys_basic(mr_mip,nd,nb);
#endif
#endif
/* In these cases mr_mip is a "global" pointer and the mip itself is allocated from the heap.
In fact mr_mip (and mip) may be thread specific if some multi-threading scheme is implemented */
#ifndef MR_GENERIC_MT
#ifndef MR_STATIC
#ifdef MR_WINDOWS_MT
miracl *mr_mip=mr_first_alloc();
TlsSetValue(mr_key,mr_mip);
#endif
#ifdef MR_UNIX_MT
miracl *mr_mip=mr_first_alloc();
pthread_setspecific(mr_key,mr_mip);
#endif
#ifdef MR_OPENMP_MT
mr_mip=mr_first_alloc();
#endif
#ifndef MR_WINDOWS_MT
#ifndef MR_UNIX_MT
#ifndef MR_OPENMP_MT
mr_mip=mr_first_alloc();
#endif
#endif
#endif
mr_mip=get_mip();
return mirsys_basic(mr_mip,nd,nb);
#endif
#endif
}
miracl *mirsys_basic(miracl *mr_mip,int nd,mr_small nb)
{
#ifndef MR_NO_RAND
int i;
#endif
mr_small b,nw;
#ifdef MR_FP
mr_small dres;
#endif
if (mr_mip==NULL) return NULL;
#ifndef MR_STRIPPED_DOWN
mr_mip->depth=0;
mr_mip->trace[0]=0;
mr_mip->depth++;
mr_mip->trace[mr_mip->depth]=29;
#endif
/* digest hardware configuration */
#ifdef MR_NO_STANDARD_IO
mr_mip->ERCON=TRUE;
#else
mr_mip->ERCON=FALSE;
#endif
#ifndef MR_STATIC
mr_mip->logN=0;
mr_mip->degree=0;
mr_mip->chin.NP=0;
#endif
mr_mip->user=NULL;
mr_mip->same=FALSE;
mr_mip->first_one=FALSE;
mr_mip->debug=FALSE;
mr_mip->AA=0;
#ifndef MR_AFFINE_ONLY
mr_mip->coord=MR_NOTSET;
#endif
#ifdef MR_NOFULLWIDTH
if (nb==0)
{
mr_berror(_MIPP_ MR_ERR_BAD_BASE);
MR_OUT
return mr_mip;
}
#endif
#ifndef MR_FP
#ifdef mr_dltype
#ifndef MR_NOFULLWIDTH
if (sizeof(mr_dltype)<2*sizeof(mr_utype))
{ /* double length type, isn't */
mr_berror(_MIPP_ MR_ERR_NOT_DOUBLE_LEN);
MR_OUT
return mr_mip;
}
#endif
#endif
#endif
if (nb==1 || nb>MAXBASE)
{
mr_berror(_MIPP_ MR_ERR_BAD_BASE);
MR_OUT
return mr_mip;
}
#ifdef MR_FP_ROUNDING
if (mr_setbase(_MIPP_ nb)==0)
{ /* unable in fact to control FP rounding */
mr_berror(_MIPP_ MR_ERR_NO_ROUNDING);
MR_OUT
return mr_mip;
}
#else
mr_setbase(_MIPP_ nb);
#endif
b=mr_mip->base;
#ifdef MR_SIMPLE_BASE
if (b!=0)
{
mr_berror(_MIPP_ MR_ERR_BAD_BASE);
MR_OUT
return mr_mip;
}
#endif
mr_mip->lg2b=0;
mr_mip->base2=1;
#ifndef MR_SIMPLE_BASE
if (b==0)
{
#endif
mr_mip->lg2b=MIRACL;
mr_mip->base2=0;
#ifndef MR_SIMPLE_BASE
}
else while (b>1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -