椭圆曲线算法中涉及的函数纷繁复杂,比如为了实现“复制点群”功能,就定义了四个函数,有:
int EC_GROUP_copy (EC_GROUP *dest, const EC_GROUP *src)、
int ec_GFp_mont_group_copy (EC_GROUP *dest, const EC_GROUP *src)、
int ec_GFp_simple_group_copy (EC_GROUP *dest, const EC_GROUP *src)、
int ec_GF2m_simple_group_copy (EC_GROUP *dest, const EC_GROUP *src)。
怎么会有这么多函数呢,它们之间有什么关系呢?在这一节里将会向你详细解释。
首先,实现椭圆曲线中算法的函数大部分在文件ec_lib.c、ecp_mont.c、ecp_smpl.c和ec2_smpl.c里面。这四个文件所起作用各不相同:
文件 |
大致作用 |
备注 |
ec_lib.c |
提供统一的对外接口 |
个别函数接口未统一 |
ecp_mont.c |
专门处理field_data1、field_data2和函数field_mod_func |
只针对素域时处理点群的部分函数 |
ecp_smpl.c |
素域底层基本功能的具体实现 |
只针对素域 |
ec2_smpl.c |
二元域底层基本功能的具体实现 |
只针对二元域 |
表5.1 ec_lib.c、ecp_mont.c、ecp_smpl.c和ec2_smpl.c的作用
接着,来看看它们之间的关系。
- ec_lib.c中的函数(无论接口是否统一)会根据有限域类型调用ecp_mont.c(素域、点群)和ecp_smpl.c(素域)或者ec2_smpl.c(二元域)。
- 对素域而言,ecp_mont.c专门处理field_data1、field_data2和函数field_mod_func(二元域没有这三个参数),剩下的底层基本功能的具体实现需要去调用ecp_smpl.c。如果不需要处理field_data1、field_data2和函数field_mod_func,则直接调用ecp_smpl.c,而不需要调用ecp_ mont.c。
- 对二元域而言,ec2_smpl.c是底层基本功能的具体实现,被ec_lib.c直接调用。
以上关系的图示如下:
图5.2 ec_lib.c、ecp_mont.c、ecp_smpl.c和ec2_smpl.c的调用关系
接下来,举两个例子来说明。
例1:分析本小节开始部分提到的“复制点群”各函数之间的相互关系。
注意:以下用记号“EC_GROUP_copy @ec_lib.c”表示函数EC_GROUP_copy是在文件ec_lib.c中,其余类似。
图5.3 “复制点群”函数的调用关系
例2:“设置群信息”。该例中不需要处理field_data1、field_data2和函数field_mod_func,所以就没有调用ecp_mont.c文件,而是直接调用ecp_smpl.c。
图5.4 “设置群信息”函数的调用关系
最后再多说两句。其实每个函数的函数名都写的非常清楚,从函数名中就可以读出该函数是在哪个文件中,是对素域还是二元域进行操作,亦或是作为一个统一的接口。
- 如果函数名中带有“GFp”,则函数是对素域进行操作;如果函数名中带有“GF2m”,则函数是对二元域进行操作。
- 如果函数名中带有“mont”,则函数在ecp_mont.c文件中。
- 如果函数名中带有“smpl”,则函数在ecp_smpl.c或者ec2m_smpl.c文件中。至于具体在哪个文件,就看文件名里面是带有“GFp”还是“GF2m”。
另外,ec_lib.c中还有部分函数的接口并没有统一(比如例2),其实这部分函数同样可以做到接口的统一,但这是后一步的工作了。