epoint_init_mem_variable
epoint_init_mem_variable函数定义在miracl.h,在mrcore.c中实现。
extern epoint* epoint_init_mem_variable(_MIPT_ char *,int,int);
函数功能:用字符数组mem初始化一个epoint指针,也就是椭圆曲线的一个点。
参数mem:字符数组。
参数index:下标。
参数sz:整数。
1. 源码分析
与epoint_init_mem_variable相关的函数如下。
#ifdef MR_GENERIC_MT
#define _MIPD_ miracl *mr_mip,
#else
#define _MIPD_
#endif
/* Elliptic curve point status */
#define MR_AFFINE 1
#define MR_EPOINT_INFINITY 2
epoint* epoint_init_mem_variable(_MIPD_ char *mem,int index,int sz)
{
epoint *p;
char *ptr;
int offset,r;
#ifdef MR_OS_THREADS
miracl *mr_mip=get_mip();
#endif
// 字节对齐
offset=0;
r=(unsigned long)mem%MR_SL;
if (r>0) offset=MR_SL-r;
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord==MR_AFFINE)
p=(epoint *)&mem[offset+index*mr_esize_a(sz)];
else
#endif
// 取mem的第offset+index*mr_esize(sz)个元素的地址,然后强制转换为epoint类型指针
p=(epoint *)&mem[offset+index*mr_esize(sz)];
ptr=(char *)p+sizeof(epoint);
p->X=mirvar_mem_variable(ptr,0,sz);
p->Y=mirvar_mem_variable(ptr,1,sz);
#ifndef MR_AFFINE_ONLY
if (mr_mip->coord!=MR_AFFINE) p->Z=mirvar_mem_variable(ptr,2,sz);
#endif
p->marker=MR_EPOINT_INFINITY;
return p;
}
如果定义了MR_OS_THREADS,则设置mr_mip为get_mip,返回miracl *指针。
mirvar_mem_variable为字符数组mem的元素设置对齐。
MR_AFFINE和MR_EPOINT_INFINITY定义在字符常量,表示椭圆曲线上点的状态。