16#ifndef __HEADER_BN_H__
17#define __HEADER_BN_H__
19#include "hitls_build.h"
20#ifdef HITLS_CRYPTO_SM9
27#define WordByteLen (WordLen/ByteLen)
28#define LSBOfWord 0x00000001
29#define MSBOfWord 0x80000000
33#define BNByteLen (BNBitLen/ByteLen)
34#define BNWordLen (BNBitLen/WordLen)
37#define WORDBYTES (WORDBITS/8)
38#define BN_MAX_WORDSIZE 16
40#define BN_MSB(x, w) (((x)[w] >> (WORDBITS - 1)) & 1)
41#define BN_LSB(x, w) ((x)[0] & 1)
42#define BN_BIT(x, i) (((x)[(i) / WORDBITS] >> ((i) % WORDBITS)) & 1)
51void bn_reset(uint32_t *x, int32_t wsize);
54void bn_set_int(uint32_t *x, int32_t n, int32_t wsize);
57void bn_assign(uint32_t *y,
const uint32_t *x, int32_t wsize);
59int32_t bn_get_bitlen(
const uint32_t *x, int32_t wsize);
61int32_t bn_get_wordlen(
const uint32_t *x, int32_t wsize);
67int32_t bn_equal(
const uint32_t *x,
const uint32_t *y, int32_t wsize);
70int32_t bn_cmp(
const uint32_t *x,
const uint32_t *y, int32_t wsize);
73int32_t bn_is_zero(uint32_t *x, int32_t wsize);
75int32_t bn_is_nonzero(uint32_t *x, int32_t wsize);
84int32_t bn_div_2(uint32_t *y,
const uint32_t *x, int32_t wsize);
87uint32_t bn_add(uint32_t *r,
const uint32_t *x,
const uint32_t *y, int32_t wsize);
90uint32_t bn_sub(uint32_t *r,
const uint32_t *x,
const uint32_t *y, int32_t wsize);
93uint32_t bn_add_int(uint32_t *r,
const uint32_t *x, uint32_t n, int32_t wsize);
96uint32_t bn_sub_int(uint32_t *r,
const uint32_t *x, uint32_t n, int32_t wsize);
101void bn_mod_add(uint32_t *r,
const uint32_t *x,
const uint32_t *y,
const uint32_t *m, int32_t wsize);
104void bn_mod_sub(uint32_t *r,
const uint32_t *x,
const uint32_t *y,
const uint32_t *m, int32_t wsize);
107void bn_mod_neg(uint32_t *r,
const uint32_t *x,
const uint32_t *m, int32_t wsize);
110void bn_mod_inv(uint32_t *r, uint32_t *x, uint32_t *m, int32_t wsize);
113void bn_mod_div_2(uint32_t *r,
const uint32_t *x,
const uint32_t *m, int32_t wsize);
116void bn_get_res(uint32_t *x,
const uint32_t *m, int32_t wsize);
126void bn_mont_mul(uint32_t *r,
const uint32_t *x,
const uint32_t *y,
const uint32_t *m, uint32_t mc, int32_t wsize);
129void bn_mont_redc(uint32_t *r,
const uint32_t *x,
const uint32_t *m, uint32_t mc, int32_t wsize);
132void BN_GetInv_Mont(uint32_t *r, uint32_t *x, uint32_t *m, uint32_t wModuleConst, uint32_t *pwRRModule, int32_t wsize);
134int32_t BN_Mod_Basic(uint32_t *rem, int32_t iBNWordLen_r, uint32_t *pwBNX,
135 int32_t iBNWordLen_X, uint32_t *pwBNM, int32_t iBNWordLen_M);
137int32_t ByteToBN(
const uint8_t *pByteBuf, int32_t bytelen, uint32_t *pwBN, int32_t wsize);
138int32_t BNToByte(uint32_t *pwBN, int32_t wsize, uint8_t *pByteBuf, int32_t *bytelen);