wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sp_int.h Source File

sp_int.h

00001 /* sp_int.h
00002  *
00003  * Copyright (C) 2006-2020 wolfSSL Inc.
00004  *
00005  * This file is part of wolfSSL.
00006  *
00007  * wolfSSL is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2 of the License, or
00010  * (at your option) any later version.
00011  *
00012  * wolfSSL is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
00020  */
00021 
00022 
00023 #ifndef WOLF_CRYPT_SP_INT_H
00024 #define WOLF_CRYPT_SP_INT_H
00025 
00026 #include <stdint.h>
00027 #include <limits.h>
00028 
00029 /* Make sure WOLFSSL_SP_ASM build option defined when requested */
00030 #if !defined(WOLFSSL_SP_ASM) && ( \
00031       defined(WOLFSSL_SP_X86_64_ASM) || defined(WOLFSSL_SP_ARM32_ASM) || \
00032       defined(WOLFSSL_SP_ARM64_ASM)  || defined(WOLFSSL_SP_ARM_THUMB_ASM) || \
00033       defined(WOLFSSL_SP_ARM_CORTEX_M_ASM))
00034     #define WOLFSSL_SP_ASM
00035 #endif
00036 
00037 
00038 #ifdef WOLFSSL_SP_X86_64_ASM
00039     #define SP_WORD_SIZE 64
00040 
00041     #define HAVE_INTEL_AVX1
00042     #define HAVE_INTEL_AVX2
00043 #elif defined(WOLFSSL_SP_ARM64_ASM)
00044     #define SP_WORD_SIZE 64
00045 #elif defined(WOLFSSL_SP_ARM32_ASM)
00046     #define SP_WORD_SIZE 32
00047 #elif defined(WOLFSSL_SP_ARM_THUMB_ASM)
00048     #define SP_WORD_SIZE 32
00049 #endif
00050 
00051 #ifndef SP_WORD_SIZE
00052     #if defined(NO_64BIT) || !defined(HAVE___UINT128_T)
00053         #define SP_WORD_SIZE 32
00054     #else
00055         #define SP_WORD_SIZE 64
00056     #endif
00057 #endif
00058 
00059 #ifdef WOLFSSL_DSP_BUILD
00060     typedef int32 sp_digit;
00061     typedef uint32 sp_int_digit;
00062     typedef uint64 sp_int_word;
00063     #undef SP_WORD_SIZE
00064     #define SP_WORD_SIZE 32
00065 #elif !defined(WOLFSSL_SP_ASM)
00066   #if SP_WORD_SIZE == 32
00067     typedef int32_t sp_digit;
00068     typedef uint32_t sp_int_digit;
00069     typedef uint64_t sp_int_word;
00070   #elif SP_WORD_SIZE == 64
00071     typedef int64_t sp_digit;
00072     typedef uint64_t sp_int_digit;
00073     #ifdef __SIZEOF_INT128__
00074       typedef __uint128_t uint128_t;
00075       typedef __int128_t int128_t;
00076     #else
00077       typedef unsigned long uint128_t __attribute__ ((mode(TI)));
00078       typedef long int128_t __attribute__ ((mode(TI)));
00079     #endif
00080     typedef uint128_t sp_int_word;
00081   #else
00082     #error Word size not defined
00083   #endif
00084 #else
00085   #if SP_WORD_SIZE == 32
00086     typedef uint32_t sp_digit;
00087     typedef uint32_t sp_int_digit;
00088     typedef uint64_t sp_int_word;
00089   #elif SP_WORD_SIZE == 64
00090     typedef uint64_t sp_digit;
00091     typedef uint64_t sp_int_digit;
00092     #ifdef __SIZEOF_INT128__
00093       typedef __uint128_t uint128_t;
00094       typedef __int128_t int128_t;
00095     #else
00096       typedef unsigned long uint128_t __attribute__ ((mode(TI)));
00097       typedef long int128_t __attribute__ ((mode(TI)));
00098     #endif
00099     typedef uint128_t sp_int_word;
00100   #else
00101     #error Word size not defined
00102   #endif
00103 #endif
00104 
00105 #define SP_MASK    (sp_digit)(-1)
00106 
00107 #ifdef WOLFSSL_SP_MATH
00108 #include <wolfssl/wolfcrypt/random.h >
00109 
00110 #if !defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_HAVE_SP_DH)
00111     #if !defined(NO_PWDBASED) && defined(WOLFSSL_SHA512)
00112         #define SP_INT_DIGITS        ((512 + SP_WORD_SIZE) / SP_WORD_SIZE)
00113     #elif defined(WOLFSSL_SP_384)
00114         #define SP_INT_DIGITS        ((384 + SP_WORD_SIZE) / SP_WORD_SIZE)
00115     #else
00116         #define SP_INT_DIGITS        ((256 + SP_WORD_SIZE) / SP_WORD_SIZE)
00117     #endif
00118 #elif defined(WOLFSSL_SP_4096)
00119     #if defined(WOLFSSL_HAVE_SP_DH)
00120         #define SP_INT_DIGITS        ((8192 + SP_WORD_SIZE) / SP_WORD_SIZE)
00121     #else
00122         #define SP_INT_DIGITS        ((4096 + SP_WORD_SIZE) / SP_WORD_SIZE)
00123     #endif
00124 #elif !defined(WOLFSSL_SP_NO_3072)
00125     #if defined(WOLFSSL_HAVE_SP_DH)
00126         #define SP_INT_DIGITS        ((6144 + SP_WORD_SIZE) / SP_WORD_SIZE)
00127     #else
00128         #define SP_INT_DIGITS        ((3072 + SP_WORD_SIZE) / SP_WORD_SIZE)
00129     #endif
00130 #else
00131     #if defined(WOLFSSL_HAVE_SP_DH)
00132         #define SP_INT_DIGITS        ((4096 + SP_WORD_SIZE) / SP_WORD_SIZE)
00133     #else
00134         #define SP_INT_DIGITS        ((2048 + SP_WORD_SIZE) / SP_WORD_SIZE)
00135     #endif
00136 #endif
00137 
00138 #define sp_isodd(a)  ((a)->used != 0 && ((a)->dp[0] & 1))
00139 #define sp_iseven(a) ((a)->used != 0 && ((a)->dp[0] & 1) == 0)
00140 #define sp_iszero(a) ((a)->used == 0)
00141 #define sp_isone(a)  ((a)->used == 1 && (a)->dp[0] == 1)
00142 #define sp_abs(a, b)  sp_copy(a, b)
00143 
00144 #ifdef HAVE_WOLF_BIGINT
00145     /* raw big integer */
00146     typedef struct WC_BIGINT {
00147         byte*   buf;
00148         word32  len;
00149         void*   heap;
00150     } WC_BIGINT;
00151     #define WOLF_BIGINT_DEFINED
00152 #endif
00153 
00154 typedef struct sp_int {
00155     int used;
00156     int size;
00157     sp_int_digit dp[SP_INT_DIGITS];
00158 #ifdef HAVE_WOLF_BIGINT
00159     struct WC_BIGINT raw; /* unsigned binary (big endian) */
00160 #endif
00161 } sp_int;
00162 
00163 typedef sp_int       mp_int;
00164 typedef sp_int_digit mp_digit;
00165 
00166 #include <wolfssl/wolfcrypt/wolfmath.h>
00167 
00168 
00169 MP_API int sp_init(sp_int* a);
00170 MP_API int sp_init_multi(sp_int* a, sp_int* b, sp_int* c, sp_int* d,
00171                          sp_int* e, sp_int* f);
00172 MP_API void sp_clear(sp_int* a);
00173 MP_API int sp_unsigned_bin_size(sp_int* a);
00174 MP_API int sp_read_unsigned_bin(sp_int* a, const byte* in, int inSz);
00175 MP_API int sp_read_radix(sp_int* a, const char* in, int radix);
00176 MP_API int sp_cmp(sp_int* a, sp_int* b);
00177 MP_API int sp_count_bits(sp_int* a);
00178 MP_API int sp_leading_bit(sp_int* a);
00179 MP_API int sp_to_unsigned_bin(sp_int* a, byte* out);
00180 MP_API int sp_to_unsigned_bin_len(sp_int* a, byte* out, int outSz);
00181 MP_API void sp_forcezero(sp_int* a);
00182 MP_API int sp_copy(sp_int* a, sp_int* r);
00183 MP_API int sp_set(sp_int* a, sp_int_digit d);
00184 MP_API void sp_clamp(sp_int* a);
00185 MP_API int sp_grow(sp_int* a, int l);
00186 MP_API int sp_sub_d(sp_int* a, sp_int_digit d, sp_int* r);
00187 MP_API int sp_cmp_d(sp_int* a, sp_int_digit d);
00188 MP_API int sp_sub(sp_int* a, sp_int* b, sp_int* r);
00189 MP_API int sp_mod(sp_int* a, sp_int* m, sp_int* r);
00190 MP_API void sp_zero(sp_int* a);
00191 MP_API int sp_add_d(sp_int* a, sp_int_digit d, sp_int* r);
00192 MP_API int sp_lshd(sp_int* a, int s);
00193 MP_API int sp_add(sp_int* a, sp_int* b, sp_int* r);
00194 MP_API int sp_set_int(sp_int* a, unsigned long b);
00195 MP_API int sp_tohex(sp_int* a, char* str);
00196 MP_API int sp_set_bit(sp_int* a, int i);
00197 MP_API int sp_2expt(sp_int* a, int e);
00198 MP_API int sp_rand_prime(sp_int* r, int len, WC_RNG* rng, void* heap);
00199 MP_API int sp_mul(sp_int* a, sp_int* b, sp_int* r);
00200 MP_API int sp_mulmod(sp_int* a, sp_int* b, sp_int* m, sp_int* r);
00201 MP_API int sp_gcd(sp_int* a, sp_int* b, sp_int* r);
00202 MP_API int sp_invmod(sp_int* a, sp_int* m, sp_int* r);
00203 MP_API int sp_lcm(sp_int* a, sp_int* b, sp_int* r);
00204 MP_API int sp_exptmod(sp_int* b, sp_int* e, sp_int* m, sp_int* r);
00205 MP_API int sp_prime_is_prime(mp_int* a, int t, int* result);
00206 MP_API int sp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng);
00207 MP_API int sp_exch(sp_int* a, sp_int* b);
00208 MP_API int sp_get_digit_count(sp_int *a);
00209 MP_API int sp_init_copy (sp_int * a, sp_int * b);
00210 MP_API void sp_rshb(sp_int* a, int n, sp_int* r);
00211 MP_API int sp_mul_d(sp_int* a, sp_int_digit n, sp_int* r);
00212 
00213 
00214 #define MP_OKAY    0
00215 #define MP_NO      0
00216 #define MP_YES     1
00217 
00218 #define MP_RADIX_HEX     16
00219 
00220 #define MP_GT    1
00221 #define MP_EQ    0
00222 #define MP_LT    -1
00223 
00224 #define MP_MEM   -2
00225 #define MP_VAL   -3
00226 
00227 #define DIGIT_BIT  SP_WORD_SIZE
00228 #define MP_MASK    SP_MASK
00229 
00230 #define CheckFastMathSettings() 1
00231 
00232 #define mp_free(a)
00233 
00234 #define mp_isodd                    sp_isodd
00235 #define mp_iseven                   sp_iseven
00236 #define mp_iszero                   sp_iszero
00237 #define mp_isone                    sp_isone
00238 #define mp_abs                      sp_abs
00239 
00240 #define mp_init                     sp_init
00241 #define mp_init_multi               sp_init_multi
00242 #define mp_clear                    sp_clear
00243 #define mp_read_unsigned_bin        sp_read_unsigned_bin
00244 #define mp_unsigned_bin_size        sp_unsigned_bin_size
00245 #define mp_read_radix               sp_read_radix
00246 #define mp_cmp                      sp_cmp
00247 #define mp_count_bits               sp_count_bits
00248 #define mp_leading_bit              sp_leading_bit
00249 #define mp_to_unsigned_bin          sp_to_unsigned_bin
00250 #define mp_to_unsigned_bin_len      sp_to_unsigned_bin_len
00251 #define mp_forcezero                sp_forcezero
00252 #define mp_copy                     sp_copy
00253 #define mp_set                      sp_set
00254 #define mp_clamp                    sp_clamp
00255 #define mp_grow                     sp_grow
00256 #define mp_sub_d                    sp_sub_d
00257 #define mp_cmp_d                    sp_cmp_d
00258 #define mp_sub                      sp_sub
00259 #define mp_mod                      sp_mod
00260 #define mp_zero                     sp_zero
00261 #define mp_add_d                    sp_add_d
00262 #define mp_lshd                     sp_lshd
00263 #define mp_add                      sp_add
00264 #define mp_set_int                  sp_set_int
00265 #define mp_tohex                    sp_tohex
00266 #define mp_set_bit                  sp_set_bit
00267 #define mp_2expt                    sp_2expt
00268 #define mp_rand_prime               sp_rand_prime
00269 #define mp_mul                      sp_mul
00270 #define mp_mulmod                   sp_mulmod
00271 #define mp_gcd                      sp_gcd
00272 #define mp_invmod                   sp_invmod
00273 #define mp_lcm                      sp_lcm
00274 #define mp_exptmod                  sp_exptmod
00275 #define mp_exptmod_nct              sp_exptmod
00276 #define mp_prime_is_prime           sp_prime_is_prime
00277 #define mp_prime_is_prime_ex        sp_prime_is_prime_ex
00278 #define mp_exch                     sp_exch
00279 #define get_digit_count             sp_get_digit_count
00280 #define mp_init_copy                sp_init_copy
00281 #define mp_rshb(A,x)                sp_rshb(A,x,A)
00282 #define mp_mul_d                    sp_mul_d
00283 
00284 #endif
00285 
00286 #endif /* WOLF_CRYPT_SP_H */
00287 
00288