API参考
载入中...
搜索中...
未找到
crypt_bn.h
1/*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 * http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16#ifndef CRYPT_BN_H
17#define CRYPT_BN_H
18
19#include "hitls_build.h"
20#ifdef HITLS_CRYPTO_BN
21
22#include <stdint.h>
23#include <stdlib.h>
24#include <stdbool.h>
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30#if defined(HITLS_SIXTY_FOUR_BITS)
31#define BN_UINT uint64_t
32#define BN_MASK (0xffffffffffffffffL)
33#define BN_DEC_VAL (10000000000000000000ULL)
34#define BN_DEC_LEN 19
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)
40#define BN_DEC_LEN 9
41#define BN_UNIT_BITS 32
42#else
43#error BN_UINT MUST be defined first.
44#endif
45
46#define BN_MAX_BITS (1u << 29) /* @note: BN_BigNum bits limitation 2^29 bits */
47#define BN_BITS_TO_BYTES(n) (((n) + 7) >> 3) /* @note: Calcute bytes form bits, bytes = (bits + 7) >> 3 */
48#define BN_BYTES_TO_BITS(n) ((n) << 3) /* bits = bytes * 8 = bytes << 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)
51/* Flag of BigNum. If a new number is added, the value increases by 0x01 0x02 0x04... */
52typedef enum {
53 CRYPT_BN_FLAG_OPTIMIZER = 0x01,
54 CRYPT_BN_FLAG_STATIC = 0x02,
55 CRYPT_BN_FLAG_CONSTTIME = 0x04,
56} CRYPT_BN_FLAG;
57
58typedef struct BigNum {
59 bool sign; /* *< bignum sign: negtive(true) or not(false) */
60 uint32_t size; /* *< bignum size (count of BN_UINT) */
61 uint32_t room; /* *< bignum max size (count of BN_UINT) */
62 uint32_t flag; /* *< bignum flag */
63 BN_UINT *data; /* *< bignum data chunk(most significant limb at the largest) */
64} BN_BigNum;
65
66typedef struct BnMont BN_Mont;
67
68typedef struct BnOptimizer BN_Optimizer;
69
70typedef struct BnCbCtx BN_CbCtx;
71
72typedef int32_t (*BN_CallBack)(BN_CbCtx *, int32_t, int32_t);
73
74/* If a == 0, return 0xFFFFFFFF...; otherwise return 0. */
75static inline BN_UINT BN_IsZeroUintConsttime(BN_UINT a)
76{
77 BN_UINT t = ~a & (a - 1); // The most significant bit of t is 1 only when a == 0.
78 // Shifting 3 bits to the left is equivalent to multiplying 8, convert the number of bytes into the number of bits.
79 return (BN_UINT)0 - (t >> (((uint32_t)sizeof(BN_UINT) << 3) - 1));
80}
81
82#ifdef HITLS_CRYPTO_EAL_BN
83/* Check whether the BN entered externally is valid. */
84bool BnVaild(const BN_BigNum *a);
85#endif
86
96BN_BigNum *BN_Create(uint32_t bits);
97
106void BN_Destroy(BN_BigNum *a);
107
121void BN_Init(BN_BigNum *bn, BN_UINT *data, uint32_t room, int32_t number);
122
123#ifdef HITLS_CRYPTO_BN_CB
124
134BN_CbCtx *BN_CbCtxCreate(void);
135
146void BN_CbCtxSet(BN_CbCtx *gencb, BN_CallBack callBack, void *arg);
147
159int32_t BN_CbCtxCall(BN_CbCtx *callBack, int32_t process, int32_t target);
160
168void *BN_CbCtxGetArg(BN_CbCtx *callBack);
169
178void BN_CbCtxDestroy(BN_CbCtx *cb);
179#endif
180
192int32_t BN_SetSign(BN_BigNum *a, bool sign);
193
205int32_t BN_SetFlag(BN_BigNum *a, uint32_t flag);
206
218int32_t BN_Copy(BN_BigNum *r, const BN_BigNum *a);
219
229BN_BigNum *BN_Dup(const BN_BigNum *a);
230
243bool BN_IsZero(const BN_BigNum *a);
244
257bool BN_IsOne(const BN_BigNum *a);
258
270bool BN_IsNegative(const BN_BigNum *a);
271
284bool BN_IsOdd(const BN_BigNum *a);
285
297bool BN_IsFlag(const BN_BigNum *a, uint32_t flag);
298
309int32_t BN_Zeroize(BN_BigNum *a);
310
323bool BN_IsLimb(const BN_BigNum *a, const BN_UINT w);
324
336int32_t BN_SetLimb(BN_BigNum *r, BN_UINT w);
337
348BN_UINT BN_GetLimb(const BN_BigNum *a);
349
362bool BN_GetBit(const BN_BigNum *a, uint32_t n);
363
375int32_t BN_SetBit(BN_BigNum *a, uint32_t n);
376
388int32_t BN_ClrBit(BN_BigNum *a, uint32_t n);
389
401int32_t BN_MaskBit(BN_BigNum *a, uint32_t n);
402
412uint32_t BN_Bits(const BN_BigNum *a);
413
423uint32_t BN_Bytes(const BN_BigNum *a);
424
441int32_t BN_Gcd(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b, BN_Optimizer *opt);
442
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);
472
485int32_t BN_Add(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b);
486
499int32_t BN_AddLimb(BN_BigNum *r, const BN_BigNum *a, BN_UINT w);
500
513int32_t BN_Sub(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b);
514
527int32_t BN_SubLimb(BN_BigNum *r, const BN_BigNum *a, BN_UINT w);
528
543int32_t BN_Mul(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b, BN_Optimizer *opt);
544
557int32_t BN_MulLimb(BN_BigNum *r, const BN_BigNum *a, const BN_UINT w);
558
572int32_t BN_Sqr(BN_BigNum *r, const BN_BigNum *a, BN_Optimizer *opt);
573
591int32_t BN_Div(BN_BigNum *q, BN_BigNum *r, const BN_BigNum *x, const BN_BigNum *y, BN_Optimizer *opt);
592
607int32_t BN_DivLimb(BN_BigNum *q, BN_UINT *r, const BN_BigNum *x, const BN_UINT y);
608
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);
647
665int32_t BN_ModMul(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b,
666 const BN_BigNum *mod, BN_Optimizer *opt);
667
684int32_t BN_ModSqr(
685 BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *mod, BN_Optimizer *opt);
686
704int32_t BN_ModExp(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *e,
705 const BN_BigNum *m, BN_Optimizer *opt);
706
723int32_t BN_Mod(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *m, BN_Optimizer *opt);
724
739int32_t BN_ModLimb(BN_UINT *r, const BN_BigNum *a, const BN_UINT m);
740
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);
763
781int32_t BN_PrimeCheck(const BN_BigNum *bn, uint32_t checkTimes, BN_Optimizer *opt, BN_CbCtx *cb);
782#endif // HITLS_CRYPTO_BN_PRIME
783
784#ifdef HITLS_CRYPTO_BN_RAND
785#define BN_RAND_TOP_NOBIT 0 /* Not set bits */
786#define BN_RAND_TOP_ONEBIT 1 /* Set the most significant bit to 1. */
787#define BN_RAND_TOP_TWOBIT 2 /* Set the highest two bits to 1 */
788
789#define BN_RAND_BOTTOM_NOBIT 0 /* Not set bits */
790#define BN_RAND_BOTTOM_ONEBIT 1 /* Set the least significant bit to 1. */
791#define BN_RAND_BOTTOM_TWOBIT 2 /* Set the least significant two bits to 1. */
792
810int32_t BN_Rand(BN_BigNum *r, uint32_t bits, uint32_t top, uint32_t bottom);
811
829int32_t BN_RandEx(void *libCtx, BN_BigNum *r, uint32_t bits, uint32_t top, uint32_t bottom);
830
846int32_t BN_RandRange(BN_BigNum *r, const BN_BigNum *p);
847
863int32_t BN_RandRangeEx(void *libCtx, BN_BigNum *r, const BN_BigNum *p);
864#endif
877int32_t BN_Bin2Bn(BN_BigNum *r, const uint8_t *bin, uint32_t binLen);
878
892int32_t BN_Bn2Bin(const BN_BigNum *a, uint8_t *bin, uint32_t *binLen);
893
902void BN_FixSize(BN_BigNum *a);
903
914int32_t BN_Extend(BN_BigNum *a, uint32_t words);
915
929int32_t BN_Bn2BinFixZero(const BN_BigNum *a, uint8_t *bin, uint32_t binLen);
930
931#ifdef HITLS_CRYPTO_BN_STR_CONV
944int32_t BN_Hex2Bn(BN_BigNum **r, const char *str);
945
957char *BN_Bn2Hex(const BN_BigNum *a);
958
971int32_t BN_Dec2Bn(BN_BigNum **r, const char *str);
972
981char *BN_Bn2Dec(const BN_BigNum *a);
982#endif
983
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);
1000
1014int32_t BN_Bn2U64Array(const BN_BigNum *a, uint64_t *array, uint32_t *len);
1015#endif
1016
1026BN_Optimizer *BN_OptimizerCreate(void);
1027
1036void BN_OptimizerDestroy(BN_Optimizer *opt);
1037
1047void BN_OptimizerSetLibCtx(void *libCtx, BN_Optimizer *opt);
1048
1057void *BN_OptimizerGetLibCtx(BN_Optimizer *opt);
1058
1068BN_Mont *BN_MontCreate(const BN_BigNum *m);
1069
1089int32_t BN_MontExp(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *e, BN_Mont *mont,
1090 BN_Optimizer *opt);
1091
1110int32_t BN_MontExpConsttime(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *e,
1111 BN_Mont *mont, BN_Optimizer *opt);
1112
1121void BN_MontDestroy(BN_Mont *mont);
1122
1136int32_t BN_Rshift(BN_BigNum *r, const BN_BigNum *a, uint32_t n);
1137
1150int32_t BN_Lshift(BN_BigNum *r, const BN_BigNum *a, uint32_t n);
1151
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);
1155#endif
1156
1157#ifdef HITLS_CRYPTO_ECC
1179int32_t BN_ModSqrt(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *p, BN_Optimizer *opt);
1180#endif
1181
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);
1198
1211int32_t BN_Array2BN(BN_BigNum *dst, const BN_UINT *src, const uint32_t size);
1212#endif
1213
1214#ifdef HITLS_CRYPTO_ECC
1229int32_t BN_CopyWithMask(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b, BN_UINT mask);
1230
1251int32_t BN_ModSubQuick(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b,
1252 const BN_BigNum *mod, const BN_Optimizer *opt);
1253
1274int32_t BN_ModAddQuick(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b,
1275 const BN_BigNum *mod, const BN_Optimizer *opt);
1276
1297int32_t BN_ModNistEccMul(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b,
1298 void *data, BN_Optimizer *opt);
1299
1319int32_t BN_ModNistEccSqr(BN_BigNum *r, const BN_BigNum *a, void *data, BN_Optimizer *opt);
1320#endif
1321
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);
1344
1364int32_t BN_ModSm2EccSqr(BN_BigNum *r, const BN_BigNum *a, void *data, BN_Optimizer *opt);
1365#endif
1366
1367#ifdef HITLS_CRYPTO_BN_RFC_PRIME
1378BN_BigNum *BN_GetRfcConstPrime(BN_BigNum *r, int32_t paraId);
1379#endif
1380
1391int32_t BN_SecBits(int32_t pubLen, int32_t prvLen);
1392
1393#if defined(HITLS_CRYPTO_RSA)
1394
1409int32_t MontMulCore(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b, BN_Mont *mont, BN_Optimizer *opt);
1410
1411#endif // HITLS_CRYPTO_RSA
1412
1413#if defined(HITLS_CRYPTO_BN_PRIME)
1426int32_t MontSqrCore(BN_BigNum *r, const BN_BigNum *a, BN_Mont *mont, BN_Optimizer *opt);
1427
1428#endif // HITLS_CRYPTO_BN_PRIME
1429
1439int32_t OptimizerStart(BN_Optimizer *opt);
1440
1450void OptimizerEnd(BN_Optimizer *opt);
1451
1462BN_BigNum *OptimizerGetBn(BN_Optimizer *opt, uint32_t room);
1463
1464#ifdef HITLS_CRYPTO_CURVE_MONT
1465
1470int32_t BN_EcPrimeMontMul(BN_BigNum *r, const BN_BigNum *a, const BN_BigNum *b, void *data, BN_Optimizer *opt);
1471
1476int32_t BN_EcPrimeMontSqr(BN_BigNum *r, const BN_BigNum *a, void *data, BN_Optimizer *opt);
1477
1481int32_t BnMontEnc(BN_BigNum *r, BN_Mont *mont, BN_Optimizer *opt, bool consttime);
1482
1486void BnMontDec(BN_BigNum *r, BN_Mont *mont);
1487
1493int32_t BN_SwapWithMask(BN_BigNum *a, BN_BigNum *b, BN_UINT mask);
1494
1495#endif // HITLS_CRYPTO_CURVE_MONT
1496
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);
1513
1514#endif // HITLS_CRYPTO_PAILLIER || HITLS_CRYPTO_RSA_CHECK
1515
1516#ifdef __cplusplus
1517}
1518#endif
1519
1520#endif /* HITLS_CRYPTO_BN */
1521
1522#endif