wolfSSL SSL/TLS library, support up to TLS1.3
Dependents: CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more
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
Generated on Tue Jul 12 2022 20:58:52 by 1.7.2