82 lines
1.8 KiB
C
Executable File
82 lines
1.8 KiB
C
Executable File
#include "cryptlib.h"
|
|
#include "asn1t.h"
|
|
#include "bn.h"
|
|
|
|
|
|
#define BN_SENSITIVE 1
|
|
|
|
static int bn_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
|
static void bn_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
|
|
|
static int bn_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
|
|
static int bn_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);
|
|
|
|
static ASN1_PRIMITIVE_FUNCS bignum_pf = {
|
|
NULL, 0,
|
|
bn_new,
|
|
bn_free,
|
|
0,
|
|
bn_c2i,
|
|
bn_i2c
|
|
};
|
|
|
|
////////////////////////BIGNUM_it//////////////////////////////////////////////
|
|
|
|
ASN1_ITEM_start(BIGNUM)
|
|
ASN1_ITYPE_PRIMITIVE, V_ASN1_INTEGER, NULL, 0, &bignum_pf, 0, "BIGNUM"
|
|
ASN1_ITEM_end(BIGNUM)
|
|
|
|
//////////////////bn_new//////////////////////////////////ok
|
|
|
|
static int bn_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
|
{
|
|
|
|
*pval = (ASN1_VALUE *)BN_new();
|
|
if(*pval) return 1;
|
|
else return 0;
|
|
}
|
|
|
|
////////////////bn_free//////////////////////////////////
|
|
|
|
static void bn_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
|
{
|
|
;
|
|
}
|
|
|
|
//////////////////bn_i2c/////////////////////////////////////////////////////////////ok
|
|
|
|
static int bn_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it)
|
|
{
|
|
BIGNUM *bn;
|
|
int pad;
|
|
|
|
if(!*pval) return -1;
|
|
bn = (BIGNUM *)*pval;
|
|
/* If MSB set in an octet we need a padding byte */
|
|
if(BN_num_bits(bn) & 0x7) pad = 0;
|
|
else pad = 1;
|
|
if(cont) {
|
|
if(pad) *cont++ = 0;
|
|
BN_bn2bin(bn, cont);
|
|
}
|
|
return pad + BN_num_bytes(bn);
|
|
}
|
|
|
|
////////////////////bn_c2i/////////////////////////////////////////////ok
|
|
|
|
static int bn_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
|
|
int utype, char *free_cont, const ASN1_ITEM *it)
|
|
{
|
|
BIGNUM *bn;
|
|
|
|
if(!*pval) bn_new(pval, it);
|
|
bn = (BIGNUM *)*pval;
|
|
if(!BN_bin2bn(cont, len, bn)) {
|
|
bn_free(pval, it);
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|