OpenSSL密码库算法笔记——第1.2.5章 comba平方

comba平方就是将comba乘法和经典平方的思想结合在一起:

 …………(1.9)

具体算法如下:(参见[3]算法4

───────────────────────────────────────

算法:    comba平方

step1:  c_{0}\leftarrow c_{1}\leftarrow c_{2}\leftarrow 0

step2:   对k从0到(2n-1),执行:

               2.1) 对每一对,执行:

2.1.1)      (uv)=ai×bj,

2.1.2)      如果(i < j),(uv)<<1,c2←带进位加法(c2,0),

2.1.3)      c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0)。

               2.2)

step3:   r_{2n-1}\leftarrow c_{0}

step3:   返回r

───────────────────────────────────────

在步骤2中:当i=j时,做一个乘法(uv)=ai×bj和三个加法: c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0),这可以用宏定义#define sqr_add_c (BN_ULONG a, int i, BN_ULONG c0, BN_ULONG c1, BN_ULONG c2) 实现,即

                  …………(1.10)

当i < j时,还要多做(uv)<<1和c2←带进位加法(c2,0),此时用#define sqr_add_c2 (BN_ULONG a, int i, int j, BN_ULONG c0, BN_ULONG c1, BN_ULONG c2) 实现,即

。            …………(1.11)

comba平方算法的函数为:

───────────────────────────────────────

void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a)

功能:    8个字的comba平方

输入:    a

输出:   

返回:    -

出处:    bn_asm.c

备注:    a实际长度超过8时,也仅仅将a的低8个字平方。

───────────────────────────────────────

说明:另外还有一个使用comba乘法思想的函数void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a),它是做4个字的comba平方。

关于这些函数与宏定义的关系请参见下节§1.2.6。

猜你喜欢

转载自blog.csdn.net/samsho2/article/details/85841476