1 1.1 mrg /* 2 1.1 mrg Name: imath.c 3 1.1 mrg Purpose: Arbitrary precision integer arithmetic routines. 4 1.1 mrg Author: M. J. Fromberger 5 1.1 mrg 6 1.1 mrg Copyright (C) 2002-2007 Michael J. Fromberger, All Rights Reserved. 7 1.1 mrg 8 1.1 mrg Permission is hereby granted, free of charge, to any person obtaining a copy 9 1.1 mrg of this software and associated documentation files (the "Software"), to deal 10 1.1 mrg in the Software without restriction, including without limitation the rights 11 1.1 mrg to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 1.1 mrg copies of the Software, and to permit persons to whom the Software is 13 1.1 mrg furnished to do so, subject to the following conditions: 14 1.1 mrg 15 1.1 mrg The above copyright notice and this permission notice shall be included in 16 1.1 mrg all copies or substantial portions of the Software. 17 1.1 mrg 18 1.1 mrg THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 1.1 mrg IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 1.1 mrg AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 1.1 mrg LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 1.1 mrg OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 1.1 mrg SOFTWARE. 25 1.1 mrg */ 26 1.1 mrg 27 1.1 mrg #include "imath.h" 28 1.1 mrg 29 1.1 mrg #include <assert.h> 30 1.1 mrg #include <ctype.h> 31 1.1 mrg #include <stdlib.h> 32 1.1 mrg #include <string.h> 33 1.1 mrg 34 1.1 mrg const mp_result MP_OK = 0; /* no error, all is well */ 35 1.1 mrg const mp_result MP_FALSE = 0; /* boolean false */ 36 1.1 mrg const mp_result MP_TRUE = -1; /* boolean true */ 37 1.1 mrg const mp_result MP_MEMORY = -2; /* out of memory */ 38 1.1 mrg const mp_result MP_RANGE = -3; /* argument out of range */ 39 1.1 mrg const mp_result MP_UNDEF = -4; /* result undefined */ 40 1.1 mrg const mp_result MP_TRUNC = -5; /* output truncated */ 41 1.1 mrg const mp_result MP_BADARG = -6; /* invalid null argument */ 42 1.1 mrg const mp_result MP_MINERR = -6; 43 1.1 mrg 44 1.1 mrg const mp_sign MP_NEG = 1; /* value is strictly negative */ 45 1.1 mrg const mp_sign MP_ZPOS = 0; /* value is non-negative */ 46 1.1 mrg 47 1.1 mrg static const char *s_unknown_err = "unknown result code"; 48 1.1 mrg static const char *s_error_msg[] = {"error code 0", "boolean true", 49 1.1 mrg "out of memory", "argument out of range", 50 1.1 mrg "result undefined", "output truncated", 51 1.1 mrg "invalid argument", NULL}; 52 1.1 mrg 53 1.1 mrg /* The ith entry of this table gives the value of log_i(2). 54 1.1 mrg 55 1.1 mrg An integer value n requires ceil(log_i(n)) digits to be represented 56 1.1 mrg in base i. Since it is easy to compute lg(n), by counting bits, we 57 1.1 mrg can compute log_i(n) = lg(n) * log_i(2). 58 1.1 mrg 59 1.1 mrg The use of this table eliminates a dependency upon linkage against 60 1.1 mrg the standard math libraries. 61 1.1 mrg 62 1.1 mrg If MP_MAX_RADIX is increased, this table should be expanded too. 63 1.1 mrg */ 64 1.1 mrg static const double s_log2[] = { 65 1.1 mrg 0.000000000, 0.000000000, 1.000000000, 0.630929754, /* (D)(D) 2 3 */ 66 1.1 mrg 0.500000000, 0.430676558, 0.386852807, 0.356207187, /* 4 5 6 7 */ 67 1.1 mrg 0.333333333, 0.315464877, 0.301029996, 0.289064826, /* 8 9 10 11 */ 68 1.1 mrg 0.278942946, 0.270238154, 0.262649535, 0.255958025, /* 12 13 14 15 */ 69 1.1 mrg 0.250000000, 0.244650542, 0.239812467, 0.235408913, /* 16 17 18 19 */ 70 1.1 mrg 0.231378213, 0.227670249, 0.224243824, 0.221064729, /* 20 21 22 23 */ 71 1.1 mrg 0.218104292, 0.215338279, 0.212746054, 0.210309918, /* 24 25 26 27 */ 72 1.1 mrg 0.208014598, 0.205846832, 0.203795047, 0.201849087, /* 28 29 30 31 */ 73 1.1 mrg 0.200000000, 0.198239863, 0.196561632, 0.194959022, /* 32 33 34 35 */ 74 1.1 mrg 0.193426404, /* 36 */ 75 1.1 mrg }; 76 1.1 mrg 77 1.1 mrg /* Return the number of digits needed to represent a static value */ 78 1.1 mrg #define MP_VALUE_DIGITS(V) \ 79 1.1 mrg ((sizeof(V) + (sizeof(mp_digit) - 1)) / sizeof(mp_digit)) 80 1.1 mrg 81 1.1 mrg /* Round precision P to nearest word boundary */ 82 1.1 mrg static inline mp_size s_round_prec(mp_size P) { return 2 * ((P + 1) / 2); } 83 1.1 mrg 84 1.1 mrg /* Set array P of S digits to zero */ 85 1.1 mrg static inline void ZERO(mp_digit *P, mp_size S) { 86 1.1 mrg mp_size i__ = S * sizeof(mp_digit); 87 1.1 mrg mp_digit *p__ = P; 88 1.1 mrg memset(p__, 0, i__); 89 1.1 mrg } 90 1.1 mrg 91 1.1 mrg /* Copy S digits from array P to array Q */ 92 1.1 mrg static inline void COPY(mp_digit *P, mp_digit *Q, mp_size S) { 93 1.1 mrg mp_size i__ = S * sizeof(mp_digit); 94 1.1 mrg mp_digit *p__ = P; 95 1.1 mrg mp_digit *q__ = Q; 96 1.1 mrg memcpy(q__, p__, i__); 97 1.1 mrg } 98 1.1 mrg 99 1.1 mrg /* Reverse N elements of unsigned char in A. */ 100 1.1 mrg static inline void REV(unsigned char *A, int N) { 101 1.1 mrg unsigned char *u_ = A; 102 1.1 mrg unsigned char *v_ = u_ + N - 1; 103 1.1 mrg while (u_ < v_) { 104 1.1 mrg unsigned char xch = *u_; 105 1.1 mrg *u_++ = *v_; 106 1.1 mrg *v_-- = xch; 107 1.1 mrg } 108 1.1 mrg } 109 1.1 mrg 110 1.1 mrg /* Strip leading zeroes from z_ in-place. */ 111 1.1 mrg static inline void CLAMP(mp_int z_) { 112 1.1 mrg mp_size uz_ = MP_USED(z_); 113 1.1 mrg mp_digit *dz_ = MP_DIGITS(z_) + uz_ - 1; 114 1.1 mrg while (uz_ > 1 && (*dz_-- == 0)) --uz_; 115 1.1 mrg z_->used = uz_; 116 1.1 mrg } 117 1.1 mrg 118 1.1 mrg /* Select min/max. */ 119 1.1 mrg static inline int MIN(int A, int B) { return (B < A ? B : A); } 120 1.1 mrg static inline mp_size MAX(mp_size A, mp_size B) { return (B > A ? B : A); } 121 1.1 mrg 122 1.1 mrg /* Exchange lvalues A and B of type T, e.g. 123 1.1 mrg SWAP(int, x, y) where x and y are variables of type int. */ 124 1.1 mrg #define SWAP(T, A, B) \ 125 1.1 mrg do { \ 126 1.1 mrg T t_ = (A); \ 127 1.1 mrg A = (B); \ 128 1.1 mrg B = t_; \ 129 1.1 mrg } while (0) 130 1.1 mrg 131 1.1 mrg /* Declare a block of N temporary mpz_t values. 132 1.1 mrg These values are initialized to zero. 133 1.1 mrg You must add CLEANUP_TEMP() at the end of the function. 134 1.1 mrg Use TEMP(i) to access a pointer to the ith value. 135 1.1 mrg */ 136 1.1 mrg #define DECLARE_TEMP(N) \ 137 1.1 mrg struct { \ 138 1.1 mrg mpz_t value[(N)]; \ 139 1.1 mrg int len; \ 140 1.1 mrg mp_result err; \ 141 1.1 mrg } temp_ = { \ 142 1.1 mrg .len = (N), \ 143 1.1 mrg .err = MP_OK, \ 144 1.1 mrg }; \ 145 1.1 mrg do { \ 146 1.1 mrg for (int i = 0; i < temp_.len; i++) { \ 147 1.1 mrg mp_int_init(TEMP(i)); \ 148 1.1 mrg } \ 149 1.1 mrg } while (0) 150 1.1 mrg 151 1.1 mrg /* Clear all allocated temp values. */ 152 1.1 mrg #define CLEANUP_TEMP() \ 153 1.1 mrg CLEANUP: \ 154 1.1 mrg do { \ 155 1.1 mrg for (int i = 0; i < temp_.len; i++) { \ 156 1.1 mrg mp_int_clear(TEMP(i)); \ 157 1.1 mrg } \ 158 1.1 mrg if (temp_.err != MP_OK) { \ 159 1.1 mrg return temp_.err; \ 160 1.1 mrg } \ 161 1.1 mrg } while (0) 162 1.1 mrg 163 1.1 mrg /* A pointer to the kth temp value. */ 164 1.1 mrg #define TEMP(K) (temp_.value + (K)) 165 1.1 mrg 166 1.1 mrg /* Evaluate E, an expression of type mp_result expected to return MP_OK. If 167 1.1 mrg the value is not MP_OK, the error is cached and control resumes at the 168 1.1 mrg cleanup handler, which returns it. 169 1.1 mrg */ 170 1.1 mrg #define REQUIRE(E) \ 171 1.1 mrg do { \ 172 1.1 mrg temp_.err = (E); \ 173 1.1 mrg if (temp_.err != MP_OK) goto CLEANUP; \ 174 1.1 mrg } while (0) 175 1.1 mrg 176 1.1 mrg /* Compare value to zero. */ 177 1.1 mrg static inline int CMPZ(mp_int Z) { 178 1.1 mrg if (Z->used == 1 && Z->digits[0] == 0) return 0; 179 1.1 mrg return (Z->sign == MP_NEG) ? -1 : 1; 180 1.1 mrg } 181 1.1 mrg 182 1.1 mrg static inline mp_word UPPER_HALF(mp_word W) { return (W >> MP_DIGIT_BIT); } 183 1.1 mrg static inline mp_digit LOWER_HALF(mp_word W) { return (mp_digit)(W); } 184 1.1 mrg 185 1.1 mrg /* Report whether the highest-order bit of W is 1. */ 186 1.1 mrg static inline bool HIGH_BIT_SET(mp_word W) { 187 1.1 mrg return (W >> (MP_WORD_BIT - 1)) != 0; 188 1.1 mrg } 189 1.1 mrg 190 1.1 mrg /* Report whether adding W + V will carry out. */ 191 1.1 mrg static inline bool ADD_WILL_OVERFLOW(mp_word W, mp_word V) { 192 1.1 mrg return ((MP_WORD_MAX - V) < W); 193 1.1 mrg } 194 1.1 mrg 195 1.1 mrg /* Default number of digits allocated to a new mp_int */ 196 1.1 mrg static mp_size default_precision = 8; 197 1.1 mrg 198 1.1 mrg void mp_int_default_precision(mp_size size) { 199 1.1 mrg assert(size > 0); 200 1.1 mrg default_precision = size; 201 1.1 mrg } 202 1.1 mrg 203 1.1 mrg /* Minimum number of digits to invoke recursive multiply */ 204 1.1 mrg static mp_size multiply_threshold = 32; 205 1.1 mrg 206 1.1 mrg void mp_int_multiply_threshold(mp_size thresh) { 207 1.1 mrg assert(thresh >= sizeof(mp_word)); 208 1.1 mrg multiply_threshold = thresh; 209 1.1 mrg } 210 1.1 mrg 211 1.1 mrg /* Allocate a buffer of (at least) num digits, or return 212 1.1 mrg NULL if that couldn't be done. */ 213 1.1 mrg static mp_digit *s_alloc(mp_size num); 214 1.1 mrg 215 1.1 mrg /* Release a buffer of digits allocated by s_alloc(). */ 216 1.1 mrg static void s_free(void *ptr); 217 1.1 mrg 218 1.1 mrg /* Insure that z has at least min digits allocated, resizing if 219 1.1 mrg necessary. Returns true if successful, false if out of memory. */ 220 1.1 mrg static bool s_pad(mp_int z, mp_size min); 221 1.1 mrg 222 1.1 mrg /* Ensure Z has at least N digits allocated. */ 223 1.1 mrg static inline mp_result GROW(mp_int Z, mp_size N) { 224 1.1 mrg return s_pad(Z, N) ? MP_OK : MP_MEMORY; 225 1.1 mrg } 226 1.1 mrg 227 1.1 mrg /* Fill in a "fake" mp_int on the stack with a given value */ 228 1.1 mrg static void s_fake(mp_int z, mp_small value, mp_digit vbuf[]); 229 1.1 mrg static void s_ufake(mp_int z, mp_usmall value, mp_digit vbuf[]); 230 1.1 mrg 231 1.1 mrg /* Compare two runs of digits of given length, returns <0, 0, >0 */ 232 1.1 mrg static int s_cdig(mp_digit *da, mp_digit *db, mp_size len); 233 1.1 mrg 234 1.1 mrg /* Pack the unsigned digits of v into array t */ 235 1.1 mrg static int s_uvpack(mp_usmall v, mp_digit t[]); 236 1.1 mrg 237 1.1 mrg /* Compare magnitudes of a and b, returns <0, 0, >0 */ 238 1.1 mrg static int s_ucmp(mp_int a, mp_int b); 239 1.1 mrg 240 1.1 mrg /* Compare magnitudes of a and v, returns <0, 0, >0 */ 241 1.1 mrg static int s_vcmp(mp_int a, mp_small v); 242 1.1 mrg static int s_uvcmp(mp_int a, mp_usmall uv); 243 1.1 mrg 244 1.1 mrg /* Unsigned magnitude addition; assumes dc is big enough. 245 1.1 mrg Carry out is returned (no memory allocated). */ 246 1.1 mrg static mp_digit s_uadd(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 247 1.1 mrg mp_size size_b); 248 1.1 mrg 249 1.1 mrg /* Unsigned magnitude subtraction. Assumes dc is big enough. */ 250 1.1 mrg static void s_usub(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 251 1.1 mrg mp_size size_b); 252 1.1 mrg 253 1.1 mrg /* Unsigned recursive multiplication. Assumes dc is big enough. */ 254 1.1 mrg static int s_kmul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 255 1.1 mrg mp_size size_b); 256 1.1 mrg 257 1.1 mrg /* Unsigned magnitude multiplication. Assumes dc is big enough. */ 258 1.1 mrg static void s_umul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 259 1.1 mrg mp_size size_b); 260 1.1 mrg 261 1.1 mrg /* Unsigned recursive squaring. Assumes dc is big enough. */ 262 1.1 mrg static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a); 263 1.1 mrg 264 1.1 mrg /* Unsigned magnitude squaring. Assumes dc is big enough. */ 265 1.1 mrg static void s_usqr(mp_digit *da, mp_digit *dc, mp_size size_a); 266 1.1 mrg 267 1.1 mrg /* Single digit addition. Assumes a is big enough. */ 268 1.1 mrg static void s_dadd(mp_int a, mp_digit b); 269 1.1 mrg 270 1.1 mrg /* Single digit multiplication. Assumes a is big enough. */ 271 1.1 mrg static void s_dmul(mp_int a, mp_digit b); 272 1.1 mrg 273 1.1 mrg /* Single digit multiplication on buffers; assumes dc is big enough. */ 274 1.1 mrg static void s_dbmul(mp_digit *da, mp_digit b, mp_digit *dc, mp_size size_a); 275 1.1 mrg 276 1.1 mrg /* Single digit division. Replaces a with the quotient, 277 1.1 mrg returns the remainder. */ 278 1.1 mrg static mp_digit s_ddiv(mp_int a, mp_digit b); 279 1.1 mrg 280 1.1 mrg /* Quick division by a power of 2, replaces z (no allocation) */ 281 1.1 mrg static void s_qdiv(mp_int z, mp_size p2); 282 1.1 mrg 283 1.1 mrg /* Quick remainder by a power of 2, replaces z (no allocation) */ 284 1.1 mrg static void s_qmod(mp_int z, mp_size p2); 285 1.1 mrg 286 1.1 mrg /* Quick multiplication by a power of 2, replaces z. 287 1.1 mrg Allocates if necessary; returns false in case this fails. */ 288 1.1 mrg static int s_qmul(mp_int z, mp_size p2); 289 1.1 mrg 290 1.1 mrg /* Quick subtraction from a power of 2, replaces z. 291 1.1 mrg Allocates if necessary; returns false in case this fails. */ 292 1.1 mrg static int s_qsub(mp_int z, mp_size p2); 293 1.1 mrg 294 1.1 mrg /* Return maximum k such that 2^k divides z. */ 295 1.1 mrg static int s_dp2k(mp_int z); 296 1.1 mrg 297 1.1 mrg /* Return k >= 0 such that z = 2^k, or -1 if there is no such k. */ 298 1.1 mrg static int s_isp2(mp_int z); 299 1.1 mrg 300 1.1 mrg /* Set z to 2^k. May allocate; returns false in case this fails. */ 301 1.1 mrg static int s_2expt(mp_int z, mp_small k); 302 1.1 mrg 303 1.1 mrg /* Normalize a and b for division, returns normalization constant */ 304 1.1 mrg static int s_norm(mp_int a, mp_int b); 305 1.1 mrg 306 1.1 mrg /* Compute constant mu for Barrett reduction, given modulus m, result 307 1.1 mrg replaces z, m is untouched. */ 308 1.1 mrg static mp_result s_brmu(mp_int z, mp_int m); 309 1.1 mrg 310 1.1 mrg /* Reduce a modulo m, using Barrett's algorithm. */ 311 1.1 mrg static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2); 312 1.1 mrg 313 1.1 mrg /* Modular exponentiation, using Barrett reduction */ 314 1.1 mrg static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c); 315 1.1 mrg 316 1.1 mrg /* Unsigned magnitude division. Assumes |a| > |b|. Allocates temporaries; 317 1.1 mrg overwrites a with quotient, b with remainder. */ 318 1.1 mrg static mp_result s_udiv_knuth(mp_int a, mp_int b); 319 1.1 mrg 320 1.1 mrg /* Compute the number of digits in radix r required to represent the given 321 1.1 mrg value. Does not account for sign flags, terminators, etc. */ 322 1.1 mrg static int s_outlen(mp_int z, mp_size r); 323 1.1 mrg 324 1.1 mrg /* Guess how many digits of precision will be needed to represent a radix r 325 1.1 mrg value of the specified number of digits. Returns a value guaranteed to be 326 1.1 mrg no smaller than the actual number required. */ 327 1.1 mrg static mp_size s_inlen(int len, mp_size r); 328 1.1 mrg 329 1.1 mrg /* Convert a character to a digit value in radix r, or 330 1.1 mrg -1 if out of range */ 331 1.1 mrg static int s_ch2val(char c, int r); 332 1.1 mrg 333 1.1 mrg /* Convert a digit value to a character */ 334 1.1 mrg static char s_val2ch(int v, int caps); 335 1.1 mrg 336 1.1 mrg /* Take 2's complement of a buffer in place */ 337 1.1 mrg static void s_2comp(unsigned char *buf, int len); 338 1.1 mrg 339 1.1 mrg /* Convert a value to binary, ignoring sign. On input, *limpos is the bound on 340 1.1 mrg how many bytes should be written to buf; on output, *limpos is set to the 341 1.1 mrg number of bytes actually written. */ 342 1.1 mrg static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad); 343 1.1 mrg 344 1.1 mrg /* Multiply X by Y into Z, ignoring signs. Requires that Z have enough storage 345 1.1 mrg preallocated to hold the result. */ 346 1.1 mrg static inline void UMUL(mp_int X, mp_int Y, mp_int Z) { 347 1.1 mrg mp_size ua_ = MP_USED(X); 348 1.1 mrg mp_size ub_ = MP_USED(Y); 349 1.1 mrg mp_size o_ = ua_ + ub_; 350 1.1 mrg ZERO(MP_DIGITS(Z), o_); 351 1.1 mrg (void)s_kmul(MP_DIGITS(X), MP_DIGITS(Y), MP_DIGITS(Z), ua_, ub_); 352 1.1 mrg Z->used = o_; 353 1.1 mrg CLAMP(Z); 354 1.1 mrg } 355 1.1 mrg 356 1.1 mrg /* Square X into Z. Requires that Z have enough storage to hold the result. */ 357 1.1 mrg static inline void USQR(mp_int X, mp_int Z) { 358 1.1 mrg mp_size ua_ = MP_USED(X); 359 1.1 mrg mp_size o_ = ua_ + ua_; 360 1.1 mrg ZERO(MP_DIGITS(Z), o_); 361 1.1 mrg (void)s_ksqr(MP_DIGITS(X), MP_DIGITS(Z), ua_); 362 1.1 mrg Z->used = o_; 363 1.1 mrg CLAMP(Z); 364 1.1 mrg } 365 1.1 mrg 366 1.1 mrg mp_result mp_int_init(mp_int z) { 367 1.1 mrg if (z == NULL) return MP_BADARG; 368 1.1 mrg 369 1.1 mrg z->single = 0; 370 1.1 mrg z->digits = &(z->single); 371 1.1 mrg z->alloc = 1; 372 1.1 mrg z->used = 1; 373 1.1 mrg z->sign = MP_ZPOS; 374 1.1 mrg 375 1.1 mrg return MP_OK; 376 1.1 mrg } 377 1.1 mrg 378 1.1 mrg mp_int mp_int_alloc(void) { 379 1.1 mrg mp_int out = malloc(sizeof(mpz_t)); 380 1.1 mrg 381 1.1 mrg if (out != NULL) mp_int_init(out); 382 1.1 mrg 383 1.1 mrg return out; 384 1.1 mrg } 385 1.1 mrg 386 1.1 mrg mp_result mp_int_init_size(mp_int z, mp_size prec) { 387 1.1 mrg assert(z != NULL); 388 1.1 mrg 389 1.1 mrg if (prec == 0) { 390 1.1 mrg prec = default_precision; 391 1.1 mrg } else if (prec == 1) { 392 1.1 mrg return mp_int_init(z); 393 1.1 mrg } else { 394 1.1 mrg prec = s_round_prec(prec); 395 1.1 mrg } 396 1.1 mrg 397 1.1 mrg z->digits = s_alloc(prec); 398 1.1 mrg if (MP_DIGITS(z) == NULL) return MP_MEMORY; 399 1.1 mrg 400 1.1 mrg z->digits[0] = 0; 401 1.1 mrg z->used = 1; 402 1.1 mrg z->alloc = prec; 403 1.1 mrg z->sign = MP_ZPOS; 404 1.1 mrg 405 1.1 mrg return MP_OK; 406 1.1 mrg } 407 1.1 mrg 408 1.1 mrg mp_result mp_int_init_copy(mp_int z, mp_int old) { 409 1.1 mrg assert(z != NULL && old != NULL); 410 1.1 mrg 411 1.1 mrg mp_size uold = MP_USED(old); 412 1.1 mrg if (uold == 1) { 413 1.1 mrg mp_int_init(z); 414 1.1 mrg } else { 415 1.1 mrg mp_size target = MAX(uold, default_precision); 416 1.1 mrg mp_result res = mp_int_init_size(z, target); 417 1.1 mrg if (res != MP_OK) return res; 418 1.1 mrg } 419 1.1 mrg 420 1.1 mrg z->used = uold; 421 1.1 mrg z->sign = old->sign; 422 1.1 mrg COPY(MP_DIGITS(old), MP_DIGITS(z), uold); 423 1.1 mrg 424 1.1 mrg return MP_OK; 425 1.1 mrg } 426 1.1 mrg 427 1.1 mrg mp_result mp_int_init_value(mp_int z, mp_small value) { 428 1.1 mrg mpz_t vtmp; 429 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 430 1.1 mrg 431 1.1 mrg s_fake(&vtmp, value, vbuf); 432 1.1 mrg return mp_int_init_copy(z, &vtmp); 433 1.1 mrg } 434 1.1 mrg 435 1.1 mrg mp_result mp_int_init_uvalue(mp_int z, mp_usmall uvalue) { 436 1.1 mrg mpz_t vtmp; 437 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(uvalue)]; 438 1.1 mrg 439 1.1 mrg s_ufake(&vtmp, uvalue, vbuf); 440 1.1 mrg return mp_int_init_copy(z, &vtmp); 441 1.1 mrg } 442 1.1 mrg 443 1.1 mrg mp_result mp_int_set_value(mp_int z, mp_small value) { 444 1.1 mrg mpz_t vtmp; 445 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 446 1.1 mrg 447 1.1 mrg s_fake(&vtmp, value, vbuf); 448 1.1 mrg return mp_int_copy(&vtmp, z); 449 1.1 mrg } 450 1.1 mrg 451 1.1 mrg mp_result mp_int_set_uvalue(mp_int z, mp_usmall uvalue) { 452 1.1 mrg mpz_t vtmp; 453 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(uvalue)]; 454 1.1 mrg 455 1.1 mrg s_ufake(&vtmp, uvalue, vbuf); 456 1.1 mrg return mp_int_copy(&vtmp, z); 457 1.1 mrg } 458 1.1 mrg 459 1.1 mrg void mp_int_clear(mp_int z) { 460 1.1 mrg if (z == NULL) return; 461 1.1 mrg 462 1.1 mrg if (MP_DIGITS(z) != NULL) { 463 1.1 mrg if (MP_DIGITS(z) != &(z->single)) s_free(MP_DIGITS(z)); 464 1.1 mrg 465 1.1 mrg z->digits = NULL; 466 1.1 mrg } 467 1.1 mrg } 468 1.1 mrg 469 1.1 mrg void mp_int_free(mp_int z) { 470 1.1 mrg assert(z != NULL); 471 1.1 mrg 472 1.1 mrg mp_int_clear(z); 473 1.1 mrg free(z); /* note: NOT s_free() */ 474 1.1 mrg } 475 1.1 mrg 476 1.1 mrg mp_result mp_int_copy(mp_int a, mp_int c) { 477 1.1 mrg assert(a != NULL && c != NULL); 478 1.1 mrg 479 1.1 mrg if (a != c) { 480 1.1 mrg mp_size ua = MP_USED(a); 481 1.1 mrg mp_digit *da, *dc; 482 1.1 mrg 483 1.1 mrg if (!s_pad(c, ua)) return MP_MEMORY; 484 1.1 mrg 485 1.1 mrg da = MP_DIGITS(a); 486 1.1 mrg dc = MP_DIGITS(c); 487 1.1 mrg COPY(da, dc, ua); 488 1.1 mrg 489 1.1 mrg c->used = ua; 490 1.1 mrg c->sign = a->sign; 491 1.1 mrg } 492 1.1 mrg 493 1.1 mrg return MP_OK; 494 1.1 mrg } 495 1.1 mrg 496 1.1 mrg void mp_int_swap(mp_int a, mp_int c) { 497 1.1 mrg if (a != c) { 498 1.1 mrg mpz_t tmp = *a; 499 1.1 mrg 500 1.1 mrg *a = *c; 501 1.1 mrg *c = tmp; 502 1.1 mrg 503 1.1 mrg if (MP_DIGITS(a) == &(c->single)) a->digits = &(a->single); 504 1.1 mrg if (MP_DIGITS(c) == &(a->single)) c->digits = &(c->single); 505 1.1 mrg } 506 1.1 mrg } 507 1.1 mrg 508 1.1 mrg void mp_int_zero(mp_int z) { 509 1.1 mrg assert(z != NULL); 510 1.1 mrg 511 1.1 mrg z->digits[0] = 0; 512 1.1 mrg z->used = 1; 513 1.1 mrg z->sign = MP_ZPOS; 514 1.1 mrg } 515 1.1 mrg 516 1.1 mrg mp_result mp_int_abs(mp_int a, mp_int c) { 517 1.1 mrg assert(a != NULL && c != NULL); 518 1.1 mrg 519 1.1 mrg mp_result res; 520 1.1 mrg if ((res = mp_int_copy(a, c)) != MP_OK) return res; 521 1.1 mrg 522 1.1 mrg c->sign = MP_ZPOS; 523 1.1 mrg return MP_OK; 524 1.1 mrg } 525 1.1 mrg 526 1.1 mrg mp_result mp_int_neg(mp_int a, mp_int c) { 527 1.1 mrg assert(a != NULL && c != NULL); 528 1.1 mrg 529 1.1 mrg mp_result res; 530 1.1 mrg if ((res = mp_int_copy(a, c)) != MP_OK) return res; 531 1.1 mrg 532 1.1 mrg if (CMPZ(c) != 0) c->sign = 1 - MP_SIGN(a); 533 1.1 mrg 534 1.1 mrg return MP_OK; 535 1.1 mrg } 536 1.1 mrg 537 1.1 mrg mp_result mp_int_add(mp_int a, mp_int b, mp_int c) { 538 1.1 mrg assert(a != NULL && b != NULL && c != NULL); 539 1.1 mrg 540 1.1 mrg mp_size ua = MP_USED(a); 541 1.1 mrg mp_size ub = MP_USED(b); 542 1.1 mrg mp_size max = MAX(ua, ub); 543 1.1 mrg 544 1.1 mrg if (MP_SIGN(a) == MP_SIGN(b)) { 545 1.1 mrg /* Same sign -- add magnitudes, preserve sign of addends */ 546 1.1 mrg if (!s_pad(c, max)) return MP_MEMORY; 547 1.1 mrg 548 1.1 mrg mp_digit carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub); 549 1.1 mrg mp_size uc = max; 550 1.1 mrg 551 1.1 mrg if (carry) { 552 1.1 mrg if (!s_pad(c, max + 1)) return MP_MEMORY; 553 1.1 mrg 554 1.1 mrg c->digits[max] = carry; 555 1.1 mrg ++uc; 556 1.1 mrg } 557 1.1 mrg 558 1.1 mrg c->used = uc; 559 1.1 mrg c->sign = a->sign; 560 1.1 mrg 561 1.1 mrg } else { 562 1.1 mrg /* Different signs -- subtract magnitudes, preserve sign of greater */ 563 1.1 mrg int cmp = s_ucmp(a, b); /* magnitude comparison, sign ignored */ 564 1.1 mrg 565 1.1 mrg /* Set x to max(a, b), y to min(a, b) to simplify later code. 566 1.1 mrg A special case yields zero for equal magnitudes. 567 1.1 mrg */ 568 1.1 mrg mp_int x, y; 569 1.1 mrg if (cmp == 0) { 570 1.1 mrg mp_int_zero(c); 571 1.1 mrg return MP_OK; 572 1.1 mrg } else if (cmp < 0) { 573 1.1 mrg x = b; 574 1.1 mrg y = a; 575 1.1 mrg } else { 576 1.1 mrg x = a; 577 1.1 mrg y = b; 578 1.1 mrg } 579 1.1 mrg 580 1.1 mrg if (!s_pad(c, MP_USED(x))) return MP_MEMORY; 581 1.1 mrg 582 1.1 mrg /* Subtract smaller from larger */ 583 1.1 mrg s_usub(MP_DIGITS(x), MP_DIGITS(y), MP_DIGITS(c), MP_USED(x), MP_USED(y)); 584 1.1 mrg c->used = x->used; 585 1.1 mrg CLAMP(c); 586 1.1 mrg 587 1.1 mrg /* Give result the sign of the larger */ 588 1.1 mrg c->sign = x->sign; 589 1.1 mrg } 590 1.1 mrg 591 1.1 mrg return MP_OK; 592 1.1 mrg } 593 1.1 mrg 594 1.1 mrg mp_result mp_int_add_value(mp_int a, mp_small value, mp_int c) { 595 1.1 mrg mpz_t vtmp; 596 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 597 1.1 mrg 598 1.1 mrg s_fake(&vtmp, value, vbuf); 599 1.1 mrg 600 1.1 mrg return mp_int_add(a, &vtmp, c); 601 1.1 mrg } 602 1.1 mrg 603 1.1 mrg mp_result mp_int_sub(mp_int a, mp_int b, mp_int c) { 604 1.1 mrg assert(a != NULL && b != NULL && c != NULL); 605 1.1 mrg 606 1.1 mrg mp_size ua = MP_USED(a); 607 1.1 mrg mp_size ub = MP_USED(b); 608 1.1 mrg mp_size max = MAX(ua, ub); 609 1.1 mrg 610 1.1 mrg if (MP_SIGN(a) != MP_SIGN(b)) { 611 1.1 mrg /* Different signs -- add magnitudes and keep sign of a */ 612 1.1 mrg if (!s_pad(c, max)) return MP_MEMORY; 613 1.1 mrg 614 1.1 mrg mp_digit carry = s_uadd(MP_DIGITS(a), MP_DIGITS(b), MP_DIGITS(c), ua, ub); 615 1.1 mrg mp_size uc = max; 616 1.1 mrg 617 1.1 mrg if (carry) { 618 1.1 mrg if (!s_pad(c, max + 1)) return MP_MEMORY; 619 1.1 mrg 620 1.1 mrg c->digits[max] = carry; 621 1.1 mrg ++uc; 622 1.1 mrg } 623 1.1 mrg 624 1.1 mrg c->used = uc; 625 1.1 mrg c->sign = a->sign; 626 1.1 mrg 627 1.1 mrg } else { 628 1.1 mrg /* Same signs -- subtract magnitudes */ 629 1.1 mrg if (!s_pad(c, max)) return MP_MEMORY; 630 1.1 mrg mp_int x, y; 631 1.1 mrg mp_sign osign; 632 1.1 mrg 633 1.1 mrg int cmp = s_ucmp(a, b); 634 1.1 mrg if (cmp >= 0) { 635 1.1 mrg x = a; 636 1.1 mrg y = b; 637 1.1 mrg osign = MP_ZPOS; 638 1.1 mrg } else { 639 1.1 mrg x = b; 640 1.1 mrg y = a; 641 1.1 mrg osign = MP_NEG; 642 1.1 mrg } 643 1.1 mrg 644 1.1 mrg if (MP_SIGN(a) == MP_NEG && cmp != 0) osign = 1 - osign; 645 1.1 mrg 646 1.1 mrg s_usub(MP_DIGITS(x), MP_DIGITS(y), MP_DIGITS(c), MP_USED(x), MP_USED(y)); 647 1.1 mrg c->used = x->used; 648 1.1 mrg CLAMP(c); 649 1.1 mrg 650 1.1 mrg c->sign = osign; 651 1.1 mrg } 652 1.1 mrg 653 1.1 mrg return MP_OK; 654 1.1 mrg } 655 1.1 mrg 656 1.1 mrg mp_result mp_int_sub_value(mp_int a, mp_small value, mp_int c) { 657 1.1 mrg mpz_t vtmp; 658 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 659 1.1 mrg 660 1.1 mrg s_fake(&vtmp, value, vbuf); 661 1.1 mrg 662 1.1 mrg return mp_int_sub(a, &vtmp, c); 663 1.1 mrg } 664 1.1 mrg 665 1.1 mrg mp_result mp_int_mul(mp_int a, mp_int b, mp_int c) { 666 1.1 mrg assert(a != NULL && b != NULL && c != NULL); 667 1.1 mrg 668 1.1 mrg /* If either input is zero, we can shortcut multiplication */ 669 1.1 mrg if (mp_int_compare_zero(a) == 0 || mp_int_compare_zero(b) == 0) { 670 1.1 mrg mp_int_zero(c); 671 1.1 mrg return MP_OK; 672 1.1 mrg } 673 1.1 mrg 674 1.1 mrg /* Output is positive if inputs have same sign, otherwise negative */ 675 1.1 mrg mp_sign osign = (MP_SIGN(a) == MP_SIGN(b)) ? MP_ZPOS : MP_NEG; 676 1.1 mrg 677 1.1 mrg /* If the output is not identical to any of the inputs, we'll write the 678 1.1 mrg results directly; otherwise, allocate a temporary space. */ 679 1.1 mrg mp_size ua = MP_USED(a); 680 1.1 mrg mp_size ub = MP_USED(b); 681 1.1 mrg mp_size osize = MAX(ua, ub); 682 1.1 mrg osize = 4 * ((osize + 1) / 2); 683 1.1 mrg 684 1.1 mrg mp_digit *out; 685 1.1 mrg mp_size p = 0; 686 1.1 mrg if (c == a || c == b) { 687 1.1 mrg p = MAX(s_round_prec(osize), default_precision); 688 1.1 mrg 689 1.1 mrg if ((out = s_alloc(p)) == NULL) return MP_MEMORY; 690 1.1 mrg } else { 691 1.1 mrg if (!s_pad(c, osize)) return MP_MEMORY; 692 1.1 mrg 693 1.1 mrg out = MP_DIGITS(c); 694 1.1 mrg } 695 1.1 mrg ZERO(out, osize); 696 1.1 mrg 697 1.1 mrg if (!s_kmul(MP_DIGITS(a), MP_DIGITS(b), out, ua, ub)) return MP_MEMORY; 698 1.1 mrg 699 1.1 mrg /* If we allocated a new buffer, get rid of whatever memory c was already 700 1.1 mrg using, and fix up its fields to reflect that. 701 1.1 mrg */ 702 1.1 mrg if (out != MP_DIGITS(c)) { 703 1.1 mrg if ((void *)MP_DIGITS(c) != (void *)c) s_free(MP_DIGITS(c)); 704 1.1 mrg c->digits = out; 705 1.1 mrg c->alloc = p; 706 1.1 mrg } 707 1.1 mrg 708 1.1 mrg c->used = osize; /* might not be true, but we'll fix it ... */ 709 1.1 mrg CLAMP(c); /* ... right here */ 710 1.1 mrg c->sign = osign; 711 1.1 mrg 712 1.1 mrg return MP_OK; 713 1.1 mrg } 714 1.1 mrg 715 1.1 mrg mp_result mp_int_mul_value(mp_int a, mp_small value, mp_int c) { 716 1.1 mrg mpz_t vtmp; 717 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 718 1.1 mrg 719 1.1 mrg s_fake(&vtmp, value, vbuf); 720 1.1 mrg 721 1.1 mrg return mp_int_mul(a, &vtmp, c); 722 1.1 mrg } 723 1.1 mrg 724 1.1 mrg mp_result mp_int_mul_pow2(mp_int a, mp_small p2, mp_int c) { 725 1.1 mrg assert(a != NULL && c != NULL && p2 >= 0); 726 1.1 mrg 727 1.1 mrg mp_result res = mp_int_copy(a, c); 728 1.1 mrg if (res != MP_OK) return res; 729 1.1 mrg 730 1.1 mrg if (s_qmul(c, (mp_size)p2)) { 731 1.1 mrg return MP_OK; 732 1.1 mrg } else { 733 1.1 mrg return MP_MEMORY; 734 1.1 mrg } 735 1.1 mrg } 736 1.1 mrg 737 1.1 mrg mp_result mp_int_sqr(mp_int a, mp_int c) { 738 1.1 mrg assert(a != NULL && c != NULL); 739 1.1 mrg 740 1.1 mrg /* Get a temporary buffer big enough to hold the result */ 741 1.1 mrg mp_size osize = (mp_size)4 * ((MP_USED(a) + 1) / 2); 742 1.1 mrg mp_size p = 0; 743 1.1 mrg mp_digit *out; 744 1.1 mrg if (a == c) { 745 1.1 mrg p = s_round_prec(osize); 746 1.1 mrg p = MAX(p, default_precision); 747 1.1 mrg 748 1.1 mrg if ((out = s_alloc(p)) == NULL) return MP_MEMORY; 749 1.1 mrg } else { 750 1.1 mrg if (!s_pad(c, osize)) return MP_MEMORY; 751 1.1 mrg 752 1.1 mrg out = MP_DIGITS(c); 753 1.1 mrg } 754 1.1 mrg ZERO(out, osize); 755 1.1 mrg 756 1.1 mrg s_ksqr(MP_DIGITS(a), out, MP_USED(a)); 757 1.1 mrg 758 1.1 mrg /* Get rid of whatever memory c was already using, and fix up its fields to 759 1.1 mrg reflect the new digit array it's using 760 1.1 mrg */ 761 1.1 mrg if (out != MP_DIGITS(c)) { 762 1.1 mrg if ((void *)MP_DIGITS(c) != (void *)c) s_free(MP_DIGITS(c)); 763 1.1 mrg c->digits = out; 764 1.1 mrg c->alloc = p; 765 1.1 mrg } 766 1.1 mrg 767 1.1 mrg c->used = osize; /* might not be true, but we'll fix it ... */ 768 1.1 mrg CLAMP(c); /* ... right here */ 769 1.1 mrg c->sign = MP_ZPOS; 770 1.1 mrg 771 1.1 mrg return MP_OK; 772 1.1 mrg } 773 1.1 mrg 774 1.1 mrg mp_result mp_int_div(mp_int a, mp_int b, mp_int q, mp_int r) { 775 1.1 mrg assert(a != NULL && b != NULL && q != r); 776 1.1 mrg 777 1.1 mrg int cmp; 778 1.1 mrg mp_result res = MP_OK; 779 1.1 mrg mp_int qout, rout; 780 1.1 mrg mp_sign sa = MP_SIGN(a); 781 1.1 mrg mp_sign sb = MP_SIGN(b); 782 1.1 mrg if (CMPZ(b) == 0) { 783 1.1 mrg return MP_UNDEF; 784 1.1 mrg } else if ((cmp = s_ucmp(a, b)) < 0) { 785 1.1 mrg /* If |a| < |b|, no division is required: 786 1.1 mrg q = 0, r = a 787 1.1 mrg */ 788 1.1 mrg if (r && (res = mp_int_copy(a, r)) != MP_OK) return res; 789 1.1 mrg 790 1.1 mrg if (q) mp_int_zero(q); 791 1.1 mrg 792 1.1 mrg return MP_OK; 793 1.1 mrg } else if (cmp == 0) { 794 1.1 mrg /* If |a| = |b|, no division is required: 795 1.1 mrg q = 1 or -1, r = 0 796 1.1 mrg */ 797 1.1 mrg if (r) mp_int_zero(r); 798 1.1 mrg 799 1.1 mrg if (q) { 800 1.1 mrg mp_int_zero(q); 801 1.1 mrg q->digits[0] = 1; 802 1.1 mrg 803 1.1 mrg if (sa != sb) q->sign = MP_NEG; 804 1.1 mrg } 805 1.1 mrg 806 1.1 mrg return MP_OK; 807 1.1 mrg } 808 1.1 mrg 809 1.1 mrg /* When |a| > |b|, real division is required. We need someplace to store 810 1.1 mrg quotient and remainder, but q and r are allowed to be NULL or to overlap 811 1.1 mrg with the inputs. 812 1.1 mrg */ 813 1.1 mrg DECLARE_TEMP(2); 814 1.1 mrg int lg; 815 1.1 mrg if ((lg = s_isp2(b)) < 0) { 816 1.1 mrg if (q && b != q) { 817 1.1 mrg REQUIRE(mp_int_copy(a, q)); 818 1.1 mrg qout = q; 819 1.1 mrg } else { 820 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(0))); 821 1.1 mrg qout = TEMP(0); 822 1.1 mrg } 823 1.1 mrg 824 1.1 mrg if (r && a != r) { 825 1.1 mrg REQUIRE(mp_int_copy(b, r)); 826 1.1 mrg rout = r; 827 1.1 mrg } else { 828 1.1 mrg REQUIRE(mp_int_copy(b, TEMP(1))); 829 1.1 mrg rout = TEMP(1); 830 1.1 mrg } 831 1.1 mrg 832 1.1 mrg REQUIRE(s_udiv_knuth(qout, rout)); 833 1.1 mrg } else { 834 1.1 mrg if (q) REQUIRE(mp_int_copy(a, q)); 835 1.1 mrg if (r) REQUIRE(mp_int_copy(a, r)); 836 1.1 mrg 837 1.1 mrg if (q) s_qdiv(q, (mp_size)lg); 838 1.1 mrg qout = q; 839 1.1 mrg if (r) s_qmod(r, (mp_size)lg); 840 1.1 mrg rout = r; 841 1.1 mrg } 842 1.1 mrg 843 1.1 mrg /* Recompute signs for output */ 844 1.1 mrg if (rout) { 845 1.1 mrg rout->sign = sa; 846 1.1 mrg if (CMPZ(rout) == 0) rout->sign = MP_ZPOS; 847 1.1 mrg } 848 1.1 mrg if (qout) { 849 1.1 mrg qout->sign = (sa == sb) ? MP_ZPOS : MP_NEG; 850 1.1 mrg if (CMPZ(qout) == 0) qout->sign = MP_ZPOS; 851 1.1 mrg } 852 1.1 mrg 853 1.1 mrg if (q) REQUIRE(mp_int_copy(qout, q)); 854 1.1 mrg if (r) REQUIRE(mp_int_copy(rout, r)); 855 1.1 mrg CLEANUP_TEMP(); 856 1.1 mrg return res; 857 1.1 mrg } 858 1.1 mrg 859 1.1 mrg mp_result mp_int_mod(mp_int a, mp_int m, mp_int c) { 860 1.1 mrg DECLARE_TEMP(1); 861 1.1 mrg mp_int out = (m == c) ? TEMP(0) : c; 862 1.1 mrg REQUIRE(mp_int_div(a, m, NULL, out)); 863 1.1 mrg if (CMPZ(out) < 0) { 864 1.1 mrg REQUIRE(mp_int_add(out, m, c)); 865 1.1 mrg } else { 866 1.1 mrg REQUIRE(mp_int_copy(out, c)); 867 1.1 mrg } 868 1.1 mrg CLEANUP_TEMP(); 869 1.1 mrg return MP_OK; 870 1.1 mrg } 871 1.1 mrg 872 1.1 mrg mp_result mp_int_div_value(mp_int a, mp_small value, mp_int q, mp_small *r) { 873 1.1 mrg mpz_t vtmp; 874 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 875 1.1 mrg s_fake(&vtmp, value, vbuf); 876 1.1 mrg 877 1.1 mrg DECLARE_TEMP(1); 878 1.1 mrg REQUIRE(mp_int_div(a, &vtmp, q, TEMP(0))); 879 1.1 mrg 880 1.1 mrg if (r) (void)mp_int_to_int(TEMP(0), r); /* can't fail */ 881 1.1 mrg 882 1.1 mrg CLEANUP_TEMP(); 883 1.1 mrg return MP_OK; 884 1.1 mrg } 885 1.1 mrg 886 1.1 mrg mp_result mp_int_div_pow2(mp_int a, mp_small p2, mp_int q, mp_int r) { 887 1.1 mrg assert(a != NULL && p2 >= 0 && q != r); 888 1.1 mrg 889 1.1 mrg mp_result res = MP_OK; 890 1.1 mrg if (q != NULL && (res = mp_int_copy(a, q)) == MP_OK) { 891 1.1 mrg s_qdiv(q, (mp_size)p2); 892 1.1 mrg } 893 1.1 mrg 894 1.1 mrg if (res == MP_OK && r != NULL && (res = mp_int_copy(a, r)) == MP_OK) { 895 1.1 mrg s_qmod(r, (mp_size)p2); 896 1.1 mrg } 897 1.1 mrg 898 1.1 mrg return res; 899 1.1 mrg } 900 1.1 mrg 901 1.1 mrg mp_result mp_int_expt(mp_int a, mp_small b, mp_int c) { 902 1.1 mrg assert(c != NULL); 903 1.1 mrg if (b < 0) return MP_RANGE; 904 1.1 mrg 905 1.1 mrg DECLARE_TEMP(1); 906 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(0))); 907 1.1 mrg 908 1.1 mrg (void)mp_int_set_value(c, 1); 909 1.1 mrg unsigned int v = labs(b); 910 1.1 mrg while (v != 0) { 911 1.1 mrg if (v & 1) { 912 1.1 mrg REQUIRE(mp_int_mul(c, TEMP(0), c)); 913 1.1 mrg } 914 1.1 mrg 915 1.1 mrg v >>= 1; 916 1.1 mrg if (v == 0) break; 917 1.1 mrg 918 1.1 mrg REQUIRE(mp_int_sqr(TEMP(0), TEMP(0))); 919 1.1 mrg } 920 1.1 mrg 921 1.1 mrg CLEANUP_TEMP(); 922 1.1 mrg return MP_OK; 923 1.1 mrg } 924 1.1 mrg 925 1.1 mrg mp_result mp_int_expt_value(mp_small a, mp_small b, mp_int c) { 926 1.1 mrg assert(c != NULL); 927 1.1 mrg if (b < 0) return MP_RANGE; 928 1.1 mrg 929 1.1 mrg DECLARE_TEMP(1); 930 1.1 mrg REQUIRE(mp_int_set_value(TEMP(0), a)); 931 1.1 mrg 932 1.1 mrg (void)mp_int_set_value(c, 1); 933 1.1 mrg unsigned int v = labs(b); 934 1.1 mrg while (v != 0) { 935 1.1 mrg if (v & 1) { 936 1.1 mrg REQUIRE(mp_int_mul(c, TEMP(0), c)); 937 1.1 mrg } 938 1.1 mrg 939 1.1 mrg v >>= 1; 940 1.1 mrg if (v == 0) break; 941 1.1 mrg 942 1.1 mrg REQUIRE(mp_int_sqr(TEMP(0), TEMP(0))); 943 1.1 mrg } 944 1.1 mrg 945 1.1 mrg CLEANUP_TEMP(); 946 1.1 mrg return MP_OK; 947 1.1 mrg } 948 1.1 mrg 949 1.1 mrg mp_result mp_int_expt_full(mp_int a, mp_int b, mp_int c) { 950 1.1 mrg assert(a != NULL && b != NULL && c != NULL); 951 1.1 mrg if (MP_SIGN(b) == MP_NEG) return MP_RANGE; 952 1.1 mrg 953 1.1 mrg DECLARE_TEMP(1); 954 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(0))); 955 1.1 mrg 956 1.1 mrg (void)mp_int_set_value(c, 1); 957 1.1 mrg for (unsigned ix = 0; ix < MP_USED(b); ++ix) { 958 1.1 mrg mp_digit d = b->digits[ix]; 959 1.1 mrg 960 1.1 mrg for (unsigned jx = 0; jx < MP_DIGIT_BIT; ++jx) { 961 1.1 mrg if (d & 1) { 962 1.1 mrg REQUIRE(mp_int_mul(c, TEMP(0), c)); 963 1.1 mrg } 964 1.1 mrg 965 1.1 mrg d >>= 1; 966 1.1 mrg if (d == 0 && ix + 1 == MP_USED(b)) break; 967 1.1 mrg REQUIRE(mp_int_sqr(TEMP(0), TEMP(0))); 968 1.1 mrg } 969 1.1 mrg } 970 1.1 mrg 971 1.1 mrg CLEANUP_TEMP(); 972 1.1 mrg return MP_OK; 973 1.1 mrg } 974 1.1 mrg 975 1.1 mrg int mp_int_compare(mp_int a, mp_int b) { 976 1.1 mrg assert(a != NULL && b != NULL); 977 1.1 mrg 978 1.1 mrg mp_sign sa = MP_SIGN(a); 979 1.1 mrg if (sa == MP_SIGN(b)) { 980 1.1 mrg int cmp = s_ucmp(a, b); 981 1.1 mrg 982 1.1 mrg /* If they're both zero or positive, the normal comparison applies; if both 983 1.1 mrg negative, the sense is reversed. */ 984 1.1 mrg if (sa == MP_ZPOS) { 985 1.1 mrg return cmp; 986 1.1 mrg } else { 987 1.1 mrg return -cmp; 988 1.1 mrg } 989 1.1 mrg } else if (sa == MP_ZPOS) { 990 1.1 mrg return 1; 991 1.1 mrg } else { 992 1.1 mrg return -1; 993 1.1 mrg } 994 1.1 mrg } 995 1.1 mrg 996 1.1 mrg int mp_int_compare_unsigned(mp_int a, mp_int b) { 997 1.1 mrg assert(a != NULL && b != NULL); 998 1.1 mrg 999 1.1 mrg return s_ucmp(a, b); 1000 1.1 mrg } 1001 1.1 mrg 1002 1.1 mrg int mp_int_compare_zero(mp_int z) { 1003 1.1 mrg assert(z != NULL); 1004 1.1 mrg 1005 1.1 mrg if (MP_USED(z) == 1 && z->digits[0] == 0) { 1006 1.1 mrg return 0; 1007 1.1 mrg } else if (MP_SIGN(z) == MP_ZPOS) { 1008 1.1 mrg return 1; 1009 1.1 mrg } else { 1010 1.1 mrg return -1; 1011 1.1 mrg } 1012 1.1 mrg } 1013 1.1 mrg 1014 1.1 mrg int mp_int_compare_value(mp_int z, mp_small value) { 1015 1.1 mrg assert(z != NULL); 1016 1.1 mrg 1017 1.1 mrg mp_sign vsign = (value < 0) ? MP_NEG : MP_ZPOS; 1018 1.1 mrg if (vsign == MP_SIGN(z)) { 1019 1.1 mrg int cmp = s_vcmp(z, value); 1020 1.1 mrg 1021 1.1 mrg return (vsign == MP_ZPOS) ? cmp : -cmp; 1022 1.1 mrg } else { 1023 1.1 mrg return (value < 0) ? 1 : -1; 1024 1.1 mrg } 1025 1.1 mrg } 1026 1.1 mrg 1027 1.1 mrg int mp_int_compare_uvalue(mp_int z, mp_usmall uv) { 1028 1.1 mrg assert(z != NULL); 1029 1.1 mrg 1030 1.1 mrg if (MP_SIGN(z) == MP_NEG) { 1031 1.1 mrg return -1; 1032 1.1 mrg } else { 1033 1.1 mrg return s_uvcmp(z, uv); 1034 1.1 mrg } 1035 1.1 mrg } 1036 1.1 mrg 1037 1.1 mrg mp_result mp_int_exptmod(mp_int a, mp_int b, mp_int m, mp_int c) { 1038 1.1 mrg assert(a != NULL && b != NULL && c != NULL && m != NULL); 1039 1.1 mrg 1040 1.1 mrg /* Zero moduli and negative exponents are not considered. */ 1041 1.1 mrg if (CMPZ(m) == 0) return MP_UNDEF; 1042 1.1 mrg if (CMPZ(b) < 0) return MP_RANGE; 1043 1.1 mrg 1044 1.1 mrg mp_size um = MP_USED(m); 1045 1.1 mrg DECLARE_TEMP(3); 1046 1.1 mrg REQUIRE(GROW(TEMP(0), 2 * um)); 1047 1.1 mrg REQUIRE(GROW(TEMP(1), 2 * um)); 1048 1.1 mrg 1049 1.1 mrg mp_int s; 1050 1.1 mrg if (c == b || c == m) { 1051 1.1 mrg REQUIRE(GROW(TEMP(2), 2 * um)); 1052 1.1 mrg s = TEMP(2); 1053 1.1 mrg } else { 1054 1.1 mrg s = c; 1055 1.1 mrg } 1056 1.1 mrg 1057 1.1 mrg REQUIRE(mp_int_mod(a, m, TEMP(0))); 1058 1.1 mrg REQUIRE(s_brmu(TEMP(1), m)); 1059 1.1 mrg REQUIRE(s_embar(TEMP(0), b, m, TEMP(1), s)); 1060 1.1 mrg REQUIRE(mp_int_copy(s, c)); 1061 1.1 mrg 1062 1.1 mrg CLEANUP_TEMP(); 1063 1.1 mrg return MP_OK; 1064 1.1 mrg } 1065 1.1 mrg 1066 1.1 mrg mp_result mp_int_exptmod_evalue(mp_int a, mp_small value, mp_int m, mp_int c) { 1067 1.1 mrg mpz_t vtmp; 1068 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 1069 1.1 mrg 1070 1.1 mrg s_fake(&vtmp, value, vbuf); 1071 1.1 mrg 1072 1.1 mrg return mp_int_exptmod(a, &vtmp, m, c); 1073 1.1 mrg } 1074 1.1 mrg 1075 1.1 mrg mp_result mp_int_exptmod_bvalue(mp_small value, mp_int b, mp_int m, mp_int c) { 1076 1.1 mrg mpz_t vtmp; 1077 1.1 mrg mp_digit vbuf[MP_VALUE_DIGITS(value)]; 1078 1.1 mrg 1079 1.1 mrg s_fake(&vtmp, value, vbuf); 1080 1.1 mrg 1081 1.1 mrg return mp_int_exptmod(&vtmp, b, m, c); 1082 1.1 mrg } 1083 1.1 mrg 1084 1.1 mrg mp_result mp_int_exptmod_known(mp_int a, mp_int b, mp_int m, mp_int mu, 1085 1.1 mrg mp_int c) { 1086 1.1 mrg assert(a && b && m && c); 1087 1.1 mrg 1088 1.1 mrg /* Zero moduli and negative exponents are not considered. */ 1089 1.1 mrg if (CMPZ(m) == 0) return MP_UNDEF; 1090 1.1 mrg if (CMPZ(b) < 0) return MP_RANGE; 1091 1.1 mrg 1092 1.1 mrg DECLARE_TEMP(2); 1093 1.1 mrg mp_size um = MP_USED(m); 1094 1.1 mrg REQUIRE(GROW(TEMP(0), 2 * um)); 1095 1.1 mrg 1096 1.1 mrg mp_int s; 1097 1.1 mrg if (c == b || c == m) { 1098 1.1 mrg REQUIRE(GROW(TEMP(1), 2 * um)); 1099 1.1 mrg s = TEMP(1); 1100 1.1 mrg } else { 1101 1.1 mrg s = c; 1102 1.1 mrg } 1103 1.1 mrg 1104 1.1 mrg REQUIRE(mp_int_mod(a, m, TEMP(0))); 1105 1.1 mrg REQUIRE(s_embar(TEMP(0), b, m, mu, s)); 1106 1.1 mrg REQUIRE(mp_int_copy(s, c)); 1107 1.1 mrg 1108 1.1 mrg CLEANUP_TEMP(); 1109 1.1 mrg return MP_OK; 1110 1.1 mrg } 1111 1.1 mrg 1112 1.1 mrg mp_result mp_int_redux_const(mp_int m, mp_int c) { 1113 1.1 mrg assert(m != NULL && c != NULL && m != c); 1114 1.1 mrg 1115 1.1 mrg return s_brmu(c, m); 1116 1.1 mrg } 1117 1.1 mrg 1118 1.1 mrg mp_result mp_int_invmod(mp_int a, mp_int m, mp_int c) { 1119 1.1 mrg assert(a != NULL && m != NULL && c != NULL); 1120 1.1 mrg 1121 1.1 mrg if (CMPZ(a) == 0 || CMPZ(m) <= 0) return MP_RANGE; 1122 1.1 mrg 1123 1.1 mrg DECLARE_TEMP(2); 1124 1.1 mrg 1125 1.1 mrg REQUIRE(mp_int_egcd(a, m, TEMP(0), TEMP(1), NULL)); 1126 1.1 mrg 1127 1.1 mrg if (mp_int_compare_value(TEMP(0), 1) != 0) { 1128 1.1 mrg REQUIRE(MP_UNDEF); 1129 1.1 mrg } 1130 1.1 mrg 1131 1.1 mrg /* It is first necessary to constrain the value to the proper range */ 1132 1.1 mrg REQUIRE(mp_int_mod(TEMP(1), m, TEMP(1))); 1133 1.1 mrg 1134 1.1 mrg /* Now, if 'a' was originally negative, the value we have is actually the 1135 1.1 mrg magnitude of the negative representative; to get the positive value we 1136 1.1 mrg have to subtract from the modulus. Otherwise, the value is okay as it 1137 1.1 mrg stands. 1138 1.1 mrg */ 1139 1.1 mrg if (MP_SIGN(a) == MP_NEG) { 1140 1.1 mrg REQUIRE(mp_int_sub(m, TEMP(1), c)); 1141 1.1 mrg } else { 1142 1.1 mrg REQUIRE(mp_int_copy(TEMP(1), c)); 1143 1.1 mrg } 1144 1.1 mrg 1145 1.1 mrg CLEANUP_TEMP(); 1146 1.1 mrg return MP_OK; 1147 1.1 mrg } 1148 1.1 mrg 1149 1.1 mrg /* Binary GCD algorithm due to Josef Stein, 1961 */ 1150 1.1 mrg mp_result mp_int_gcd(mp_int a, mp_int b, mp_int c) { 1151 1.1 mrg assert(a != NULL && b != NULL && c != NULL); 1152 1.1 mrg 1153 1.1 mrg int ca = CMPZ(a); 1154 1.1 mrg int cb = CMPZ(b); 1155 1.1 mrg if (ca == 0 && cb == 0) { 1156 1.1 mrg return MP_UNDEF; 1157 1.1 mrg } else if (ca == 0) { 1158 1.1 mrg return mp_int_abs(b, c); 1159 1.1 mrg } else if (cb == 0) { 1160 1.1 mrg return mp_int_abs(a, c); 1161 1.1 mrg } 1162 1.1 mrg 1163 1.1 mrg DECLARE_TEMP(3); 1164 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(0))); 1165 1.1 mrg REQUIRE(mp_int_copy(b, TEMP(1))); 1166 1.1 mrg 1167 1.1 mrg TEMP(0)->sign = MP_ZPOS; 1168 1.1 mrg TEMP(1)->sign = MP_ZPOS; 1169 1.1 mrg 1170 1.1 mrg int k = 0; 1171 1.1 mrg { /* Divide out common factors of 2 from u and v */ 1172 1.1 mrg int div2_u = s_dp2k(TEMP(0)); 1173 1.1 mrg int div2_v = s_dp2k(TEMP(1)); 1174 1.1 mrg 1175 1.1 mrg k = MIN(div2_u, div2_v); 1176 1.1 mrg s_qdiv(TEMP(0), (mp_size)k); 1177 1.1 mrg s_qdiv(TEMP(1), (mp_size)k); 1178 1.1 mrg } 1179 1.1 mrg 1180 1.1 mrg if (mp_int_is_odd(TEMP(0))) { 1181 1.1 mrg REQUIRE(mp_int_neg(TEMP(1), TEMP(2))); 1182 1.1 mrg } else { 1183 1.1 mrg REQUIRE(mp_int_copy(TEMP(0), TEMP(2))); 1184 1.1 mrg } 1185 1.1 mrg 1186 1.1 mrg for (;;) { 1187 1.1 mrg s_qdiv(TEMP(2), s_dp2k(TEMP(2))); 1188 1.1 mrg 1189 1.1 mrg if (CMPZ(TEMP(2)) > 0) { 1190 1.1 mrg REQUIRE(mp_int_copy(TEMP(2), TEMP(0))); 1191 1.1 mrg } else { 1192 1.1 mrg REQUIRE(mp_int_neg(TEMP(2), TEMP(1))); 1193 1.1 mrg } 1194 1.1 mrg 1195 1.1 mrg REQUIRE(mp_int_sub(TEMP(0), TEMP(1), TEMP(2))); 1196 1.1 mrg 1197 1.1 mrg if (CMPZ(TEMP(2)) == 0) break; 1198 1.1 mrg } 1199 1.1 mrg 1200 1.1 mrg REQUIRE(mp_int_abs(TEMP(0), c)); 1201 1.1 mrg if (!s_qmul(c, (mp_size)k)) REQUIRE(MP_MEMORY); 1202 1.1 mrg 1203 1.1 mrg CLEANUP_TEMP(); 1204 1.1 mrg return MP_OK; 1205 1.1 mrg } 1206 1.1 mrg 1207 1.1 mrg /* This is the binary GCD algorithm again, but this time we keep track of the 1208 1.1 mrg elementary matrix operations as we go, so we can get values x and y 1209 1.1 mrg satisfying c = ax + by. 1210 1.1 mrg */ 1211 1.1 mrg mp_result mp_int_egcd(mp_int a, mp_int b, mp_int c, mp_int x, mp_int y) { 1212 1.1 mrg assert(a != NULL && b != NULL && c != NULL && (x != NULL || y != NULL)); 1213 1.1 mrg 1214 1.1 mrg mp_result res = MP_OK; 1215 1.1 mrg int ca = CMPZ(a); 1216 1.1 mrg int cb = CMPZ(b); 1217 1.1 mrg if (ca == 0 && cb == 0) { 1218 1.1 mrg return MP_UNDEF; 1219 1.1 mrg } else if (ca == 0) { 1220 1.1 mrg if ((res = mp_int_abs(b, c)) != MP_OK) return res; 1221 1.1 mrg mp_int_zero(x); 1222 1.1 mrg (void)mp_int_set_value(y, 1); 1223 1.1 mrg return MP_OK; 1224 1.1 mrg } else if (cb == 0) { 1225 1.1 mrg if ((res = mp_int_abs(a, c)) != MP_OK) return res; 1226 1.1 mrg (void)mp_int_set_value(x, 1); 1227 1.1 mrg mp_int_zero(y); 1228 1.1 mrg return MP_OK; 1229 1.1 mrg } 1230 1.1 mrg 1231 1.1 mrg /* Initialize temporaries: 1232 1.1 mrg A:0, B:1, C:2, D:3, u:4, v:5, ou:6, ov:7 */ 1233 1.1 mrg DECLARE_TEMP(8); 1234 1.1 mrg REQUIRE(mp_int_set_value(TEMP(0), 1)); 1235 1.1 mrg REQUIRE(mp_int_set_value(TEMP(3), 1)); 1236 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(4))); 1237 1.1 mrg REQUIRE(mp_int_copy(b, TEMP(5))); 1238 1.1 mrg 1239 1.1 mrg /* We will work with absolute values here */ 1240 1.1 mrg TEMP(4)->sign = MP_ZPOS; 1241 1.1 mrg TEMP(5)->sign = MP_ZPOS; 1242 1.1 mrg 1243 1.1 mrg int k = 0; 1244 1.1 mrg { /* Divide out common factors of 2 from u and v */ 1245 1.1 mrg int div2_u = s_dp2k(TEMP(4)), div2_v = s_dp2k(TEMP(5)); 1246 1.1 mrg 1247 1.1 mrg k = MIN(div2_u, div2_v); 1248 1.1 mrg s_qdiv(TEMP(4), k); 1249 1.1 mrg s_qdiv(TEMP(5), k); 1250 1.1 mrg } 1251 1.1 mrg 1252 1.1 mrg REQUIRE(mp_int_copy(TEMP(4), TEMP(6))); 1253 1.1 mrg REQUIRE(mp_int_copy(TEMP(5), TEMP(7))); 1254 1.1 mrg 1255 1.1 mrg for (;;) { 1256 1.1 mrg while (mp_int_is_even(TEMP(4))) { 1257 1.1 mrg s_qdiv(TEMP(4), 1); 1258 1.1 mrg 1259 1.1 mrg if (mp_int_is_odd(TEMP(0)) || mp_int_is_odd(TEMP(1))) { 1260 1.1 mrg REQUIRE(mp_int_add(TEMP(0), TEMP(7), TEMP(0))); 1261 1.1 mrg REQUIRE(mp_int_sub(TEMP(1), TEMP(6), TEMP(1))); 1262 1.1 mrg } 1263 1.1 mrg 1264 1.1 mrg s_qdiv(TEMP(0), 1); 1265 1.1 mrg s_qdiv(TEMP(1), 1); 1266 1.1 mrg } 1267 1.1 mrg 1268 1.1 mrg while (mp_int_is_even(TEMP(5))) { 1269 1.1 mrg s_qdiv(TEMP(5), 1); 1270 1.1 mrg 1271 1.1 mrg if (mp_int_is_odd(TEMP(2)) || mp_int_is_odd(TEMP(3))) { 1272 1.1 mrg REQUIRE(mp_int_add(TEMP(2), TEMP(7), TEMP(2))); 1273 1.1 mrg REQUIRE(mp_int_sub(TEMP(3), TEMP(6), TEMP(3))); 1274 1.1 mrg } 1275 1.1 mrg 1276 1.1 mrg s_qdiv(TEMP(2), 1); 1277 1.1 mrg s_qdiv(TEMP(3), 1); 1278 1.1 mrg } 1279 1.1 mrg 1280 1.1 mrg if (mp_int_compare(TEMP(4), TEMP(5)) >= 0) { 1281 1.1 mrg REQUIRE(mp_int_sub(TEMP(4), TEMP(5), TEMP(4))); 1282 1.1 mrg REQUIRE(mp_int_sub(TEMP(0), TEMP(2), TEMP(0))); 1283 1.1 mrg REQUIRE(mp_int_sub(TEMP(1), TEMP(3), TEMP(1))); 1284 1.1 mrg } else { 1285 1.1 mrg REQUIRE(mp_int_sub(TEMP(5), TEMP(4), TEMP(5))); 1286 1.1 mrg REQUIRE(mp_int_sub(TEMP(2), TEMP(0), TEMP(2))); 1287 1.1 mrg REQUIRE(mp_int_sub(TEMP(3), TEMP(1), TEMP(3))); 1288 1.1 mrg } 1289 1.1 mrg 1290 1.1 mrg if (CMPZ(TEMP(4)) == 0) { 1291 1.1 mrg if (x) REQUIRE(mp_int_copy(TEMP(2), x)); 1292 1.1 mrg if (y) REQUIRE(mp_int_copy(TEMP(3), y)); 1293 1.1 mrg if (c) { 1294 1.1 mrg if (!s_qmul(TEMP(5), k)) { 1295 1.1 mrg REQUIRE(MP_MEMORY); 1296 1.1 mrg } 1297 1.1 mrg REQUIRE(mp_int_copy(TEMP(5), c)); 1298 1.1 mrg } 1299 1.1 mrg 1300 1.1 mrg break; 1301 1.1 mrg } 1302 1.1 mrg } 1303 1.1 mrg 1304 1.1 mrg CLEANUP_TEMP(); 1305 1.1 mrg return MP_OK; 1306 1.1 mrg } 1307 1.1 mrg 1308 1.1 mrg mp_result mp_int_lcm(mp_int a, mp_int b, mp_int c) { 1309 1.1 mrg assert(a != NULL && b != NULL && c != NULL); 1310 1.1 mrg 1311 1.1 mrg /* Since a * b = gcd(a, b) * lcm(a, b), we can compute 1312 1.1 mrg lcm(a, b) = (a / gcd(a, b)) * b. 1313 1.1 mrg 1314 1.1 mrg This formulation insures everything works even if the input 1315 1.1 mrg variables share space. 1316 1.1 mrg */ 1317 1.1 mrg DECLARE_TEMP(1); 1318 1.1 mrg REQUIRE(mp_int_gcd(a, b, TEMP(0))); 1319 1.1 mrg REQUIRE(mp_int_div(a, TEMP(0), TEMP(0), NULL)); 1320 1.1 mrg REQUIRE(mp_int_mul(TEMP(0), b, TEMP(0))); 1321 1.1 mrg REQUIRE(mp_int_copy(TEMP(0), c)); 1322 1.1 mrg 1323 1.1 mrg CLEANUP_TEMP(); 1324 1.1 mrg return MP_OK; 1325 1.1 mrg } 1326 1.1 mrg 1327 1.1 mrg bool mp_int_divisible_value(mp_int a, mp_small v) { 1328 1.1 mrg mp_small rem = 0; 1329 1.1 mrg 1330 1.1 mrg if (mp_int_div_value(a, v, NULL, &rem) != MP_OK) { 1331 1.1 mrg return false; 1332 1.1 mrg } 1333 1.1 mrg return rem == 0; 1334 1.1 mrg } 1335 1.1 mrg 1336 1.1 mrg int mp_int_is_pow2(mp_int z) { 1337 1.1 mrg assert(z != NULL); 1338 1.1 mrg 1339 1.1 mrg return s_isp2(z); 1340 1.1 mrg } 1341 1.1 mrg 1342 1.1 mrg /* Implementation of Newton's root finding method, based loosely on a patch 1343 1.1 mrg contributed by Hal Finkel <half (at) halssoftware.com> 1344 1.1 mrg modified by M. J. Fromberger. 1345 1.1 mrg */ 1346 1.1 mrg mp_result mp_int_root(mp_int a, mp_small b, mp_int c) { 1347 1.1 mrg assert(a != NULL && c != NULL && b > 0); 1348 1.1 mrg 1349 1.1 mrg if (b == 1) { 1350 1.1 mrg return mp_int_copy(a, c); 1351 1.1 mrg } 1352 1.1 mrg bool flips = false; 1353 1.1 mrg if (MP_SIGN(a) == MP_NEG) { 1354 1.1 mrg if (b % 2 == 0) { 1355 1.1 mrg return MP_UNDEF; /* root does not exist for negative a with even b */ 1356 1.1 mrg } else { 1357 1.1 mrg flips = true; 1358 1.1 mrg } 1359 1.1 mrg } 1360 1.1 mrg 1361 1.1 mrg DECLARE_TEMP(5); 1362 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(0))); 1363 1.1 mrg REQUIRE(mp_int_copy(a, TEMP(1))); 1364 1.1 mrg TEMP(0)->sign = MP_ZPOS; 1365 1.1 mrg TEMP(1)->sign = MP_ZPOS; 1366 1.1 mrg 1367 1.1 mrg for (;;) { 1368 1.1 mrg REQUIRE(mp_int_expt(TEMP(1), b, TEMP(2))); 1369 1.1 mrg 1370 1.1 mrg if (mp_int_compare_unsigned(TEMP(2), TEMP(0)) <= 0) break; 1371 1.1 mrg 1372 1.1 mrg REQUIRE(mp_int_sub(TEMP(2), TEMP(0), TEMP(2))); 1373 1.1 mrg REQUIRE(mp_int_expt(TEMP(1), b - 1, TEMP(3))); 1374 1.1 mrg REQUIRE(mp_int_mul_value(TEMP(3), b, TEMP(3))); 1375 1.1 mrg REQUIRE(mp_int_div(TEMP(2), TEMP(3), TEMP(4), NULL)); 1376 1.1 mrg REQUIRE(mp_int_sub(TEMP(1), TEMP(4), TEMP(4))); 1377 1.1 mrg 1378 1.1 mrg if (mp_int_compare_unsigned(TEMP(1), TEMP(4)) == 0) { 1379 1.1 mrg REQUIRE(mp_int_sub_value(TEMP(4), 1, TEMP(4))); 1380 1.1 mrg } 1381 1.1 mrg REQUIRE(mp_int_copy(TEMP(4), TEMP(1))); 1382 1.1 mrg } 1383 1.1 mrg 1384 1.1 mrg REQUIRE(mp_int_copy(TEMP(1), c)); 1385 1.1 mrg 1386 1.1 mrg /* If the original value of a was negative, flip the output sign. */ 1387 1.1 mrg if (flips) (void)mp_int_neg(c, c); /* cannot fail */ 1388 1.1 mrg 1389 1.1 mrg CLEANUP_TEMP(); 1390 1.1 mrg return MP_OK; 1391 1.1 mrg } 1392 1.1 mrg 1393 1.1 mrg mp_result mp_int_to_int(mp_int z, mp_small *out) { 1394 1.1 mrg assert(z != NULL); 1395 1.1 mrg 1396 1.1 mrg /* Make sure the value is representable as a small integer */ 1397 1.1 mrg mp_sign sz = MP_SIGN(z); 1398 1.1 mrg if ((sz == MP_ZPOS && mp_int_compare_value(z, MP_SMALL_MAX) > 0) || 1399 1.1 mrg mp_int_compare_value(z, MP_SMALL_MIN) < 0) { 1400 1.1 mrg return MP_RANGE; 1401 1.1 mrg } 1402 1.1 mrg 1403 1.1 mrg mp_usmall uz = MP_USED(z); 1404 1.1 mrg mp_digit *dz = MP_DIGITS(z) + uz - 1; 1405 1.1 mrg mp_small uv = 0; 1406 1.1 mrg while (uz > 0) { 1407 1.1 mrg uv <<= MP_DIGIT_BIT / 2; 1408 1.1 mrg uv = (uv << (MP_DIGIT_BIT / 2)) | *dz--; 1409 1.1 mrg --uz; 1410 1.1 mrg } 1411 1.1 mrg 1412 1.1 mrg if (out) *out = (mp_small)((sz == MP_NEG) ? -uv : uv); 1413 1.1 mrg 1414 1.1 mrg return MP_OK; 1415 1.1 mrg } 1416 1.1 mrg 1417 1.1 mrg mp_result mp_int_to_uint(mp_int z, mp_usmall *out) { 1418 1.1 mrg assert(z != NULL); 1419 1.1 mrg 1420 1.1 mrg /* Make sure the value is representable as an unsigned small integer */ 1421 1.1 mrg mp_size sz = MP_SIGN(z); 1422 1.1 mrg if (sz == MP_NEG || mp_int_compare_uvalue(z, MP_USMALL_MAX) > 0) { 1423 1.1 mrg return MP_RANGE; 1424 1.1 mrg } 1425 1.1 mrg 1426 1.1 mrg mp_size uz = MP_USED(z); 1427 1.1 mrg mp_digit *dz = MP_DIGITS(z) + uz - 1; 1428 1.1 mrg mp_usmall uv = 0; 1429 1.1 mrg 1430 1.1 mrg while (uz > 0) { 1431 1.1 mrg uv <<= MP_DIGIT_BIT / 2; 1432 1.1 mrg uv = (uv << (MP_DIGIT_BIT / 2)) | *dz--; 1433 1.1 mrg --uz; 1434 1.1 mrg } 1435 1.1 mrg 1436 1.1 mrg if (out) *out = uv; 1437 1.1 mrg 1438 1.1 mrg return MP_OK; 1439 1.1 mrg } 1440 1.1 mrg 1441 1.1 mrg mp_result mp_int_to_string(mp_int z, mp_size radix, char *str, int limit) { 1442 1.1 mrg assert(z != NULL && str != NULL && limit >= 2); 1443 1.1 mrg assert(radix >= MP_MIN_RADIX && radix <= MP_MAX_RADIX); 1444 1.1 mrg 1445 1.1 mrg int cmp = 0; 1446 1.1 mrg if (CMPZ(z) == 0) { 1447 1.1 mrg *str++ = s_val2ch(0, 1); 1448 1.1 mrg } else { 1449 1.1 mrg mp_result res; 1450 1.1 mrg mpz_t tmp; 1451 1.1 mrg char *h, *t; 1452 1.1 mrg 1453 1.1 mrg if ((res = mp_int_init_copy(&tmp, z)) != MP_OK) return res; 1454 1.1 mrg 1455 1.1 mrg if (MP_SIGN(z) == MP_NEG) { 1456 1.1 mrg *str++ = '-'; 1457 1.1 mrg --limit; 1458 1.1 mrg } 1459 1.1 mrg h = str; 1460 1.1 mrg 1461 1.1 mrg /* Generate digits in reverse order until finished or limit reached */ 1462 1.1 mrg for (/* */; limit > 0; --limit) { 1463 1.1 mrg mp_digit d; 1464 1.1 mrg 1465 1.1 mrg if ((cmp = CMPZ(&tmp)) == 0) break; 1466 1.1 mrg 1467 1.1 mrg d = s_ddiv(&tmp, (mp_digit)radix); 1468 1.1 mrg *str++ = s_val2ch(d, 1); 1469 1.1 mrg } 1470 1.1 mrg t = str - 1; 1471 1.1 mrg 1472 1.1 mrg /* Put digits back in correct output order */ 1473 1.1 mrg while (h < t) { 1474 1.1 mrg char tc = *h; 1475 1.1 mrg *h++ = *t; 1476 1.1 mrg *t-- = tc; 1477 1.1 mrg } 1478 1.1 mrg 1479 1.1 mrg mp_int_clear(&tmp); 1480 1.1 mrg } 1481 1.1 mrg 1482 1.1 mrg *str = '\0'; 1483 1.1 mrg if (cmp == 0) { 1484 1.1 mrg return MP_OK; 1485 1.1 mrg } else { 1486 1.1 mrg return MP_TRUNC; 1487 1.1 mrg } 1488 1.1 mrg } 1489 1.1 mrg 1490 1.1 mrg mp_result mp_int_string_len(mp_int z, mp_size radix) { 1491 1.1 mrg assert(z != NULL); 1492 1.1 mrg assert(radix >= MP_MIN_RADIX && radix <= MP_MAX_RADIX); 1493 1.1 mrg 1494 1.1 mrg int len = s_outlen(z, radix) + 1; /* for terminator */ 1495 1.1 mrg 1496 1.1 mrg /* Allow for sign marker on negatives */ 1497 1.1 mrg if (MP_SIGN(z) == MP_NEG) len += 1; 1498 1.1 mrg 1499 1.1 mrg return len; 1500 1.1 mrg } 1501 1.1 mrg 1502 1.1 mrg /* Read zero-terminated string into z */ 1503 1.1 mrg mp_result mp_int_read_string(mp_int z, mp_size radix, const char *str) { 1504 1.1 mrg return mp_int_read_cstring(z, radix, str, NULL); 1505 1.1 mrg } 1506 1.1 mrg 1507 1.1 mrg mp_result mp_int_read_cstring(mp_int z, mp_size radix, const char *str, 1508 1.1 mrg char **end) { 1509 1.1 mrg assert(z != NULL && str != NULL); 1510 1.1 mrg assert(radix >= MP_MIN_RADIX && radix <= MP_MAX_RADIX); 1511 1.1 mrg 1512 1.1 mrg /* Skip leading whitespace */ 1513 1.1 mrg while (isspace((unsigned char)*str)) ++str; 1514 1.1 mrg 1515 1.1 mrg /* Handle leading sign tag (+/-, positive default) */ 1516 1.1 mrg switch (*str) { 1517 1.1 mrg case '-': 1518 1.1 mrg z->sign = MP_NEG; 1519 1.1 mrg ++str; 1520 1.1 mrg break; 1521 1.1 mrg case '+': 1522 1.1 mrg ++str; /* fallthrough */ 1523 1.1 mrg default: 1524 1.1 mrg z->sign = MP_ZPOS; 1525 1.1 mrg break; 1526 1.1 mrg } 1527 1.1 mrg 1528 1.1 mrg /* Skip leading zeroes */ 1529 1.1 mrg int ch; 1530 1.1 mrg while ((ch = s_ch2val(*str, radix)) == 0) ++str; 1531 1.1 mrg 1532 1.1 mrg /* Make sure there is enough space for the value */ 1533 1.1 mrg if (!s_pad(z, s_inlen(strlen(str), radix))) return MP_MEMORY; 1534 1.1 mrg 1535 1.1 mrg z->used = 1; 1536 1.1 mrg z->digits[0] = 0; 1537 1.1 mrg 1538 1.1 mrg while (*str != '\0' && ((ch = s_ch2val(*str, radix)) >= 0)) { 1539 1.1 mrg s_dmul(z, (mp_digit)radix); 1540 1.1 mrg s_dadd(z, (mp_digit)ch); 1541 1.1 mrg ++str; 1542 1.1 mrg } 1543 1.1 mrg 1544 1.1 mrg CLAMP(z); 1545 1.1 mrg 1546 1.1 mrg /* Override sign for zero, even if negative specified. */ 1547 1.1 mrg if (CMPZ(z) == 0) z->sign = MP_ZPOS; 1548 1.1 mrg 1549 1.1 mrg if (end != NULL) *end = (char *)str; 1550 1.1 mrg 1551 1.1 mrg /* Return a truncation error if the string has unprocessed characters 1552 1.1 mrg remaining, so the caller can tell if the whole string was done */ 1553 1.1 mrg if (*str != '\0') { 1554 1.1 mrg return MP_TRUNC; 1555 1.1 mrg } else { 1556 1.1 mrg return MP_OK; 1557 1.1 mrg } 1558 1.1 mrg } 1559 1.1 mrg 1560 1.1 mrg mp_result mp_int_count_bits(mp_int z) { 1561 1.1 mrg assert(z != NULL); 1562 1.1 mrg 1563 1.1 mrg mp_size uz = MP_USED(z); 1564 1.1 mrg if (uz == 1 && z->digits[0] == 0) return 1; 1565 1.1 mrg 1566 1.1 mrg --uz; 1567 1.1 mrg mp_size nbits = uz * MP_DIGIT_BIT; 1568 1.1 mrg mp_digit d = z->digits[uz]; 1569 1.1 mrg 1570 1.1 mrg while (d != 0) { 1571 1.1 mrg d >>= 1; 1572 1.1 mrg ++nbits; 1573 1.1 mrg } 1574 1.1 mrg 1575 1.1 mrg return nbits; 1576 1.1 mrg } 1577 1.1 mrg 1578 1.1 mrg mp_result mp_int_to_binary(mp_int z, unsigned char *buf, int limit) { 1579 1.1 mrg static const int PAD_FOR_2C = 1; 1580 1.1 mrg 1581 1.1 mrg assert(z != NULL && buf != NULL); 1582 1.1 mrg 1583 1.1 mrg int limpos = limit; 1584 1.1 mrg mp_result res = s_tobin(z, buf, &limpos, PAD_FOR_2C); 1585 1.1 mrg 1586 1.1 mrg if (MP_SIGN(z) == MP_NEG) s_2comp(buf, limpos); 1587 1.1 mrg 1588 1.1 mrg return res; 1589 1.1 mrg } 1590 1.1 mrg 1591 1.1 mrg mp_result mp_int_read_binary(mp_int z, unsigned char *buf, int len) { 1592 1.1 mrg assert(z != NULL && buf != NULL && len > 0); 1593 1.1 mrg 1594 1.1 mrg /* Figure out how many digits are needed to represent this value */ 1595 1.1 mrg mp_size need = ((len * CHAR_BIT) + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT; 1596 1.1 mrg if (!s_pad(z, need)) return MP_MEMORY; 1597 1.1 mrg 1598 1.1 mrg mp_int_zero(z); 1599 1.1 mrg 1600 1.1 mrg /* If the high-order bit is set, take the 2's complement before reading the 1601 1.1 mrg value (it will be restored afterward) */ 1602 1.1 mrg if (buf[0] >> (CHAR_BIT - 1)) { 1603 1.1 mrg z->sign = MP_NEG; 1604 1.1 mrg s_2comp(buf, len); 1605 1.1 mrg } 1606 1.1 mrg 1607 1.1 mrg mp_digit *dz = MP_DIGITS(z); 1608 1.1 mrg unsigned char *tmp = buf; 1609 1.1 mrg for (int i = len; i > 0; --i, ++tmp) { 1610 1.1 mrg s_qmul(z, (mp_size)CHAR_BIT); 1611 1.1 mrg *dz |= *tmp; 1612 1.1 mrg } 1613 1.1 mrg 1614 1.1 mrg /* Restore 2's complement if we took it before */ 1615 1.1 mrg if (MP_SIGN(z) == MP_NEG) s_2comp(buf, len); 1616 1.1 mrg 1617 1.1 mrg return MP_OK; 1618 1.1 mrg } 1619 1.1 mrg 1620 1.1 mrg mp_result mp_int_binary_len(mp_int z) { 1621 1.1 mrg mp_result res = mp_int_count_bits(z); 1622 1.1 mrg if (res <= 0) return res; 1623 1.1 mrg 1624 1.1 mrg int bytes = mp_int_unsigned_len(z); 1625 1.1 mrg 1626 1.1 mrg /* If the highest-order bit falls exactly on a byte boundary, we need to pad 1627 1.1 mrg with an extra byte so that the sign will be read correctly when reading it 1628 1.1 mrg back in. */ 1629 1.1 mrg if (bytes * CHAR_BIT == res) ++bytes; 1630 1.1 mrg 1631 1.1 mrg return bytes; 1632 1.1 mrg } 1633 1.1 mrg 1634 1.1 mrg mp_result mp_int_to_unsigned(mp_int z, unsigned char *buf, int limit) { 1635 1.1 mrg static const int NO_PADDING = 0; 1636 1.1 mrg 1637 1.1 mrg assert(z != NULL && buf != NULL); 1638 1.1 mrg 1639 1.1 mrg return s_tobin(z, buf, &limit, NO_PADDING); 1640 1.1 mrg } 1641 1.1 mrg 1642 1.1 mrg mp_result mp_int_read_unsigned(mp_int z, unsigned char *buf, int len) { 1643 1.1 mrg assert(z != NULL && buf != NULL && len > 0); 1644 1.1 mrg 1645 1.1 mrg /* Figure out how many digits are needed to represent this value */ 1646 1.1 mrg mp_size need = ((len * CHAR_BIT) + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT; 1647 1.1 mrg if (!s_pad(z, need)) return MP_MEMORY; 1648 1.1 mrg 1649 1.1 mrg mp_int_zero(z); 1650 1.1 mrg 1651 1.1 mrg unsigned char *tmp = buf; 1652 1.1 mrg for (int i = len; i > 0; --i, ++tmp) { 1653 1.1 mrg (void)s_qmul(z, CHAR_BIT); 1654 1.1 mrg *MP_DIGITS(z) |= *tmp; 1655 1.1 mrg } 1656 1.1 mrg 1657 1.1 mrg return MP_OK; 1658 1.1 mrg } 1659 1.1 mrg 1660 1.1 mrg mp_result mp_int_unsigned_len(mp_int z) { 1661 1.1 mrg mp_result res = mp_int_count_bits(z); 1662 1.1 mrg if (res <= 0) return res; 1663 1.1 mrg 1664 1.1 mrg int bytes = (res + (CHAR_BIT - 1)) / CHAR_BIT; 1665 1.1 mrg return bytes; 1666 1.1 mrg } 1667 1.1 mrg 1668 1.1 mrg const char *mp_error_string(mp_result res) { 1669 1.1 mrg if (res > 0) return s_unknown_err; 1670 1.1 mrg 1671 1.1 mrg res = -res; 1672 1.1 mrg int ix; 1673 1.1 mrg for (ix = 0; ix < res && s_error_msg[ix] != NULL; ++ix) 1674 1.1 mrg ; 1675 1.1 mrg 1676 1.1 mrg if (s_error_msg[ix] != NULL) { 1677 1.1 mrg return s_error_msg[ix]; 1678 1.1 mrg } else { 1679 1.1 mrg return s_unknown_err; 1680 1.1 mrg } 1681 1.1 mrg } 1682 1.1 mrg 1683 1.1 mrg /*------------------------------------------------------------------------*/ 1684 1.1 mrg /* Private functions for internal use. These make assumptions. */ 1685 1.1 mrg 1686 1.1 mrg #if DEBUG 1687 1.1 mrg static const mp_digit fill = (mp_digit)0xdeadbeefabad1dea; 1688 1.1 mrg #endif 1689 1.1 mrg 1690 1.1 mrg static mp_digit *s_alloc(mp_size num) { 1691 1.1 mrg mp_digit *out = malloc(num * sizeof(mp_digit)); 1692 1.1 mrg assert(out != NULL); 1693 1.1 mrg 1694 1.1 mrg #if DEBUG 1695 1.1 mrg for (mp_size ix = 0; ix < num; ++ix) out[ix] = fill; 1696 1.1 mrg #endif 1697 1.1 mrg return out; 1698 1.1 mrg } 1699 1.1 mrg 1700 1.1 mrg static mp_digit *s_realloc(mp_digit *old, mp_size osize, mp_size nsize) { 1701 1.1 mrg #if DEBUG 1702 1.1 mrg mp_digit *new = s_alloc(nsize); 1703 1.1 mrg assert(new != NULL); 1704 1.1 mrg 1705 1.1 mrg for (mp_size ix = 0; ix < nsize; ++ix) new[ix] = fill; 1706 1.1 mrg memcpy(new, old, osize * sizeof(mp_digit)); 1707 1.1 mrg #else 1708 1.1 mrg mp_digit *new = realloc(old, nsize * sizeof(mp_digit)); 1709 1.1 mrg assert(new != NULL); 1710 1.1 mrg #endif 1711 1.1 mrg 1712 1.1 mrg return new; 1713 1.1 mrg } 1714 1.1 mrg 1715 1.1 mrg static void s_free(void *ptr) { free(ptr); } 1716 1.1 mrg 1717 1.1 mrg static bool s_pad(mp_int z, mp_size min) { 1718 1.1 mrg if (MP_ALLOC(z) < min) { 1719 1.1 mrg mp_size nsize = s_round_prec(min); 1720 1.1 mrg mp_digit *tmp; 1721 1.1 mrg 1722 1.1 mrg if (z->digits == &(z->single)) { 1723 1.1 mrg if ((tmp = s_alloc(nsize)) == NULL) return false; 1724 1.1 mrg tmp[0] = z->single; 1725 1.1 mrg } else if ((tmp = s_realloc(MP_DIGITS(z), MP_ALLOC(z), nsize)) == NULL) { 1726 1.1 mrg return false; 1727 1.1 mrg } 1728 1.1 mrg 1729 1.1 mrg z->digits = tmp; 1730 1.1 mrg z->alloc = nsize; 1731 1.1 mrg } 1732 1.1 mrg 1733 1.1 mrg return true; 1734 1.1 mrg } 1735 1.1 mrg 1736 1.1 mrg /* Note: This will not work correctly when value == MP_SMALL_MIN */ 1737 1.1 mrg static void s_fake(mp_int z, mp_small value, mp_digit vbuf[]) { 1738 1.1 mrg mp_usmall uv = (mp_usmall)(value < 0) ? -value : value; 1739 1.1 mrg s_ufake(z, uv, vbuf); 1740 1.1 mrg if (value < 0) z->sign = MP_NEG; 1741 1.1 mrg } 1742 1.1 mrg 1743 1.1 mrg static void s_ufake(mp_int z, mp_usmall value, mp_digit vbuf[]) { 1744 1.1 mrg mp_size ndig = (mp_size)s_uvpack(value, vbuf); 1745 1.1 mrg 1746 1.1 mrg z->used = ndig; 1747 1.1 mrg z->alloc = MP_VALUE_DIGITS(value); 1748 1.1 mrg z->sign = MP_ZPOS; 1749 1.1 mrg z->digits = vbuf; 1750 1.1 mrg } 1751 1.1 mrg 1752 1.1 mrg static int s_cdig(mp_digit *da, mp_digit *db, mp_size len) { 1753 1.1 mrg mp_digit *dat = da + len - 1, *dbt = db + len - 1; 1754 1.1 mrg 1755 1.1 mrg for (/* */; len != 0; --len, --dat, --dbt) { 1756 1.1 mrg if (*dat > *dbt) { 1757 1.1 mrg return 1; 1758 1.1 mrg } else if (*dat < *dbt) { 1759 1.1 mrg return -1; 1760 1.1 mrg } 1761 1.1 mrg } 1762 1.1 mrg 1763 1.1 mrg return 0; 1764 1.1 mrg } 1765 1.1 mrg 1766 1.1 mrg static int s_uvpack(mp_usmall uv, mp_digit t[]) { 1767 1.1 mrg int ndig = 0; 1768 1.1 mrg 1769 1.1 mrg if (uv == 0) 1770 1.1 mrg t[ndig++] = 0; 1771 1.1 mrg else { 1772 1.1 mrg while (uv != 0) { 1773 1.1 mrg t[ndig++] = (mp_digit)uv; 1774 1.1 mrg uv >>= MP_DIGIT_BIT / 2; 1775 1.1 mrg uv >>= MP_DIGIT_BIT / 2; 1776 1.1 mrg } 1777 1.1 mrg } 1778 1.1 mrg 1779 1.1 mrg return ndig; 1780 1.1 mrg } 1781 1.1 mrg 1782 1.1 mrg static int s_ucmp(mp_int a, mp_int b) { 1783 1.1 mrg mp_size ua = MP_USED(a), ub = MP_USED(b); 1784 1.1 mrg 1785 1.1 mrg if (ua > ub) { 1786 1.1 mrg return 1; 1787 1.1 mrg } else if (ub > ua) { 1788 1.1 mrg return -1; 1789 1.1 mrg } else { 1790 1.1 mrg return s_cdig(MP_DIGITS(a), MP_DIGITS(b), ua); 1791 1.1 mrg } 1792 1.1 mrg } 1793 1.1 mrg 1794 1.1 mrg static int s_vcmp(mp_int a, mp_small v) { 1795 1.1 mrg mp_usmall uv = (v < 0) ? -(mp_usmall)v : (mp_usmall)v; 1796 1.1 mrg return s_uvcmp(a, uv); 1797 1.1 mrg } 1798 1.1 mrg 1799 1.1 mrg static int s_uvcmp(mp_int a, mp_usmall uv) { 1800 1.1 mrg mpz_t vtmp; 1801 1.1 mrg mp_digit vdig[MP_VALUE_DIGITS(uv)]; 1802 1.1 mrg 1803 1.1 mrg s_ufake(&vtmp, uv, vdig); 1804 1.1 mrg return s_ucmp(a, &vtmp); 1805 1.1 mrg } 1806 1.1 mrg 1807 1.1 mrg static mp_digit s_uadd(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 1808 1.1 mrg mp_size size_b) { 1809 1.1 mrg mp_size pos; 1810 1.1 mrg mp_word w = 0; 1811 1.1 mrg 1812 1.1 mrg /* Insure that da is the longer of the two to simplify later code */ 1813 1.1 mrg if (size_b > size_a) { 1814 1.1 mrg SWAP(mp_digit *, da, db); 1815 1.1 mrg SWAP(mp_size, size_a, size_b); 1816 1.1 mrg } 1817 1.1 mrg 1818 1.1 mrg /* Add corresponding digits until the shorter number runs out */ 1819 1.1 mrg for (pos = 0; pos < size_b; ++pos, ++da, ++db, ++dc) { 1820 1.1 mrg w = w + (mp_word)*da + (mp_word)*db; 1821 1.1 mrg *dc = LOWER_HALF(w); 1822 1.1 mrg w = UPPER_HALF(w); 1823 1.1 mrg } 1824 1.1 mrg 1825 1.1 mrg /* Propagate carries as far as necessary */ 1826 1.1 mrg for (/* */; pos < size_a; ++pos, ++da, ++dc) { 1827 1.1 mrg w = w + *da; 1828 1.1 mrg 1829 1.1 mrg *dc = LOWER_HALF(w); 1830 1.1 mrg w = UPPER_HALF(w); 1831 1.1 mrg } 1832 1.1 mrg 1833 1.1 mrg /* Return carry out */ 1834 1.1 mrg return (mp_digit)w; 1835 1.1 mrg } 1836 1.1 mrg 1837 1.1 mrg static void s_usub(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 1838 1.1 mrg mp_size size_b) { 1839 1.1 mrg mp_size pos; 1840 1.1 mrg mp_word w = 0; 1841 1.1 mrg 1842 1.1 mrg /* We assume that |a| >= |b| so this should definitely hold */ 1843 1.1 mrg assert(size_a >= size_b); 1844 1.1 mrg 1845 1.1 mrg /* Subtract corresponding digits and propagate borrow */ 1846 1.1 mrg for (pos = 0; pos < size_b; ++pos, ++da, ++db, ++dc) { 1847 1.1 mrg w = ((mp_word)MP_DIGIT_MAX + 1 + /* MP_RADIX */ 1848 1.1 mrg (mp_word)*da) - 1849 1.1 mrg w - (mp_word)*db; 1850 1.1 mrg 1851 1.1 mrg *dc = LOWER_HALF(w); 1852 1.1 mrg w = (UPPER_HALF(w) == 0); 1853 1.1 mrg } 1854 1.1 mrg 1855 1.1 mrg /* Finish the subtraction for remaining upper digits of da */ 1856 1.1 mrg for (/* */; pos < size_a; ++pos, ++da, ++dc) { 1857 1.1 mrg w = ((mp_word)MP_DIGIT_MAX + 1 + /* MP_RADIX */ 1858 1.1 mrg (mp_word)*da) - 1859 1.1 mrg w; 1860 1.1 mrg 1861 1.1 mrg *dc = LOWER_HALF(w); 1862 1.1 mrg w = (UPPER_HALF(w) == 0); 1863 1.1 mrg } 1864 1.1 mrg 1865 1.1 mrg /* If there is a borrow out at the end, it violates the precondition */ 1866 1.1 mrg assert(w == 0); 1867 1.1 mrg } 1868 1.1 mrg 1869 1.1 mrg static int s_kmul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 1870 1.1 mrg mp_size size_b) { 1871 1.1 mrg mp_size bot_size; 1872 1.1 mrg 1873 1.1 mrg /* Make sure b is the smaller of the two input values */ 1874 1.1 mrg if (size_b > size_a) { 1875 1.1 mrg SWAP(mp_digit *, da, db); 1876 1.1 mrg SWAP(mp_size, size_a, size_b); 1877 1.1 mrg } 1878 1.1 mrg 1879 1.1 mrg /* Insure that the bottom is the larger half in an odd-length split; the code 1880 1.1 mrg below relies on this being true. 1881 1.1 mrg */ 1882 1.1 mrg bot_size = (size_a + 1) / 2; 1883 1.1 mrg 1884 1.1 mrg /* If the values are big enough to bother with recursion, use the Karatsuba 1885 1.1 mrg algorithm to compute the product; otherwise use the normal multiplication 1886 1.1 mrg algorithm 1887 1.1 mrg */ 1888 1.1 mrg if (multiply_threshold && size_a >= multiply_threshold && size_b > bot_size) { 1889 1.1 mrg mp_digit *t1, *t2, *t3, carry; 1890 1.1 mrg 1891 1.1 mrg mp_digit *a_top = da + bot_size; 1892 1.1 mrg mp_digit *b_top = db + bot_size; 1893 1.1 mrg 1894 1.1 mrg mp_size at_size = size_a - bot_size; 1895 1.1 mrg mp_size bt_size = size_b - bot_size; 1896 1.1 mrg mp_size buf_size = 2 * bot_size; 1897 1.1 mrg 1898 1.1 mrg /* Do a single allocation for all three temporary buffers needed; each 1899 1.1 mrg buffer must be big enough to hold the product of two bottom halves, and 1900 1.1 mrg one buffer needs space for the completed product; twice the space is 1901 1.1 mrg plenty. 1902 1.1 mrg */ 1903 1.1 mrg if ((t1 = s_alloc(4 * buf_size)) == NULL) return 0; 1904 1.1 mrg t2 = t1 + buf_size; 1905 1.1 mrg t3 = t2 + buf_size; 1906 1.1 mrg ZERO(t1, 4 * buf_size); 1907 1.1 mrg 1908 1.1 mrg /* t1 and t2 are initially used as temporaries to compute the inner product 1909 1.1 mrg (a1 + a0)(b1 + b0) = a1b1 + a1b0 + a0b1 + a0b0 1910 1.1 mrg */ 1911 1.1 mrg carry = s_uadd(da, a_top, t1, bot_size, at_size); /* t1 = a1 + a0 */ 1912 1.1 mrg t1[bot_size] = carry; 1913 1.1 mrg 1914 1.1 mrg carry = s_uadd(db, b_top, t2, bot_size, bt_size); /* t2 = b1 + b0 */ 1915 1.1 mrg t2[bot_size] = carry; 1916 1.1 mrg 1917 1.1 mrg (void)s_kmul(t1, t2, t3, bot_size + 1, bot_size + 1); /* t3 = t1 * t2 */ 1918 1.1 mrg 1919 1.1 mrg /* Now we'll get t1 = a0b0 and t2 = a1b1, and subtract them out so that 1920 1.1 mrg we're left with only the pieces we want: t3 = a1b0 + a0b1 1921 1.1 mrg */ 1922 1.1 mrg ZERO(t1, buf_size); 1923 1.1 mrg ZERO(t2, buf_size); 1924 1.1 mrg (void)s_kmul(da, db, t1, bot_size, bot_size); /* t1 = a0 * b0 */ 1925 1.1 mrg (void)s_kmul(a_top, b_top, t2, at_size, bt_size); /* t2 = a1 * b1 */ 1926 1.1 mrg 1927 1.1 mrg /* Subtract out t1 and t2 to get the inner product */ 1928 1.1 mrg s_usub(t3, t1, t3, buf_size + 2, buf_size); 1929 1.1 mrg s_usub(t3, t2, t3, buf_size + 2, buf_size); 1930 1.1 mrg 1931 1.1 mrg /* Assemble the output value */ 1932 1.1 mrg COPY(t1, dc, buf_size); 1933 1.1 mrg carry = s_uadd(t3, dc + bot_size, dc + bot_size, buf_size + 1, buf_size); 1934 1.1 mrg assert(carry == 0); 1935 1.1 mrg 1936 1.1 mrg carry = 1937 1.1 mrg s_uadd(t2, dc + 2 * bot_size, dc + 2 * bot_size, buf_size, buf_size); 1938 1.1 mrg assert(carry == 0); 1939 1.1 mrg 1940 1.1 mrg s_free(t1); /* note t2 and t3 are just internal pointers to t1 */ 1941 1.1 mrg } else { 1942 1.1 mrg s_umul(da, db, dc, size_a, size_b); 1943 1.1 mrg } 1944 1.1 mrg 1945 1.1 mrg return 1; 1946 1.1 mrg } 1947 1.1 mrg 1948 1.1 mrg static void s_umul(mp_digit *da, mp_digit *db, mp_digit *dc, mp_size size_a, 1949 1.1 mrg mp_size size_b) { 1950 1.1 mrg mp_size a, b; 1951 1.1 mrg mp_word w; 1952 1.1 mrg 1953 1.1 mrg for (a = 0; a < size_a; ++a, ++dc, ++da) { 1954 1.1 mrg mp_digit *dct = dc; 1955 1.1 mrg mp_digit *dbt = db; 1956 1.1 mrg 1957 1.1 mrg if (*da == 0) continue; 1958 1.1 mrg 1959 1.1 mrg w = 0; 1960 1.1 mrg for (b = 0; b < size_b; ++b, ++dbt, ++dct) { 1961 1.1 mrg w = (mp_word)*da * (mp_word)*dbt + w + (mp_word)*dct; 1962 1.1 mrg 1963 1.1 mrg *dct = LOWER_HALF(w); 1964 1.1 mrg w = UPPER_HALF(w); 1965 1.1 mrg } 1966 1.1 mrg 1967 1.1 mrg *dct = (mp_digit)w; 1968 1.1 mrg } 1969 1.1 mrg } 1970 1.1 mrg 1971 1.1 mrg static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a) { 1972 1.1 mrg if (multiply_threshold && size_a > multiply_threshold) { 1973 1.1 mrg mp_size bot_size = (size_a + 1) / 2; 1974 1.1 mrg mp_digit *a_top = da + bot_size; 1975 1.1 mrg mp_digit *t1, *t2, *t3, carry; 1976 1.1 mrg mp_size at_size = size_a - bot_size; 1977 1.1 mrg mp_size buf_size = 2 * bot_size; 1978 1.1 mrg 1979 1.1 mrg if ((t1 = s_alloc(4 * buf_size)) == NULL) return 0; 1980 1.1 mrg t2 = t1 + buf_size; 1981 1.1 mrg t3 = t2 + buf_size; 1982 1.1 mrg ZERO(t1, 4 * buf_size); 1983 1.1 mrg 1984 1.1 mrg (void)s_ksqr(da, t1, bot_size); /* t1 = a0 ^ 2 */ 1985 1.1 mrg (void)s_ksqr(a_top, t2, at_size); /* t2 = a1 ^ 2 */ 1986 1.1 mrg 1987 1.1 mrg (void)s_kmul(da, a_top, t3, bot_size, at_size); /* t3 = a0 * a1 */ 1988 1.1 mrg 1989 1.1 mrg /* Quick multiply t3 by 2, shifting left (can't overflow) */ 1990 1.1 mrg { 1991 1.1 mrg int i, top = bot_size + at_size; 1992 1.1 mrg mp_word w, save = 0; 1993 1.1 mrg 1994 1.1 mrg for (i = 0; i < top; ++i) { 1995 1.1 mrg w = t3[i]; 1996 1.1 mrg w = (w << 1) | save; 1997 1.1 mrg t3[i] = LOWER_HALF(w); 1998 1.1 mrg save = UPPER_HALF(w); 1999 1.1 mrg } 2000 1.1 mrg t3[i] = LOWER_HALF(save); 2001 1.1 mrg } 2002 1.1 mrg 2003 1.1 mrg /* Assemble the output value */ 2004 1.1 mrg COPY(t1, dc, 2 * bot_size); 2005 1.1 mrg carry = s_uadd(t3, dc + bot_size, dc + bot_size, buf_size + 1, buf_size); 2006 1.1 mrg assert(carry == 0); 2007 1.1 mrg 2008 1.1 mrg carry = 2009 1.1 mrg s_uadd(t2, dc + 2 * bot_size, dc + 2 * bot_size, buf_size, buf_size); 2010 1.1 mrg assert(carry == 0); 2011 1.1 mrg 2012 1.1 mrg s_free(t1); /* note that t2 and t2 are internal pointers only */ 2013 1.1 mrg 2014 1.1 mrg } else { 2015 1.1 mrg s_usqr(da, dc, size_a); 2016 1.1 mrg } 2017 1.1 mrg 2018 1.1 mrg return 1; 2019 1.1 mrg } 2020 1.1 mrg 2021 1.1 mrg static void s_usqr(mp_digit *da, mp_digit *dc, mp_size size_a) { 2022 1.1 mrg mp_size i, j; 2023 1.1 mrg mp_word w; 2024 1.1 mrg 2025 1.1 mrg for (i = 0; i < size_a; ++i, dc += 2, ++da) { 2026 1.1 mrg mp_digit *dct = dc, *dat = da; 2027 1.1 mrg 2028 1.1 mrg if (*da == 0) continue; 2029 1.1 mrg 2030 1.1 mrg /* Take care of the first digit, no rollover */ 2031 1.1 mrg w = (mp_word)*dat * (mp_word)*dat + (mp_word)*dct; 2032 1.1 mrg *dct = LOWER_HALF(w); 2033 1.1 mrg w = UPPER_HALF(w); 2034 1.1 mrg ++dat; 2035 1.1 mrg ++dct; 2036 1.1 mrg 2037 1.1 mrg for (j = i + 1; j < size_a; ++j, ++dat, ++dct) { 2038 1.1 mrg mp_word t = (mp_word)*da * (mp_word)*dat; 2039 1.1 mrg mp_word u = w + (mp_word)*dct, ov = 0; 2040 1.1 mrg 2041 1.1 mrg /* Check if doubling t will overflow a word */ 2042 1.1 mrg if (HIGH_BIT_SET(t)) ov = 1; 2043 1.1 mrg 2044 1.1 mrg w = t + t; 2045 1.1 mrg 2046 1.1 mrg /* Check if adding u to w will overflow a word */ 2047 1.1 mrg if (ADD_WILL_OVERFLOW(w, u)) ov = 1; 2048 1.1 mrg 2049 1.1 mrg w += u; 2050 1.1 mrg 2051 1.1 mrg *dct = LOWER_HALF(w); 2052 1.1 mrg w = UPPER_HALF(w); 2053 1.1 mrg if (ov) { 2054 1.1 mrg w += MP_DIGIT_MAX; /* MP_RADIX */ 2055 1.1 mrg ++w; 2056 1.1 mrg } 2057 1.1 mrg } 2058 1.1 mrg 2059 1.1 mrg w = w + *dct; 2060 1.1 mrg *dct = (mp_digit)w; 2061 1.1 mrg while ((w = UPPER_HALF(w)) != 0) { 2062 1.1 mrg ++dct; 2063 1.1 mrg w = w + *dct; 2064 1.1 mrg *dct = LOWER_HALF(w); 2065 1.1 mrg } 2066 1.1 mrg 2067 1.1 mrg assert(w == 0); 2068 1.1 mrg } 2069 1.1 mrg } 2070 1.1 mrg 2071 1.1 mrg static void s_dadd(mp_int a, mp_digit b) { 2072 1.1 mrg mp_word w = 0; 2073 1.1 mrg mp_digit *da = MP_DIGITS(a); 2074 1.1 mrg mp_size ua = MP_USED(a); 2075 1.1 mrg 2076 1.1 mrg w = (mp_word)*da + b; 2077 1.1 mrg *da++ = LOWER_HALF(w); 2078 1.1 mrg w = UPPER_HALF(w); 2079 1.1 mrg 2080 1.1 mrg for (ua -= 1; ua > 0; --ua, ++da) { 2081 1.1 mrg w = (mp_word)*da + w; 2082 1.1 mrg 2083 1.1 mrg *da = LOWER_HALF(w); 2084 1.1 mrg w = UPPER_HALF(w); 2085 1.1 mrg } 2086 1.1 mrg 2087 1.1 mrg if (w) { 2088 1.1 mrg *da = (mp_digit)w; 2089 1.1 mrg a->used += 1; 2090 1.1 mrg } 2091 1.1 mrg } 2092 1.1 mrg 2093 1.1 mrg static void s_dmul(mp_int a, mp_digit b) { 2094 1.1 mrg mp_word w = 0; 2095 1.1 mrg mp_digit *da = MP_DIGITS(a); 2096 1.1 mrg mp_size ua = MP_USED(a); 2097 1.1 mrg 2098 1.1 mrg while (ua > 0) { 2099 1.1 mrg w = (mp_word)*da * b + w; 2100 1.1 mrg *da++ = LOWER_HALF(w); 2101 1.1 mrg w = UPPER_HALF(w); 2102 1.1 mrg --ua; 2103 1.1 mrg } 2104 1.1 mrg 2105 1.1 mrg if (w) { 2106 1.1 mrg *da = (mp_digit)w; 2107 1.1 mrg a->used += 1; 2108 1.1 mrg } 2109 1.1 mrg } 2110 1.1 mrg 2111 1.1 mrg static void s_dbmul(mp_digit *da, mp_digit b, mp_digit *dc, mp_size size_a) { 2112 1.1 mrg mp_word w = 0; 2113 1.1 mrg 2114 1.1 mrg while (size_a > 0) { 2115 1.1 mrg w = (mp_word)*da++ * (mp_word)b + w; 2116 1.1 mrg 2117 1.1 mrg *dc++ = LOWER_HALF(w); 2118 1.1 mrg w = UPPER_HALF(w); 2119 1.1 mrg --size_a; 2120 1.1 mrg } 2121 1.1 mrg 2122 1.1 mrg if (w) *dc = LOWER_HALF(w); 2123 1.1 mrg } 2124 1.1 mrg 2125 1.1 mrg static mp_digit s_ddiv(mp_int a, mp_digit b) { 2126 1.1 mrg mp_word w = 0, qdigit; 2127 1.1 mrg mp_size ua = MP_USED(a); 2128 1.1 mrg mp_digit *da = MP_DIGITS(a) + ua - 1; 2129 1.1 mrg 2130 1.1 mrg for (/* */; ua > 0; --ua, --da) { 2131 1.1 mrg w = (w << MP_DIGIT_BIT) | *da; 2132 1.1 mrg 2133 1.1 mrg if (w >= b) { 2134 1.1 mrg qdigit = w / b; 2135 1.1 mrg w = w % b; 2136 1.1 mrg } else { 2137 1.1 mrg qdigit = 0; 2138 1.1 mrg } 2139 1.1 mrg 2140 1.1 mrg *da = (mp_digit)qdigit; 2141 1.1 mrg } 2142 1.1 mrg 2143 1.1 mrg CLAMP(a); 2144 1.1 mrg return (mp_digit)w; 2145 1.1 mrg } 2146 1.1 mrg 2147 1.1 mrg static void s_qdiv(mp_int z, mp_size p2) { 2148 1.1 mrg mp_size ndig = p2 / MP_DIGIT_BIT, nbits = p2 % MP_DIGIT_BIT; 2149 1.1 mrg mp_size uz = MP_USED(z); 2150 1.1 mrg 2151 1.1 mrg if (ndig) { 2152 1.1 mrg mp_size mark; 2153 1.1 mrg mp_digit *to, *from; 2154 1.1 mrg 2155 1.1 mrg if (ndig >= uz) { 2156 1.1 mrg mp_int_zero(z); 2157 1.1 mrg return; 2158 1.1 mrg } 2159 1.1 mrg 2160 1.1 mrg to = MP_DIGITS(z); 2161 1.1 mrg from = to + ndig; 2162 1.1 mrg 2163 1.1 mrg for (mark = ndig; mark < uz; ++mark) { 2164 1.1 mrg *to++ = *from++; 2165 1.1 mrg } 2166 1.1 mrg 2167 1.1 mrg z->used = uz - ndig; 2168 1.1 mrg } 2169 1.1 mrg 2170 1.1 mrg if (nbits) { 2171 1.1 mrg mp_digit d = 0, *dz, save; 2172 1.1 mrg mp_size up = MP_DIGIT_BIT - nbits; 2173 1.1 mrg 2174 1.1 mrg uz = MP_USED(z); 2175 1.1 mrg dz = MP_DIGITS(z) + uz - 1; 2176 1.1 mrg 2177 1.1 mrg for (/* */; uz > 0; --uz, --dz) { 2178 1.1 mrg save = *dz; 2179 1.1 mrg 2180 1.1 mrg *dz = (*dz >> nbits) | (d << up); 2181 1.1 mrg d = save; 2182 1.1 mrg } 2183 1.1 mrg 2184 1.1 mrg CLAMP(z); 2185 1.1 mrg } 2186 1.1 mrg 2187 1.1 mrg if (MP_USED(z) == 1 && z->digits[0] == 0) z->sign = MP_ZPOS; 2188 1.1 mrg } 2189 1.1 mrg 2190 1.1 mrg static void s_qmod(mp_int z, mp_size p2) { 2191 1.1 mrg mp_size start = p2 / MP_DIGIT_BIT + 1, rest = p2 % MP_DIGIT_BIT; 2192 1.1 mrg mp_size uz = MP_USED(z); 2193 1.1 mrg mp_digit mask = (1u << rest) - 1; 2194 1.1 mrg 2195 1.1 mrg if (start <= uz) { 2196 1.1 mrg z->used = start; 2197 1.1 mrg z->digits[start - 1] &= mask; 2198 1.1 mrg CLAMP(z); 2199 1.1 mrg } 2200 1.1 mrg } 2201 1.1 mrg 2202 1.1 mrg static int s_qmul(mp_int z, mp_size p2) { 2203 1.1 mrg mp_size uz, need, rest, extra, i; 2204 1.1 mrg mp_digit *from, *to, d; 2205 1.1 mrg 2206 1.1 mrg if (p2 == 0) return 1; 2207 1.1 mrg 2208 1.1 mrg uz = MP_USED(z); 2209 1.1 mrg need = p2 / MP_DIGIT_BIT; 2210 1.1 mrg rest = p2 % MP_DIGIT_BIT; 2211 1.1 mrg 2212 1.1 mrg /* Figure out if we need an extra digit at the top end; this occurs if the 2213 1.1 mrg topmost `rest' bits of the high-order digit of z are not zero, meaning 2214 1.1 mrg they will be shifted off the end if not preserved */ 2215 1.1 mrg extra = 0; 2216 1.1 mrg if (rest != 0) { 2217 1.1 mrg mp_digit *dz = MP_DIGITS(z) + uz - 1; 2218 1.1 mrg 2219 1.1 mrg if ((*dz >> (MP_DIGIT_BIT - rest)) != 0) extra = 1; 2220 1.1 mrg } 2221 1.1 mrg 2222 1.1 mrg if (!s_pad(z, uz + need + extra)) return 0; 2223 1.1 mrg 2224 1.1 mrg /* If we need to shift by whole digits, do that in one pass, then 2225 1.1 mrg to back and shift by partial digits. 2226 1.1 mrg */ 2227 1.1 mrg if (need > 0) { 2228 1.1 mrg from = MP_DIGITS(z) + uz - 1; 2229 1.1 mrg to = from + need; 2230 1.1 mrg 2231 1.1 mrg for (i = 0; i < uz; ++i) *to-- = *from--; 2232 1.1 mrg 2233 1.1 mrg ZERO(MP_DIGITS(z), need); 2234 1.1 mrg uz += need; 2235 1.1 mrg } 2236 1.1 mrg 2237 1.1 mrg if (rest) { 2238 1.1 mrg d = 0; 2239 1.1 mrg for (i = need, from = MP_DIGITS(z) + need; i < uz; ++i, ++from) { 2240 1.1 mrg mp_digit save = *from; 2241 1.1 mrg 2242 1.1 mrg *from = (*from << rest) | (d >> (MP_DIGIT_BIT - rest)); 2243 1.1 mrg d = save; 2244 1.1 mrg } 2245 1.1 mrg 2246 1.1 mrg d >>= (MP_DIGIT_BIT - rest); 2247 1.1 mrg if (d != 0) { 2248 1.1 mrg *from = d; 2249 1.1 mrg uz += extra; 2250 1.1 mrg } 2251 1.1 mrg } 2252 1.1 mrg 2253 1.1 mrg z->used = uz; 2254 1.1 mrg CLAMP(z); 2255 1.1 mrg 2256 1.1 mrg return 1; 2257 1.1 mrg } 2258 1.1 mrg 2259 1.1 mrg /* Compute z = 2^p2 - |z|; requires that 2^p2 >= |z| 2260 1.1 mrg The sign of the result is always zero/positive. 2261 1.1 mrg */ 2262 1.1 mrg static int s_qsub(mp_int z, mp_size p2) { 2263 1.1 mrg mp_digit hi = (1u << (p2 % MP_DIGIT_BIT)), *zp; 2264 1.1 mrg mp_size tdig = (p2 / MP_DIGIT_BIT), pos; 2265 1.1 mrg mp_word w = 0; 2266 1.1 mrg 2267 1.1 mrg if (!s_pad(z, tdig + 1)) return 0; 2268 1.1 mrg 2269 1.1 mrg for (pos = 0, zp = MP_DIGITS(z); pos < tdig; ++pos, ++zp) { 2270 1.1 mrg w = ((mp_word)MP_DIGIT_MAX + 1) - w - (mp_word)*zp; 2271 1.1 mrg 2272 1.1 mrg *zp = LOWER_HALF(w); 2273 1.1 mrg w = UPPER_HALF(w) ? 0 : 1; 2274 1.1 mrg } 2275 1.1 mrg 2276 1.1 mrg w = ((mp_word)MP_DIGIT_MAX + 1 + hi) - w - (mp_word)*zp; 2277 1.1 mrg *zp = LOWER_HALF(w); 2278 1.1 mrg 2279 1.1 mrg assert(UPPER_HALF(w) != 0); /* no borrow out should be possible */ 2280 1.1 mrg 2281 1.1 mrg z->sign = MP_ZPOS; 2282 1.1 mrg CLAMP(z); 2283 1.1 mrg 2284 1.1 mrg return 1; 2285 1.1 mrg } 2286 1.1 mrg 2287 1.1 mrg static int s_dp2k(mp_int z) { 2288 1.1 mrg int k = 0; 2289 1.1 mrg mp_digit *dp = MP_DIGITS(z), d; 2290 1.1 mrg 2291 1.1 mrg if (MP_USED(z) == 1 && *dp == 0) return 1; 2292 1.1 mrg 2293 1.1 mrg while (*dp == 0) { 2294 1.1 mrg k += MP_DIGIT_BIT; 2295 1.1 mrg ++dp; 2296 1.1 mrg } 2297 1.1 mrg 2298 1.1 mrg d = *dp; 2299 1.1 mrg while ((d & 1) == 0) { 2300 1.1 mrg d >>= 1; 2301 1.1 mrg ++k; 2302 1.1 mrg } 2303 1.1 mrg 2304 1.1 mrg return k; 2305 1.1 mrg } 2306 1.1 mrg 2307 1.1 mrg static int s_isp2(mp_int z) { 2308 1.1 mrg mp_size uz = MP_USED(z), k = 0; 2309 1.1 mrg mp_digit *dz = MP_DIGITS(z), d; 2310 1.1 mrg 2311 1.1 mrg while (uz > 1) { 2312 1.1 mrg if (*dz++ != 0) return -1; 2313 1.1 mrg k += MP_DIGIT_BIT; 2314 1.1 mrg --uz; 2315 1.1 mrg } 2316 1.1 mrg 2317 1.1 mrg d = *dz; 2318 1.1 mrg while (d > 1) { 2319 1.1 mrg if (d & 1) return -1; 2320 1.1 mrg ++k; 2321 1.1 mrg d >>= 1; 2322 1.1 mrg } 2323 1.1 mrg 2324 1.1 mrg return (int)k; 2325 1.1 mrg } 2326 1.1 mrg 2327 1.1 mrg static int s_2expt(mp_int z, mp_small k) { 2328 1.1 mrg mp_size ndig, rest; 2329 1.1 mrg mp_digit *dz; 2330 1.1 mrg 2331 1.1 mrg ndig = (k + MP_DIGIT_BIT) / MP_DIGIT_BIT; 2332 1.1 mrg rest = k % MP_DIGIT_BIT; 2333 1.1 mrg 2334 1.1 mrg if (!s_pad(z, ndig)) return 0; 2335 1.1 mrg 2336 1.1 mrg dz = MP_DIGITS(z); 2337 1.1 mrg ZERO(dz, ndig); 2338 1.1 mrg *(dz + ndig - 1) = (1u << rest); 2339 1.1 mrg z->used = ndig; 2340 1.1 mrg 2341 1.1 mrg return 1; 2342 1.1 mrg } 2343 1.1 mrg 2344 1.1 mrg static int s_norm(mp_int a, mp_int b) { 2345 1.1 mrg mp_digit d = b->digits[MP_USED(b) - 1]; 2346 1.1 mrg int k = 0; 2347 1.1 mrg 2348 1.1 mrg while (d < (1u << (mp_digit)(MP_DIGIT_BIT - 1))) { /* d < (MP_RADIX / 2) */ 2349 1.1 mrg d <<= 1; 2350 1.1 mrg ++k; 2351 1.1 mrg } 2352 1.1 mrg 2353 1.1 mrg /* These multiplications can't fail */ 2354 1.1 mrg if (k != 0) { 2355 1.1 mrg (void)s_qmul(a, (mp_size)k); 2356 1.1 mrg (void)s_qmul(b, (mp_size)k); 2357 1.1 mrg } 2358 1.1 mrg 2359 1.1 mrg return k; 2360 1.1 mrg } 2361 1.1 mrg 2362 1.1 mrg static mp_result s_brmu(mp_int z, mp_int m) { 2363 1.1 mrg mp_size um = MP_USED(m) * 2; 2364 1.1 mrg 2365 1.1 mrg if (!s_pad(z, um)) return MP_MEMORY; 2366 1.1 mrg 2367 1.1 mrg s_2expt(z, MP_DIGIT_BIT * um); 2368 1.1 mrg return mp_int_div(z, m, z, NULL); 2369 1.1 mrg } 2370 1.1 mrg 2371 1.1 mrg static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2) { 2372 1.1 mrg mp_size um = MP_USED(m), umb_p1, umb_m1; 2373 1.1 mrg 2374 1.1 mrg umb_p1 = (um + 1) * MP_DIGIT_BIT; 2375 1.1 mrg umb_m1 = (um - 1) * MP_DIGIT_BIT; 2376 1.1 mrg 2377 1.1 mrg if (mp_int_copy(x, q1) != MP_OK) return 0; 2378 1.1 mrg 2379 1.1 mrg /* Compute q2 = floor((floor(x / b^(k-1)) * mu) / b^(k+1)) */ 2380 1.1 mrg s_qdiv(q1, umb_m1); 2381 1.1 mrg UMUL(q1, mu, q2); 2382 1.1 mrg s_qdiv(q2, umb_p1); 2383 1.1 mrg 2384 1.1 mrg /* Set x = x mod b^(k+1) */ 2385 1.1 mrg s_qmod(x, umb_p1); 2386 1.1 mrg 2387 1.1 mrg /* Now, q is a guess for the quotient a / m. 2388 1.1 mrg Compute x - q * m mod b^(k+1), replacing x. This may be off 2389 1.1 mrg by a factor of 2m, but no more than that. 2390 1.1 mrg */ 2391 1.1 mrg UMUL(q2, m, q1); 2392 1.1 mrg s_qmod(q1, umb_p1); 2393 1.1 mrg (void)mp_int_sub(x, q1, x); /* can't fail */ 2394 1.1 mrg 2395 1.1 mrg /* The result may be < 0; if it is, add b^(k+1) to pin it in the proper 2396 1.1 mrg range. */ 2397 1.1 mrg if ((CMPZ(x) < 0) && !s_qsub(x, umb_p1)) return 0; 2398 1.1 mrg 2399 1.1 mrg /* If x > m, we need to back it off until it is in range. This will be 2400 1.1 mrg required at most twice. */ 2401 1.1 mrg if (mp_int_compare(x, m) >= 0) { 2402 1.1 mrg (void)mp_int_sub(x, m, x); 2403 1.1 mrg if (mp_int_compare(x, m) >= 0) { 2404 1.1 mrg (void)mp_int_sub(x, m, x); 2405 1.1 mrg } 2406 1.1 mrg } 2407 1.1 mrg 2408 1.1 mrg /* At this point, x has been properly reduced. */ 2409 1.1 mrg return 1; 2410 1.1 mrg } 2411 1.1 mrg 2412 1.1 mrg /* Perform modular exponentiation using Barrett's method, where mu is the 2413 1.1 mrg reduction constant for m. Assumes a < m, b > 0. */ 2414 1.1 mrg static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c) { 2415 1.1 mrg mp_digit umu = MP_USED(mu); 2416 1.1 mrg mp_digit *db = MP_DIGITS(b); 2417 1.1 mrg mp_digit *dbt = db + MP_USED(b) - 1; 2418 1.1 mrg 2419 1.1 mrg DECLARE_TEMP(3); 2420 1.1 mrg REQUIRE(GROW(TEMP(0), 4 * umu)); 2421 1.1 mrg REQUIRE(GROW(TEMP(1), 4 * umu)); 2422 1.1 mrg REQUIRE(GROW(TEMP(2), 4 * umu)); 2423 1.1 mrg ZERO(TEMP(0)->digits, TEMP(0)->alloc); 2424 1.1 mrg ZERO(TEMP(1)->digits, TEMP(1)->alloc); 2425 1.1 mrg ZERO(TEMP(2)->digits, TEMP(2)->alloc); 2426 1.1 mrg 2427 1.1 mrg (void)mp_int_set_value(c, 1); 2428 1.1 mrg 2429 1.1 mrg /* Take care of low-order digits */ 2430 1.1 mrg while (db < dbt) { 2431 1.1 mrg mp_digit d = *db; 2432 1.1 mrg 2433 1.1 mrg for (int i = MP_DIGIT_BIT; i > 0; --i, d >>= 1) { 2434 1.1 mrg if (d & 1) { 2435 1.1 mrg /* The use of a second temporary avoids allocation */ 2436 1.1 mrg UMUL(c, a, TEMP(0)); 2437 1.1 mrg if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { 2438 1.1 mrg REQUIRE(MP_MEMORY); 2439 1.1 mrg } 2440 1.1 mrg mp_int_copy(TEMP(0), c); 2441 1.1 mrg } 2442 1.1 mrg 2443 1.1 mrg USQR(a, TEMP(0)); 2444 1.1 mrg assert(MP_SIGN(TEMP(0)) == MP_ZPOS); 2445 1.1 mrg if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { 2446 1.1 mrg REQUIRE(MP_MEMORY); 2447 1.1 mrg } 2448 1.1 mrg assert(MP_SIGN(TEMP(0)) == MP_ZPOS); 2449 1.1 mrg mp_int_copy(TEMP(0), a); 2450 1.1 mrg } 2451 1.1 mrg 2452 1.1 mrg ++db; 2453 1.1 mrg } 2454 1.1 mrg 2455 1.1 mrg /* Take care of highest-order digit */ 2456 1.1 mrg mp_digit d = *dbt; 2457 1.1 mrg for (;;) { 2458 1.1 mrg if (d & 1) { 2459 1.1 mrg UMUL(c, a, TEMP(0)); 2460 1.1 mrg if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { 2461 1.1 mrg REQUIRE(MP_MEMORY); 2462 1.1 mrg } 2463 1.1 mrg mp_int_copy(TEMP(0), c); 2464 1.1 mrg } 2465 1.1 mrg 2466 1.1 mrg d >>= 1; 2467 1.1 mrg if (!d) break; 2468 1.1 mrg 2469 1.1 mrg USQR(a, TEMP(0)); 2470 1.1 mrg if (!s_reduce(TEMP(0), m, mu, TEMP(1), TEMP(2))) { 2471 1.1 mrg REQUIRE(MP_MEMORY); 2472 1.1 mrg } 2473 1.1 mrg (void)mp_int_copy(TEMP(0), a); 2474 1.1 mrg } 2475 1.1 mrg 2476 1.1 mrg CLEANUP_TEMP(); 2477 1.1 mrg return MP_OK; 2478 1.1 mrg } 2479 1.1 mrg 2480 1.1 mrg /* Division of nonnegative integers 2481 1.1 mrg 2482 1.1 mrg This function implements division algorithm for unsigned multi-precision 2483 1.1 mrg integers. The algorithm is based on Algorithm D from Knuth's "The Art of 2484 1.1 mrg Computer Programming", 3rd ed. 1998, pg 272-273. 2485 1.1 mrg 2486 1.1 mrg We diverge from Knuth's algorithm in that we do not perform the subtraction 2487 1.1 mrg from the remainder until we have determined that we have the correct 2488 1.1 mrg quotient digit. This makes our algorithm less efficient that Knuth because 2489 1.1 mrg we might have to perform multiple multiplication and comparison steps before 2490 1.1 mrg the subtraction. The advantage is that it is easy to implement and ensure 2491 1.1 mrg correctness without worrying about underflow from the subtraction. 2492 1.1 mrg 2493 1.1 mrg inputs: u a n+m digit integer in base b (b is 2^MP_DIGIT_BIT) 2494 1.1 mrg v a n digit integer in base b (b is 2^MP_DIGIT_BIT) 2495 1.1 mrg n >= 1 2496 1.1 mrg m >= 0 2497 1.1 mrg outputs: u / v stored in u 2498 1.1 mrg u % v stored in v 2499 1.1 mrg */ 2500 1.1 mrg static mp_result s_udiv_knuth(mp_int u, mp_int v) { 2501 1.1 mrg /* Force signs to positive */ 2502 1.1 mrg u->sign = MP_ZPOS; 2503 1.1 mrg v->sign = MP_ZPOS; 2504 1.1 mrg 2505 1.1 mrg /* Use simple division algorithm when v is only one digit long */ 2506 1.1 mrg if (MP_USED(v) == 1) { 2507 1.1 mrg mp_digit d, rem; 2508 1.1 mrg d = v->digits[0]; 2509 1.1 mrg rem = s_ddiv(u, d); 2510 1.1 mrg mp_int_set_value(v, rem); 2511 1.1 mrg return MP_OK; 2512 1.1 mrg } 2513 1.1 mrg 2514 1.1 mrg /* Algorithm D 2515 1.1 mrg 2516 1.1 mrg The n and m variables are defined as used by Knuth. 2517 1.1 mrg u is an n digit number with digits u_{n-1}..u_0. 2518 1.1 mrg v is an n+m digit number with digits from v_{m+n-1}..v_0. 2519 1.1 mrg We require that n > 1 and m >= 0 2520 1.1 mrg */ 2521 1.1 mrg mp_size n = MP_USED(v); 2522 1.1 mrg mp_size m = MP_USED(u) - n; 2523 1.1 mrg assert(n > 1); 2524 1.1 mrg /* assert(m >= 0) follows because m is unsigned. */ 2525 1.1 mrg 2526 1.1 mrg /* D1: Normalize. 2527 1.1 mrg The normalization step provides the necessary condition for Theorem B, 2528 1.1 mrg which states that the quotient estimate for q_j, call it qhat 2529 1.1 mrg 2530 1.1 mrg qhat = u_{j+n}u_{j+n-1} / v_{n-1} 2531 1.1 mrg 2532 1.1 mrg is bounded by 2533 1.1 mrg 2534 1.1 mrg qhat - 2 <= q_j <= qhat. 2535 1.1 mrg 2536 1.1 mrg That is, qhat is always greater than the actual quotient digit q, 2537 1.1 mrg and it is never more than two larger than the actual quotient digit. 2538 1.1 mrg */ 2539 1.1 mrg int k = s_norm(u, v); 2540 1.1 mrg 2541 1.1 mrg /* Extend size of u by one if needed. 2542 1.1 mrg 2543 1.1 mrg The algorithm begins with a value of u that has one more digit of input. 2544 1.1 mrg The normalization step sets u_{m+n}..u_0 = 2^k * u_{m+n-1}..u_0. If the 2545 1.1 mrg multiplication did not increase the number of digits of u, we need to add 2546 1.1 mrg a leading zero here. 2547 1.1 mrg */ 2548 1.1 mrg if (k == 0 || MP_USED(u) != m + n + 1) { 2549 1.1 mrg if (!s_pad(u, m + n + 1)) return MP_MEMORY; 2550 1.1 mrg u->digits[m + n] = 0; 2551 1.1 mrg u->used = m + n + 1; 2552 1.1 mrg } 2553 1.1 mrg 2554 1.1 mrg /* Add a leading 0 to v. 2555 1.1 mrg 2556 1.1 mrg The multiplication in step D4 multiplies qhat * 0v_{n-1}..v_0. We need to 2557 1.1 mrg add the leading zero to v here to ensure that the multiplication will 2558 1.1 mrg produce the full n+1 digit result. 2559 1.1 mrg */ 2560 1.1 mrg if (!s_pad(v, n + 1)) return MP_MEMORY; 2561 1.1 mrg v->digits[n] = 0; 2562 1.1 mrg 2563 1.1 mrg /* Initialize temporary variables q and t. 2564 1.1 mrg q allocates space for m+1 digits to store the quotient digits 2565 1.1 mrg t allocates space for n+1 digits to hold the result of q_j*v 2566 1.1 mrg */ 2567 1.1 mrg DECLARE_TEMP(2); 2568 1.1 mrg REQUIRE(GROW(TEMP(0), m + 1)); 2569 1.1 mrg REQUIRE(GROW(TEMP(1), n + 1)); 2570 1.1 mrg 2571 1.1 mrg /* D2: Initialize j */ 2572 1.1 mrg int j = m; 2573 1.1 mrg mpz_t r; 2574 1.1 mrg r.digits = MP_DIGITS(u) + j; /* The contents of r are shared with u */ 2575 1.1 mrg r.used = n + 1; 2576 1.1 mrg r.sign = MP_ZPOS; 2577 1.1 mrg r.alloc = MP_ALLOC(u); 2578 1.1 mrg ZERO(TEMP(1)->digits, TEMP(1)->alloc); 2579 1.1 mrg 2580 1.1 mrg /* Calculate the m+1 digits of the quotient result */ 2581 1.1 mrg for (; j >= 0; j--) { 2582 1.1 mrg /* D3: Calculate q' */ 2583 1.1 mrg /* r->digits is aligned to position j of the number u */ 2584 1.1 mrg mp_word pfx, qhat; 2585 1.1 mrg pfx = r.digits[n]; 2586 1.1 mrg pfx <<= MP_DIGIT_BIT / 2; 2587 1.1 mrg pfx <<= MP_DIGIT_BIT / 2; 2588 1.1 mrg pfx |= r.digits[n - 1]; /* pfx = u_{j+n}{j+n-1} */ 2589 1.1 mrg 2590 1.1 mrg qhat = pfx / v->digits[n - 1]; 2591 1.1 mrg /* Check to see if qhat > b, and decrease qhat if so. 2592 1.1 mrg Theorem B guarantess that qhat is at most 2 larger than the 2593 1.1 mrg actual value, so it is possible that qhat is greater than 2594 1.1 mrg the maximum value that will fit in a digit */ 2595 1.1 mrg if (qhat > MP_DIGIT_MAX) qhat = MP_DIGIT_MAX; 2596 1.1 mrg 2597 1.1 mrg /* D4,D5,D6: Multiply qhat * v and test for a correct value of q 2598 1.1 mrg 2599 1.1 mrg We proceed a bit different than the way described by Knuth. This way is 2600 1.1 mrg simpler but less efficent. Instead of doing the multiply and subtract 2601 1.1 mrg then checking for underflow, we first do the multiply of qhat * v and 2602 1.1 mrg see if it is larger than the current remainder r. If it is larger, we 2603 1.1 mrg decrease qhat by one and try again. We may need to decrease qhat one 2604 1.1 mrg more time before we get a value that is smaller than r. 2605 1.1 mrg 2606 1.1 mrg This way is less efficent than Knuth because we do more multiplies, but 2607 1.1 mrg we do not need to worry about underflow this way. 2608 1.1 mrg */ 2609 1.1 mrg /* t = qhat * v */ 2610 1.1 mrg s_dbmul(MP_DIGITS(v), (mp_digit)qhat, TEMP(1)->digits, n + 1); 2611 1.1 mrg TEMP(1)->used = n + 1; 2612 1.1 mrg CLAMP(TEMP(1)); 2613 1.1 mrg 2614 1.1 mrg /* Clamp r for the comparison. Comparisons do not like leading zeros. */ 2615 1.1 mrg CLAMP(&r); 2616 1.1 mrg if (s_ucmp(TEMP(1), &r) > 0) { /* would the remainder be negative? */ 2617 1.1 mrg qhat -= 1; /* try a smaller q */ 2618 1.1 mrg s_dbmul(MP_DIGITS(v), (mp_digit)qhat, TEMP(1)->digits, n + 1); 2619 1.1 mrg TEMP(1)->used = n + 1; 2620 1.1 mrg CLAMP(TEMP(1)); 2621 1.1 mrg if (s_ucmp(TEMP(1), &r) > 0) { /* would the remainder be negative? */ 2622 1.1 mrg assert(qhat > 0); 2623 1.1 mrg qhat -= 1; /* try a smaller q */ 2624 1.1 mrg s_dbmul(MP_DIGITS(v), (mp_digit)qhat, TEMP(1)->digits, n + 1); 2625 1.1 mrg TEMP(1)->used = n + 1; 2626 1.1 mrg CLAMP(TEMP(1)); 2627 1.1 mrg } 2628 1.1 mrg assert(s_ucmp(TEMP(1), &r) <= 0 && "The mathematics failed us."); 2629 1.1 mrg } 2630 1.1 mrg /* Unclamp r. The D algorithm expects r = u_{j+n}..u_j to always be n+1 2631 1.1 mrg digits long. */ 2632 1.1 mrg r.used = n + 1; 2633 1.1 mrg 2634 1.1 mrg /* D4: Multiply and subtract 2635 1.1 mrg 2636 1.1 mrg Note: The multiply was completed above so we only need to subtract here. 2637 1.1 mrg */ 2638 1.1 mrg s_usub(r.digits, TEMP(1)->digits, r.digits, r.used, TEMP(1)->used); 2639 1.1 mrg 2640 1.1 mrg /* D5: Test remainder 2641 1.1 mrg 2642 1.1 mrg Note: Not needed because we always check that qhat is the correct value 2643 1.1 mrg before performing the subtract. Value cast to mp_digit to prevent 2644 1.1 mrg warning, qhat has been clamped to MP_DIGIT_MAX 2645 1.1 mrg */ 2646 1.1 mrg TEMP(0)->digits[j] = (mp_digit)qhat; 2647 1.1 mrg 2648 1.1 mrg /* D6: Add back 2649 1.1 mrg Note: Not needed because we always check that qhat is the correct value 2650 1.1 mrg before performing the subtract. 2651 1.1 mrg */ 2652 1.1 mrg 2653 1.1 mrg /* D7: Loop on j */ 2654 1.1 mrg r.digits--; 2655 1.1 mrg ZERO(TEMP(1)->digits, TEMP(1)->alloc); 2656 1.1 mrg } 2657 1.1 mrg 2658 1.1 mrg /* Get rid of leading zeros in q */ 2659 1.1 mrg TEMP(0)->used = m + 1; 2660 1.1 mrg CLAMP(TEMP(0)); 2661 1.1 mrg 2662 1.1 mrg /* Denormalize the remainder */ 2663 1.1 mrg CLAMP(u); /* use u here because the r.digits pointer is off-by-one */ 2664 1.1 mrg if (k != 0) s_qdiv(u, k); 2665 1.1 mrg 2666 1.1 mrg mp_int_copy(u, v); /* ok: 0 <= r < v */ 2667 1.1 mrg mp_int_copy(TEMP(0), u); /* ok: q <= u */ 2668 1.1 mrg 2669 1.1 mrg CLEANUP_TEMP(); 2670 1.1 mrg return MP_OK; 2671 1.1 mrg } 2672 1.1 mrg 2673 1.1 mrg static int s_outlen(mp_int z, mp_size r) { 2674 1.1 mrg assert(r >= MP_MIN_RADIX && r <= MP_MAX_RADIX); 2675 1.1 mrg 2676 1.1 mrg mp_result bits = mp_int_count_bits(z); 2677 1.1 mrg double raw = (double)bits * s_log2[r]; 2678 1.1 mrg 2679 1.1 mrg return (int)(raw + 0.999999); 2680 1.1 mrg } 2681 1.1 mrg 2682 1.1 mrg static mp_size s_inlen(int len, mp_size r) { 2683 1.1 mrg double raw = (double)len / s_log2[r]; 2684 1.1 mrg mp_size bits = (mp_size)(raw + 0.5); 2685 1.1 mrg 2686 1.1 mrg return (mp_size)((bits + (MP_DIGIT_BIT - 1)) / MP_DIGIT_BIT) + 1; 2687 1.1 mrg } 2688 1.1 mrg 2689 1.1 mrg static int s_ch2val(char c, int r) { 2690 1.1 mrg int out; 2691 1.1 mrg 2692 1.1 mrg /* 2693 1.1 mrg * In some locales, isalpha() accepts characters outside the range A-Z, 2694 1.1 mrg * producing out<0 or out>=36. The "out >= r" check will always catch 2695 1.1 mrg * out>=36. Though nothing explicitly catches out<0, our caller reacts the 2696 1.1 mrg * same way to every negative return value. 2697 1.1 mrg */ 2698 1.1 mrg if (isdigit((unsigned char)c)) 2699 1.1 mrg out = c - '0'; 2700 1.1 mrg else if (r > 10 && isalpha((unsigned char)c)) 2701 1.1 mrg out = toupper((unsigned char)c) - 'A' + 10; 2702 1.1 mrg else 2703 1.1 mrg return -1; 2704 1.1 mrg 2705 1.1 mrg return (out >= r) ? -1 : out; 2706 1.1 mrg } 2707 1.1 mrg 2708 1.1 mrg static char s_val2ch(int v, int caps) { 2709 1.1 mrg assert(v >= 0); 2710 1.1 mrg 2711 1.1 mrg if (v < 10) { 2712 1.1 mrg return v + '0'; 2713 1.1 mrg } else { 2714 1.1 mrg char out = (v - 10) + 'a'; 2715 1.1 mrg 2716 1.1 mrg if (caps) { 2717 1.1 mrg return toupper((unsigned char)out); 2718 1.1 mrg } else { 2719 1.1 mrg return out; 2720 1.1 mrg } 2721 1.1 mrg } 2722 1.1 mrg } 2723 1.1 mrg 2724 1.1 mrg static void s_2comp(unsigned char *buf, int len) { 2725 1.1 mrg unsigned short s = 1; 2726 1.1 mrg 2727 1.1 mrg for (int i = len - 1; i >= 0; --i) { 2728 1.1 mrg unsigned char c = ~buf[i]; 2729 1.1 mrg 2730 1.1 mrg s = c + s; 2731 1.1 mrg c = s & UCHAR_MAX; 2732 1.1 mrg s >>= CHAR_BIT; 2733 1.1 mrg 2734 1.1 mrg buf[i] = c; 2735 1.1 mrg } 2736 1.1 mrg 2737 1.1 mrg /* last carry out is ignored */ 2738 1.1 mrg } 2739 1.1 mrg 2740 1.1 mrg static mp_result s_tobin(mp_int z, unsigned char *buf, int *limpos, int pad) { 2741 1.1 mrg int pos = 0, limit = *limpos; 2742 1.1 mrg mp_size uz = MP_USED(z); 2743 1.1 mrg mp_digit *dz = MP_DIGITS(z); 2744 1.1 mrg 2745 1.1 mrg while (uz > 0 && pos < limit) { 2746 1.1 mrg mp_digit d = *dz++; 2747 1.1 mrg int i; 2748 1.1 mrg 2749 1.1 mrg for (i = sizeof(mp_digit); i > 0 && pos < limit; --i) { 2750 1.1 mrg buf[pos++] = (unsigned char)d; 2751 1.1 mrg d >>= CHAR_BIT; 2752 1.1 mrg 2753 1.1 mrg /* Don't write leading zeroes */ 2754 1.1 mrg if (d == 0 && uz == 1) i = 0; /* exit loop without signaling truncation */ 2755 1.1 mrg } 2756 1.1 mrg 2757 1.1 mrg /* Detect truncation (loop exited with pos >= limit) */ 2758 1.1 mrg if (i > 0) break; 2759 1.1 mrg 2760 1.1 mrg --uz; 2761 1.1 mrg } 2762 1.1 mrg 2763 1.1 mrg if (pad != 0 && (buf[pos - 1] >> (CHAR_BIT - 1))) { 2764 1.1 mrg if (pos < limit) { 2765 1.1 mrg buf[pos++] = 0; 2766 1.1 mrg } else { 2767 1.1 mrg uz = 1; 2768 1.1 mrg } 2769 1.1 mrg } 2770 1.1 mrg 2771 1.1 mrg /* Digits are in reverse order, fix that */ 2772 1.1 mrg REV(buf, pos); 2773 1.1 mrg 2774 1.1 mrg /* Return the number of bytes actually written */ 2775 1.1 mrg *limpos = pos; 2776 1.1 mrg 2777 1.1 mrg return (uz == 0) ? MP_OK : MP_TRUNC; 2778 1.1 mrg } 2779 1.1 mrg 2780 1.1 mrg /* Here there be dragons */ 2781