Openssl 学习—2.BIGNUM结构
BIGNUM数据结构是openssl中带的专门处理大数的一种结构
一、结构简介
先看什么是BIGNUM:
typedef struct bignum_st BIGNUM;
而
struct bignum_st
{
BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */
int top; /* Index of last used d +1. */
/* The next are internal book keeping for bn_expand. */
int dmax; /* Size of the d array. */
int neg; /* one if the number is negative */
int flags;
};
top: 使用的d结构的数目
dmax:d数组的容量
neg:是否为负数
flags:/
d:d是什么、占多少字节从下方获得:
/* assuming long is 64bit */
#ifdef SIXTY_FOUR_BIT_LONG
#define BN_ULONG unsigned long
……
#endif
/* This is where the long long data type is 64 bits, but long is 32.
#ifdef SIXTY_FOUR_BIT
#define BN_ULONG unsigned long long
……
#endif
#ifdef THIRTY_TWO_BIT
#define BN_ULONG unsigned int
……
#endif
本机为32位,即THIRTY_TWO_BIT,BN_ULONG定义为 unsigned int,32位
二、可进行的操作
1. 创建与释放
BIGNUM * BN_new (void); |
创建一个BIGNUM的结构,返回新BIGNUM结构的指针 |
BIGNUM *a = BN_new (); |
void BN_free (BIGNUM *); |
释放一个BIGNUM |
free (a); |
2. 值测试
int BN_cmp (BIGNUM *a, BIGNUM *b); |
判断a与b是否相等 |
if (BN_cmp (a, b) { printf ("a equ b/n"); } |
int BN_is_zero(BIGNUM *a); |
判断a是不是为0 |
if (BN_is_zero (a)) |
int BN_is_one(BIGNUM *a); |
判断a是不是1 |
if (BN_is_one (a)) |
int BN_is_word(BIGNUM *a, BN_ULONG w); |
判断a是不是值w |
if (BN_is_word (a, 12)) |
int BN_is_odd(BIGNUM *a); |
判断a是不是一个奇数 |
if (BN_is_odd (a)) |
3. 操作
Int BN_rand(BIGNUM *rnd, int bits, int top,int bottom); |
||
void BN_init(BIGNUM *); |
||
BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b); |
||
void BN_swap(BIGNUM *a, BIGNUM *b); |
||
4. 赋值与取值
int BN_num_bytes(BIGNUM *a); |
返回a的字节数 |
printf ("length: %d/n", BN_num_tytes (a)); |
int BN_num_bits(BIGNUM *a); |
返回a的二进制位数 |
printf ("bits: %d/n", BN_num_bits (a)); |
int BN_one(BIGNUM *a); |
设置a为1 |
BN_one (a); |
int BN_zero(BIGNUM *a); |
设置a为0 |
BN_zero (a); |
int BN_bn2bin(const BIGNUM *a, unsigned char *to); |
取a为二进制到to中,返回字符串长度 |
char s[1024]; |
BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret); |
赋二进制值s到ret中,返回ret |
char s[] = "1001001"; |
char *BN_bn2hex(const BIGNUM *a); |
取a的16进制值,返回一个字符串的指针。此指针要使用完后,手动使用OPENSSL_free释放 |
char *p = BN_bn2hex (a); |
char *BN_bn2dec(const BIGNUM *a); |
取a的10进制值,返回一个字符串的指针。此指针要使用完后,手动使用OPENSSL_free释放 |
p = BN_bn2dec (a); |
int BN_hex2bn(BIGNUM **a, const char *str); |
赋16进制值str到*a中,返回成功与否 |
BN_hex2bn (&a, "0x123F23D12"); |
int BN_dec2bn(BIGNUM **a, const char *str); |
赋10进制值str到*a中,返回成功与否 |
BN_dec2bn (&a, "1999"); |