Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more
integer.h
00001 /* integer.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 /* 00024 * Based on public domain LibTomMath 0.38 by Tom St Denis, tomstdenis@iahu.ca, 00025 * http://math.libtomcrypt.com 00026 */ 00027 00028 00029 #ifndef WOLF_CRYPT_INTEGER_H 00030 #define WOLF_CRYPT_INTEGER_H 00031 00032 /* may optionally use fast math instead, not yet supported on all platforms and 00033 may not be faster on all 00034 */ 00035 #include <wolfssl/wolfcrypt/types.h > /* will set MP_xxBIT if not default */ 00036 #ifdef WOLFSSL_SP_MATH 00037 #include <wolfssl/wolfcrypt/sp_int.h> 00038 #elif defined(USE_FAST_MATH) 00039 #include <wolfssl/wolfcrypt/tfm.h> 00040 #else 00041 00042 #include <wolfssl/wolfcrypt/random.h > 00043 00044 #ifndef CHAR_BIT 00045 #include <limits.h> 00046 #endif 00047 00048 #include <wolfssl/wolfcrypt/mpi_class.h> 00049 00050 00051 #ifdef __cplusplus 00052 extern "C" { 00053 00054 /* C++ compilers don't like assigning void * to mp_digit * */ 00055 #define OPT_CAST(x) (x *) 00056 00057 #elif defined(_SH3) 00058 00059 /* SuperH SH3 compiler doesn't like assigning voi* to mp_digit* */ 00060 #define OPT_CAST(x) (x *) 00061 00062 #else 00063 00064 /* C on the other hand doesn't care */ 00065 #define OPT_CAST(x) 00066 00067 #endif /* __cplusplus */ 00068 00069 00070 /* detect 64-bit mode if possible */ 00071 #if defined(__x86_64__) && !(defined (_MSC_VER) && defined(__clang__)) 00072 #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT)) 00073 #define MP_64BIT 00074 #endif 00075 #endif 00076 /* if intel compiler doesn't provide 128 bit type don't turn on 64bit */ 00077 #if defined(MP_64BIT) && defined(__INTEL_COMPILER) && !defined(HAVE___UINT128_T) 00078 #undef MP_64BIT 00079 #endif 00080 00081 00082 /* allow user to define on mp_digit, mp_word, DIGIT_BIT types */ 00083 #ifndef WOLFSSL_BIGINT_TYPES 00084 00085 /* some default configurations. 00086 * 00087 * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits 00088 * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits 00089 * 00090 * At the very least a mp_digit must be able to hold 7 bits 00091 * [any size beyond that is ok provided it doesn't overflow the data type] 00092 */ 00093 #ifdef MP_8BIT 00094 /* 8-bit */ 00095 typedef unsigned char mp_digit; 00096 typedef unsigned short mp_word; 00097 /* don't define DIGIT_BIT, so its calculated below */ 00098 #elif defined(MP_16BIT) 00099 /* 16-bit */ 00100 typedef unsigned int mp_digit; 00101 typedef unsigned long mp_word; 00102 /* don't define DIGIT_BIT, so its calculated below */ 00103 #elif defined(NO_64BIT) 00104 /* 32-bit forced to 16-bit */ 00105 typedef unsigned short mp_digit; 00106 typedef unsigned int mp_word; 00107 #define DIGIT_BIT 12 00108 #elif defined(MP_64BIT) 00109 /* 64-bit */ 00110 /* for GCC only on supported platforms */ 00111 typedef unsigned long long mp_digit; /* 64 bit type, 128 uses mode(TI) */ 00112 typedef unsigned long mp_word __attribute__ ((mode(TI))); 00113 #define DIGIT_BIT 60 00114 #else 00115 /* 32-bit default case */ 00116 00117 #if defined(_MSC_VER) || defined(__BORLANDC__) 00118 typedef unsigned __int64 ulong64; 00119 #else 00120 typedef unsigned long long ulong64; 00121 #endif 00122 00123 typedef unsigned int mp_digit; /* long could be 64 now, changed TAO */ 00124 typedef ulong64 mp_word; 00125 00126 #ifdef MP_31BIT 00127 /* this is an extension that uses 31-bit digits */ 00128 #define DIGIT_BIT 31 00129 #else 00130 /* default case is 28-bit digits, defines MP_28BIT as a handy test macro */ 00131 #define DIGIT_BIT 28 00132 #define MP_28BIT 00133 #endif 00134 #endif 00135 00136 #endif /* WOLFSSL_BIGINT_TYPES */ 00137 00138 /* otherwise the bits per digit is calculated automatically from the size of 00139 a mp_digit */ 00140 #ifndef DIGIT_BIT 00141 #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) 00142 /* bits per digit */ 00143 #endif 00144 00145 #define MP_DIGIT_BIT DIGIT_BIT 00146 #define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) 00147 #define MP_DIGIT_MAX MP_MASK 00148 00149 /* equalities */ 00150 #define MP_LT -1 /* less than */ 00151 #define MP_EQ 0 /* equal to */ 00152 #define MP_GT 1 /* greater than */ 00153 00154 #define MP_ZPOS 0 /* positive integer */ 00155 #define MP_NEG 1 /* negative */ 00156 00157 #define MP_OKAY 0 /* ok result */ 00158 #define MP_MEM -2 /* out of mem */ 00159 #define MP_VAL -3 /* invalid input */ 00160 #define MP_NOT_INF -4 /* point not at infinity */ 00161 #define MP_RANGE MP_NOT_INF 00162 00163 #define MP_YES 1 /* yes response */ 00164 #define MP_NO 0 /* no response */ 00165 00166 /* Primality generation flags */ 00167 #define LTM_PRIME_BBS 0x0001 /* BBS style prime */ 00168 #define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ 00169 #define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ 00170 00171 typedef int mp_err; 00172 00173 /* define this to use lower memory usage routines (exptmods mostly) */ 00174 #define MP_LOW_MEM 00175 00176 /* default precision */ 00177 #ifndef MP_PREC 00178 #ifndef MP_LOW_MEM 00179 #define MP_PREC 32 /* default digits of precision */ 00180 #else 00181 #define MP_PREC 1 /* default digits of precision */ 00182 #endif 00183 #endif 00184 00185 /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - 00186 BITS_PER_DIGIT*2) */ 00187 #define MP_WARRAY ((mp_word)1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) 00188 00189 #ifdef HAVE_WOLF_BIGINT 00190 /* raw big integer */ 00191 typedef struct WC_BIGINT { 00192 byte* buf; 00193 word32 len; 00194 void* heap; 00195 } WC_BIGINT; 00196 #define WOLF_BIGINT_DEFINED 00197 #endif 00198 00199 /* the mp_int structure */ 00200 typedef struct mp_int { 00201 int used, alloc, sign; 00202 mp_digit *dp; 00203 00204 #ifdef HAVE_WOLF_BIGINT 00205 struct WC_BIGINT raw; /* unsigned binary (big endian) */ 00206 #endif 00207 } mp_int; 00208 00209 /* wolf big int and common functions */ 00210 #include <wolfssl/wolfcrypt/wolfmath.h> 00211 00212 00213 /* callback for mp_prime_random, should fill dst with random bytes and return 00214 how many read [up to len] */ 00215 typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); 00216 00217 00218 #define USED(m) ((m)->used) 00219 #define DIGIT(m,k) ((m)->dp[(k)]) 00220 #define SIGN(m) ((m)->sign) 00221 00222 00223 /* ---> Basic Manipulations <--- */ 00224 #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) 00225 #define mp_isone(a) \ 00226 (((((a)->used == 1)) && ((a)->dp[0] == 1u)) ? MP_YES : MP_NO) 00227 #define mp_iseven(a) \ 00228 (((a)->used > 0 && (((a)->dp[0] & 1u) == 0u)) ? MP_YES : MP_NO) 00229 #define mp_isodd(a) \ 00230 (((a)->used > 0 && (((a)->dp[0] & 1u) == 1u)) ? MP_YES : MP_NO) 00231 #define mp_isneg(a) (((a)->sign != MP_ZPOS) ? MP_YES : MP_NO) 00232 #define mp_isword(a, w) \ 00233 ((((a)->used == 1) && ((a)->dp[0] == w)) || ((w == 0) && ((a)->used == 0)) \ 00234 ? MP_YES : MP_NO) 00235 00236 /* number of primes */ 00237 #ifdef MP_8BIT 00238 #define PRIME_SIZE 31 00239 #else 00240 #define PRIME_SIZE 256 00241 #endif 00242 00243 #ifndef MAX_INVMOD_SZ 00244 #if defined(WOLFSSL_MYSQL_COMPATIBLE) 00245 #define MAX_INVMOD_SZ 8192 00246 #else 00247 #define MAX_INVMOD_SZ 4096 00248 #endif 00249 #endif 00250 00251 #define mp_prime_random(a, t, size, bbs, cb, dat) \ 00252 mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) 00253 00254 #define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) 00255 #define mp_raw_size(mp) mp_signed_bin_size(mp) 00256 #define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) 00257 #define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) 00258 #define mp_mag_size(mp) mp_unsigned_bin_size(mp) 00259 #define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) 00260 00261 #define MP_RADIX_BIN 2 00262 #define MP_RADIX_OCT 8 00263 #define MP_RADIX_DEC 10 00264 #define MP_RADIX_HEX 16 00265 #define MP_RADIX_MAX 64 00266 00267 #define mp_tobinary(M, S) mp_toradix((M), (S), MP_RADIX_BIN) 00268 #define mp_tooctal(M, S) mp_toradix((M), (S), MP_RADIX_OCT) 00269 #define mp_todecimal(M, S) mp_toradix((M), (S), MP_RADIX_DEC) 00270 #define mp_tohex(M, S) mp_toradix((M), (S), MP_RADIX_HEX) 00271 00272 #define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) 00273 00274 #if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \ 00275 defined(WOLFSSL_DEBUG_MATH) || defined(DEBUG_WOLFSSL) 00276 extern const char *mp_s_rmap; 00277 #endif 00278 00279 /* 6 functions needed by Rsa */ 00280 MP_API int mp_init (mp_int * a); 00281 MP_API void mp_clear (mp_int * a); 00282 MP_API void mp_free (mp_int * a); 00283 MP_API void mp_forcezero(mp_int * a); 00284 MP_API int mp_unsigned_bin_size(mp_int * a); 00285 MP_API int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c); 00286 MP_API int mp_to_unsigned_bin_at_pos(int x, mp_int *t, unsigned char *b); 00287 MP_API int mp_to_unsigned_bin (mp_int * a, unsigned char *b); 00288 MP_API int mp_to_unsigned_bin_len(mp_int * a, unsigned char *b, int c); 00289 MP_API int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); 00290 MP_API int mp_exptmod_ex (mp_int * G, mp_int * X, int digits, mp_int * P, 00291 mp_int * Y); 00292 /* end functions needed by Rsa */ 00293 00294 /* functions added to support above needed, removed TOOM and KARATSUBA */ 00295 MP_API int mp_count_bits (mp_int * a); 00296 MP_API int mp_leading_bit (mp_int * a); 00297 MP_API int mp_init_copy (mp_int * a, mp_int * b); 00298 MP_API int mp_copy (mp_int * a, mp_int * b); 00299 MP_API int mp_grow (mp_int * a, int size); 00300 MP_API int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d); 00301 MP_API void mp_zero (mp_int * a); 00302 MP_API void mp_clamp (mp_int * a); 00303 MP_API void mp_exch (mp_int * a, mp_int * b); 00304 MP_API void mp_rshd (mp_int * a, int b); 00305 MP_API void mp_rshb (mp_int * a, int b); 00306 MP_API int mp_mod_2d (mp_int * a, int b, mp_int * c); 00307 MP_API int mp_mul_2d (mp_int * a, int b, mp_int * c); 00308 MP_API int mp_lshd (mp_int * a, int b); 00309 MP_API int mp_abs (mp_int * a, mp_int * b); 00310 MP_API int mp_invmod (mp_int * a, mp_int * b, mp_int * c); 00311 int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c); 00312 MP_API int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); 00313 MP_API int mp_cmp_mag (mp_int * a, mp_int * b); 00314 MP_API int mp_cmp (mp_int * a, mp_int * b); 00315 MP_API int mp_cmp_d(mp_int * a, mp_digit b); 00316 MP_API int mp_set (mp_int * a, mp_digit b); 00317 MP_API int mp_is_bit_set (mp_int * a, mp_digit b); 00318 MP_API int mp_mod (mp_int * a, mp_int * b, mp_int * c); 00319 MP_API int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d); 00320 MP_API int mp_div_2(mp_int * a, mp_int * b); 00321 MP_API int mp_add (mp_int * a, mp_int * b, mp_int * c); 00322 int s_mp_add (mp_int * a, mp_int * b, mp_int * c); 00323 int s_mp_sub (mp_int * a, mp_int * b, mp_int * c); 00324 MP_API int mp_sub (mp_int * a, mp_int * b, mp_int * c); 00325 MP_API int mp_reduce_is_2k_l(mp_int *a); 00326 MP_API int mp_reduce_is_2k(mp_int *a); 00327 MP_API int mp_dr_is_modulus(mp_int *a); 00328 MP_API int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, 00329 int); 00330 MP_API int mp_exptmod_base_2 (mp_int * X, mp_int * P, mp_int * Y); 00331 #define mp_exptmod_nct(G,X,P,Y) mp_exptmod_fast(G,X,P,Y,0) 00332 MP_API int mp_montgomery_setup (mp_int * n, mp_digit * rho); 00333 int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho); 00334 MP_API int mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho); 00335 MP_API void mp_dr_setup(mp_int *a, mp_digit *d); 00336 MP_API int mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k); 00337 MP_API int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); 00338 int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs); 00339 int s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs); 00340 MP_API int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); 00341 MP_API int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); 00342 MP_API int mp_reduce (mp_int * x, mp_int * m, mp_int * mu); 00343 MP_API int mp_reduce_setup (mp_int * a, mp_int * b); 00344 int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode); 00345 MP_API int mp_montgomery_calc_normalization (mp_int * a, mp_int * b); 00346 int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); 00347 int s_mp_sqr (mp_int * a, mp_int * b); 00348 int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); 00349 int fast_s_mp_sqr (mp_int * a, mp_int * b); 00350 MP_API int mp_init_size (mp_int * a, int size); 00351 MP_API int mp_div_3 (mp_int * a, mp_int *c, mp_digit * d); 00352 MP_API int mp_mul_2(mp_int * a, mp_int * b); 00353 MP_API int mp_mul (mp_int * a, mp_int * b, mp_int * c); 00354 MP_API int mp_sqr (mp_int * a, mp_int * b); 00355 MP_API int mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d); 00356 MP_API int mp_submod (mp_int* a, mp_int* b, mp_int* c, mp_int* d); 00357 MP_API int mp_addmod (mp_int* a, mp_int* b, mp_int* c, mp_int* d); 00358 MP_API int mp_mul_d (mp_int * a, mp_digit b, mp_int * c); 00359 MP_API int mp_2expt (mp_int * a, int b); 00360 MP_API int mp_set_bit (mp_int * a, int b); 00361 MP_API int mp_reduce_2k_setup(mp_int *a, mp_digit *d); 00362 MP_API int mp_add_d (mp_int* a, mp_digit b, mp_int* c); 00363 MP_API int mp_set_int (mp_int * a, unsigned long b); 00364 MP_API int mp_sub_d (mp_int * a, mp_digit b, mp_int * c); 00365 /* end support added functions */ 00366 00367 /* added */ 00368 MP_API int mp_init_multi(mp_int* a, mp_int* b, mp_int* c, mp_int* d, mp_int* e, 00369 mp_int* f); 00370 MP_API int mp_toradix (mp_int *a, char *str, int radix); 00371 MP_API int mp_radix_size (mp_int * a, int radix, int *size); 00372 00373 #ifdef WOLFSSL_DEBUG_MATH 00374 MP_API void mp_dump(const char* desc, mp_int* a, byte verbose); 00375 #else 00376 #define mp_dump(desc, a, verbose) 00377 #endif 00378 00379 #if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || !defined(NO_RSA) || \ 00380 !defined(NO_DSA) || !defined(NO_DH) 00381 MP_API int mp_sqrmod(mp_int* a, mp_int* b, mp_int* c); 00382 #endif 00383 #if !defined(NO_DSA) || defined(HAVE_ECC) 00384 MP_API int mp_read_radix(mp_int* a, const char* str, int radix); 00385 #endif 00386 00387 #if defined(WOLFSSL_KEY_GEN) || !defined(NO_RSA) || !defined(NO_DSA) || !defined(NO_DH) 00388 MP_API int mp_prime_is_prime (mp_int * a, int t, int *result); 00389 MP_API int mp_prime_is_prime_ex (mp_int * a, int t, int *result, WC_RNG*); 00390 #endif /* WOLFSSL_KEY_GEN NO_RSA NO_DSA NO_DH */ 00391 #ifdef WOLFSSL_KEY_GEN 00392 MP_API int mp_gcd (mp_int * a, mp_int * b, mp_int * c); 00393 MP_API int mp_lcm (mp_int * a, mp_int * b, mp_int * c); 00394 MP_API int mp_rand_prime(mp_int* N, int len, WC_RNG* rng, void* heap); 00395 #endif 00396 00397 MP_API int mp_cnt_lsb(mp_int *a); 00398 MP_API int mp_mod_d(mp_int* a, mp_digit b, mp_digit* c); 00399 00400 00401 #ifdef __cplusplus 00402 } 00403 #endif 00404 00405 00406 #endif /* USE_FAST_MATH */ 00407 00408 #endif /* WOLF_CRYPT_INTEGER_H */ 00409 00410
Generated on Tue Jul 12 2022 20:58:36 by
1.7.2