29 #ifndef WOLF_CRYPT_INTEGER_H 30 #define WOLF_CRYPT_INTEGER_H 36 #ifdef WOLFSSL_SP_MATH 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 160 #define MP_NOT_INF -4 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> 215 typedef 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) 225 #define mp_isone(a) \ 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) 229 #define mp_isodd(a) \ 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 243 #ifndef MAX_INVMOD_SZ 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) 276 extern const char *mp_s_rmap;
280 MP_API
int mp_init (
mp_int * a);
281 MP_API
void mp_clear (
mp_int * a);
282 MP_API
void mp_free (
mp_int * a);
283 MP_API
void mp_forcezero(
mp_int * a);
284 MP_API
int mp_unsigned_bin_size(
mp_int * a);
285 MP_API
int mp_read_unsigned_bin (
mp_int * a,
const unsigned char *b,
int c);
286 MP_API
int mp_to_unsigned_bin_at_pos(
int x,
mp_int *t,
unsigned char *b);
287 MP_API
int mp_to_unsigned_bin (
mp_int * a,
unsigned char *b);
288 MP_API
int mp_to_unsigned_bin_len(
mp_int * a,
unsigned char *b,
int c);
295 MP_API
int mp_count_bits (
mp_int * a);
296 MP_API
int mp_leading_bit (
mp_int * a);
299 MP_API
int mp_grow (
mp_int * a,
int size);
301 MP_API
void mp_zero (
mp_int * a);
302 MP_API
void mp_clamp (
mp_int * a);
304 MP_API
void mp_rshd (
mp_int * a,
int b);
305 MP_API
void mp_rshb (
mp_int * a,
int b);
308 MP_API
int mp_lshd (
mp_int * a,
int b);
315 MP_API
int mp_cmp_d(
mp_int * a, mp_digit b);
316 MP_API
int mp_set (
mp_int * a, mp_digit b);
317 MP_API
int mp_is_bit_set (
mp_int * a, mp_digit b);
325 MP_API
int mp_reduce_is_2k_l(
mp_int *a);
326 MP_API
int mp_reduce_is_2k(
mp_int *a);
327 MP_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) 332 MP_API
int mp_montgomery_setup (
mp_int * n, mp_digit * rho);
333 int fast_mp_montgomery_reduce (
mp_int * x,
mp_int * n, mp_digit rho);
334 MP_API
int mp_montgomery_reduce (
mp_int * x,
mp_int * n, mp_digit rho);
335 MP_API
void mp_dr_setup(
mp_int *a, mp_digit *d);
336 MP_API
int mp_dr_reduce (
mp_int * x,
mp_int * n, mp_digit k);
337 MP_API
int mp_reduce_2k(
mp_int *a,
mp_int *n, mp_digit d);
345 MP_API
int mp_montgomery_calc_normalization (
mp_int * a,
mp_int * b);
350 MP_API
int mp_init_size (
mp_int * a,
int size);
351 MP_API
int mp_div_3 (
mp_int * a,
mp_int *c, mp_digit * d);
358 MP_API
int mp_mul_d (
mp_int * a, mp_digit b,
mp_int * c);
359 MP_API
int mp_2expt (
mp_int * a,
int b);
360 MP_API
int mp_set_bit (
mp_int * a,
int b);
361 MP_API
int mp_reduce_2k_setup(
mp_int *a, mp_digit *d);
363 MP_API
int mp_set_int (
mp_int * a,
unsigned long b);
364 MP_API
int mp_sub_d (
mp_int * a, mp_digit b,
mp_int * c);
370 MP_API
int mp_toradix (
mp_int *a,
char *str,
int radix);
371 MP_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);
397 MP_API
int mp_cnt_lsb(
mp_int *a);
398 MP_API
int mp_mod_d(
mp_int* a, mp_digit b, mp_digit* c);
Definition: integer.h:200
Definition: integer.h:191