19#include "hitls_build.h"
30#if defined(HITLS_SIXTY_FOUR_BITS)
31#define BN_UINT uint64_t
32#define BN_MASK (0xffffffffffffffffL)
33#define BN_DEC_VAL (10000000000000000000ULL)
35#define BN_UNIT_BITS 64
36#elif defined(HITLS_THIRTY_TWO_BITS)
37#define BN_UINT uint32_t
38#define BN_MASK (0xffffffffL)
39#define BN_DEC_VAL (1000000000L)
41#define BN_UNIT_BITS 32
43#error BN_UINT MUST be defined first.
46#define BN_MAX_BITS (1u << 29)
47#define BN_BITS_TO_BYTES(n) (((n) + 7) >> 3)
48#define BN_BYTES_TO_BITS(n) ((n) << 3)
49#define BN_UINT_BITS ((uint32_t)sizeof(BN_UINT) << 3)
50#define BITS_TO_BN_UNIT(bits) (((bits) + BN_UINT_BITS - 1) / BN_UINT_BITS)
53 CRYPT_BN_FLAG_OPTIMIZER = 0x01,
54 CRYPT_BN_FLAG_STATIC = 0x02,
55 CRYPT_BN_FLAG_CONSTTIME = 0x04,
58typedef struct BigNum {
66typedef struct BnMont BN_Mont;
68typedef struct BnOptimizer BN_Optimizer;
70typedef struct BnCbCtx BN_CbCtx;
72typedef int32_t (*BN_CallBack)(BN_CbCtx *, int32_t, int32_t);
75static inline BN_UINT BN_IsZeroUintConsttime(BN_UINT a)
77 BN_UINT t = ~a & (a - 1);
79 return (BN_UINT)0 - (t >> (((uint32_t)
sizeof(BN_UINT) << 3) - 1));
82#ifdef HITLS_CRYPTO_EAL_BN
84bool BnVaild(
const BN_BigNum *a);
96BN_BigNum *BN_Create(uint32_t bits);
106void BN_Destroy(BN_BigNum *a);
121void BN_Init(BN_BigNum *bn, BN_UINT *data, uint32_t room, int32_t number);
123#ifdef HITLS_CRYPTO_BN_CB
134BN_CbCtx *BN_CbCtxCreate(
void);
146void BN_CbCtxSet(BN_CbCtx *gencb, BN_CallBack callBack,
void *arg);
159int32_t BN_CbCtxCall(BN_CbCtx *callBack, int32_t process, int32_t target);
168void *BN_CbCtxGetArg(BN_CbCtx *callBack);
178void BN_CbCtxDestroy(BN_CbCtx *cb);
192int32_t BN_SetSign(BN_BigNum *a,
bool sign);
205int32_t BN_SetFlag(BN_BigNum *a, uint32_t flag);
218int32_t BN_Copy(BN_BigNum *r,
const BN_BigNum *a);
229BN_BigNum *BN_Dup(
const BN_BigNum *a);
243bool BN_IsZero(
const BN_BigNum *a);
257bool BN_IsOne(
const BN_BigNum *a);
270bool BN_IsNegative(
const BN_BigNum *a);
284bool BN_IsOdd(
const BN_BigNum *a);
297bool BN_IsFlag(
const BN_BigNum *a, uint32_t flag);
309int32_t BN_Zeroize(BN_BigNum *a);
323bool BN_IsLimb(
const BN_BigNum *a,
const BN_UINT w);
336int32_t BN_SetLimb(BN_BigNum *r, BN_UINT w);
348BN_UINT BN_GetLimb(
const BN_BigNum *a);
362bool BN_GetBit(
const BN_BigNum *a, uint32_t n);
375int32_t BN_SetBit(BN_BigNum *a, uint32_t n);
388int32_t BN_ClrBit(BN_BigNum *a, uint32_t n);
401int32_t BN_MaskBit(BN_BigNum *a, uint32_t n);
412uint32_t BN_Bits(
const BN_BigNum *a);
423uint32_t BN_Bytes(
const BN_BigNum *a);
441int32_t BN_Gcd(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b, BN_Optimizer *opt);
458int32_t BN_ModInv(BN_BigNum *r,
const BN_BigNum *x,
const BN_BigNum *m, BN_Optimizer *opt);
471int32_t BN_Cmp(
const BN_BigNum *a,
const BN_BigNum *b);
485int32_t BN_Add(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b);
499int32_t BN_AddLimb(BN_BigNum *r,
const BN_BigNum *a, BN_UINT w);
513int32_t BN_Sub(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b);
527int32_t BN_SubLimb(BN_BigNum *r,
const BN_BigNum *a, BN_UINT w);
543int32_t BN_Mul(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b, BN_Optimizer *opt);
557int32_t BN_MulLimb(BN_BigNum *r,
const BN_BigNum *a,
const BN_UINT w);
572int32_t BN_Sqr(BN_BigNum *r,
const BN_BigNum *a, BN_Optimizer *opt);
591int32_t BN_Div(BN_BigNum *q, BN_BigNum *r,
const BN_BigNum *x,
const BN_BigNum *y, BN_Optimizer *opt);
607int32_t BN_DivLimb(BN_BigNum *q, BN_UINT *r,
const BN_BigNum *x,
const BN_UINT y);
626int32_t BN_ModAdd(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
627 const BN_BigNum *mod, BN_Optimizer *opt);
645int32_t BN_ModSub(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
646 const BN_BigNum *mod, BN_Optimizer *opt);
665int32_t BN_ModMul(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
666 const BN_BigNum *mod, BN_Optimizer *opt);
685 BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *mod, BN_Optimizer *opt);
704int32_t BN_ModExp(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *e,
705 const BN_BigNum *m, BN_Optimizer *opt);
723int32_t BN_Mod(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *m, BN_Optimizer *opt);
739int32_t BN_ModLimb(BN_UINT *r,
const BN_BigNum *a,
const BN_UINT m);
741#ifdef HITLS_CRYPTO_BN_PRIME
762int32_t BN_GenPrime(BN_BigNum *r, BN_BigNum *e, uint32_t bits,
bool half, BN_Optimizer *opt, BN_CbCtx *cb);
781int32_t BN_PrimeCheck(
const BN_BigNum *bn, uint32_t checkTimes, BN_Optimizer *opt, BN_CbCtx *cb);
784#ifdef HITLS_CRYPTO_BN_RAND
785#define BN_RAND_TOP_NOBIT 0
786#define BN_RAND_TOP_ONEBIT 1
787#define BN_RAND_TOP_TWOBIT 2
789#define BN_RAND_BOTTOM_NOBIT 0
790#define BN_RAND_BOTTOM_ONEBIT 1
791#define BN_RAND_BOTTOM_TWOBIT 2
810int32_t BN_Rand(BN_BigNum *r, uint32_t bits, uint32_t top, uint32_t bottom);
829int32_t BN_RandEx(
void *libCtx, BN_BigNum *r, uint32_t bits, uint32_t top, uint32_t bottom);
846int32_t BN_RandRange(BN_BigNum *r,
const BN_BigNum *p);
863int32_t BN_RandRangeEx(
void *libCtx, BN_BigNum *r,
const BN_BigNum *p);
877int32_t BN_Bin2Bn(BN_BigNum *r,
const uint8_t *bin, uint32_t binLen);
892int32_t BN_Bn2Bin(
const BN_BigNum *a, uint8_t *bin, uint32_t *binLen);
902void BN_FixSize(BN_BigNum *a);
914int32_t BN_Extend(BN_BigNum *a, uint32_t words);
929int32_t BN_Bn2BinFixZero(
const BN_BigNum *a, uint8_t *bin, uint32_t binLen);
931#ifdef HITLS_CRYPTO_BN_STR_CONV
944int32_t BN_Hex2Bn(BN_BigNum **r,
const char *str);
957char *BN_Bn2Hex(
const BN_BigNum *a);
971int32_t BN_Dec2Bn(BN_BigNum **r,
const char *str);
981char *BN_Bn2Dec(
const BN_BigNum *a);
984#if defined(HITLS_CRYPTO_CURVE_SM2_ASM) || \
985 ((defined(HITLS_CRYPTO_CURVE_NISTP521) || defined(HITLS_CRYPTO_CURVE_NISTP384_ASM)) && \
986 defined(HITLS_CRYPTO_NIST_USE_ACCEL))
999int32_t BN_U64Array2Bn(BN_BigNum *r,
const uint64_t *array, uint32_t len);
1014int32_t BN_Bn2U64Array(
const BN_BigNum *a, uint64_t *array, uint32_t *len);
1026BN_Optimizer *BN_OptimizerCreate(
void);
1036void BN_OptimizerDestroy(BN_Optimizer *opt);
1047void BN_OptimizerSetLibCtx(
void *libCtx, BN_Optimizer *opt);
1057void *BN_OptimizerGetLibCtx(BN_Optimizer *opt);
1068BN_Mont *BN_MontCreate(
const BN_BigNum *m);
1089int32_t BN_MontExp(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *e, BN_Mont *mont,
1110int32_t BN_MontExpConsttime(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *e,
1111 BN_Mont *mont, BN_Optimizer *opt);
1121void BN_MontDestroy(BN_Mont *mont);
1136int32_t BN_Rshift(BN_BigNum *r,
const BN_BigNum *a, uint32_t n);
1150int32_t BN_Lshift(BN_BigNum *r,
const BN_BigNum *a, uint32_t n);
1152#ifdef HITLS_CRYPTO_DSA
1153int32_t BN_MontExpMul(BN_BigNum *r,
const BN_BigNum *a1,
const BN_BigNum *e1,
1154 const BN_BigNum *a2,
const BN_BigNum *e2, BN_Mont *mont, BN_Optimizer *opt);
1157#ifdef HITLS_CRYPTO_ECC
1179int32_t BN_ModSqrt(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *p, BN_Optimizer *opt);
1182#if defined(HITLS_CRYPTO_CURVE_SM2_ASM) || (defined(HITLS_CRYPTO_CURVE_NISTP256_ASM) && \
1183 defined(HITLS_CRYPTO_NIST_ECC_ACCELERATE))
1197int32_t BN_BN2Array(
const BN_BigNum *src, BN_UINT *dst, uint32_t size);
1211int32_t BN_Array2BN(BN_BigNum *dst,
const BN_UINT *src,
const uint32_t size);
1214#ifdef HITLS_CRYPTO_ECC
1229int32_t BN_CopyWithMask(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b, BN_UINT mask);
1251int32_t BN_ModSubQuick(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
1252 const BN_BigNum *mod,
const BN_Optimizer *opt);
1274int32_t BN_ModAddQuick(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
1275 const BN_BigNum *mod,
const BN_Optimizer *opt);
1297int32_t BN_ModNistEccMul(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
1298 void *data, BN_Optimizer *opt);
1319int32_t BN_ModNistEccSqr(BN_BigNum *r,
const BN_BigNum *a,
void *data, BN_Optimizer *opt);
1322#ifdef HITLS_CRYPTO_CURVE_SM2
1343int32_t BN_ModSm2EccMul(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
void *data, BN_Optimizer *opt);
1364int32_t BN_ModSm2EccSqr(BN_BigNum *r,
const BN_BigNum *a,
void *data, BN_Optimizer *opt);
1367#ifdef HITLS_CRYPTO_BN_RFC_PRIME
1378BN_BigNum *BN_GetRfcConstPrime(BN_BigNum *r, int32_t paraId);
1391int32_t BN_SecBits(int32_t pubLen, int32_t prvLen);
1393#if defined(HITLS_CRYPTO_RSA)
1409int32_t MontMulCore(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b, BN_Mont *mont, BN_Optimizer *opt);
1413#if defined(HITLS_CRYPTO_BN_PRIME)
1426int32_t MontSqrCore(BN_BigNum *r,
const BN_BigNum *a, BN_Mont *mont, BN_Optimizer *opt);
1439int32_t OptimizerStart(BN_Optimizer *opt);
1450void OptimizerEnd(BN_Optimizer *opt);
1462BN_BigNum *OptimizerGetBn(BN_Optimizer *opt, uint32_t room);
1464#ifdef HITLS_CRYPTO_CURVE_MONT
1470int32_t BN_EcPrimeMontMul(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b,
void *data, BN_Optimizer *opt);
1476int32_t BN_EcPrimeMontSqr(BN_BigNum *r,
const BN_BigNum *a,
void *data, BN_Optimizer *opt);
1481int32_t BnMontEnc(BN_BigNum *r, BN_Mont *mont, BN_Optimizer *opt,
bool consttime);
1486void BnMontDec(BN_BigNum *r, BN_Mont *mont);
1493int32_t BN_SwapWithMask(BN_BigNum *a, BN_BigNum *b, BN_UINT mask);
1497#if defined(HITLS_CRYPTO_PAILLIER) || defined(HITLS_CRYPTO_RSA_CHECK)
1512int32_t BN_Lcm(BN_BigNum *r,
const BN_BigNum *a,
const BN_BigNum *b, BN_Optimizer *opt);