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