为了便于使用Montgomery约化,专门定义了一个结构体,我们将它称作Montgomery模数,这点与Barrett模数类似。结构体的定义如下:
struct bn_mont_ctx_st
{
int ri;
BIGNUM RR;
BIGNUM N;
BIGNUM Ni;
BN_ULONG n0;
int flags;
};
typedef struct bn_mont_ctx_st BN_MONT_CTX;
其中:
为了方便对这种新的结构体进行操作与管理,定义了许多相关的基本函数来做实现一些基本的功能——初始化、新建、释放、设置模数、Montgomery模数和普通大整数之间的转换。
(1). 首先看看怎样新建和释放一个Montgomery模数。这一点与大整数的新建和释放(见§0.2.1)是非常相似的。同样是两种方法都可以新建一个Montgomery模数。
BN_MONT_CTX mont;
BN_MONT_CTX_init (&mont);
BIGNUM * mont;
mont=BN_MONT_CTX_new();
Montgomery模数的释放也和大整数相同。
BN_MONT_CTX_free (mont);
下面简要介绍下上面涉及到的三个函数。方法1用到的初始化函数:
───────────────────────────────────────
void BN_MONT_CTX_init(BN_MONT_CTX *ctx)
功能: 初始化Montgomery模数,内部信息置零。
输入: ctx
输出: -
返回: -
出处: bn_mont.c
备注: 内部信息(n0除外)置零。
───────────────────────────────────────
方法2用到的新建函数:
───────────────────────────────────────
BN_MONT_CTX *BN_MONT_CTX_new(void)
功能: 新建一个Montgomery模数,并将内部信息置零
输入: -
输出: -
返回: 新建的Montgomery模数地址
出处: bn_mont.c
───────────────────────────────────────
释放Montgomery模数用到的函数:
───────────────────────────────────────
void BN_MONT_CTX_free(BN_MONT_CTX *mont)
功能: 释放Montgomery模数
输入: mont
输出: -
返回: -
出处: bn_mont.c
───────────────────────────────────────
(2). 设置Montgomery模数。初始化或者新建好一个Montgomery模数以后,该模数内部信息全部为零,所以需要设置其内部信息。可以是用一个大整数来设置模数的内部信息,也可以直接从一个已有的Montgomey模数那里复制。
───────────────────────────────────────
int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod)
功能: 利用给定大数设置Montgomery模数
输入: mod【用来设置Montgomey模数的大整数】
输出: mont【Montgomery模数】
返回: 1【正常】 or 0【出错】
出处: bn_mont.c
备注: 利用给定大数mod设置好Montgomery模数中相关信息——ri,RR,N,Ni,n0。
───────────────────────────────────────
复制Montgomery模数如下:
───────────────────────────────────────
BN_MONT_CTX *BN_MONT_CTX_copy (BN_MONT_CTX *to, BN_MONT_CTX *from)
功能: 复制Montgomery模数
输入: from【源模数】
输出: to ← from
返回: to【目标模数,正常】 or NULL【出错】
出处: bn_mont.c
───────────────────────────────────────