OpenSSL密码库算法笔记——第0.2.1章 新建与释放大整数

首先来看怎样新建一个大整数。

以下两种方式中的任意一种都可以新建一个大整数。

  1. 方法1:

首先象定义普通数据类型一样定义一个大整数a:

BIGNUM a;

然后用初始化函数void BN_init(BIGNUM *a)作初始化:

BN_init(&a);

  1. 方法2:

首先象定义指向普通数据类型的指针一样定义一个指向大整数的指针a:

BIGNUM *a;

然后调用新建大整数函数BIGNUM *BN_new(void),将函数返回的大整数地址赋给a:

a=BN_new();

 

上述方法中涉及的两个函数,其详细信息如下:

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

void BN_init(BIGNUM *a)

功能:    初始化大整数a,且让a中信息全部为0。

输入:    a

输出:    -

返回:    —

出处:    bn_lib.c

备注:    只能BIGNUM  a这样申明的大整数进行初始化;

不能BIGNUM * a这样申明的大整数进行初始化。

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

而对BIGNUM * a申明的大整数就需要用到新建大整数函数BN_new。该函数详细信息如下:

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

BIGNUM *BN_new(void)

功能:    新建一个大整数

输入:    -

输出:    -

返回:    新建大整数的地址

出处:    bn_lib.c

备注:    新建大整数中的信息全部置0,但flag除外。

属性值flag置为BN_FLG_MALLOCED(其值定义为1)。

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

关于这个属性值flag有必要交代一下。flag有多种取值,这里只简单介绍其中几个:0、BN_FLG_MALLOCED(其值定义为1)、BN_FLG_STATIC_DATA(其值定义为2)、。

  • flag=0:如果用方法1——BN_init新建大整数,就将其flag值置为0;
  • flag=BN_FLG_MALLOCED:如果用方法2——BN_new新建大整数,就将其flag值置为BN_FLG_MALLOCED。
  • flag=BN_FLG_STATIC_DATA:此时的大整数为静态变量。

有关flag的详细取值可参见[4,5]。

如何知道大整数是否具有上述某个属性呢?可以调用BN_get_flags函数:

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

#define BN_get_flags(BIGNUM *b, int n)

功能:    判断大整数是否带有n属性

输入:    b,n

输出:    —

返回:    n【b带有属性n】或者0【b无属性n】

出处:    bn.h

备注:    宏定义。#define BN_get_flags(b,n)            ((b)→flags&(n))

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

 

        接下来谈一谈大整数的释放。

  1. 用方法1——BN_init新建的大整数,无法人为地释放。只有当该大整数所在的函数执行完毕后,才能同别的数据类型一起被释放。
  2. 用方法2——BN_new新建的大整数,可以人为地释放。调用专门的大整数释放函数BN_free即可:

BN_free(a);

在这里简单解释一下BN_free函数:

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

void BN_free(BIGNUM *a)

功能:    释放大整数

输入:    a

输出:    -

返回:    —

出处:    bn_lib.c

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

你可能感兴趣的:(openssl,密码,密码技术与应用)