29#ifndef WOLF_CRYPT_INTEGER_H
30#define WOLF_CRYPT_INTEGER_H
37 #include <wolfssl/wolfcrypt/sp_int.h>
38#elif defined(USE_FAST_MATH)
48#include <wolfssl/wolfcrypt/mpi_class.h>
55#define OPT_CAST(x) (x *)
60#define OPT_CAST(x) (x *)
71#if defined(__x86_64__) && !(defined (_MSC_VER) && defined(__clang__))
72 #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT))
77#if defined(MP_64BIT) && defined(__INTEL_COMPILER) && !defined(HAVE___UINT128_T)
83#ifndef WOLFSSL_BIGINT_TYPES
95 typedef unsigned char mp_digit;
96 typedef unsigned short mp_word;
98#elif defined(MP_16BIT)
100 typedef unsigned int mp_digit;
101 typedef unsigned long mp_word;
103#elif defined(NO_64BIT)
105 typedef unsigned short mp_digit;
106 typedef unsigned int mp_word;
108#elif defined(MP_64BIT)
111 typedef unsigned long long mp_digit;
112 typedef unsigned long mp_word __attribute__ ((mode(TI)));
117 #if defined(_MSC_VER) || defined(__BORLANDC__)
118 typedef unsigned __int64 ulong64;
120 typedef unsigned long long ulong64;
123 typedef unsigned int mp_digit;
124 typedef ulong64 mp_word;
141 #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1)))
145#define MP_DIGIT_BIT DIGIT_BIT
146#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1))
147#define MP_DIGIT_MAX MP_MASK
161#define MP_RANGE MP_NOT_INF
167#define LTM_PRIME_BBS 0x0001
168#define LTM_PRIME_SAFE 0x0002
169#define LTM_PRIME_2MSB_ON 0x0008
187#define MP_WARRAY ((mp_word)1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1))
189#ifdef HAVE_WOLF_BIGINT
196 #define WOLF_BIGINT_DEFINED
201 int used, alloc, sign;
204#ifdef HAVE_WOLF_BIGINT
210#include <wolfssl/wolfcrypt/wolfmath.h>
215typedef int ltm_prime_callback(
unsigned char *dst,
int len,
void *dat);
218#define USED(m) ((m)->used)
219#define DIGIT(m,k) ((m)->dp[(k)])
220#define SIGN(m) ((m)->sign)
224#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO)
226 (((((a)->used == 1)) && ((a)->dp[0] == 1u)) ? MP_YES : MP_NO)
227#define mp_iseven(a) \
228 (((a)->used > 0 && (((a)->dp[0] & 1u) == 0u)) ? MP_YES : MP_NO)
230 (((a)->used > 0 && (((a)->dp[0] & 1u) == 1u)) ? MP_YES : MP_NO)
231#define mp_isneg(a) (((a)->sign != MP_ZPOS) ? MP_YES : MP_NO)
232#define mp_isword(a, w) \
233 ((((a)->used == 1) && ((a)->dp[0] == w)) || ((w == 0) && ((a)->used == 0)) \
238 #define PRIME_SIZE 31
240 #define PRIME_SIZE 256
244 #if defined(WOLFSSL_MYSQL_COMPATIBLE)
245 #define MAX_INVMOD_SZ 8192
247 #define MAX_INVMOD_SZ 4096
251#define mp_prime_random(a, t, size, bbs, cb, dat) \
252 mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat)
254#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len))
255#define mp_raw_size(mp) mp_signed_bin_size(mp)
256#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str))
257#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len))
258#define mp_mag_size(mp) mp_unsigned_bin_size(mp)
259#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str))
261#define MP_RADIX_BIN 2
262#define MP_RADIX_OCT 8
263#define MP_RADIX_DEC 10
264#define MP_RADIX_HEX 16
265#define MP_RADIX_MAX 64
267#define mp_tobinary(M, S) mp_toradix((M), (S), MP_RADIX_BIN)
268#define mp_tooctal(M, S) mp_toradix((M), (S), MP_RADIX_OCT)
269#define mp_todecimal(M, S) mp_toradix((M), (S), MP_RADIX_DEC)
270#define mp_tohex(M, S) mp_toradix((M), (S), MP_RADIX_HEX)
272#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1)
274#if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \
275 defined(WOLFSSL_DEBUG_MATH) || defined(DEBUG_WOLFSSL)
276extern const char *mp_s_rmap;
280MP_API
int mp_init (
mp_int * a);
281MP_API
void mp_clear (
mp_int * a);
282MP_API
void mp_free (
mp_int * a);
283MP_API
void mp_forcezero(
mp_int * a);
284MP_API
int mp_unsigned_bin_size(
mp_int * a);
285MP_API
int mp_read_unsigned_bin (
mp_int * a,
const unsigned char *b,
int c);
286MP_API
int mp_to_unsigned_bin_at_pos(
int x,
mp_int *t,
unsigned char *b);
287MP_API
int mp_to_unsigned_bin (
mp_int * a,
unsigned char *b);
288MP_API
int mp_to_unsigned_bin_len(
mp_int * a,
unsigned char *b,
int c);
295MP_API
int mp_count_bits (
mp_int * a);
296MP_API
int mp_leading_bit (
mp_int * a);
299MP_API
int mp_grow (
mp_int * a,
int size);
301MP_API
void mp_zero (
mp_int * a);
302MP_API
void mp_clamp (
mp_int * a);
304MP_API
void mp_rshd (
mp_int * a,
int b);
305MP_API
void mp_rshb (
mp_int * a,
int b);
308MP_API
int mp_lshd (
mp_int * a,
int b);
315MP_API
int mp_cmp_d(
mp_int * a, mp_digit b);
316MP_API
int mp_set (
mp_int * a, mp_digit b);
317MP_API
int mp_is_bit_set (
mp_int * a, mp_digit b);
325MP_API
int mp_reduce_is_2k_l(
mp_int *a);
326MP_API
int mp_reduce_is_2k(
mp_int *a);
327MP_API
int mp_dr_is_modulus(
mp_int *a);
331#define mp_exptmod_nct(G,X,P,Y) mp_exptmod_fast(G,X,P,Y,0)
332MP_API
int mp_montgomery_setup (
mp_int * n, mp_digit * rho);
333int fast_mp_montgomery_reduce (
mp_int * x,
mp_int * n, mp_digit rho);
334MP_API
int mp_montgomery_reduce (
mp_int * x,
mp_int * n, mp_digit rho);
335MP_API
void mp_dr_setup(
mp_int *a, mp_digit *d);
336MP_API
int mp_dr_reduce (
mp_int * x,
mp_int * n, mp_digit k);
337MP_API
int mp_reduce_2k(
mp_int *a,
mp_int *n, mp_digit d);
345MP_API
int mp_montgomery_calc_normalization (
mp_int * a,
mp_int * b);
350MP_API
int mp_init_size (
mp_int * a,
int size);
351MP_API
int mp_div_3 (
mp_int * a,
mp_int *c, mp_digit * d);
358MP_API
int mp_mul_d (
mp_int * a, mp_digit b,
mp_int * c);
359MP_API
int mp_2expt (
mp_int * a,
int b);
360MP_API
int mp_set_bit (
mp_int * a,
int b);
361MP_API
int mp_reduce_2k_setup(
mp_int *a, mp_digit *d);
363MP_API
int mp_set_int (
mp_int * a,
unsigned long b);
364MP_API
int mp_sub_d (
mp_int * a, mp_digit b,
mp_int * c);
370MP_API
int mp_toradix (
mp_int *a,
char *str,
int radix);
371MP_API
int mp_radix_size (
mp_int * a,
int radix,
int *size);
373#ifdef WOLFSSL_DEBUG_MATH
374 MP_API
void mp_dump(
const char* desc,
mp_int* a,
byte verbose);
376 #define mp_dump(desc, a, verbose)
379#if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || !defined(NO_RSA) || \
380 !defined(NO_DSA) || !defined(NO_DH)
383#if !defined(NO_DSA) || defined(HAVE_ECC)
384 MP_API
int mp_read_radix(
mp_int* a,
const char* str,
int radix);
387#if defined(WOLFSSL_KEY_GEN) || !defined(NO_RSA) || !defined(NO_DSA) || !defined(NO_DH)
388 MP_API
int mp_prime_is_prime (
mp_int * a,
int t,
int *result);
389 MP_API
int mp_prime_is_prime_ex (
mp_int * a,
int t,
int *result,
WC_RNG*);
391#ifdef WOLFSSL_KEY_GEN
394 MP_API
int mp_rand_prime(
mp_int* N,
int len,
WC_RNG* rng,
void* heap);
397MP_API
int mp_cnt_lsb(
mp_int *a);
398MP_API
int mp_mod_d(
mp_int* a, mp_digit b, mp_digit* c);