23#ifndef WOLF_CRYPT_SP_INT_H
24#define WOLF_CRYPT_SP_INT_H
30#if !defined(WOLFSSL_SP_ASM) && ( \
31 defined(WOLFSSL_SP_X86_64_ASM) || defined(WOLFSSL_SP_ARM32_ASM) || \
32 defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM_THUMB_ASM) || \
33 defined(WOLFSSL_SP_ARM_CORTEX_M_ASM))
34 #define WOLFSSL_SP_ASM
38#ifdef WOLFSSL_SP_X86_64_ASM
39 #define SP_WORD_SIZE 64
41 #define HAVE_INTEL_AVX1
42 #define HAVE_INTEL_AVX2
43#elif defined(WOLFSSL_SP_ARM64_ASM)
44 #define SP_WORD_SIZE 64
45#elif defined(WOLFSSL_SP_ARM32_ASM)
46 #define SP_WORD_SIZE 32
47#elif defined(WOLFSSL_SP_ARM_THUMB_ASM)
48 #define SP_WORD_SIZE 32
52 #if defined(NO_64BIT) || !defined(HAVE___UINT128_T)
53 #define SP_WORD_SIZE 32
55 #define SP_WORD_SIZE 64
59#ifdef WOLFSSL_DSP_BUILD
60 typedef int32 sp_digit;
61 typedef uint32 sp_int_digit;
62 typedef uint64 sp_int_word;
64 #define SP_WORD_SIZE 32
65#elif !defined(WOLFSSL_SP_ASM)
66 #if SP_WORD_SIZE == 32
67 typedef int32_t sp_digit;
68 typedef uint32_t sp_int_digit;
69 typedef uint64_t sp_int_word;
70 #elif SP_WORD_SIZE == 64
71 typedef int64_t sp_digit;
72 typedef uint64_t sp_int_digit;
73 #ifdef __SIZEOF_INT128__
74 typedef __uint128_t uint128_t;
75 typedef __int128_t int128_t;
77 typedef unsigned long uint128_t __attribute__ ((mode(TI)));
78 typedef long int128_t __attribute__ ((mode(TI)));
80 typedef uint128_t sp_int_word;
82 #error Word size not defined
85 #if SP_WORD_SIZE == 32
86 typedef uint32_t sp_digit;
87 typedef uint32_t sp_int_digit;
88 typedef uint64_t sp_int_word;
89 #elif SP_WORD_SIZE == 64
90 typedef uint64_t sp_digit;
91 typedef uint64_t sp_int_digit;
92 #ifdef __SIZEOF_INT128__
93 typedef __uint128_t uint128_t;
94 typedef __int128_t int128_t;
96 typedef unsigned long uint128_t __attribute__ ((mode(TI)));
97 typedef long int128_t __attribute__ ((mode(TI)));
99 typedef uint128_t sp_int_word;
101 #error Word size not defined
105#define SP_MASK (sp_digit)(-1)
107#ifdef WOLFSSL_SP_MATH
110#if !defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_HAVE_SP_DH)
111 #if !defined(NO_PWDBASED) && defined(WOLFSSL_SHA512)
112 #define SP_INT_DIGITS ((512 + SP_WORD_SIZE) / SP_WORD_SIZE)
113 #elif defined(WOLFSSL_SP_384)
114 #define SP_INT_DIGITS ((384 + SP_WORD_SIZE) / SP_WORD_SIZE)
116 #define SP_INT_DIGITS ((256 + SP_WORD_SIZE) / SP_WORD_SIZE)
118#elif defined(WOLFSSL_SP_4096)
119 #if defined(WOLFSSL_HAVE_SP_DH)
120 #define SP_INT_DIGITS ((8192 + SP_WORD_SIZE) / SP_WORD_SIZE)
122 #define SP_INT_DIGITS ((4096 + SP_WORD_SIZE) / SP_WORD_SIZE)
124#elif !defined(WOLFSSL_SP_NO_3072)
125 #if defined(WOLFSSL_HAVE_SP_DH)
126 #define SP_INT_DIGITS ((6144 + SP_WORD_SIZE) / SP_WORD_SIZE)
128 #define SP_INT_DIGITS ((3072 + SP_WORD_SIZE) / SP_WORD_SIZE)
131 #if defined(WOLFSSL_HAVE_SP_DH)
132 #define SP_INT_DIGITS ((4096 + SP_WORD_SIZE) / SP_WORD_SIZE)
134 #define SP_INT_DIGITS ((2048 + SP_WORD_SIZE) / SP_WORD_SIZE)
138#define sp_isodd(a) ((a)->used != 0 && ((a)->dp[0] & 1))
139#define sp_iseven(a) ((a)->used != 0 && ((a)->dp[0] & 1) == 0)
140#define sp_iszero(a) ((a)->used == 0)
141#define sp_isone(a) ((a)->used == 1 && (a)->dp[0] == 1)
142#define sp_abs(a, b) sp_copy(a, b)
144#ifdef HAVE_WOLF_BIGINT
151 #define WOLF_BIGINT_DEFINED
157 sp_int_digit dp[SP_INT_DIGITS];
158#ifdef HAVE_WOLF_BIGINT
164typedef sp_int_digit mp_digit;
166#include <wolfssl/wolfcrypt/wolfmath.h>
169MP_API
int sp_init(
sp_int* a);
172MP_API
void sp_clear(
sp_int* a);
173MP_API
int sp_unsigned_bin_size(
sp_int* a);
174MP_API
int sp_read_unsigned_bin(
sp_int* a,
const byte* in,
int inSz);
175MP_API
int sp_read_radix(
sp_int* a,
const char* in,
int radix);
177MP_API
int sp_count_bits(
sp_int* a);
178MP_API
int sp_leading_bit(
sp_int* a);
179MP_API
int sp_to_unsigned_bin(
sp_int* a,
byte* out);
180MP_API
int sp_to_unsigned_bin_len(
sp_int* a,
byte* out,
int outSz);
181MP_API
void sp_forcezero(
sp_int* a);
183MP_API
int sp_set(
sp_int* a, sp_int_digit d);
184MP_API
void sp_clamp(
sp_int* a);
185MP_API
int sp_grow(
sp_int* a,
int l);
186MP_API
int sp_sub_d(
sp_int* a, sp_int_digit d,
sp_int* r);
187MP_API
int sp_cmp_d(
sp_int* a, sp_int_digit d);
190MP_API
void sp_zero(
sp_int* a);
191MP_API
int sp_add_d(
sp_int* a, sp_int_digit d,
sp_int* r);
192MP_API
int sp_lshd(
sp_int* a,
int s);
194MP_API
int sp_set_int(
sp_int* a,
unsigned long b);
195MP_API
int sp_tohex(
sp_int* a,
char* str);
196MP_API
int sp_set_bit(
sp_int* a,
int i);
197MP_API
int sp_2expt(
sp_int* a,
int e);
198MP_API
int sp_rand_prime(
sp_int* r,
int len,
WC_RNG* rng,
void* heap);
205MP_API
int sp_prime_is_prime(
mp_int* a,
int t,
int* result);
206MP_API
int sp_prime_is_prime_ex(
mp_int* a,
int t,
int* result,
WC_RNG* rng);
208MP_API
int sp_get_digit_count(
sp_int *a);
211MP_API
int sp_mul_d(
sp_int* a, sp_int_digit n,
sp_int* r);
218#define MP_RADIX_HEX 16
227#define DIGIT_BIT SP_WORD_SIZE
228#define MP_MASK SP_MASK
230#define CheckFastMathSettings() 1
234#define mp_isodd sp_isodd
235#define mp_iseven sp_iseven
236#define mp_iszero sp_iszero
237#define mp_isone sp_isone
240#define mp_init sp_init
241#define mp_init_multi sp_init_multi
242#define mp_clear sp_clear
243#define mp_read_unsigned_bin sp_read_unsigned_bin
244#define mp_unsigned_bin_size sp_unsigned_bin_size
245#define mp_read_radix sp_read_radix
247#define mp_count_bits sp_count_bits
248#define mp_leading_bit sp_leading_bit
249#define mp_to_unsigned_bin sp_to_unsigned_bin
250#define mp_to_unsigned_bin_len sp_to_unsigned_bin_len
251#define mp_forcezero sp_forcezero
252#define mp_copy sp_copy
254#define mp_clamp sp_clamp
255#define mp_grow sp_grow
256#define mp_sub_d sp_sub_d
257#define mp_cmp_d sp_cmp_d
260#define mp_zero sp_zero
261#define mp_add_d sp_add_d
262#define mp_lshd sp_lshd
264#define mp_set_int sp_set_int
265#define mp_tohex sp_tohex
266#define mp_set_bit sp_set_bit
267#define mp_2expt sp_2expt
268#define mp_rand_prime sp_rand_prime
270#define mp_mulmod sp_mulmod
272#define mp_invmod sp_invmod
274#define mp_exptmod sp_exptmod
275#define mp_exptmod_nct sp_exptmod
276#define mp_prime_is_prime sp_prime_is_prime
277#define mp_prime_is_prime_ex sp_prime_is_prime_ex
278#define mp_exch sp_exch
279#define get_digit_count sp_get_digit_count
280#define mp_init_copy sp_init_copy
281#define mp_rshb(A,x) sp_rshb(A,x,A)
282#define mp_mul_d sp_mul_d