OpenSSL密码库算法笔记——第1.2.2章 comba乘法

comba乘法就是用另外一种顺序来做乘法:

                    …………(1.4)

即按照由低到高的顺序计算乘积r的每一个字。其具体算法如下:(参见[3]算法3

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

算法:    comba算法

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

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

               2.1) 对每一对,执行:

2.2.1)      uv)=ai×bj

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

               2.2)r_{k}\leftarrow c_{0},c_{0} \leftarrow c_{1}, c_{1} \leftarrow c_{2}, c_{2}\leftarrow 0

step3: r_{m+n+1}\leftarrow c_{0}  。

step3:   (r_{m+n+1},...,r_{1},r_{0})返回

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

其中的u、v、c0、c1、c2、ri都是32比特字,(u,v)表示u和v连接成的64比特数。

步骤2中的一个乘法(uv)=ai×bj和三个加法: c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0),可以用宏定义#define mul_add_c(BN_ULONG a, BN_ULONG b, BN_ULONG c0, BN_ULONG c1, BN_ULONG c2) 实现,即

              …………(1.5)

comba乘法算法的函数为:

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

void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b)

功能:    8个字与8个字的comba乘法

输入:    a,b

输出:   r=(a[7],...,a[1],a[0])\times (b[7],...,b[1],b[0])

返回:    -

出处:    bn_asm.c

备注:    a、b实际长度超过8时,也仅仅将a、b的低8个字相乘。

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

说明:

(1)、另外还有一个使用comba乘法思想的函数void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b),它是做4个字与4个字的comba乘法。

(2)、和经典乘法一样,其根本就是做字与字的乘法aj×bi,这个同样用宏定义#define mul64 (BN_ULONG l, BN_ULONG h, BN_ULONG bl, BN_ULONG bh)来实现。请注意这里的参数lh前后代表的意思不一样:

                      …………(1.6)

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

猜你喜欢

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