39 #ifndef WOLF_CRYPT_TFM_H 40 #define WOLF_CRYPT_TFM_H 65 #if defined(__x86_64__) 66 #if defined(TFM_X86) || defined(TFM_SSE2) || defined(TFM_ARM) 67 #error x86-64 detected, x86-32/SSE2/ARM optimizations are not valid! 69 #if !defined(TFM_X86_64) && !defined(TFM_NO_ASM) 73 #if defined(TFM_X86_64) 74 #if !defined(FP_64BIT) 79 #if defined(__x86_64__) && !defined(FP_64BIT) 83 #if defined(FP_64BIT) && defined(__INTEL_COMPILER) && !defined(HAVE___UINT128_T) 90 #if defined(__i386__) && !defined(TFM_SSE2) 91 #if defined(TFM_X86_64) || defined(TFM_ARM) 92 #error x86-32 detected, x86-64/ARM optimizations are not valid! 94 #if !defined(TFM_X86) && !defined(TFM_NO_ASM) 100 #if (defined(TFM_X86) || defined(TFM_SSE2) || defined(TFM_ARM) || defined(TFM_PPC32)) && defined(FP_64BIT) 101 #warning x86-32, SSE2 and ARM, PPC32 optimizations require 32-bit digits (undefining) 111 #error TFM_ASM already defined! 117 #error TFM_ASM already defined! 123 #error TFM_ASM already defined! 129 #error TFM_ASM already defined! 135 #error TFM_ASM already defined! 141 #error TFM_ASM already defined! 211 #ifndef WOLFSSL_BIGINT_TYPES 215 #if defined(WC_16BIT_CPU) 216 typedef unsigned int fp_digit;
217 #define SIZEOF_FP_DIGIT 2 218 typedef unsigned long fp_word;
219 #elif defined(FP_64BIT) 221 typedef unsigned long long fp_digit;
222 #define SIZEOF_FP_DIGIT 8 223 typedef unsigned long fp_word __attribute__ ((mode(TI)));
227 #if defined(_MSC_VER) || defined(__BORLANDC__) 228 typedef unsigned __int64 ulong64;
230 typedef unsigned long long ulong64;
232 typedef unsigned int fp_digit;
233 #define SIZEOF_FP_DIGIT 4 234 typedef ulong64 fp_word;
239 typedef unsigned short fp_digit;
240 #define SIZEOF_FP_DIGIT 2 241 typedef unsigned int fp_word;
249 #define DIGIT_BIT ((CHAR_BIT) * SIZEOF_FP_DIGIT) 259 #define FP_MAX_BITS 4096 261 #ifdef WOLFSSL_OPENSSH 264 #define FP_MAX_BITS 16384 266 #define FP_MAX_SIZE (FP_MAX_BITS+(8*DIGIT_BIT)) 270 #error CHAR_BIT must be a multiple of eight. 272 #if FP_MAX_BITS % CHAR_BIT 273 #error FP_MAX_BITS must be a multiple of CHAR_BIT 276 #define FP_MASK (fp_digit)(-1) 277 #define FP_DIGIT_MAX FP_MASK 278 #define FP_SIZE (FP_MAX_SIZE/DIGIT_BIT) 280 #define FP_MAX_PRIME_SIZE (FP_MAX_BITS/(2*CHAR_BIT)) 294 #define FP_NOT_INF -3 295 #define FP_WOULDBLOCK -4 306 #ifdef HAVE_WOLF_BIGINT 313 #define WOLF_BIGINT_DEFINED 320 #if defined(ALT_ECC_SIZE) || defined(HAVE_WOLF_BIGINT) 323 fp_digit dp[FP_SIZE];
325 #ifdef HAVE_WOLF_BIGINT 331 typedef fp_digit mp_digit;
332 typedef fp_word mp_word;
337 #include <wolfssl/wolfcrypt/wolfmath.h> 341 #ifndef TFM_ALREADY_SET 369 #if (FP_MAX_BITS >= 6144) && defined(FP_64BIT) 372 #if (FP_MAX_BITS >= 8192) && defined(FP_64BIT) 417 MP_API
void fp_zero(
fp_int *a);
418 MP_API
void fp_clear(
fp_int *a);
419 MP_API
void fp_forcezero (
fp_int * a);
420 MP_API
void fp_free(
fp_int* a);
423 #define fp_iszero(a) (((a)->used == 0) ? FP_YES : FP_NO) 424 #define fp_isone(a) \ 425 ((((a)->used == 1) && ((a)->dp[0] == 1)) ? FP_YES : FP_NO) 426 #define fp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? FP_YES : FP_NO) 427 #define fp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? FP_YES : FP_NO) 428 #define fp_isneg(a) (((a)->sign != 0) ? FP_YES : FP_NO) 429 #define fp_isword(a, w) \ 430 ((((a)->used == 1) && ((a)->dp[0] == w)) || ((w == 0) && ((a)->used == 0)) \ 434 void fp_set(
fp_int *a, fp_digit b);
435 void fp_set_int(
fp_int *a,
unsigned long b);
438 int fp_is_bit_set(
fp_int *a, fp_digit b);
440 int fp_set_bit (
fp_int * a, fp_digit b);
447 #define fp_clamp(a) { while ((a)->used && (a)->dp[(a)->used-1] == 0) --((a)->used); (a)->sign = (a)->used ? (a)->sign : FP_ZPOS; } 448 #define mp_clamp(a) fp_clamp(a) 449 #define mp_grow(a,s) MP_OKAY 452 #define fp_neg(a, b) { fp_copy(a, b); (b)->sign ^= 1; fp_clamp(b); } 453 #define fp_abs(a, b) { fp_copy(a, b); (b)->sign = 0; } 456 void fp_rshd(
fp_int *a,
int x);
459 void fp_rshb(
fp_int *a,
int x);
462 void fp_lshd(
fp_int *a,
int x);
474 void fp_2expt (
fp_int *a,
int b);
479 int fp_cnt_lsb(
fp_int *a);
500 int fp_cmp_d(
fp_int *a, fp_digit b);
547 int fp_montgomery_setup(
fp_int *a, fp_digit *mp);
552 void fp_montgomery_calc_normalization(
fp_int *a,
fp_int *b);
555 int fp_montgomery_reduce(
fp_int *a,
fp_int *m, fp_digit mp);
562 #ifdef WC_RSA_NONBLOCK 564 enum tfmExptModNbState {
565 TFM_EXPTMOD_NB_INIT = 0,
567 TFM_EXPTMOD_NB_MONT_RED,
568 TFM_EXPTMOD_NB_MONT_MUL,
569 TFM_EXPTMOD_NB_MONT_MOD,
570 TFM_EXPTMOD_NB_MONT_MODCHK,
573 TFM_EXPTMOD_NB_MUL_RED,
575 TFM_EXPTMOD_NB_SQR_RED,
581 #ifndef WC_NO_CACHE_RESISTANT 592 #ifdef WC_RSA_NONBLOCK_TIME 598 #ifdef WC_RSA_NONBLOCK_TIME 600 TFM_EXPTMOD_NB_STOP = 0,
601 TFM_EXPTMOD_NB_CONTINUE = 1,
616 #define FP_PRIME_SIZE 256 636 int fp_count_bits(
fp_int *a);
637 int fp_leading_bit(
fp_int *a);
639 int fp_unsigned_bin_size(
fp_int *a);
640 void fp_read_unsigned_bin(
fp_int *a,
const unsigned char *b,
int c);
641 int fp_to_unsigned_bin(
fp_int *a,
unsigned char *b);
642 int fp_to_unsigned_bin_len(
fp_int *a,
unsigned char *b,
int c);
643 int fp_to_unsigned_bin_at_pos(
int x,
fp_int *t,
unsigned char *b);
657 void fp_reverse(
unsigned char *s,
int len);
702 #define MP_VAL FP_VAL 703 #define MP_MEM FP_MEM 704 #define MP_NOT_INF FP_NOT_INF 705 #define MP_OKAY FP_OKAY 707 #define MP_YES FP_YES 708 #define MP_ZPOS FP_ZPOS 709 #define MP_NEG FP_NEG 710 #define MP_MASK FP_MASK 713 #define mp_zero(a) fp_zero(a) 714 #define mp_isone(a) fp_isone(a) 715 #define mp_iseven(a) fp_iseven(a) 716 #define mp_isneg(a) fp_isneg(a) 717 #define mp_isword(a, w) fp_isword(a, w) 719 #define MP_RADIX_BIN 2 720 #define MP_RADIX_OCT 8 721 #define MP_RADIX_DEC 10 722 #define MP_RADIX_HEX 16 723 #define MP_RADIX_MAX 64 725 #define mp_tobinary(M, S) mp_toradix((M), (S), MP_RADIX_BIN) 726 #define mp_tooctal(M, S) mp_toradix((M), (S), MP_RADIX_OCT) 727 #define mp_todecimal(M, S) mp_toradix((M), (S), MP_RADIX_DEC) 728 #define mp_tohex(M, S) mp_toradix((M), (S), MP_RADIX_HEX) 730 MP_API
int mp_init (
mp_int * a);
731 MP_API
void mp_clear (
mp_int * a);
732 MP_API
void mp_free (
mp_int * a);
733 MP_API
void mp_forcezero (
mp_int * a);
739 MP_API
int mp_add_d (
mp_int * a, mp_digit b,
mp_int * c);
742 MP_API
int mp_mul_d (
mp_int * a, mp_digit b,
mp_int * c);
754 MP_API
int mp_2expt(
mp_int* a,
int b);
759 MP_API
int mp_cmp_d(
mp_int *a, mp_digit b);
761 MP_API
int mp_unsigned_bin_size(
mp_int * a);
762 MP_API
int mp_read_unsigned_bin (
mp_int * a,
const unsigned char *b,
int c);
763 MP_API
int mp_to_unsigned_bin_at_pos(
int x,
mp_int *t,
unsigned char *b);
764 MP_API
int mp_to_unsigned_bin (
mp_int * a,
unsigned char *b);
765 MP_API
int mp_to_unsigned_bin_len(
mp_int * a,
unsigned char *b,
int c);
769 MP_API
int mp_isodd(
mp_int* a);
770 MP_API
int mp_iszero(
mp_int* a);
771 MP_API
int mp_count_bits(
mp_int *a);
772 MP_API
int mp_leading_bit(
mp_int *a);
773 MP_API
int mp_set_int(
mp_int *a,
unsigned long b);
774 MP_API
int mp_is_bit_set (
mp_int * a, mp_digit b);
775 MP_API
int mp_set_bit (
mp_int * a, mp_digit b);
776 MP_API
void mp_rshb(
mp_int *a,
int x);
777 MP_API
void mp_rshd(
mp_int *a,
int x);
778 MP_API
int mp_toradix (
mp_int *a,
char *str,
int radix);
779 MP_API
int mp_radix_size (
mp_int * a,
int radix,
int *size);
781 #ifdef WOLFSSL_DEBUG_MATH 782 MP_API
void mp_dump(
const char* desc,
mp_int* a, byte verbose);
784 #define mp_dump(desc, a, verbose) 787 #if !defined(NO_DSA) || defined(HAVE_ECC) 788 MP_API
int mp_read_radix(
mp_int* a,
const char* str,
int radix);
793 MP_API
int mp_montgomery_reduce(
fp_int *a,
fp_int *m, fp_digit mp);
794 MP_API
int mp_montgomery_setup(
fp_int *a, fp_digit *rho);
799 #if defined(HAVE_ECC) || !defined(NO_RSA) || !defined(NO_DSA) || \ 800 defined(WOLFSSL_KEY_GEN) 801 MP_API
int mp_set(
fp_int *a, fp_digit b);
804 #if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || !defined(NO_RSA) || \ 805 !defined(NO_DSA) || !defined(NO_DH) 807 MP_API
int mp_montgomery_calc_normalization(
mp_int *a,
mp_int *b);
810 #if !defined(NO_DH) || !defined(NO_DSA) || !defined(NO_RSA) || defined(WOLFSSL_KEY_GEN) 811 MP_API
int mp_prime_is_prime(
mp_int* a,
int t,
int* result);
812 MP_API
int mp_prime_is_prime_ex(
mp_int* a,
int t,
int* result,
WC_RNG* rng);
814 #ifdef WOLFSSL_KEY_GEN 817 MP_API
int mp_rand_prime(
mp_int* N,
int len,
WC_RNG* rng,
void* heap);
821 MP_API
int mp_cnt_lsb(
fp_int *a);
823 MP_API
int mp_mod_d(
fp_int* a, fp_digit b, fp_digit* c);
824 MP_API
int mp_lshd (
mp_int * a,
int b);
831 #define CheckFastMathSettings() (FP_SIZE == CheckRunTimeFastMath())
Definition: integer.h:200
WOLFSSL_API word32 CheckRunTimeFastMath(void)
This function checks the runtime fastmath settings for the maximum size of an integer. It is important when a user is using a wolfCrypt library independently, as the FP_SIZE must match for each library in order for math to work correctly. This check is defined as CheckFastMathSettings(), which simply compares CheckRunTimeFastMath and FP_SIZE, returning 0 if there is a mismatch, or 1 if they match.
Definition: tfm.c:98
Definition: integer.h:191