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))
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
331typedef fp_digit mp_digit;
332typedef 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)
417MP_API
void fp_zero(
fp_int *a);
418MP_API
void fp_clear(
fp_int *a);
419MP_API
void fp_forcezero (
fp_int * a);
420MP_API
void fp_free(
fp_int* a);
423#define fp_iszero(a) (((a)->used == 0) ? FP_YES : FP_NO)
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)) \
434void fp_set(
fp_int *a, fp_digit b);
435void fp_set_int(
fp_int *a,
unsigned long b);
438int fp_is_bit_set(
fp_int *a, fp_digit b);
440int 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; }
456void fp_rshd(
fp_int *a,
int x);
459void fp_rshb(
fp_int *a,
int x);
462void fp_lshd(
fp_int *a,
int x);
474void fp_2expt (
fp_int *a,
int b);
500int fp_cmp_d(
fp_int *a, fp_digit b);
547int fp_montgomery_setup(
fp_int *a, fp_digit *mp);
552void fp_montgomery_calc_normalization(
fp_int *a,
fp_int *b);
555int fp_montgomery_reduce(
fp_int *a,
fp_int *m, fp_digit mp);
562#ifdef WC_RSA_NONBLOCK
564enum 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
636int fp_count_bits(
fp_int *a);
637int fp_leading_bit(
fp_int *a);
639int fp_unsigned_bin_size(
fp_int *a);
640void fp_read_unsigned_bin(
fp_int *a,
const unsigned char *b,
int c);
641int fp_to_unsigned_bin(
fp_int *a,
unsigned char *b);
642int fp_to_unsigned_bin_len(
fp_int *a,
unsigned char *b,
int c);
643int fp_to_unsigned_bin_at_pos(
int x,
fp_int *t,
unsigned char *b);
657void fp_reverse(
unsigned char *s,
int len);
704#define MP_NOT_INF FP_NOT_INF
705#define MP_OKAY FP_OKAY
708#define MP_ZPOS FP_ZPOS
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)
730MP_API
int mp_init (
mp_int * a);
731MP_API
void mp_clear (
mp_int * a);
732MP_API
void mp_free (
mp_int * a);
733MP_API
void mp_forcezero (
mp_int * a);
739MP_API
int mp_add_d (
mp_int * a, mp_digit b,
mp_int * c);
742MP_API
int mp_mul_d (
mp_int * a, mp_digit b,
mp_int * c);
754MP_API
int mp_2expt(
mp_int* a,
int b);
759MP_API
int mp_cmp_d(
mp_int *a, mp_digit b);
761MP_API
int mp_unsigned_bin_size(
mp_int * a);
762MP_API
int mp_read_unsigned_bin (
mp_int * a,
const unsigned char *b,
int c);
763MP_API
int mp_to_unsigned_bin_at_pos(
int x,
mp_int *t,
unsigned char *b);
764MP_API
int mp_to_unsigned_bin (
mp_int * a,
unsigned char *b);
765MP_API
int mp_to_unsigned_bin_len(
mp_int * a,
unsigned char *b,
int c);
769MP_API
int mp_isodd(
mp_int* a);
770MP_API
int mp_iszero(
mp_int* a);
771MP_API
int mp_count_bits(
mp_int *a);
772MP_API
int mp_leading_bit(
mp_int *a);
773MP_API
int mp_set_int(
mp_int *a,
unsigned long b);
774MP_API
int mp_is_bit_set (
mp_int * a, mp_digit b);
775MP_API
int mp_set_bit (
mp_int * a, mp_digit b);
776MP_API
void mp_rshb(
mp_int *a,
int x);
777MP_API
void mp_rshd(
mp_int *a,
int x);
778MP_API
int mp_toradix (
mp_int *a,
char *str,
int radix);
779MP_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)
811MP_API
int mp_prime_is_prime(
mp_int* a,
int t,
int* result);
812MP_API
int mp_prime_is_prime_ex(
mp_int* a,
int t,
int* result,
WC_RNG* rng);
814#ifdef WOLFSSL_KEY_GEN
817MP_API
int mp_rand_prime(
mp_int* N,
int len,
WC_RNG* rng,
void* heap);
821MP_API
int mp_cnt_lsb(
fp_int *a);
823MP_API
int mp_mod_d(
fp_int* a, fp_digit b, fp_digit* c);
824MP_API
int mp_lshd (
mp_int * a,
int b);
831#define CheckFastMathSettings() (FP_SIZE == CheckRunTimeFastMath())
WOLFSSL_API word32 CheckRunTimeFastMath(void)
This function checks the runtime fastmath settings for the maximum size of an integer....
Definition tfm.c:98