19#include "hitls_build.h"
25#if defined(HITLS_CRYPTO_BN_X8664)
26 #include "bn_bincal_x8664.h"
27#elif defined(HITLS_CRYPTO_BN_ARMV8)
28 #include "bn_bincal_armv8.h"
30 #include "bn_bincal_noasm.h"
38#define ADD_AB(carry, r, a, b) \
40 BN_UINT macroTmpT = (a) + (b); \
41 (carry) = macroTmpT < (a) ? 1 : 0; \
46#define SUB_AB(borrow, r, a, b) \
48 BN_UINT macroTmpT = (a) - (b); \
49 (borrow) = ((a) < (b)) ? 1 : 0; \
54#define SUB_ABC(borrow, r, a, b, c) \
56 BN_UINT macroTmpS = (a) - (b); \
57 BN_UINT macroTmpB = ((a) < (b)) ? 1 : 0; \
58 macroTmpB += (macroTmpS < (c)) ? 1 : 0; \
59 (r) = macroTmpS - (c); \
63#define BN_UINT_HALF_BITS (BN_UINT_BITS >> 1)
66#define BN_UINT_HC ((BN_UINT)1 << BN_UINT_HALF_BITS)
69#define BN_UINT_LO_TO_HI(t) ((t) << BN_UINT_HALF_BITS)
72#define BN_UINT_HI_TO_HI(t) ((t) & ((BN_UINT)0 - BN_UINT_HC))
75#define BN_UINT_LO(t) ((t) & (BN_UINT_HC - 1))
78#define BN_UINT_HI(t) ((t) >> BN_UINT_HALF_BITS)
81#define BN_COPY_BYTES(dst, dstlen, src, srclen) \
84 for (macroTmpI = 0; macroTmpI < (srclen); macroTmpI++) { (dst)[macroTmpI] = (src)[macroTmpI]; } \
85 for (; macroTmpI < (dstlen); macroTmpI++) { (dst)[macroTmpI] = 0; } \
89#define MULADD_ABC(c, r, a, b) \
91 BN_UINT macroTmpAl = BN_UINT_LO(a); \
92 BN_UINT macroTmpAh = BN_UINT_HI(a); \
93 BN_UINT macroTmpBl = BN_UINT_LO(b); \
94 BN_UINT macroTmpBh = BN_UINT_HI(b); \
95 BN_UINT macroTmpX3 = macroTmpAh * macroTmpBh; \
96 BN_UINT macroTmpX2 = macroTmpAh * macroTmpBl; \
97 BN_UINT macroTmpX1 = macroTmpAl * macroTmpBh; \
98 BN_UINT macroTmpX0 = macroTmpAl * macroTmpBl; \
100 (c) = ((r) < (c)) ? 1 : 0; \
101 macroTmpX1 += macroTmpX2; \
102 (c) += (macroTmpX1 < macroTmpX2) ? BN_UINT_HC : 0; \
103 macroTmpX2 = macroTmpX0; \
104 macroTmpX0 += macroTmpX1 << BN_UINT_HALF_BITS; \
105 (c) += (macroTmpX0 < macroTmpX2) ? 1 : 0; \
106 (c) += BN_UINT_HI(macroTmpX1); \
109 (c) += ((r) < macroTmpX0) ? 1 : 0; \
113#define ADD_ABC(carry, r, a, b, c) \
115 BN_UINT macroTmpS = (b) + (c); \
116 carry = (macroTmpS < (c)) ? 1 : 0; \
117 (r) = macroTmpS + (a); \
118 carry += ((r) < macroTmpS) ? 1 : 0; \
121BN_UINT BinAdd(BN_UINT *r,
const BN_UINT *a,
const BN_UINT *b, uint32_t n);
123BN_UINT BinSub(BN_UINT *r,
const BN_UINT *a,
const BN_UINT *b, uint32_t n);
125BN_UINT BinInc(BN_UINT *r,
const BN_UINT *a, uint32_t size, BN_UINT w);
127BN_UINT BinDec(BN_UINT *r,
const BN_UINT *a, uint32_t n, BN_UINT w);
129uint32_t BinRshift(BN_UINT *r,
const BN_UINT *a, uint32_t n, uint32_t bits);
131BN_UINT BinSubMul(BN_UINT *r,
const BN_UINT *a, BN_UINT aSize, BN_UINT m);
133uint32_t BinLshift(BN_UINT *r,
const BN_UINT *a, uint32_t n, uint32_t bits);
135BN_UINT BinMulAcc(BN_UINT *r,
const BN_UINT *a, uint32_t aSize, BN_UINT b);
137uint32_t BinMul(BN_UINT *r, uint32_t rRoom,
const BN_UINT *a, uint32_t aSize,
const BN_UINT *b, uint32_t bSize);
139uint32_t BinSqr(BN_UINT *r, uint32_t rRoom,
const BN_UINT *a, uint32_t aSize);
141uint32_t GetZeroBitsUint(BN_UINT x);
143uint32_t BinFixSize(
const BN_UINT *data, uint32_t size);
145int32_t BinCmp(
const BN_UINT *a, uint32_t aSize,
const BN_UINT *b, uint32_t bSize);
147uint32_t BinBits(
const BN_UINT *data, uint32_t size);
149uint32_t BinDiv(BN_UINT *q, uint32_t *qSize, BN_UINT *x, uint32_t xSize, BN_UINT *y, uint32_t ySize);
151#ifdef HITLS_CRYPTO_BN_COMBA
152uint32_t SpaceSize(uint32_t size);
156void MulComba4(BN_UINT *r,
const BN_UINT *a,
const BN_UINT *b);
159void SqrComba4(BN_UINT *r,
const BN_UINT *a);
163void MulComba6(BN_UINT *r,
const BN_UINT *a,
const BN_UINT *b);
166void SqrComba6(BN_UINT *r,
const BN_UINT *a);
168void MulConquer(BN_UINT *r,
const BN_UINT *a,
const BN_UINT *b, uint32_t size, BN_UINT *space,
bool consttime);
170void SqrConquer(BN_UINT *r,
const BN_UINT *a, uint32_t size, BN_UINT *space,
bool consttime);
173int32_t MontSqrBinCore(BN_UINT *r, BN_Mont *mont, BN_Optimizer *opt,
bool consttime);
175int32_t MontMulBinCore(BN_UINT *r,
const BN_UINT *a,
const BN_UINT *b, BN_Mont *mont,
176 BN_Optimizer *opt,
bool consttime);
178int32_t MontEncBinCore(BN_UINT *r, BN_Mont *mont, BN_Optimizer *opt,
bool consttime);
180void ReduceCore(BN_UINT *r, BN_UINT *x,
const BN_UINT *m, uint32_t mSize, BN_UINT m0);