|
|
|||
File indexing completed on 2026-04-12 08:27:23
0001 /* LibTomMath, multiple-precision integer library -- Tom St Denis */ 0002 /* SPDX-License-Identifier: Unlicense */ 0003 0004 #ifndef BN_H_ 0005 #define BN_H_ 0006 0007 #ifndef MODULE_SCOPE 0008 #define MODULE_SCOPE extern 0009 #endif 0010 0011 0012 0013 #ifdef __cplusplus 0014 extern "C" { 0015 #endif 0016 0017 /* MS Visual C++ doesn't have a 128bit type for words, so fall back to 32bit MPI's (where words are 64bit) */ 0018 #if (defined(_WIN32) || defined(__LLP64__) || defined(__e2k__) || defined(__LCC__)) && !defined(MP_64BIT) 0019 # define MP_32BIT 0020 #endif 0021 0022 /* detect 64-bit mode if possible */ 0023 #if defined(NEVER) 0024 # if !(defined(MP_32BIT) || defined(MP_16BIT) || defined(MP_8BIT)) 0025 # if defined(__GNUC__) 0026 /* we support 128bit integers only via: __attribute__((mode(TI))) */ 0027 # define MP_64BIT 0028 # else 0029 /* otherwise we fall back to MP_32BIT even on 64bit platforms */ 0030 # define MP_32BIT 0031 # endif 0032 # endif 0033 #endif 0034 0035 #ifdef MP_DIGIT_BIT 0036 # error Defining MP_DIGIT_BIT is disallowed, use MP_8/16/31/32/64BIT 0037 #endif 0038 0039 /* some default configurations. 0040 * 0041 * A "mp_digit" must be able to hold MP_DIGIT_BIT + 1 bits 0042 * A "mp_word" must be able to hold 2*MP_DIGIT_BIT + 1 bits 0043 * 0044 * At the very least a mp_digit must be able to hold 7 bits 0045 * [any size beyond that is ok provided it doesn't overflow the data type] 0046 */ 0047 0048 #ifdef MP_8BIT 0049 #ifndef MP_DIGIT_DECLARED 0050 typedef unsigned char mp_digit; 0051 #define MP_DIGIT_DECLARED 0052 #endif 0053 #ifndef MP_WORD_DECLARED 0054 typedef unsigned short private_mp_word; 0055 #define MP_WORD_DECLARED 0056 #endif 0057 # define MP_SIZEOF_MP_DIGIT 1 0058 # ifdef MP_DIGIT_BIT 0059 # error You must not define MP_DIGIT_BIT when using MP_8BIT 0060 # endif 0061 #elif defined(MP_16BIT) 0062 #ifndef MP_DIGIT_DECLARED 0063 typedef unsigned short mp_digit; 0064 #define MP_DIGIT_DECLARED 0065 #endif 0066 #ifndef MP_WORD_DECLARED 0067 typedef unsigned int private_mp_word; 0068 #define MP_WORD_DECLARED 0069 #endif 0070 # define MP_SIZEOF_MP_DIGIT 2 0071 # ifdef MP_DIGIT_BIT 0072 # error You must not define MP_DIGIT_BIT when using MP_16BIT 0073 # endif 0074 #elif defined(MP_64BIT) 0075 /* for GCC only on supported platforms */ 0076 #ifndef MP_DIGIT_DECLARED 0077 typedef unsigned long long mp_digit; 0078 #define MP_DIGIT_DECLARED 0079 #endif 0080 #if defined(__GNUC__) 0081 typedef unsigned long private_mp_word __attribute__((mode(TI))); 0082 #endif 0083 # define MP_DIGIT_BIT 60 0084 #else 0085 #ifndef MP_DIGIT_DECLARED 0086 typedef unsigned int mp_digit; 0087 #define MP_DIGIT_DECLARED 0088 #endif 0089 #ifndef MP_WORD_DECLARED 0090 #ifdef _WIN32 0091 typedef unsigned __int64 private_mp_word; 0092 #else 0093 typedef unsigned long long private_mp_word; 0094 #endif 0095 #define MP_WORD_DECLARED 0096 #endif 0097 0098 # ifdef MP_31BIT 0099 /* 0100 * This is an extension that uses 31-bit digits. 0101 * Please be aware that not all functions support this size, especially s_mp_mul_digs_fast 0102 * will be reduced to work on small numbers only: 0103 * Up to 8 limbs, 248 bits instead of up to 512 limbs, 15872 bits with MP_28BIT. 0104 */ 0105 # define MP_DIGIT_BIT 31 0106 # else 0107 /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ 0108 # define MP_DIGIT_BIT 28 0109 # define MP_28BIT 0110 # endif 0111 #endif 0112 0113 /* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ 0114 #ifndef MP_DIGIT_BIT 0115 # define MP_DIGIT_BIT (((CHAR_BIT * MP_SIZEOF_MP_DIGIT) - 1)) /* bits per digit */ 0116 #endif 0117 0118 #define MP_MASK ((((mp_digit)1)<<((mp_digit)MP_DIGIT_BIT))-((mp_digit)1)) 0119 #define MP_DIGIT_MAX MP_MASK 0120 0121 /* Primality generation flags */ 0122 #define MP_PRIME_BBS 0x0001 /* BBS style prime */ 0123 #define MP_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ 0124 #define MP_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ 0125 0126 #define LTM_PRIME_BBS (MP_DEPRECATED_PRAGMA("LTM_PRIME_BBS has been deprecated, use MP_PRIME_BBS") MP_PRIME_BBS) 0127 #define LTM_PRIME_SAFE (MP_DEPRECATED_PRAGMA("LTM_PRIME_SAFE has been deprecated, use MP_PRIME_SAFE") MP_PRIME_SAFE) 0128 #define LTM_PRIME_2MSB_ON (MP_DEPRECATED_PRAGMA("LTM_PRIME_2MSB_ON has been deprecated, use MP_PRIME_2MSB_ON") MP_PRIME_2MSB_ON) 0129 0130 #ifdef MP_USE_ENUMS 0131 typedef enum { 0132 MP_ZPOS = 0, /* positive */ 0133 MP_NEG = 1 /* negative */ 0134 } mp_sign; 0135 typedef enum { 0136 MP_LT = -1, /* less than */ 0137 MP_EQ = 0, /* equal */ 0138 MP_GT = 1 /* greater than */ 0139 } mp_ord; 0140 typedef enum { 0141 MP_NO = 0, 0142 MP_YES = 1 0143 } mp_bool; 0144 typedef enum { 0145 MP_OKAY = 0, /* no error */ 0146 MP_ERR = -1, /* unknown error */ 0147 MP_MEM = -2, /* out of mem */ 0148 MP_VAL = -3, /* invalid input */ 0149 MP_ITER = -4, /* maximum iterations reached */ 0150 MP_BUF = -5 /* buffer overflow, supplied buffer too small */ 0151 } mp_err; 0152 typedef enum { 0153 MP_LSB_FIRST = -1, 0154 MP_MSB_FIRST = 1 0155 } mp_order; 0156 typedef enum { 0157 MP_LITTLE_ENDIAN = -1, 0158 MP_NATIVE_ENDIAN = 0, 0159 MP_BIG_ENDIAN = 1 0160 } mp_endian; 0161 #else 0162 typedef int mp_sign; 0163 #define MP_ZPOS 0 /* positive integer */ 0164 #define MP_NEG 1 /* negative */ 0165 typedef int mp_ord; 0166 #define MP_LT -1 /* less than */ 0167 #define MP_EQ 0 /* equal to */ 0168 #define MP_GT 1 /* greater than */ 0169 typedef int mp_bool; 0170 #define MP_YES 1 0171 #define MP_NO 0 0172 typedef int mp_err; 0173 #define MP_OKAY 0 /* no error */ 0174 #define MP_ERR -1 /* unknown error */ 0175 #define MP_MEM -2 /* out of mem */ 0176 #define MP_VAL -3 /* invalid input */ 0177 #define MP_RANGE (MP_DEPRECATED_PRAGMA("MP_RANGE has been deprecated in favor of MP_VAL") MP_VAL) 0178 #define MP_ITER -4 /* maximum iterations reached */ 0179 #define MP_BUF -5 /* buffer overflow, supplied buffer too small */ 0180 typedef int mp_order; 0181 #define MP_LSB_FIRST -1 0182 #define MP_MSB_FIRST 1 0183 typedef int mp_endian; 0184 #define MP_LITTLE_ENDIAN -1 0185 #define MP_NATIVE_ENDIAN 0 0186 #define MP_BIG_ENDIAN 1 0187 #endif 0188 0189 /* tunable cutoffs */ 0190 0191 #ifndef MP_FIXED_CUTOFFS 0192 extern int 0193 KARATSUBA_MUL_CUTOFF, 0194 KARATSUBA_SQR_CUTOFF, 0195 TOOM_MUL_CUTOFF, 0196 TOOM_SQR_CUTOFF; 0197 #endif 0198 0199 /* define this to use lower memory usage routines (exptmods mostly) */ 0200 /* #define MP_LOW_MEM */ 0201 0202 /* default precision */ 0203 #ifndef MP_PREC 0204 # ifndef MP_LOW_MEM 0205 # define MP_PREC 32 /* default digits of precision */ 0206 # elif defined(MP_8BIT) 0207 # define MP_PREC 16 /* default digits of precision */ 0208 # else 0209 # define MP_PREC 8 /* default digits of precision */ 0210 # endif 0211 #endif 0212 0213 /* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ 0214 #define PRIVATE_MP_WARRAY (int)(1 << (((CHAR_BIT * sizeof(private_mp_word)) - (2 * MP_DIGIT_BIT)) + 1)) 0215 0216 #if defined(__GNUC__) && __GNUC__ >= 4 0217 # define MP_NULL_TERMINATED __attribute__((sentinel)) 0218 #else 0219 # define MP_NULL_TERMINATED 0220 #endif 0221 0222 /* 0223 * MP_WUR - warn unused result 0224 * --------------------------- 0225 * 0226 * The result of functions annotated with MP_WUR must be 0227 * checked and cannot be ignored. 0228 * 0229 * Most functions in libtommath return an error code. 0230 * This error code must be checked in order to prevent crashes or invalid 0231 * results. 0232 * 0233 * If you still want to avoid the error checks for quick and dirty programs 0234 * without robustness guarantees, you can `#define MP_WUR` before including 0235 * tommath.h, disabling the warnings. 0236 */ 0237 #ifndef MP_WUR 0238 # if defined(__GNUC__) && __GNUC__ >= 4 0239 # define MP_WUR __attribute__((warn_unused_result)) 0240 # else 0241 # define MP_WUR 0242 # endif 0243 #endif 0244 0245 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 405) 0246 # define MP_DEPRECATED(x) __attribute__((deprecated("replaced by " #x))) 0247 #elif defined(_MSC_VER) && _MSC_VER >= 1500 0248 # define MP_DEPRECATED(x) __declspec(deprecated("replaced by " #x)) 0249 #else 0250 # define MP_DEPRECATED(x) 0251 #endif 0252 0253 #ifndef MP_NO_DEPRECATED_PRAGMA 0254 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 301) 0255 # define PRIVATE_MP_DEPRECATED_PRAGMA(s) _Pragma(#s) 0256 # define MP_DEPRECATED_PRAGMA(s) PRIVATE_MP_DEPRECATED_PRAGMA(GCC warning s) 0257 #elif defined(_MSC_VER) && _MSC_VER >= 1500 0258 # define MP_DEPRECATED_PRAGMA(s) __pragma(message(s)) 0259 #endif 0260 #endif 0261 0262 #ifndef MP_DEPRECATED_PRAGMA 0263 # define MP_DEPRECATED_PRAGMA(s) 0264 #endif 0265 0266 #define DIGIT_BIT MP_DIGIT_BIT 0267 #define USED(m) ((m)->used) 0268 #define DIGIT(m,k) ((m)->dp[(k)]) 0269 #define SIGN(m) ((m)->sign) 0270 0271 /* the infamous mp_int structure */ 0272 #ifndef MP_INT_DECLARED 0273 #define MP_INT_DECLARED 0274 typedef struct mp_int mp_int; 0275 #endif 0276 struct mp_int { 0277 int used, alloc; 0278 mp_sign sign; 0279 mp_digit *dp; 0280 }; 0281 0282 /* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ 0283 typedef int private_mp_prime_callback(unsigned char *dst, int len, void *dat); 0284 typedef private_mp_prime_callback MP_DEPRECATED(mp_rand_source) ltm_prime_callback; 0285 0286 /* error code to char* string */ 0287 /* 0288 const char *mp_error_to_string(mp_err code) MP_WUR; 0289 */ 0290 0291 /* ---> init and deinit bignum functions <--- */ 0292 /* init a bignum */ 0293 /* 0294 mp_err mp_init(mp_int *a) MP_WUR; 0295 */ 0296 0297 /* free a bignum */ 0298 /* 0299 void mp_clear(mp_int *a); 0300 */ 0301 0302 /* init a null terminated series of arguments */ 0303 /* 0304 mp_err mp_init_multi(mp_int *mp, ...) MP_NULL_TERMINATED MP_WUR; 0305 */ 0306 0307 /* clear a null terminated series of arguments */ 0308 /* 0309 void mp_clear_multi(mp_int *mp, ...) MP_NULL_TERMINATED; 0310 */ 0311 0312 /* exchange two ints */ 0313 /* 0314 void mp_exch(mp_int *a, mp_int *b); 0315 */ 0316 0317 /* shrink ram required for a bignum */ 0318 /* 0319 mp_err mp_shrink(mp_int *a) MP_WUR; 0320 */ 0321 0322 /* grow an int to a given size */ 0323 /* 0324 mp_err mp_grow(mp_int *a, int size) MP_WUR; 0325 */ 0326 0327 /* init to a given number of digits */ 0328 /* 0329 mp_err mp_init_size(mp_int *a, int size) MP_WUR; 0330 */ 0331 0332 /* ---> Basic Manipulations <--- */ 0333 #define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) 0334 #define mp_isodd(a) (((a)->used != 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) 0335 #define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) 0336 #define mp_isneg(a) (((a)->sign != MP_ZPOS) ? MP_YES : MP_NO) 0337 0338 /* set to zero */ 0339 /* 0340 void mp_zero(mp_int *a); 0341 */ 0342 0343 /* get and set doubles */ 0344 /* 0345 double mp_get_double(const mp_int *a) MP_WUR; 0346 */ 0347 /* 0348 mp_err mp_set_double(mp_int *a, double b) MP_WUR; 0349 */ 0350 0351 /* get integer, set integer and init with integer (int32_t) */ 0352 #ifndef MP_NO_STDINT 0353 /* 0354 int32_t mp_get_i32(const mp_int *a) MP_WUR; 0355 */ 0356 /* 0357 void mp_set_i32(mp_int *a, int32_t b); 0358 */ 0359 /* 0360 mp_err mp_init_i32(mp_int *a, int32_t b) MP_WUR; 0361 */ 0362 0363 /* get integer, set integer and init with integer, behaves like two complement for negative numbers (uint32_t) */ 0364 #define mp_get_u32(a) ((uint32_t)mp_get_i32(a)) 0365 /* 0366 void mp_set_u32(mp_int *a, uint32_t b); 0367 */ 0368 /* 0369 mp_err mp_init_u32(mp_int *a, uint32_t b) MP_WUR; 0370 */ 0371 0372 /* get integer, set integer and init with integer (int64_t) */ 0373 /* 0374 int64_t mp_get_i64(const mp_int *a) MP_WUR; 0375 */ 0376 /* 0377 void mp_set_i64(mp_int *a, int64_t b); 0378 */ 0379 /* 0380 mp_err mp_init_i64(mp_int *a, int64_t b) MP_WUR; 0381 */ 0382 0383 /* get integer, set integer and init with integer, behaves like two complement for negative numbers (uint64_t) */ 0384 #define mp_get_u64(a) ((uint64_t)mp_get_i64(a)) 0385 /* 0386 void mp_set_u64(mp_int *a, uint64_t b); 0387 */ 0388 /* 0389 mp_err mp_init_u64(mp_int *a, uint64_t b) MP_WUR; 0390 */ 0391 0392 /* get magnitude */ 0393 /* 0394 uint32_t mp_get_mag_u32(const mp_int *a) MP_WUR; 0395 */ 0396 /* 0397 uint64_t mp_get_mag_u64(const mp_int *a) MP_WUR; 0398 */ 0399 #endif 0400 /* 0401 unsigned long mp_get_mag_ul(const mp_int *a) MP_WUR; 0402 */ 0403 /* 0404 MP_DEPRECATED(mp_get_mag_u64) Tcl_WideUInt mp_get_mag_ull(const mp_int *a) MP_WUR; 0405 */ 0406 0407 /* get integer, set integer (long) */ 0408 /* 0409 long mp_get_l(const mp_int *a) MP_WUR; 0410 */ 0411 /* 0412 void mp_set_l(mp_int *a, long b); 0413 */ 0414 /* 0415 mp_err mp_init_l(mp_int *a, long b) MP_WUR; 0416 */ 0417 0418 /* get integer, set integer (unsigned long) */ 0419 #define mp_get_ul(a) ((unsigned long)mp_get_l(a)) 0420 /* 0421 void mp_set_ul(mp_int *a, unsigned long b); 0422 */ 0423 /* 0424 mp_err mp_init_ul(mp_int *a, unsigned long b) MP_WUR; 0425 */ 0426 0427 /* get integer, set integer (Tcl_WideInt) */ 0428 /* 0429 MP_DEPRECATED(mp_get_i64) Tcl_WideInt mp_get_ll(const mp_int *a) MP_WUR; 0430 */ 0431 /* 0432 MP_DEPRECATED(mp_set_i64) void mp_set_ll(mp_int *a, Tcl_WideInt b); 0433 */ 0434 /* 0435 MP_DEPRECATED(mp_init_i64) mp_err mp_init_ll(mp_int *a, Tcl_WideInt b) MP_WUR; 0436 */ 0437 0438 /* get integer, set integer (Tcl_WideUInt) */ 0439 /* 0440 #define mp_get_ull(a) (MP_DEPRECATED_PRAGMA("mp_get_ull() has been deprecated, use mp_get_u64()") ((Tcl_WideUInt)mp_get_ll(a))) 0441 */ 0442 /* 0443 MP_DEPRECATED(mp_set_u64) void mp_set_ull(mp_int *a, Tcl_WideUInt b); 0444 */ 0445 /* 0446 MP_DEPRECATED(mp_init_u64) mp_err mp_init_ull(mp_int *a, Tcl_WideUInt b) MP_WUR; 0447 */ 0448 0449 /* set to single unsigned digit, up to MP_DIGIT_MAX */ 0450 /* 0451 void mp_set(mp_int *a, mp_digit b); 0452 */ 0453 /* 0454 mp_err mp_init_set(mp_int *a, mp_digit b) MP_WUR; 0455 */ 0456 0457 /* get integer, set integer and init with integer (deprecated) */ 0458 /* 0459 MP_DEPRECATED(mp_get_mag_u32/mp_get_u32) unsigned long mp_get_int(const mp_int *a) MP_WUR; 0460 */ 0461 /* 0462 MP_DEPRECATED(mp_get_mag_ul/mp_get_ul) unsigned long mp_get_long(const mp_int *a) MP_WUR; 0463 */ 0464 /* 0465 MP_DEPRECATED(mp_get_mag_u64/mp_get_u64) Tcl_WideUInt mp_get_long_long(const mp_int *a) MP_WUR; 0466 */ 0467 /* 0468 MP_DEPRECATED(mp_set_ul) mp_err mp_set_int(mp_int *a, unsigned long b); 0469 */ 0470 /* 0471 MP_DEPRECATED(mp_set_ul) mp_err mp_set_long(mp_int *a, unsigned long b); 0472 */ 0473 /* 0474 MP_DEPRECATED(mp_set_ull) mp_err mp_set_long_long(mp_int *a, Tcl_WideUInt b); 0475 */ 0476 /* 0477 MP_DEPRECATED(mp_init_ul) mp_err mp_init_set_int(mp_int *a, unsigned long b) MP_WUR; 0478 */ 0479 0480 /* copy, b = a */ 0481 /* 0482 mp_err mp_copy(const mp_int *a, mp_int *b) MP_WUR; 0483 */ 0484 0485 /* inits and copies, a = b */ 0486 /* 0487 mp_err mp_init_copy(mp_int *a, const mp_int *b) MP_WUR; 0488 */ 0489 0490 /* trim unused digits */ 0491 /* 0492 void mp_clamp(mp_int *a); 0493 */ 0494 0495 0496 /* export binary data */ 0497 /* 0498 MP_DEPRECATED(mp_pack) mp_err mp_export(void *rop, size_t *countp, int order, size_t size, 0499 int endian, size_t nails, const mp_int *op) MP_WUR; 0500 */ 0501 0502 /* import binary data */ 0503 /* 0504 MP_DEPRECATED(mp_unpack) mp_err mp_import(mp_int *rop, size_t count, int order, 0505 size_t size, int endian, size_t nails, 0506 const void *op) MP_WUR; 0507 */ 0508 0509 /* unpack binary data */ 0510 /* 0511 mp_err mp_unpack(mp_int *rop, size_t count, mp_order order, size_t size, mp_endian endian, 0512 size_t nails, const void *op) MP_WUR; 0513 */ 0514 0515 /* pack binary data */ 0516 /* 0517 size_t mp_pack_count(const mp_int *a, size_t nails, size_t size) MP_WUR; 0518 */ 0519 /* 0520 mp_err mp_pack(void *rop, size_t maxcount, size_t *written, mp_order order, size_t size, 0521 mp_endian endian, size_t nails, const mp_int *op) MP_WUR; 0522 */ 0523 0524 /* ---> digit manipulation <--- */ 0525 0526 /* right shift by "b" digits */ 0527 /* 0528 void mp_rshd(mp_int *a, int b); 0529 */ 0530 0531 /* left shift by "b" digits */ 0532 /* 0533 mp_err mp_lshd(mp_int *a, int b) MP_WUR; 0534 */ 0535 0536 /* c = a / 2**b, implemented as c = a >> b */ 0537 /* 0538 mp_err mp_div_2d(const mp_int *a, int b, mp_int *c, mp_int *d) MP_WUR; 0539 */ 0540 0541 /* b = a/2 */ 0542 /* 0543 mp_err mp_div_2(const mp_int *a, mp_int *b) MP_WUR; 0544 */ 0545 0546 /* a/3 => 3c + d == a */ 0547 /* 0548 MP_DEPRECATED(mp_div_d) mp_err mp_div_3(const mp_int *a, mp_int *c, mp_digit *d) MP_WUR; 0549 */ 0550 0551 /* c = a * 2**b, implemented as c = a << b */ 0552 /* 0553 mp_err mp_mul_2d(const mp_int *a, int b, mp_int *c) MP_WUR; 0554 */ 0555 0556 /* b = a*2 */ 0557 /* 0558 mp_err mp_mul_2(const mp_int *a, mp_int *b) MP_WUR; 0559 */ 0560 0561 /* c = a mod 2**b */ 0562 /* 0563 mp_err mp_mod_2d(const mp_int *a, int b, mp_int *c) MP_WUR; 0564 */ 0565 0566 /* computes a = 2**b */ 0567 /* 0568 mp_err mp_2expt(mp_int *a, int b) MP_WUR; 0569 */ 0570 0571 /* Counts the number of lsbs which are zero before the first zero bit */ 0572 /* 0573 int mp_cnt_lsb(const mp_int *a) MP_WUR; 0574 */ 0575 0576 /* I Love Earth! */ 0577 0578 /* makes a pseudo-random mp_int of a given size */ 0579 /* 0580 mp_err mp_rand(mp_int *a, int digits) MP_WUR; 0581 */ 0582 /* makes a pseudo-random small int of a given size */ 0583 /* 0584 MP_DEPRECATED(mp_rand) mp_err mp_rand_digit(mp_digit *r) MP_WUR; 0585 */ 0586 /* use custom random data source instead of source provided the platform */ 0587 /* 0588 void mp_rand_source(mp_err(*source)(void *out, size_t size)); 0589 */ 0590 0591 #ifdef MP_PRNG_ENABLE_LTM_RNG 0592 /* A last resort to provide random data on systems without any of the other 0593 * implemented ways to gather entropy. 0594 * It is compatible with `rng_get_bytes()` from libtomcrypt so you could 0595 * provide that one and then set `ltm_rng = rng_get_bytes;` */ 0596 extern unsigned long (*ltm_rng)(unsigned char *out, unsigned long outlen, void (*callback)(void)); 0597 extern void (*ltm_rng_callback)(void); 0598 #endif 0599 0600 /* ---> binary operations <--- */ 0601 0602 /* Checks the bit at position b and returns MP_YES 0603 * if the bit is 1, MP_NO if it is 0 and MP_VAL 0604 * in case of error 0605 */ 0606 /* 0607 MP_DEPRECATED(s_mp_get_bit) int mp_get_bit(const mp_int *a, int b) MP_WUR; 0608 */ 0609 0610 /* c = a XOR b (two complement) */ 0611 /* 0612 MP_DEPRECATED(mp_xor) mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0613 */ 0614 /* 0615 mp_err mp_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0616 */ 0617 0618 /* c = a OR b (two complement) */ 0619 /* 0620 MP_DEPRECATED(mp_or) mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0621 */ 0622 /* 0623 mp_err mp_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0624 */ 0625 0626 /* c = a AND b (two complement) */ 0627 /* 0628 MP_DEPRECATED(mp_and) mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0629 */ 0630 /* 0631 mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0632 */ 0633 0634 /* b = ~a (bitwise not, two complement) */ 0635 /* 0636 mp_err mp_complement(const mp_int *a, mp_int *b) MP_WUR; 0637 */ 0638 0639 /* right shift with sign extension */ 0640 /* 0641 MP_DEPRECATED(mp_signed_rsh) mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c) MP_WUR; 0642 */ 0643 /* 0644 mp_err mp_signed_rsh(const mp_int *a, int b, mp_int *c) MP_WUR; 0645 */ 0646 0647 /* ---> Basic arithmetic <--- */ 0648 0649 /* b = -a */ 0650 /* 0651 mp_err mp_neg(const mp_int *a, mp_int *b) MP_WUR; 0652 */ 0653 0654 /* b = |a| */ 0655 /* 0656 mp_err mp_abs(const mp_int *a, mp_int *b) MP_WUR; 0657 */ 0658 0659 /* compare a to b */ 0660 /* 0661 mp_ord mp_cmp(const mp_int *a, const mp_int *b) MP_WUR; 0662 */ 0663 0664 /* compare |a| to |b| */ 0665 /* 0666 mp_ord mp_cmp_mag(const mp_int *a, const mp_int *b) MP_WUR; 0667 */ 0668 0669 /* c = a + b */ 0670 /* 0671 mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0672 */ 0673 0674 /* c = a - b */ 0675 /* 0676 mp_err mp_sub(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0677 */ 0678 0679 /* c = a * b */ 0680 /* 0681 mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0682 */ 0683 0684 /* b = a*a */ 0685 /* 0686 mp_err mp_sqr(const mp_int *a, mp_int *b) MP_WUR; 0687 */ 0688 0689 /* a/b => cb + d == a */ 0690 /* 0691 mp_err mp_div(const mp_int *a, const mp_int *b, mp_int *c, mp_int *d) MP_WUR; 0692 */ 0693 0694 /* c = a mod b, 0 <= c < b */ 0695 /* 0696 mp_err mp_mod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0697 */ 0698 0699 /* Increment "a" by one like "a++". Changes input! */ 0700 /* 0701 mp_err mp_incr(mp_int *a) MP_WUR; 0702 */ 0703 0704 /* Decrement "a" by one like "a--". Changes input! */ 0705 /* 0706 mp_err mp_decr(mp_int *a) MP_WUR; 0707 */ 0708 0709 /* ---> single digit functions <--- */ 0710 0711 /* compare against a single digit */ 0712 /* 0713 mp_ord mp_cmp_d(const mp_int *a, mp_digit b) MP_WUR; 0714 */ 0715 0716 /* c = a + b */ 0717 /* 0718 mp_err mp_add_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; 0719 */ 0720 0721 /* c = a - b */ 0722 /* 0723 mp_err mp_sub_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; 0724 */ 0725 0726 /* c = a * b */ 0727 /* 0728 mp_err mp_mul_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; 0729 */ 0730 0731 /* a/b => cb + d == a */ 0732 /* 0733 mp_err mp_div_d(const mp_int *a, mp_digit b, mp_int *c, mp_digit *d) MP_WUR; 0734 */ 0735 0736 /* c = a mod b, 0 <= c < b */ 0737 /* 0738 mp_err mp_mod_d(const mp_int *a, mp_digit b, mp_digit *c) MP_WUR; 0739 */ 0740 0741 /* ---> number theory <--- */ 0742 0743 /* d = a + b (mod c) */ 0744 /* 0745 mp_err mp_addmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; 0746 */ 0747 0748 /* d = a - b (mod c) */ 0749 /* 0750 mp_err mp_submod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; 0751 */ 0752 0753 /* d = a * b (mod c) */ 0754 /* 0755 mp_err mp_mulmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; 0756 */ 0757 0758 /* c = a * a (mod b) */ 0759 /* 0760 mp_err mp_sqrmod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0761 */ 0762 0763 /* c = 1/a (mod b) */ 0764 /* 0765 mp_err mp_invmod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0766 */ 0767 0768 /* c = (a, b) */ 0769 /* 0770 mp_err mp_gcd(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0771 */ 0772 0773 /* produces value such that U1*a + U2*b = U3 */ 0774 /* 0775 mp_err mp_exteuclid(const mp_int *a, const mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) MP_WUR; 0776 */ 0777 0778 /* c = [a, b] or (a*b)/(a, b) */ 0779 /* 0780 mp_err mp_lcm(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; 0781 */ 0782 0783 /* Integer logarithm to integer base */ 0784 /* 0785 mp_err mp_log_n(const mp_int *a, int base, int *c) MP_WUR; 0786 */ 0787 /* 0788 MP_DEPRECATED(mp_log_n) mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) MP_WUR; 0789 */ 0790 0791 /* c = a**b */ 0792 /* 0793 mp_err mp_expt_n(const mp_int *a, int b, mp_int *c) MP_WUR; 0794 */ 0795 /* 0796 MP_DEPRECATED(mp_expt_n) mp_err mp_expt_u32(const mp_int *a, uint32_t b, mp_int *c) MP_WUR; 0797 */ 0798 /* 0799 MP_DEPRECATED(mp_expt_n) mp_err mp_expt_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; 0800 */ 0801 /* 0802 MP_DEPRECATED(mp_expt_n) mp_err mp_expt_d_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; 0803 */ 0804 /* finds one of the b'th root of a, such that |c|**b <= |a| 0805 * 0806 * returns error if a < 0 and b is even 0807 */ 0808 /* 0809 mp_err mp_root_n(const mp_int *a, int b, mp_int *c) MP_WUR; 0810 */ 0811 /* 0812 MP_DEPRECATED(mp_root_n) mp_err mp_root_u32(const mp_int *a, uint32_t b, mp_int *c) MP_WUR; 0813 */ 0814 /* 0815 MP_DEPRECATED(mp_root_n) mp_err mp_n_root(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; 0816 */ 0817 /* 0818 MP_DEPRECATED(mp_root_n) mp_err mp_n_root_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; 0819 */ 0820 0821 /* special sqrt algo */ 0822 /* 0823 mp_err mp_sqrt(const mp_int *arg, mp_int *ret) MP_WUR; 0824 */ 0825 0826 /* special sqrt (mod prime) */ 0827 /* 0828 mp_err mp_sqrtmod_prime(const mp_int *n, const mp_int *prime, mp_int *ret) MP_WUR; 0829 */ 0830 0831 /* is number a square? */ 0832 /* 0833 mp_err mp_is_square(const mp_int *arg, mp_bool *ret) MP_WUR; 0834 */ 0835 0836 /* computes the jacobi c = (a | n) (or Legendre if b is prime) */ 0837 /* 0838 MP_DEPRECATED(mp_kronecker) mp_err mp_jacobi(const mp_int *a, const mp_int *n, int *c) MP_WUR; 0839 */ 0840 0841 /* computes the Kronecker symbol c = (a | p) (like jacobi() but with {a,p} in Z */ 0842 /* 0843 mp_err mp_kronecker(const mp_int *a, const mp_int *p, int *c) MP_WUR; 0844 */ 0845 0846 /* used to setup the Barrett reduction for a given modulus b */ 0847 /* 0848 mp_err mp_reduce_setup(mp_int *a, const mp_int *b) MP_WUR; 0849 */ 0850 0851 /* Barrett Reduction, computes a (mod b) with a precomputed value c 0852 * 0853 * Assumes that 0 < x <= m*m, note if 0 > x > -(m*m) then you can merely 0854 * compute the reduction as -1 * mp_reduce(mp_abs(x)) [pseudo code]. 0855 */ 0856 /* 0857 mp_err mp_reduce(mp_int *x, const mp_int *m, const mp_int *mu) MP_WUR; 0858 */ 0859 0860 /* setups the montgomery reduction */ 0861 /* 0862 mp_err mp_montgomery_setup(const mp_int *n, mp_digit *rho) MP_WUR; 0863 */ 0864 0865 /* computes a = B**n mod b without division or multiplication useful for 0866 * normalizing numbers in a Montgomery system. 0867 */ 0868 /* 0869 mp_err mp_montgomery_calc_normalization(mp_int *a, const mp_int *b) MP_WUR; 0870 */ 0871 0872 /* computes x/R == x (mod N) via Montgomery Reduction */ 0873 /* 0874 mp_err mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho) MP_WUR; 0875 */ 0876 0877 /* returns 1 if a is a valid DR modulus */ 0878 /* 0879 mp_bool mp_dr_is_modulus(const mp_int *a) MP_WUR; 0880 */ 0881 0882 /* sets the value of "d" required for mp_dr_reduce */ 0883 /* 0884 void mp_dr_setup(const mp_int *a, mp_digit *d); 0885 */ 0886 0887 /* reduces a modulo n using the Diminished Radix method */ 0888 /* 0889 mp_err mp_dr_reduce(mp_int *x, const mp_int *n, mp_digit k) MP_WUR; 0890 */ 0891 0892 /* returns true if a can be reduced with mp_reduce_2k */ 0893 /* 0894 mp_bool mp_reduce_is_2k(const mp_int *a) MP_WUR; 0895 */ 0896 0897 /* determines k value for 2k reduction */ 0898 /* 0899 mp_err mp_reduce_2k_setup(const mp_int *a, mp_digit *d) MP_WUR; 0900 */ 0901 0902 /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ 0903 /* 0904 mp_err mp_reduce_2k(mp_int *a, const mp_int *n, mp_digit d) MP_WUR; 0905 */ 0906 0907 /* returns true if a can be reduced with mp_reduce_2k_l */ 0908 /* 0909 mp_bool mp_reduce_is_2k_l(const mp_int *a) MP_WUR; 0910 */ 0911 0912 /* determines k value for 2k reduction */ 0913 /* 0914 mp_err mp_reduce_2k_setup_l(const mp_int *a, mp_int *d) MP_WUR; 0915 */ 0916 0917 /* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ 0918 /* 0919 mp_err mp_reduce_2k_l(mp_int *a, const mp_int *n, const mp_int *d) MP_WUR; 0920 */ 0921 0922 /* Y = G**X (mod P) */ 0923 /* 0924 mp_err mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y) MP_WUR; 0925 */ 0926 0927 /* ---> Primes <--- */ 0928 0929 /* number of primes */ 0930 #ifdef MP_8BIT 0931 # define PRIVATE_MP_PRIME_TAB_SIZE 31 0932 #else 0933 # define PRIVATE_MP_PRIME_TAB_SIZE 256 0934 #endif 0935 #define PRIME_SIZE (MP_DEPRECATED_PRAGMA("PRIME_SIZE has been made internal") PRIVATE_MP_PRIME_TAB_SIZE) 0936 0937 /* table of first PRIME_SIZE primes */ 0938 #if defined(BUILD_tcl) || !defined(_WIN32) 0939 MODULE_SCOPE const mp_digit ltm_prime_tab[PRIVATE_MP_PRIME_TAB_SIZE]; 0940 #endif 0941 0942 /* result=1 if a is divisible by one of the first PRIME_SIZE primes */ 0943 /* 0944 MP_DEPRECATED(mp_prime_is_prime) mp_err mp_prime_is_divisible(const mp_int *a, mp_bool *result) MP_WUR; 0945 */ 0946 0947 /* performs one Fermat test of "a" using base "b". 0948 * Sets result to 0 if composite or 1 if probable prime 0949 */ 0950 /* 0951 mp_err mp_prime_fermat(const mp_int *a, const mp_int *b, mp_bool *result) MP_WUR; 0952 */ 0953 0954 /* performs one Miller-Rabin test of "a" using base "b". 0955 * Sets result to 0 if composite or 1 if probable prime 0956 */ 0957 /* 0958 mp_err mp_prime_miller_rabin(const mp_int *a, const mp_int *b, mp_bool *result) MP_WUR; 0959 */ 0960 0961 /* This gives [for a given bit size] the number of trials required 0962 * such that Miller-Rabin gives a prob of failure lower than 2^-96 0963 */ 0964 /* 0965 int mp_prime_rabin_miller_trials(int size) MP_WUR; 0966 */ 0967 0968 /* performs one strong Lucas-Selfridge test of "a". 0969 * Sets result to 0 if composite or 1 if probable prime 0970 */ 0971 /* 0972 mp_err mp_prime_strong_lucas_selfridge(const mp_int *a, mp_bool *result) MP_WUR; 0973 */ 0974 0975 /* performs one Frobenius test of "a" as described by Paul Underwood. 0976 * Sets result to 0 if composite or 1 if probable prime 0977 */ 0978 /* 0979 mp_err mp_prime_frobenius_underwood(const mp_int *N, mp_bool *result) MP_WUR; 0980 */ 0981 0982 /* performs t random rounds of Miller-Rabin on "a" additional to 0983 * bases 2 and 3. Also performs an initial sieve of trial 0984 * division. Determines if "a" is prime with probability 0985 * of error no more than (1/4)**t. 0986 * Both a strong Lucas-Selfridge to complete the BPSW test 0987 * and a separate Frobenius test are available at compile time. 0988 * With t<0 a deterministic test is run for primes up to 0989 * 318665857834031151167461. With t<13 (abs(t)-13) additional 0990 * tests with sequential small primes are run starting at 43. 0991 * Is Fips 186.4 compliant if called with t as computed by 0992 * mp_prime_rabin_miller_trials(); 0993 * 0994 * Sets result to 1 if probably prime, 0 otherwise 0995 */ 0996 /* 0997 mp_err mp_prime_is_prime(const mp_int *a, int t, mp_bool *result) MP_WUR; 0998 */ 0999 1000 /* finds the next prime after the number "a" using "t" trials 1001 * of Miller-Rabin. 1002 * 1003 * bbs_style = 1 means the prime must be congruent to 3 mod 4 1004 */ 1005 /* 1006 mp_err mp_prime_next_prime(mp_int *a, int t, int bbs_style) MP_WUR; 1007 */ 1008 1009 /* makes a truly random prime of a given size (bytes), 1010 * call with bbs = 1 if you want it to be congruent to 3 mod 4 1011 * 1012 * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can 1013 * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself 1014 * so it can be NULL 1015 * 1016 * The prime generated will be larger than 2^(8*size). 1017 */ 1018 #define mp_prime_random(a, t, size, bbs, cb, dat) (MP_DEPRECATED_PRAGMA("mp_prime_random has been deprecated, use mp_prime_rand instead") mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?MP_PRIME_BBS:0, cb, dat)) 1019 1020 /* makes a truly random prime of a given size (bits), 1021 * 1022 * Flags are as follows: 1023 * 1024 * MP_PRIME_BBS - make prime congruent to 3 mod 4 1025 * MP_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies MP_PRIME_BBS) 1026 * MP_PRIME_2MSB_ON - make the 2nd highest bit one 1027 * 1028 * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can 1029 * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself 1030 * so it can be NULL 1031 * 1032 */ 1033 /* 1034 MP_DEPRECATED(mp_prime_rand) mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, 1035 private_mp_prime_callback cb, void *dat) MP_WUR; 1036 */ 1037 /* 1038 mp_err mp_prime_rand(mp_int *a, int t, int size, int flags) MP_WUR; 1039 */ 1040 1041 /* ---> radix conversion <--- */ 1042 /* 1043 int mp_count_bits(const mp_int *a) MP_WUR; 1044 */ 1045 1046 1047 /* 1048 MP_DEPRECATED(mp_ubin_size) int mp_unsigned_bin_size(const mp_int *a) MP_WUR; 1049 */ 1050 /* 1051 MP_DEPRECATED(mp_from_ubin) mp_err mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c) MP_WUR; 1052 */ 1053 /* 1054 MP_DEPRECATED(mp_to_ubin) mp_err mp_to_unsigned_bin(const mp_int *a, unsigned char *b) MP_WUR; 1055 */ 1056 /* 1057 MP_DEPRECATED(mp_to_ubin) mp_err mp_to_unsigned_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) MP_WUR; 1058 */ 1059 1060 /* 1061 MP_DEPRECATED(mp_sbin_size) int mp_signed_bin_size(const mp_int *a) MP_WUR; 1062 */ 1063 /* 1064 MP_DEPRECATED(mp_from_sbin) mp_err mp_read_signed_bin(mp_int *a, const unsigned char *b, int c) MP_WUR; 1065 */ 1066 /* 1067 MP_DEPRECATED(mp_to_sbin) mp_err mp_to_signed_bin(const mp_int *a, unsigned char *b) MP_WUR; 1068 */ 1069 /* 1070 MP_DEPRECATED(mp_to_sbin) mp_err mp_to_signed_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) MP_WUR; 1071 */ 1072 1073 /* 1074 size_t mp_ubin_size(const mp_int *a) MP_WUR; 1075 */ 1076 /* 1077 mp_err mp_from_ubin(mp_int *a, const unsigned char *buf, size_t size) MP_WUR; 1078 */ 1079 /* 1080 mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) MP_WUR; 1081 */ 1082 1083 /* 1084 size_t mp_sbin_size(const mp_int *a) MP_WUR; 1085 */ 1086 /* 1087 mp_err mp_from_sbin(mp_int *a, const unsigned char *buf, size_t size) MP_WUR; 1088 */ 1089 /* 1090 mp_err mp_to_sbin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) MP_WUR; 1091 */ 1092 1093 /* 1094 mp_err mp_read_radix(mp_int *a, const char *str, int radix) MP_WUR; 1095 */ 1096 /* 1097 MP_DEPRECATED(mp_to_radix) mp_err mp_toradix(const mp_int *a, char *str, int radix) MP_WUR; 1098 */ 1099 /* 1100 MP_DEPRECATED(mp_to_radix) mp_err mp_toradix_n(const mp_int *a, char *str, int radix, int maxlen) MP_WUR; 1101 */ 1102 /* 1103 mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, int radix) MP_WUR; 1104 */ 1105 /* 1106 mp_err mp_radix_size(const mp_int *a, int radix, int *size) MP_WUR; 1107 */ 1108 1109 #ifndef MP_NO_FILE 1110 /* 1111 mp_err mp_fread(mp_int *a, int radix, FILE *stream) MP_WUR; 1112 */ 1113 /* 1114 mp_err mp_fwrite(const mp_int *a, int radix, FILE *stream) MP_WUR; 1115 */ 1116 #endif 1117 1118 #define mp_read_raw(mp, str, len) (MP_DEPRECATED_PRAGMA("replaced by mp_read_signed_bin") mp_read_signed_bin((mp), (str), (len))) 1119 #define mp_raw_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_signed_bin_size") mp_signed_bin_size(mp)) 1120 #define mp_toraw(mp, str) (MP_DEPRECATED_PRAGMA("replaced by mp_to_signed_bin") mp_to_signed_bin((mp), (str))) 1121 #define mp_read_mag(mp, str, len) (MP_DEPRECATED_PRAGMA("replaced by mp_read_unsigned_bin") mp_read_unsigned_bin((mp), (str), (len)) 1122 #define mp_mag_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_unsigned_bin_size") mp_unsigned_bin_size(mp)) 1123 #define mp_tomag(mp, str) (MP_DEPRECATED_PRAGMA("replaced by mp_to_unsigned_bin") mp_to_unsigned_bin((mp), (str))) 1124 1125 #define mp_tobinary(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_binary") mp_toradix((M), (S), 2)) 1126 #define mp_tooctal(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_octal") mp_toradix((M), (S), 8)) 1127 #define mp_todecimal(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_decimal") mp_toradix((M), (S), 10)) 1128 #define mp_tohex(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_hex") mp_toradix((M), (S), 16)) 1129 1130 #define mp_to_binary(M, S, N) mp_to_radix((M), (S), (N), NULL, 2) 1131 #define mp_to_octal(M, S, N) mp_to_radix((M), (S), (N), NULL, 8) 1132 #define mp_to_decimal(M, S, N) mp_to_radix((M), (S), (N), NULL, 10) 1133 #define mp_to_hex(M, S, N) mp_to_radix((M), (S), (N), NULL, 16) 1134 1135 #ifdef __cplusplus 1136 } 1137 #endif 1138 1139 #include "tclTomMathDecls.h" 1140 1141 #endif
| [ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
|
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
|