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