1 1.6 andvar /* $NetBSD: bignum.c,v 1.6 2023/02/27 22:00:25 andvar Exp $ */ 2 1.1 nonaka 3 1.1 nonaka /*- 4 1.1 nonaka * Copyright (c) 2012 Alistair Crooks <agc (at) NetBSD.org> 5 1.1 nonaka * All rights reserved. 6 1.1 nonaka * 7 1.1 nonaka * Redistribution and use in source and binary forms, with or without 8 1.1 nonaka * modification, are permitted provided that the following conditions 9 1.1 nonaka * are met: 10 1.1 nonaka * 1. Redistributions of source code must retain the above copyright 11 1.1 nonaka * notice, this list of conditions and the following disclaimer. 12 1.1 nonaka * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 nonaka * notice, this list of conditions and the following disclaimer in the 14 1.1 nonaka * documentation and/or other materials provided with the distribution. 15 1.1 nonaka * 16 1.1 nonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 nonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 nonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 nonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 nonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 nonaka * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 nonaka * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 nonaka * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 nonaka * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 nonaka * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.1 nonaka */ 27 1.1 nonaka /* LibTomMath, multiple-precision integer library -- Tom St Denis 28 1.1 nonaka * 29 1.1 nonaka * LibTomMath is a library that provides multiple-precision 30 1.1 nonaka * integer arithmetic as well as number theoretic functionality. 31 1.1 nonaka * 32 1.1 nonaka * The library was designed directly after the MPI library by 33 1.1 nonaka * Michael Fromberger but has been written from scratch with 34 1.1 nonaka * additional optimizations in place. 35 1.1 nonaka * 36 1.1 nonaka * The library is free for all purposes without any express 37 1.1 nonaka * guarantee it works. 38 1.1 nonaka * 39 1.1 nonaka * Tom St Denis, tomstdenis (at) gmail.com, http://libtom.org 40 1.1 nonaka */ 41 1.1 nonaka 42 1.1 nonaka #include <sys/types.h> 43 1.1 nonaka #include <sys/param.h> 44 1.1 nonaka 45 1.1 nonaka #include <limits.h> 46 1.1 nonaka #include <stdarg.h> 47 1.1 nonaka #include <stdio.h> 48 1.1 nonaka #include <stdlib.h> 49 1.1 nonaka #include <string.h> 50 1.1 nonaka #include <unistd.h> 51 1.1 nonaka 52 1.1 nonaka #include "bn.h" 53 1.1 nonaka 54 1.1 nonaka /**************************************************************************/ 55 1.1 nonaka 56 1.1 nonaka /* LibTomMath, multiple-precision integer library -- Tom St Denis 57 1.1 nonaka * 58 1.1 nonaka * LibTomMath is a library that provides multiple-precision 59 1.1 nonaka * integer arithmetic as well as number theoretic functionality. 60 1.1 nonaka * 61 1.1 nonaka * The library was designed directly after the MPI library by 62 1.1 nonaka * Michael Fromberger but has been written from scratch with 63 1.1 nonaka * additional optimizations in place. 64 1.1 nonaka * 65 1.1 nonaka * The library is free for all purposes without any express 66 1.1 nonaka * guarantee it works. 67 1.1 nonaka * 68 1.1 nonaka * Tom St Denis, tomstdenis (at) gmail.com, http://libtom.org 69 1.1 nonaka */ 70 1.1 nonaka 71 1.1 nonaka #define MP_PREC 32 72 1.1 nonaka #define DIGIT_BIT 28 73 1.1 nonaka #define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) 74 1.1 nonaka 75 1.1 nonaka #define MP_WARRAY /*LINTED*/(1U << (((sizeof(mp_word) * CHAR_BIT) - (2 * DIGIT_BIT) + 1))) 76 1.1 nonaka 77 1.1 nonaka #define MP_NO 0 78 1.1 nonaka #define MP_YES 1 79 1.1 nonaka 80 1.1 nonaka #ifndef USE_ARG 81 1.1 nonaka #define USE_ARG(x) /*LINTED*/(void)&(x) 82 1.1 nonaka #endif 83 1.1 nonaka 84 1.1 nonaka #ifndef __arraycount 85 1.1 nonaka #define __arraycount(__x) (sizeof(__x) / sizeof(__x[0])) 86 1.1 nonaka #endif 87 1.1 nonaka 88 1.1 nonaka #ifndef MIN 89 1.1 nonaka #define MIN(a,b) (((a)<(b))?(a):(b)) 90 1.1 nonaka #endif 91 1.1 nonaka 92 1.1 nonaka #define MP_ISZERO(a) (((a)->used == 0) ? MP_YES : MP_NO) 93 1.1 nonaka 94 1.1 nonaka typedef int mp_err; 95 1.1 nonaka 96 1.1 nonaka static int signed_multiply(mp_int * a, mp_int * b, mp_int * c); 97 1.1 nonaka static int square(mp_int * a, mp_int * b); 98 1.1 nonaka 99 1.1 nonaka static int signed_subtract_word(mp_int *a, mp_digit b, mp_int *c); 100 1.1 nonaka 101 1.1 nonaka static inline void * 102 1.1 nonaka allocate(size_t n, size_t m) 103 1.1 nonaka { 104 1.1 nonaka return calloc(n, m); 105 1.1 nonaka } 106 1.1 nonaka 107 1.1 nonaka static inline void 108 1.1 nonaka deallocate(void *v, size_t sz) 109 1.1 nonaka { 110 1.1 nonaka USE_ARG(sz); 111 1.1 nonaka free(v); 112 1.1 nonaka } 113 1.1 nonaka 114 1.1 nonaka /* set to zero */ 115 1.1 nonaka static inline void 116 1.1 nonaka mp_zero(mp_int *a) 117 1.1 nonaka { 118 1.1 nonaka a->sign = MP_ZPOS; 119 1.1 nonaka a->used = 0; 120 1.1 nonaka memset(a->dp, 0x0, a->alloc * sizeof(*a->dp)); 121 1.1 nonaka } 122 1.1 nonaka 123 1.1 nonaka /* grow as required */ 124 1.1 nonaka static int 125 1.1 nonaka mp_grow(mp_int *a, int size) 126 1.1 nonaka { 127 1.1 nonaka mp_digit *tmp; 128 1.1 nonaka 129 1.1 nonaka /* if the alloc size is smaller alloc more ram */ 130 1.1 nonaka if (a->alloc < size) { 131 1.1 nonaka /* ensure there are always at least MP_PREC digits extra on top */ 132 1.1 nonaka size += (MP_PREC * 2) - (size % MP_PREC); 133 1.1 nonaka 134 1.1 nonaka /* reallocate the array a->dp 135 1.1 nonaka * 136 1.1 nonaka * We store the return in a temporary variable 137 1.1 nonaka * in case the operation failed we don't want 138 1.1 nonaka * to overwrite the dp member of a. 139 1.1 nonaka */ 140 1.1 nonaka tmp = realloc(a->dp, sizeof(*tmp) * size); 141 1.1 nonaka if (tmp == NULL) { 142 1.1 nonaka /* reallocation failed but "a" is still valid [can be freed] */ 143 1.1 nonaka return MP_MEM; 144 1.1 nonaka } 145 1.1 nonaka 146 1.1 nonaka /* reallocation succeeded so set a->dp */ 147 1.1 nonaka a->dp = tmp; 148 1.1 nonaka /* zero excess digits */ 149 1.1 nonaka memset(&a->dp[a->alloc], 0x0, (size - a->alloc) * sizeof(*a->dp)); 150 1.1 nonaka a->alloc = size; 151 1.1 nonaka } 152 1.1 nonaka return MP_OKAY; 153 1.1 nonaka } 154 1.1 nonaka 155 1.1 nonaka /* shift left a certain amount of digits */ 156 1.1 nonaka static int 157 1.1 nonaka lshift_digits(mp_int * a, int b) 158 1.1 nonaka { 159 1.1 nonaka mp_digit *top, *bottom; 160 1.1 nonaka int x, res; 161 1.1 nonaka 162 1.1 nonaka /* if its less than zero return */ 163 1.1 nonaka if (b <= 0) { 164 1.1 nonaka return MP_OKAY; 165 1.1 nonaka } 166 1.1 nonaka 167 1.1 nonaka /* grow to fit the new digits */ 168 1.1 nonaka if (a->alloc < a->used + b) { 169 1.1 nonaka if ((res = mp_grow(a, a->used + b)) != MP_OKAY) { 170 1.1 nonaka return res; 171 1.1 nonaka } 172 1.1 nonaka } 173 1.1 nonaka 174 1.1 nonaka /* increment the used by the shift amount then copy upwards */ 175 1.1 nonaka a->used += b; 176 1.1 nonaka 177 1.1 nonaka /* top */ 178 1.1 nonaka top = a->dp + a->used - 1; 179 1.1 nonaka 180 1.1 nonaka /* base */ 181 1.1 nonaka bottom = a->dp + a->used - 1 - b; 182 1.1 nonaka 183 1.1 nonaka /* much like rshift_digits this is implemented using a sliding window 184 1.1 nonaka * except the window goes the otherway around. Copying from 185 1.1 nonaka * the bottom to the top. 186 1.1 nonaka */ 187 1.1 nonaka for (x = a->used - 1; x >= b; x--) { 188 1.1 nonaka *top-- = *bottom--; 189 1.1 nonaka } 190 1.1 nonaka 191 1.1 nonaka /* zero the lower digits */ 192 1.1 nonaka memset(a->dp, 0x0, b * sizeof(*a->dp)); 193 1.1 nonaka return MP_OKAY; 194 1.1 nonaka } 195 1.1 nonaka 196 1.1 nonaka /* trim unused digits 197 1.1 nonaka * 198 1.1 nonaka * This is used to ensure that leading zero digits are 199 1.6 andvar * trimmed and the leading "used" digit will be non-zero 200 1.1 nonaka * Typically very fast. Also fixes the sign if there 201 1.1 nonaka * are no more leading digits 202 1.1 nonaka */ 203 1.1 nonaka static void 204 1.1 nonaka trim_unused_digits(mp_int * a) 205 1.1 nonaka { 206 1.1 nonaka /* decrease used while the most significant digit is 207 1.1 nonaka * zero. 208 1.1 nonaka */ 209 1.1 nonaka while (a->used > 0 && a->dp[a->used - 1] == 0) { 210 1.1 nonaka a->used -= 1; 211 1.1 nonaka } 212 1.1 nonaka /* reset the sign flag if used == 0 */ 213 1.1 nonaka if (a->used == 0) { 214 1.1 nonaka a->sign = MP_ZPOS; 215 1.1 nonaka } 216 1.1 nonaka } 217 1.1 nonaka 218 1.1 nonaka /* copy, b = a */ 219 1.1 nonaka static int 220 1.1 nonaka mp_copy(BIGNUM *a, BIGNUM *b) 221 1.1 nonaka { 222 1.1 nonaka int res; 223 1.1 nonaka 224 1.1 nonaka /* if dst == src do nothing */ 225 1.1 nonaka if (a == b) { 226 1.1 nonaka return MP_OKAY; 227 1.1 nonaka } 228 1.1 nonaka if (a == NULL || b == NULL) { 229 1.1 nonaka return MP_VAL; 230 1.1 nonaka } 231 1.1 nonaka 232 1.1 nonaka /* grow dest */ 233 1.1 nonaka if (b->alloc < a->used) { 234 1.1 nonaka if ((res = mp_grow(b, a->used)) != MP_OKAY) { 235 1.1 nonaka return res; 236 1.1 nonaka } 237 1.1 nonaka } 238 1.1 nonaka 239 1.1 nonaka memcpy(b->dp, a->dp, a->used * sizeof(*b->dp)); 240 1.1 nonaka if (b->used > a->used) { 241 1.1 nonaka memset(&b->dp[a->used], 0x0, (b->used - a->used) * sizeof(*b->dp)); 242 1.1 nonaka } 243 1.1 nonaka 244 1.1 nonaka /* copy used count and sign */ 245 1.1 nonaka b->used = a->used; 246 1.1 nonaka b->sign = a->sign; 247 1.1 nonaka return MP_OKAY; 248 1.1 nonaka } 249 1.1 nonaka 250 1.1 nonaka /* shift left by a certain bit count */ 251 1.1 nonaka static int 252 1.1 nonaka lshift_bits(mp_int *a, int b, mp_int *c) 253 1.1 nonaka { 254 1.1 nonaka mp_digit d; 255 1.1 nonaka int res; 256 1.1 nonaka 257 1.1 nonaka /* copy */ 258 1.1 nonaka if (a != c) { 259 1.1 nonaka if ((res = mp_copy(a, c)) != MP_OKAY) { 260 1.1 nonaka return res; 261 1.1 nonaka } 262 1.1 nonaka } 263 1.1 nonaka 264 1.1 nonaka if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { 265 1.1 nonaka if ((res = mp_grow(c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { 266 1.1 nonaka return res; 267 1.1 nonaka } 268 1.1 nonaka } 269 1.1 nonaka 270 1.1 nonaka /* shift by as many digits in the bit count */ 271 1.1 nonaka if (b >= (int)DIGIT_BIT) { 272 1.1 nonaka if ((res = lshift_digits(c, b / DIGIT_BIT)) != MP_OKAY) { 273 1.1 nonaka return res; 274 1.1 nonaka } 275 1.1 nonaka } 276 1.1 nonaka 277 1.1 nonaka /* shift any bit count < DIGIT_BIT */ 278 1.1 nonaka d = (mp_digit) (b % DIGIT_BIT); 279 1.1 nonaka if (d != 0) { 280 1.1 nonaka mp_digit *tmpc, shift, mask, carry, rr; 281 1.1 nonaka int x; 282 1.1 nonaka 283 1.1 nonaka /* bitmask for carries */ 284 1.1 nonaka mask = (((mp_digit)1) << d) - 1; 285 1.1 nonaka 286 1.1 nonaka /* shift for msbs */ 287 1.1 nonaka shift = DIGIT_BIT - d; 288 1.1 nonaka 289 1.1 nonaka /* alias */ 290 1.1 nonaka tmpc = c->dp; 291 1.1 nonaka 292 1.1 nonaka /* carry */ 293 1.1 nonaka carry = 0; 294 1.1 nonaka for (x = 0; x < c->used; x++) { 295 1.1 nonaka /* get the higher bits of the current word */ 296 1.1 nonaka rr = (*tmpc >> shift) & mask; 297 1.1 nonaka 298 1.1 nonaka /* shift the current word and OR in the carry */ 299 1.1 nonaka *tmpc = ((*tmpc << d) | carry) & MP_MASK; 300 1.1 nonaka ++tmpc; 301 1.1 nonaka 302 1.1 nonaka /* set the carry to the carry bits of the current word */ 303 1.1 nonaka carry = rr; 304 1.1 nonaka } 305 1.1 nonaka 306 1.1 nonaka /* set final carry */ 307 1.1 nonaka if (carry != 0) { 308 1.1 nonaka c->dp[c->used++] = carry; 309 1.1 nonaka } 310 1.1 nonaka } 311 1.1 nonaka trim_unused_digits(c); 312 1.1 nonaka return MP_OKAY; 313 1.1 nonaka } 314 1.1 nonaka 315 1.1 nonaka /* reads a unsigned char array, assumes the msb is stored first [big endian] */ 316 1.1 nonaka static int 317 1.1 nonaka mp_read_unsigned_bin(mp_int *a, const uint8_t *b, int c) 318 1.1 nonaka { 319 1.1 nonaka int res; 320 1.1 nonaka 321 1.1 nonaka /* make sure there are at least two digits */ 322 1.1 nonaka if (a->alloc < 2) { 323 1.1 nonaka if ((res = mp_grow(a, 2)) != MP_OKAY) { 324 1.1 nonaka return res; 325 1.1 nonaka } 326 1.1 nonaka } 327 1.1 nonaka 328 1.1 nonaka /* zero the int */ 329 1.1 nonaka mp_zero(a); 330 1.1 nonaka 331 1.1 nonaka /* read the bytes in */ 332 1.1 nonaka while (c-- > 0) { 333 1.1 nonaka if ((res = lshift_bits(a, 8, a)) != MP_OKAY) { 334 1.1 nonaka return res; 335 1.1 nonaka } 336 1.1 nonaka 337 1.1 nonaka a->dp[0] |= *b++; 338 1.1 nonaka a->used += 1; 339 1.1 nonaka } 340 1.1 nonaka trim_unused_digits(a); 341 1.1 nonaka return MP_OKAY; 342 1.1 nonaka } 343 1.1 nonaka 344 1.1 nonaka /* returns the number of bits in an mpi */ 345 1.1 nonaka static int 346 1.1 nonaka mp_count_bits(const mp_int *a) 347 1.1 nonaka { 348 1.1 nonaka int r; 349 1.1 nonaka mp_digit q; 350 1.1 nonaka 351 1.1 nonaka /* shortcut */ 352 1.1 nonaka if (a->used == 0) { 353 1.1 nonaka return 0; 354 1.1 nonaka } 355 1.1 nonaka 356 1.1 nonaka /* get number of digits and add that */ 357 1.1 nonaka r = (a->used - 1) * DIGIT_BIT; 358 1.1 nonaka 359 1.1 nonaka /* take the last digit and count the bits in it */ 360 1.1 nonaka for (q = a->dp[a->used - 1]; q > ((mp_digit) 0) ; r++) { 361 1.1 nonaka q >>= ((mp_digit) 1); 362 1.1 nonaka } 363 1.1 nonaka return r; 364 1.1 nonaka } 365 1.1 nonaka 366 1.6 andvar /* compare magnitude of two ints (unsigned) */ 367 1.1 nonaka static int 368 1.1 nonaka compare_magnitude(mp_int * a, mp_int * b) 369 1.1 nonaka { 370 1.1 nonaka int n; 371 1.1 nonaka mp_digit *tmpa, *tmpb; 372 1.1 nonaka 373 1.1 nonaka /* compare based on # of non-zero digits */ 374 1.1 nonaka if (a->used > b->used) { 375 1.1 nonaka return MP_GT; 376 1.1 nonaka } 377 1.1 nonaka 378 1.1 nonaka if (a->used < b->used) { 379 1.1 nonaka return MP_LT; 380 1.1 nonaka } 381 1.1 nonaka 382 1.1 nonaka /* alias for a */ 383 1.1 nonaka tmpa = a->dp + (a->used - 1); 384 1.1 nonaka 385 1.1 nonaka /* alias for b */ 386 1.1 nonaka tmpb = b->dp + (a->used - 1); 387 1.1 nonaka 388 1.1 nonaka /* compare based on digits */ 389 1.1 nonaka for (n = 0; n < a->used; ++n, --tmpa, --tmpb) { 390 1.1 nonaka if (*tmpa > *tmpb) { 391 1.1 nonaka return MP_GT; 392 1.1 nonaka } 393 1.1 nonaka 394 1.1 nonaka if (*tmpa < *tmpb) { 395 1.1 nonaka return MP_LT; 396 1.1 nonaka } 397 1.1 nonaka } 398 1.1 nonaka return MP_EQ; 399 1.1 nonaka } 400 1.1 nonaka 401 1.1 nonaka /* compare two ints (signed)*/ 402 1.1 nonaka static int 403 1.1 nonaka signed_compare(mp_int * a, mp_int * b) 404 1.1 nonaka { 405 1.1 nonaka /* compare based on sign */ 406 1.1 nonaka if (a->sign != b->sign) { 407 1.1 nonaka return (a->sign == MP_NEG) ? MP_LT : MP_GT; 408 1.1 nonaka } 409 1.1 nonaka return (a->sign == MP_NEG) ? compare_magnitude(b, a) : compare_magnitude(a, b); 410 1.1 nonaka } 411 1.1 nonaka 412 1.1 nonaka /* get the size for an unsigned equivalent */ 413 1.1 nonaka static int 414 1.1 nonaka mp_unsigned_bin_size(mp_int * a) 415 1.1 nonaka { 416 1.1 nonaka int size = mp_count_bits(a); 417 1.1 nonaka 418 1.1 nonaka return (size / 8 + ((size & 7) != 0 ? 1 : 0)); 419 1.1 nonaka } 420 1.1 nonaka 421 1.1 nonaka /* init a new mp_int */ 422 1.1 nonaka static int 423 1.1 nonaka mp_init(mp_int * a) 424 1.1 nonaka { 425 1.1 nonaka /* allocate memory required and clear it */ 426 1.1 nonaka a->dp = allocate(1, sizeof(*a->dp) * MP_PREC); 427 1.1 nonaka if (a->dp == NULL) { 428 1.1 nonaka return MP_MEM; 429 1.1 nonaka } 430 1.1 nonaka 431 1.1 nonaka /* set the digits to zero */ 432 1.1 nonaka memset(a->dp, 0x0, MP_PREC * sizeof(*a->dp)); 433 1.1 nonaka 434 1.1 nonaka /* set the used to zero, allocated digits to the default precision 435 1.1 nonaka * and sign to positive */ 436 1.1 nonaka a->used = 0; 437 1.1 nonaka a->alloc = MP_PREC; 438 1.1 nonaka a->sign = MP_ZPOS; 439 1.1 nonaka 440 1.1 nonaka return MP_OKAY; 441 1.1 nonaka } 442 1.1 nonaka 443 1.1 nonaka /* clear one (frees) */ 444 1.1 nonaka static void 445 1.1 nonaka mp_clear(mp_int * a) 446 1.1 nonaka { 447 1.1 nonaka /* only do anything if a hasn't been freed previously */ 448 1.1 nonaka if (a->dp != NULL) { 449 1.1 nonaka memset(a->dp, 0x0, a->used * sizeof(*a->dp)); 450 1.1 nonaka 451 1.1 nonaka /* free ram */ 452 1.1 nonaka deallocate(a->dp, (size_t)a->alloc); 453 1.1 nonaka 454 1.1 nonaka /* reset members to make debugging easier */ 455 1.1 nonaka a->dp = NULL; 456 1.1 nonaka a->alloc = a->used = 0; 457 1.1 nonaka a->sign = MP_ZPOS; 458 1.1 nonaka } 459 1.1 nonaka } 460 1.1 nonaka 461 1.1 nonaka static int 462 1.1 nonaka mp_init_multi(mp_int *mp, ...) 463 1.1 nonaka { 464 1.1 nonaka mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ 465 1.1 nonaka int n = 0; /* Number of ok inits */ 466 1.1 nonaka mp_int* cur_arg = mp; 467 1.1 nonaka va_list args; 468 1.1 nonaka 469 1.1 nonaka va_start(args, mp); /* init args to next argument from caller */ 470 1.1 nonaka while (cur_arg != NULL) { 471 1.1 nonaka if (mp_init(cur_arg) != MP_OKAY) { 472 1.1 nonaka /* Oops - error! Back-track and mp_clear what we already 473 1.1 nonaka succeeded in init-ing, then return error. 474 1.1 nonaka */ 475 1.1 nonaka va_list clean_args; 476 1.1 nonaka 477 1.1 nonaka /* end the current list */ 478 1.1 nonaka va_end(args); 479 1.1 nonaka 480 1.1 nonaka /* now start cleaning up */ 481 1.1 nonaka cur_arg = mp; 482 1.1 nonaka va_start(clean_args, mp); 483 1.1 nonaka while (n--) { 484 1.1 nonaka mp_clear(cur_arg); 485 1.1 nonaka cur_arg = va_arg(clean_args, mp_int*); 486 1.1 nonaka } 487 1.1 nonaka va_end(clean_args); 488 1.1 nonaka res = MP_MEM; 489 1.1 nonaka break; 490 1.1 nonaka } 491 1.1 nonaka n++; 492 1.1 nonaka cur_arg = va_arg(args, mp_int*); 493 1.1 nonaka } 494 1.1 nonaka va_end(args); 495 1.1 nonaka return res; /* Assumed ok, if error flagged above. */ 496 1.1 nonaka } 497 1.1 nonaka 498 1.1 nonaka /* init an mp_init for a given size */ 499 1.1 nonaka static int 500 1.1 nonaka mp_init_size(mp_int * a, int size) 501 1.1 nonaka { 502 1.1 nonaka /* pad size so there are always extra digits */ 503 1.1 nonaka size += (MP_PREC * 2) - (size % MP_PREC); 504 1.1 nonaka 505 1.1 nonaka /* alloc mem */ 506 1.1 nonaka a->dp = allocate(1, sizeof(*a->dp) * size); 507 1.1 nonaka if (a->dp == NULL) { 508 1.1 nonaka return MP_MEM; 509 1.1 nonaka } 510 1.1 nonaka 511 1.1 nonaka /* set the members */ 512 1.1 nonaka a->used = 0; 513 1.1 nonaka a->alloc = size; 514 1.1 nonaka a->sign = MP_ZPOS; 515 1.1 nonaka 516 1.1 nonaka /* zero the digits */ 517 1.1 nonaka memset(a->dp, 0x0, size * sizeof(*a->dp)); 518 1.1 nonaka return MP_OKAY; 519 1.1 nonaka } 520 1.1 nonaka 521 1.1 nonaka /* creates "a" then copies b into it */ 522 1.1 nonaka static int 523 1.1 nonaka mp_init_copy(mp_int * a, mp_int * b) 524 1.1 nonaka { 525 1.1 nonaka int res; 526 1.1 nonaka 527 1.1 nonaka if ((res = mp_init(a)) != MP_OKAY) { 528 1.1 nonaka return res; 529 1.1 nonaka } 530 1.1 nonaka return mp_copy(b, a); 531 1.1 nonaka } 532 1.1 nonaka 533 1.1 nonaka /* low level addition, based on HAC pp.594, Algorithm 14.7 */ 534 1.1 nonaka static int 535 1.1 nonaka basic_add(mp_int * a, mp_int * b, mp_int * c) 536 1.1 nonaka { 537 1.1 nonaka mp_int *x; 538 1.1 nonaka int olduse, res, min, max; 539 1.1 nonaka 540 1.1 nonaka /* find sizes, we let |a| <= |b| which means we have to sort 541 1.1 nonaka * them. "x" will point to the input with the most digits 542 1.1 nonaka */ 543 1.1 nonaka if (a->used > b->used) { 544 1.1 nonaka min = b->used; 545 1.1 nonaka max = a->used; 546 1.1 nonaka x = a; 547 1.1 nonaka } else { 548 1.1 nonaka min = a->used; 549 1.1 nonaka max = b->used; 550 1.1 nonaka x = b; 551 1.1 nonaka } 552 1.1 nonaka 553 1.1 nonaka /* init result */ 554 1.1 nonaka if (c->alloc < max + 1) { 555 1.1 nonaka if ((res = mp_grow(c, max + 1)) != MP_OKAY) { 556 1.1 nonaka return res; 557 1.1 nonaka } 558 1.1 nonaka } 559 1.1 nonaka 560 1.1 nonaka /* get old used digit count and set new one */ 561 1.1 nonaka olduse = c->used; 562 1.1 nonaka c->used = max + 1; 563 1.1 nonaka 564 1.1 nonaka { 565 1.1 nonaka mp_digit carry, *tmpa, *tmpb, *tmpc; 566 1.1 nonaka int i; 567 1.1 nonaka 568 1.1 nonaka /* alias for digit pointers */ 569 1.1 nonaka 570 1.1 nonaka /* first input */ 571 1.1 nonaka tmpa = a->dp; 572 1.1 nonaka 573 1.1 nonaka /* second input */ 574 1.1 nonaka tmpb = b->dp; 575 1.1 nonaka 576 1.1 nonaka /* destination */ 577 1.1 nonaka tmpc = c->dp; 578 1.1 nonaka 579 1.1 nonaka /* zero the carry */ 580 1.1 nonaka carry = 0; 581 1.1 nonaka for (i = 0; i < min; i++) { 582 1.1 nonaka /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ 583 1.1 nonaka *tmpc = *tmpa++ + *tmpb++ + carry; 584 1.1 nonaka 585 1.1 nonaka /* U = carry bit of T[i] */ 586 1.1 nonaka carry = *tmpc >> ((mp_digit)DIGIT_BIT); 587 1.1 nonaka 588 1.1 nonaka /* take away carry bit from T[i] */ 589 1.1 nonaka *tmpc++ &= MP_MASK; 590 1.1 nonaka } 591 1.1 nonaka 592 1.1 nonaka /* now copy higher words if any, that is in A+B 593 1.1 nonaka * if A or B has more digits add those in 594 1.1 nonaka */ 595 1.1 nonaka if (min != max) { 596 1.1 nonaka for (; i < max; i++) { 597 1.1 nonaka /* T[i] = X[i] + U */ 598 1.1 nonaka *tmpc = x->dp[i] + carry; 599 1.1 nonaka 600 1.1 nonaka /* U = carry bit of T[i] */ 601 1.1 nonaka carry = *tmpc >> ((mp_digit)DIGIT_BIT); 602 1.1 nonaka 603 1.1 nonaka /* take away carry bit from T[i] */ 604 1.1 nonaka *tmpc++ &= MP_MASK; 605 1.1 nonaka } 606 1.1 nonaka } 607 1.1 nonaka 608 1.1 nonaka /* add carry */ 609 1.1 nonaka *tmpc++ = carry; 610 1.1 nonaka 611 1.1 nonaka /* clear digits above oldused */ 612 1.1 nonaka if (olduse > c->used) { 613 1.1 nonaka memset(tmpc, 0x0, (olduse - c->used) * sizeof(*c->dp)); 614 1.1 nonaka } 615 1.1 nonaka } 616 1.1 nonaka 617 1.1 nonaka trim_unused_digits(c); 618 1.1 nonaka return MP_OKAY; 619 1.1 nonaka } 620 1.1 nonaka 621 1.1 nonaka /* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ 622 1.1 nonaka static int 623 1.1 nonaka basic_subtract(mp_int * a, mp_int * b, mp_int * c) 624 1.1 nonaka { 625 1.1 nonaka int olduse, res, min, max; 626 1.1 nonaka 627 1.1 nonaka /* find sizes */ 628 1.1 nonaka min = b->used; 629 1.1 nonaka max = a->used; 630 1.1 nonaka 631 1.1 nonaka /* init result */ 632 1.1 nonaka if (c->alloc < max) { 633 1.1 nonaka if ((res = mp_grow(c, max)) != MP_OKAY) { 634 1.1 nonaka return res; 635 1.1 nonaka } 636 1.1 nonaka } 637 1.1 nonaka olduse = c->used; 638 1.1 nonaka c->used = max; 639 1.1 nonaka 640 1.1 nonaka { 641 1.1 nonaka mp_digit carry, *tmpa, *tmpb, *tmpc; 642 1.1 nonaka int i; 643 1.1 nonaka 644 1.1 nonaka /* alias for digit pointers */ 645 1.1 nonaka tmpa = a->dp; 646 1.1 nonaka tmpb = b->dp; 647 1.1 nonaka tmpc = c->dp; 648 1.1 nonaka 649 1.1 nonaka /* set carry to zero */ 650 1.1 nonaka carry = 0; 651 1.1 nonaka for (i = 0; i < min; i++) { 652 1.1 nonaka /* T[i] = A[i] - B[i] - U */ 653 1.1 nonaka *tmpc = *tmpa++ - *tmpb++ - carry; 654 1.1 nonaka 655 1.1 nonaka /* U = carry bit of T[i] 656 1.1 nonaka * Note this saves performing an AND operation since 657 1.1 nonaka * if a carry does occur it will propagate all the way to the 658 1.1 nonaka * MSB. As a result a single shift is enough to get the carry 659 1.1 nonaka */ 660 1.1 nonaka carry = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof(mp_digit) - 1)); 661 1.1 nonaka 662 1.1 nonaka /* Clear carry from T[i] */ 663 1.1 nonaka *tmpc++ &= MP_MASK; 664 1.1 nonaka } 665 1.1 nonaka 666 1.1 nonaka /* now copy higher words if any, e.g. if A has more digits than B */ 667 1.1 nonaka for (; i < max; i++) { 668 1.1 nonaka /* T[i] = A[i] - U */ 669 1.1 nonaka *tmpc = *tmpa++ - carry; 670 1.1 nonaka 671 1.1 nonaka /* U = carry bit of T[i] */ 672 1.1 nonaka carry = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof(mp_digit) - 1)); 673 1.1 nonaka 674 1.1 nonaka /* Clear carry from T[i] */ 675 1.1 nonaka *tmpc++ &= MP_MASK; 676 1.1 nonaka } 677 1.1 nonaka 678 1.1 nonaka /* clear digits above used (since we may not have grown result above) */ 679 1.1 nonaka if (olduse > c->used) { 680 1.1 nonaka memset(tmpc, 0x0, (olduse - c->used) * sizeof(*a->dp)); 681 1.1 nonaka } 682 1.1 nonaka } 683 1.1 nonaka 684 1.1 nonaka trim_unused_digits(c); 685 1.1 nonaka return MP_OKAY; 686 1.1 nonaka } 687 1.1 nonaka 688 1.1 nonaka /* high level subtraction (handles signs) */ 689 1.1 nonaka static int 690 1.1 nonaka signed_subtract(mp_int * a, mp_int * b, mp_int * c) 691 1.1 nonaka { 692 1.1 nonaka int sa, sb, res; 693 1.1 nonaka 694 1.1 nonaka sa = a->sign; 695 1.1 nonaka sb = b->sign; 696 1.1 nonaka 697 1.1 nonaka if (sa != sb) { 698 1.1 nonaka /* subtract a negative from a positive, OR */ 699 1.1 nonaka /* subtract a positive from a negative. */ 700 1.1 nonaka /* In either case, ADD their magnitudes, */ 701 1.1 nonaka /* and use the sign of the first number. */ 702 1.1 nonaka c->sign = sa; 703 1.1 nonaka res = basic_add(a, b, c); 704 1.1 nonaka } else { 705 1.1 nonaka /* subtract a positive from a positive, OR */ 706 1.1 nonaka /* subtract a negative from a negative. */ 707 1.1 nonaka /* First, take the difference between their */ 708 1.1 nonaka /* magnitudes, then... */ 709 1.1 nonaka if (compare_magnitude(a, b) != MP_LT) { 710 1.1 nonaka /* Copy the sign from the first */ 711 1.1 nonaka c->sign = sa; 712 1.1 nonaka /* The first has a larger or equal magnitude */ 713 1.1 nonaka res = basic_subtract(a, b, c); 714 1.1 nonaka } else { 715 1.1 nonaka /* The result has the *opposite* sign from */ 716 1.1 nonaka /* the first number. */ 717 1.1 nonaka c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; 718 1.1 nonaka /* The second has a larger magnitude */ 719 1.1 nonaka res = basic_subtract(b, a, c); 720 1.1 nonaka } 721 1.1 nonaka } 722 1.1 nonaka return res; 723 1.1 nonaka } 724 1.1 nonaka 725 1.1 nonaka /* shift right a certain amount of digits */ 726 1.1 nonaka static int 727 1.1 nonaka rshift_digits(mp_int * a, int b) 728 1.1 nonaka { 729 1.1 nonaka /* if b <= 0 then ignore it */ 730 1.1 nonaka if (b <= 0) { 731 1.1 nonaka return 0; 732 1.1 nonaka } 733 1.1 nonaka 734 1.1 nonaka /* if b > used then simply zero it and return */ 735 1.1 nonaka if (a->used <= b) { 736 1.1 nonaka mp_zero(a); 737 1.1 nonaka return 0; 738 1.1 nonaka } 739 1.1 nonaka 740 1.1 nonaka /* this is implemented as a sliding window where 741 1.1 nonaka * the window is b-digits long and digits from 742 1.1 nonaka * the top of the window are copied to the bottom 743 1.1 nonaka * 744 1.1 nonaka * e.g. 745 1.1 nonaka 746 1.1 nonaka b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> 747 1.1 nonaka /\ | ----> 748 1.1 nonaka \-------------------/ ----> 749 1.1 nonaka */ 750 1.1 nonaka memmove(a->dp, &a->dp[b], (a->used - b) * sizeof(*a->dp)); 751 1.1 nonaka memset(&a->dp[a->used - b], 0x0, b * sizeof(*a->dp)); 752 1.1 nonaka 753 1.1 nonaka /* remove excess digits */ 754 1.1 nonaka a->used -= b; 755 1.1 nonaka return 1; 756 1.1 nonaka } 757 1.1 nonaka 758 1.1 nonaka /* multiply by a digit */ 759 1.1 nonaka static int 760 1.1 nonaka multiply_digit(mp_int * a, mp_digit b, mp_int * c) 761 1.1 nonaka { 762 1.1 nonaka mp_digit carry, *tmpa, *tmpc; 763 1.1 nonaka mp_word r; 764 1.1 nonaka int ix, res, olduse; 765 1.1 nonaka 766 1.1 nonaka /* make sure c is big enough to hold a*b */ 767 1.1 nonaka if (c->alloc < a->used + 1) { 768 1.1 nonaka if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { 769 1.1 nonaka return res; 770 1.1 nonaka } 771 1.1 nonaka } 772 1.1 nonaka 773 1.1 nonaka /* get the original destinations used count */ 774 1.1 nonaka olduse = c->used; 775 1.1 nonaka 776 1.1 nonaka /* set the sign */ 777 1.1 nonaka c->sign = a->sign; 778 1.1 nonaka 779 1.1 nonaka /* alias for a->dp [source] */ 780 1.1 nonaka tmpa = a->dp; 781 1.1 nonaka 782 1.1 nonaka /* alias for c->dp [dest] */ 783 1.1 nonaka tmpc = c->dp; 784 1.1 nonaka 785 1.1 nonaka /* zero carry */ 786 1.1 nonaka carry = 0; 787 1.1 nonaka 788 1.1 nonaka /* compute columns */ 789 1.1 nonaka for (ix = 0; ix < a->used; ix++) { 790 1.1 nonaka /* compute product and carry sum for this term */ 791 1.1 nonaka r = ((mp_word) carry) + ((mp_word)*tmpa++) * ((mp_word)b); 792 1.1 nonaka 793 1.1 nonaka /* mask off higher bits to get a single digit */ 794 1.1 nonaka *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); 795 1.1 nonaka 796 1.1 nonaka /* send carry into next iteration */ 797 1.1 nonaka carry = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); 798 1.1 nonaka } 799 1.1 nonaka 800 1.1 nonaka /* store final carry [if any] and increment ix offset */ 801 1.1 nonaka *tmpc++ = carry; 802 1.1 nonaka ++ix; 803 1.1 nonaka if (olduse > ix) { 804 1.1 nonaka memset(tmpc, 0x0, (olduse - ix) * sizeof(*tmpc)); 805 1.1 nonaka } 806 1.1 nonaka 807 1.1 nonaka /* set used count */ 808 1.1 nonaka c->used = a->used + 1; 809 1.1 nonaka trim_unused_digits(c); 810 1.1 nonaka 811 1.1 nonaka return MP_OKAY; 812 1.1 nonaka } 813 1.1 nonaka 814 1.1 nonaka /* high level addition (handles signs) */ 815 1.1 nonaka static int 816 1.1 nonaka signed_add(mp_int * a, mp_int * b, mp_int * c) 817 1.1 nonaka { 818 1.1 nonaka int asign, bsign, res; 819 1.1 nonaka 820 1.1 nonaka /* get sign of both inputs */ 821 1.1 nonaka asign = a->sign; 822 1.1 nonaka bsign = b->sign; 823 1.1 nonaka 824 1.1 nonaka /* handle two cases, not four */ 825 1.1 nonaka if (asign == bsign) { 826 1.1 nonaka /* both positive or both negative */ 827 1.1 nonaka /* add their magnitudes, copy the sign */ 828 1.1 nonaka c->sign = asign; 829 1.1 nonaka res = basic_add(a, b, c); 830 1.1 nonaka } else { 831 1.1 nonaka /* one positive, the other negative */ 832 1.1 nonaka /* subtract the one with the greater magnitude from */ 833 1.1 nonaka /* the one of the lesser magnitude. The result gets */ 834 1.1 nonaka /* the sign of the one with the greater magnitude. */ 835 1.1 nonaka if (compare_magnitude(a, b) == MP_LT) { 836 1.1 nonaka c->sign = bsign; 837 1.1 nonaka res = basic_subtract(b, a, c); 838 1.1 nonaka } else { 839 1.1 nonaka c->sign = asign; 840 1.1 nonaka res = basic_subtract(a, b, c); 841 1.1 nonaka } 842 1.1 nonaka } 843 1.1 nonaka return res; 844 1.1 nonaka } 845 1.1 nonaka 846 1.1 nonaka /* swap the elements of two integers, for cases where you can't simply swap the 847 1.1 nonaka * mp_int pointers around 848 1.1 nonaka */ 849 1.1 nonaka static void 850 1.1 nonaka mp_exch(mp_int *a, mp_int *b) 851 1.1 nonaka { 852 1.1 nonaka mp_int t; 853 1.1 nonaka 854 1.1 nonaka t = *a; 855 1.1 nonaka *a = *b; 856 1.1 nonaka *b = t; 857 1.1 nonaka } 858 1.1 nonaka 859 1.1 nonaka /* calc a value mod 2**b */ 860 1.1 nonaka static int 861 1.1 nonaka modulo_2_to_power(mp_int * a, int b, mp_int * c) 862 1.1 nonaka { 863 1.1 nonaka int x, res; 864 1.1 nonaka 865 1.1 nonaka /* if b is <= 0 then zero the int */ 866 1.1 nonaka if (b <= 0) { 867 1.1 nonaka mp_zero(c); 868 1.1 nonaka return MP_OKAY; 869 1.1 nonaka } 870 1.1 nonaka 871 1.1 nonaka /* if the modulus is larger than the value than return */ 872 1.1 nonaka if (b >= (int) (a->used * DIGIT_BIT)) { 873 1.1 nonaka res = mp_copy(a, c); 874 1.1 nonaka return res; 875 1.1 nonaka } 876 1.1 nonaka 877 1.1 nonaka /* copy */ 878 1.1 nonaka if ((res = mp_copy(a, c)) != MP_OKAY) { 879 1.1 nonaka return res; 880 1.1 nonaka } 881 1.1 nonaka 882 1.1 nonaka /* zero digits above the last digit of the modulus */ 883 1.1 nonaka for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { 884 1.1 nonaka c->dp[x] = 0; 885 1.1 nonaka } 886 1.1 nonaka /* clear the digit that is not completely outside/inside the modulus */ 887 1.1 nonaka c->dp[b / DIGIT_BIT] &= 888 1.1 nonaka (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); 889 1.1 nonaka trim_unused_digits(c); 890 1.1 nonaka return MP_OKAY; 891 1.1 nonaka } 892 1.1 nonaka 893 1.1 nonaka /* shift right by a certain bit count (store quotient in c, optional remainder in d) */ 894 1.1 nonaka static int 895 1.1 nonaka rshift_bits(mp_int * a, int b, mp_int * c, mp_int * d) 896 1.1 nonaka { 897 1.1 nonaka mp_digit D, r, rr; 898 1.1 nonaka int x, res; 899 1.1 nonaka mp_int t; 900 1.1 nonaka 901 1.1 nonaka 902 1.1 nonaka /* if the shift count is <= 0 then we do no work */ 903 1.1 nonaka if (b <= 0) { 904 1.1 nonaka res = mp_copy(a, c); 905 1.1 nonaka if (d != NULL) { 906 1.1 nonaka mp_zero(d); 907 1.1 nonaka } 908 1.1 nonaka return res; 909 1.1 nonaka } 910 1.1 nonaka 911 1.1 nonaka if ((res = mp_init(&t)) != MP_OKAY) { 912 1.1 nonaka return res; 913 1.1 nonaka } 914 1.1 nonaka 915 1.1 nonaka /* get the remainder */ 916 1.1 nonaka if (d != NULL) { 917 1.1 nonaka if ((res = modulo_2_to_power(a, b, &t)) != MP_OKAY) { 918 1.1 nonaka mp_clear(&t); 919 1.1 nonaka return res; 920 1.1 nonaka } 921 1.1 nonaka } 922 1.1 nonaka 923 1.1 nonaka /* copy */ 924 1.1 nonaka if ((res = mp_copy(a, c)) != MP_OKAY) { 925 1.1 nonaka mp_clear(&t); 926 1.1 nonaka return res; 927 1.1 nonaka } 928 1.1 nonaka 929 1.1 nonaka /* shift by as many digits in the bit count */ 930 1.1 nonaka if (b >= (int)DIGIT_BIT) { 931 1.1 nonaka rshift_digits(c, b / DIGIT_BIT); 932 1.1 nonaka } 933 1.1 nonaka 934 1.1 nonaka /* shift any bit count < DIGIT_BIT */ 935 1.1 nonaka D = (mp_digit) (b % DIGIT_BIT); 936 1.1 nonaka if (D != 0) { 937 1.1 nonaka mp_digit *tmpc, mask, shift; 938 1.1 nonaka 939 1.1 nonaka /* mask */ 940 1.1 nonaka mask = (((mp_digit)1) << D) - 1; 941 1.1 nonaka 942 1.1 nonaka /* shift for lsb */ 943 1.1 nonaka shift = DIGIT_BIT - D; 944 1.1 nonaka 945 1.1 nonaka /* alias */ 946 1.1 nonaka tmpc = c->dp + (c->used - 1); 947 1.1 nonaka 948 1.1 nonaka /* carry */ 949 1.1 nonaka r = 0; 950 1.1 nonaka for (x = c->used - 1; x >= 0; x--) { 951 1.1 nonaka /* get the lower bits of this word in a temp */ 952 1.1 nonaka rr = *tmpc & mask; 953 1.1 nonaka 954 1.1 nonaka /* shift the current word and mix in the carry bits from the previous word */ 955 1.1 nonaka *tmpc = (*tmpc >> D) | (r << shift); 956 1.1 nonaka --tmpc; 957 1.1 nonaka 958 1.1 nonaka /* set the carry to the carry bits of the current word found above */ 959 1.1 nonaka r = rr; 960 1.1 nonaka } 961 1.1 nonaka } 962 1.1 nonaka trim_unused_digits(c); 963 1.1 nonaka if (d != NULL) { 964 1.1 nonaka mp_exch(&t, d); 965 1.1 nonaka } 966 1.1 nonaka mp_clear(&t); 967 1.1 nonaka return MP_OKAY; 968 1.1 nonaka } 969 1.1 nonaka 970 1.1 nonaka /* integer signed division. 971 1.1 nonaka * c*b + d == a [e.g. a/b, c=quotient, d=remainder] 972 1.1 nonaka * HAC pp.598 Algorithm 14.20 973 1.1 nonaka * 974 1.1 nonaka * Note that the description in HAC is horribly 975 1.1 nonaka * incomplete. For example, it doesn't consider 976 1.1 nonaka * the case where digits are removed from 'x' in 977 1.1 nonaka * the inner loop. It also doesn't consider the 978 1.1 nonaka * case that y has fewer than three digits, etc.. 979 1.1 nonaka * 980 1.1 nonaka * The overall algorithm is as described as 981 1.1 nonaka * 14.20 from HAC but fixed to treat these cases. 982 1.1 nonaka */ 983 1.1 nonaka static int 984 1.1 nonaka signed_divide(mp_int *c, mp_int *d, mp_int *a, mp_int *b) 985 1.1 nonaka { 986 1.1 nonaka mp_int q, x, y, t1, t2; 987 1.1 nonaka int res, n, t, i, norm, neg; 988 1.1 nonaka 989 1.1 nonaka /* is divisor zero ? */ 990 1.1 nonaka if (MP_ISZERO(b) == MP_YES) { 991 1.1 nonaka return MP_VAL; 992 1.1 nonaka } 993 1.1 nonaka 994 1.1 nonaka /* if a < b then q=0, r = a */ 995 1.1 nonaka if (compare_magnitude(a, b) == MP_LT) { 996 1.1 nonaka if (d != NULL) { 997 1.1 nonaka res = mp_copy(a, d); 998 1.1 nonaka } else { 999 1.1 nonaka res = MP_OKAY; 1000 1.1 nonaka } 1001 1.1 nonaka if (c != NULL) { 1002 1.1 nonaka mp_zero(c); 1003 1.1 nonaka } 1004 1.1 nonaka return res; 1005 1.1 nonaka } 1006 1.1 nonaka 1007 1.1 nonaka if ((res = mp_init_size(&q, a->used + 2)) != MP_OKAY) { 1008 1.1 nonaka return res; 1009 1.1 nonaka } 1010 1.1 nonaka q.used = a->used + 2; 1011 1.1 nonaka 1012 1.1 nonaka if ((res = mp_init(&t1)) != MP_OKAY) { 1013 1.1 nonaka goto LBL_Q; 1014 1.1 nonaka } 1015 1.1 nonaka 1016 1.1 nonaka if ((res = mp_init(&t2)) != MP_OKAY) { 1017 1.1 nonaka goto LBL_T1; 1018 1.1 nonaka } 1019 1.1 nonaka 1020 1.1 nonaka if ((res = mp_init_copy(&x, a)) != MP_OKAY) { 1021 1.1 nonaka goto LBL_T2; 1022 1.1 nonaka } 1023 1.1 nonaka 1024 1.1 nonaka if ((res = mp_init_copy(&y, b)) != MP_OKAY) { 1025 1.1 nonaka goto LBL_X; 1026 1.1 nonaka } 1027 1.1 nonaka 1028 1.1 nonaka /* fix the sign */ 1029 1.1 nonaka neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; 1030 1.1 nonaka x.sign = y.sign = MP_ZPOS; 1031 1.1 nonaka 1032 1.1 nonaka /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ 1033 1.1 nonaka norm = mp_count_bits(&y) % DIGIT_BIT; 1034 1.1 nonaka if (norm < (int)(DIGIT_BIT-1)) { 1035 1.1 nonaka norm = (DIGIT_BIT-1) - norm; 1036 1.1 nonaka if ((res = lshift_bits(&x, norm, &x)) != MP_OKAY) { 1037 1.1 nonaka goto LBL_Y; 1038 1.1 nonaka } 1039 1.1 nonaka if ((res = lshift_bits(&y, norm, &y)) != MP_OKAY) { 1040 1.1 nonaka goto LBL_Y; 1041 1.1 nonaka } 1042 1.1 nonaka } else { 1043 1.1 nonaka norm = 0; 1044 1.1 nonaka } 1045 1.1 nonaka 1046 1.1 nonaka /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ 1047 1.1 nonaka n = x.used - 1; 1048 1.1 nonaka t = y.used - 1; 1049 1.1 nonaka 1050 1.1 nonaka /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ 1051 1.1 nonaka if ((res = lshift_digits(&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ 1052 1.1 nonaka goto LBL_Y; 1053 1.1 nonaka } 1054 1.1 nonaka 1055 1.1 nonaka while (signed_compare(&x, &y) != MP_LT) { 1056 1.1 nonaka ++(q.dp[n - t]); 1057 1.1 nonaka if ((res = signed_subtract(&x, &y, &x)) != MP_OKAY) { 1058 1.1 nonaka goto LBL_Y; 1059 1.1 nonaka } 1060 1.1 nonaka } 1061 1.1 nonaka 1062 1.1 nonaka /* reset y by shifting it back down */ 1063 1.1 nonaka rshift_digits(&y, n - t); 1064 1.1 nonaka 1065 1.1 nonaka /* step 3. for i from n down to (t + 1) */ 1066 1.1 nonaka for (i = n; i >= (t + 1); i--) { 1067 1.1 nonaka if (i > x.used) { 1068 1.1 nonaka continue; 1069 1.1 nonaka } 1070 1.1 nonaka 1071 1.1 nonaka /* step 3.1 if xi == yt then set q{i-t-1} to b-1, 1072 1.1 nonaka * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ 1073 1.1 nonaka if (x.dp[i] == y.dp[t]) { 1074 1.1 nonaka q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); 1075 1.1 nonaka } else { 1076 1.1 nonaka mp_word tmp; 1077 1.1 nonaka tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); 1078 1.1 nonaka tmp |= ((mp_word) x.dp[i - 1]); 1079 1.1 nonaka tmp /= ((mp_word) y.dp[t]); 1080 1.1 nonaka if (tmp > (mp_word) MP_MASK) { 1081 1.1 nonaka tmp = MP_MASK; 1082 1.1 nonaka } 1083 1.1 nonaka q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); 1084 1.1 nonaka } 1085 1.1 nonaka 1086 1.1 nonaka /* while (q{i-t-1} * (yt * b + y{t-1})) > 1087 1.1 nonaka xi * b**2 + xi-1 * b + xi-2 1088 1.1 nonaka do q{i-t-1} -= 1; 1089 1.1 nonaka */ 1090 1.1 nonaka q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; 1091 1.1 nonaka do { 1092 1.1 nonaka q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; 1093 1.1 nonaka 1094 1.1 nonaka /* find left hand */ 1095 1.1 nonaka mp_zero(&t1); 1096 1.1 nonaka t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; 1097 1.1 nonaka t1.dp[1] = y.dp[t]; 1098 1.1 nonaka t1.used = 2; 1099 1.1 nonaka if ((res = multiply_digit(&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { 1100 1.1 nonaka goto LBL_Y; 1101 1.1 nonaka } 1102 1.1 nonaka 1103 1.1 nonaka /* find right hand */ 1104 1.1 nonaka t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; 1105 1.1 nonaka t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; 1106 1.1 nonaka t2.dp[2] = x.dp[i]; 1107 1.1 nonaka t2.used = 3; 1108 1.1 nonaka } while (compare_magnitude(&t1, &t2) == MP_GT); 1109 1.1 nonaka 1110 1.1 nonaka /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ 1111 1.1 nonaka if ((res = multiply_digit(&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { 1112 1.1 nonaka goto LBL_Y; 1113 1.1 nonaka } 1114 1.1 nonaka 1115 1.1 nonaka if ((res = lshift_digits(&t1, i - t - 1)) != MP_OKAY) { 1116 1.1 nonaka goto LBL_Y; 1117 1.1 nonaka } 1118 1.1 nonaka 1119 1.1 nonaka if ((res = signed_subtract(&x, &t1, &x)) != MP_OKAY) { 1120 1.1 nonaka goto LBL_Y; 1121 1.1 nonaka } 1122 1.1 nonaka 1123 1.1 nonaka /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ 1124 1.1 nonaka if (x.sign == MP_NEG) { 1125 1.1 nonaka if ((res = mp_copy(&y, &t1)) != MP_OKAY) { 1126 1.1 nonaka goto LBL_Y; 1127 1.1 nonaka } 1128 1.1 nonaka if ((res = lshift_digits(&t1, i - t - 1)) != MP_OKAY) { 1129 1.1 nonaka goto LBL_Y; 1130 1.1 nonaka } 1131 1.1 nonaka if ((res = signed_add(&x, &t1, &x)) != MP_OKAY) { 1132 1.1 nonaka goto LBL_Y; 1133 1.1 nonaka } 1134 1.1 nonaka 1135 1.1 nonaka q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; 1136 1.1 nonaka } 1137 1.1 nonaka } 1138 1.1 nonaka 1139 1.1 nonaka /* now q is the quotient and x is the remainder 1140 1.1 nonaka * [which we have to normalize] 1141 1.1 nonaka */ 1142 1.1 nonaka 1143 1.1 nonaka /* get sign before writing to c */ 1144 1.1 nonaka x.sign = x.used == 0 ? MP_ZPOS : a->sign; 1145 1.1 nonaka 1146 1.1 nonaka if (c != NULL) { 1147 1.1 nonaka trim_unused_digits(&q); 1148 1.1 nonaka mp_exch(&q, c); 1149 1.1 nonaka c->sign = neg; 1150 1.1 nonaka } 1151 1.1 nonaka 1152 1.1 nonaka if (d != NULL) { 1153 1.1 nonaka rshift_bits(&x, norm, &x, NULL); 1154 1.1 nonaka mp_exch(&x, d); 1155 1.1 nonaka } 1156 1.1 nonaka 1157 1.1 nonaka res = MP_OKAY; 1158 1.1 nonaka 1159 1.1 nonaka LBL_Y: 1160 1.1 nonaka mp_clear(&y); 1161 1.1 nonaka LBL_X: 1162 1.1 nonaka mp_clear(&x); 1163 1.1 nonaka LBL_T2: 1164 1.1 nonaka mp_clear(&t2); 1165 1.1 nonaka LBL_T1: 1166 1.1 nonaka mp_clear(&t1); 1167 1.1 nonaka LBL_Q: 1168 1.1 nonaka mp_clear(&q); 1169 1.1 nonaka return res; 1170 1.1 nonaka } 1171 1.1 nonaka 1172 1.1 nonaka /* c = a mod b, 0 <= c < b */ 1173 1.1 nonaka static int 1174 1.1 nonaka modulo(mp_int * a, mp_int * b, mp_int * c) 1175 1.1 nonaka { 1176 1.1 nonaka mp_int t; 1177 1.1 nonaka int res; 1178 1.1 nonaka 1179 1.1 nonaka if ((res = mp_init(&t)) != MP_OKAY) { 1180 1.1 nonaka return res; 1181 1.1 nonaka } 1182 1.1 nonaka 1183 1.1 nonaka if ((res = signed_divide(NULL, &t, a, b)) != MP_OKAY) { 1184 1.1 nonaka mp_clear(&t); 1185 1.1 nonaka return res; 1186 1.1 nonaka } 1187 1.1 nonaka 1188 1.1 nonaka if (t.sign != b->sign) { 1189 1.1 nonaka res = signed_add(b, &t, c); 1190 1.1 nonaka } else { 1191 1.1 nonaka res = MP_OKAY; 1192 1.1 nonaka mp_exch(&t, c); 1193 1.1 nonaka } 1194 1.1 nonaka 1195 1.1 nonaka mp_clear(&t); 1196 1.1 nonaka return res; 1197 1.1 nonaka } 1198 1.1 nonaka 1199 1.1 nonaka /* set to a digit */ 1200 1.1 nonaka static void 1201 1.1 nonaka set_word(mp_int * a, mp_digit b) 1202 1.1 nonaka { 1203 1.1 nonaka mp_zero(a); 1204 1.1 nonaka a->dp[0] = b & MP_MASK; 1205 1.1 nonaka a->used = (a->dp[0] != 0) ? 1 : 0; 1206 1.1 nonaka } 1207 1.1 nonaka 1208 1.1 nonaka /* b = a/2 */ 1209 1.1 nonaka static int 1210 1.1 nonaka half(mp_int * a, mp_int * b) 1211 1.1 nonaka { 1212 1.1 nonaka int x, res, oldused; 1213 1.1 nonaka 1214 1.1 nonaka /* copy */ 1215 1.1 nonaka if (b->alloc < a->used) { 1216 1.1 nonaka if ((res = mp_grow(b, a->used)) != MP_OKAY) { 1217 1.1 nonaka return res; 1218 1.1 nonaka } 1219 1.1 nonaka } 1220 1.1 nonaka 1221 1.1 nonaka oldused = b->used; 1222 1.1 nonaka b->used = a->used; 1223 1.1 nonaka { 1224 1.1 nonaka mp_digit r, rr, *tmpa, *tmpb; 1225 1.1 nonaka 1226 1.1 nonaka /* source alias */ 1227 1.1 nonaka tmpa = a->dp + b->used - 1; 1228 1.1 nonaka 1229 1.1 nonaka /* dest alias */ 1230 1.1 nonaka tmpb = b->dp + b->used - 1; 1231 1.1 nonaka 1232 1.1 nonaka /* carry */ 1233 1.1 nonaka r = 0; 1234 1.1 nonaka for (x = b->used - 1; x >= 0; x--) { 1235 1.1 nonaka /* get the carry for the next iteration */ 1236 1.1 nonaka rr = *tmpa & 1; 1237 1.1 nonaka 1238 1.1 nonaka /* shift the current digit, add in carry and store */ 1239 1.1 nonaka *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); 1240 1.1 nonaka 1241 1.1 nonaka /* forward carry to next iteration */ 1242 1.1 nonaka r = rr; 1243 1.1 nonaka } 1244 1.1 nonaka 1245 1.1 nonaka /* zero excess digits */ 1246 1.1 nonaka tmpb = b->dp + b->used; 1247 1.1 nonaka for (x = b->used; x < oldused; x++) { 1248 1.1 nonaka *tmpb++ = 0; 1249 1.1 nonaka } 1250 1.1 nonaka } 1251 1.1 nonaka b->sign = a->sign; 1252 1.1 nonaka trim_unused_digits(b); 1253 1.1 nonaka return MP_OKAY; 1254 1.1 nonaka } 1255 1.1 nonaka 1256 1.1 nonaka /* compare a digit */ 1257 1.1 nonaka static int 1258 1.1 nonaka compare_digit(mp_int * a, mp_digit b) 1259 1.1 nonaka { 1260 1.1 nonaka /* compare based on sign */ 1261 1.1 nonaka if (a->sign == MP_NEG) { 1262 1.1 nonaka return MP_LT; 1263 1.1 nonaka } 1264 1.1 nonaka 1265 1.1 nonaka /* compare based on magnitude */ 1266 1.1 nonaka if (a->used > 1) { 1267 1.1 nonaka return MP_GT; 1268 1.1 nonaka } 1269 1.1 nonaka 1270 1.1 nonaka /* compare the only digit of a to b */ 1271 1.1 nonaka if (a->dp[0] > b) { 1272 1.1 nonaka return MP_GT; 1273 1.1 nonaka } else if (a->dp[0] < b) { 1274 1.1 nonaka return MP_LT; 1275 1.1 nonaka } else { 1276 1.1 nonaka return MP_EQ; 1277 1.1 nonaka } 1278 1.1 nonaka } 1279 1.1 nonaka 1280 1.1 nonaka static void 1281 1.1 nonaka mp_clear_multi(mp_int *mp, ...) 1282 1.1 nonaka { 1283 1.1 nonaka mp_int* next_mp = mp; 1284 1.1 nonaka va_list args; 1285 1.1 nonaka 1286 1.1 nonaka va_start(args, mp); 1287 1.1 nonaka while (next_mp != NULL) { 1288 1.1 nonaka mp_clear(next_mp); 1289 1.1 nonaka next_mp = va_arg(args, mp_int*); 1290 1.1 nonaka } 1291 1.1 nonaka va_end(args); 1292 1.1 nonaka } 1293 1.1 nonaka 1294 1.1 nonaka /* computes the modular inverse via binary extended euclidean algorithm, 1295 1.1 nonaka * that is c = 1/a mod b 1296 1.1 nonaka * 1297 1.1 nonaka * Based on slow invmod except this is optimized for the case where b is 1298 1.1 nonaka * odd as per HAC Note 14.64 on pp. 610 1299 1.1 nonaka */ 1300 1.1 nonaka static int 1301 1.1 nonaka fast_modular_inverse(mp_int * a, mp_int * b, mp_int * c) 1302 1.1 nonaka { 1303 1.1 nonaka mp_int x, y, u, v, B, D; 1304 1.1 nonaka int res, neg; 1305 1.1 nonaka 1306 1.1 nonaka /* 2. [modified] b must be odd */ 1307 1.1 nonaka if (MP_ISZERO(b) == MP_YES) { 1308 1.1 nonaka return MP_VAL; 1309 1.1 nonaka } 1310 1.1 nonaka 1311 1.1 nonaka /* init all our temps */ 1312 1.1 nonaka if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) { 1313 1.1 nonaka return res; 1314 1.1 nonaka } 1315 1.1 nonaka 1316 1.1 nonaka /* x == modulus, y == value to invert */ 1317 1.1 nonaka if ((res = mp_copy(b, &x)) != MP_OKAY) { 1318 1.1 nonaka goto LBL_ERR; 1319 1.1 nonaka } 1320 1.1 nonaka 1321 1.1 nonaka /* we need y = |a| */ 1322 1.1 nonaka if ((res = modulo(a, b, &y)) != MP_OKAY) { 1323 1.1 nonaka goto LBL_ERR; 1324 1.1 nonaka } 1325 1.1 nonaka 1326 1.1 nonaka /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ 1327 1.1 nonaka if ((res = mp_copy(&x, &u)) != MP_OKAY) { 1328 1.1 nonaka goto LBL_ERR; 1329 1.1 nonaka } 1330 1.1 nonaka if ((res = mp_copy(&y, &v)) != MP_OKAY) { 1331 1.1 nonaka goto LBL_ERR; 1332 1.1 nonaka } 1333 1.1 nonaka set_word(&D, 1); 1334 1.1 nonaka 1335 1.1 nonaka top: 1336 1.1 nonaka /* 4. while u is even do */ 1337 1.1 nonaka while (BN_is_even(&u) == 1) { 1338 1.1 nonaka /* 4.1 u = u/2 */ 1339 1.1 nonaka if ((res = half(&u, &u)) != MP_OKAY) { 1340 1.1 nonaka goto LBL_ERR; 1341 1.1 nonaka } 1342 1.1 nonaka /* 4.2 if B is odd then */ 1343 1.1 nonaka if (BN_is_odd(&B) == 1) { 1344 1.1 nonaka if ((res = signed_subtract(&B, &x, &B)) != MP_OKAY) { 1345 1.1 nonaka goto LBL_ERR; 1346 1.1 nonaka } 1347 1.1 nonaka } 1348 1.1 nonaka /* B = B/2 */ 1349 1.1 nonaka if ((res = half(&B, &B)) != MP_OKAY) { 1350 1.1 nonaka goto LBL_ERR; 1351 1.1 nonaka } 1352 1.1 nonaka } 1353 1.1 nonaka 1354 1.1 nonaka /* 5. while v is even do */ 1355 1.1 nonaka while (BN_is_even(&v) == 1) { 1356 1.1 nonaka /* 5.1 v = v/2 */ 1357 1.1 nonaka if ((res = half(&v, &v)) != MP_OKAY) { 1358 1.1 nonaka goto LBL_ERR; 1359 1.1 nonaka } 1360 1.1 nonaka /* 5.2 if D is odd then */ 1361 1.1 nonaka if (BN_is_odd(&D) == 1) { 1362 1.1 nonaka /* D = (D-x)/2 */ 1363 1.1 nonaka if ((res = signed_subtract(&D, &x, &D)) != MP_OKAY) { 1364 1.1 nonaka goto LBL_ERR; 1365 1.1 nonaka } 1366 1.1 nonaka } 1367 1.1 nonaka /* D = D/2 */ 1368 1.1 nonaka if ((res = half(&D, &D)) != MP_OKAY) { 1369 1.1 nonaka goto LBL_ERR; 1370 1.1 nonaka } 1371 1.1 nonaka } 1372 1.1 nonaka 1373 1.1 nonaka /* 6. if u >= v then */ 1374 1.1 nonaka if (signed_compare(&u, &v) != MP_LT) { 1375 1.1 nonaka /* u = u - v, B = B - D */ 1376 1.1 nonaka if ((res = signed_subtract(&u, &v, &u)) != MP_OKAY) { 1377 1.1 nonaka goto LBL_ERR; 1378 1.1 nonaka } 1379 1.1 nonaka 1380 1.1 nonaka if ((res = signed_subtract(&B, &D, &B)) != MP_OKAY) { 1381 1.1 nonaka goto LBL_ERR; 1382 1.1 nonaka } 1383 1.1 nonaka } else { 1384 1.1 nonaka /* v - v - u, D = D - B */ 1385 1.1 nonaka if ((res = signed_subtract(&v, &u, &v)) != MP_OKAY) { 1386 1.1 nonaka goto LBL_ERR; 1387 1.1 nonaka } 1388 1.1 nonaka 1389 1.1 nonaka if ((res = signed_subtract(&D, &B, &D)) != MP_OKAY) { 1390 1.1 nonaka goto LBL_ERR; 1391 1.1 nonaka } 1392 1.1 nonaka } 1393 1.1 nonaka 1394 1.1 nonaka /* if not zero goto step 4 */ 1395 1.1 nonaka if (MP_ISZERO(&u) == MP_NO) { 1396 1.1 nonaka goto top; 1397 1.1 nonaka } 1398 1.1 nonaka 1399 1.1 nonaka /* now a = C, b = D, gcd == g*v */ 1400 1.1 nonaka 1401 1.1 nonaka /* if v != 1 then there is no inverse */ 1402 1.1 nonaka if (compare_digit(&v, 1) != MP_EQ) { 1403 1.1 nonaka res = MP_VAL; 1404 1.1 nonaka goto LBL_ERR; 1405 1.1 nonaka } 1406 1.1 nonaka 1407 1.1 nonaka /* b is now the inverse */ 1408 1.1 nonaka neg = a->sign; 1409 1.1 nonaka while (D.sign == MP_NEG) { 1410 1.1 nonaka if ((res = signed_add(&D, b, &D)) != MP_OKAY) { 1411 1.1 nonaka goto LBL_ERR; 1412 1.1 nonaka } 1413 1.1 nonaka } 1414 1.1 nonaka mp_exch(&D, c); 1415 1.1 nonaka c->sign = neg; 1416 1.1 nonaka res = MP_OKAY; 1417 1.1 nonaka 1418 1.1 nonaka LBL_ERR: 1419 1.1 nonaka mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); 1420 1.1 nonaka return res; 1421 1.1 nonaka } 1422 1.1 nonaka 1423 1.1 nonaka /* hac 14.61, pp608 */ 1424 1.1 nonaka static int 1425 1.1 nonaka slow_modular_inverse(mp_int * a, mp_int * b, mp_int * c) 1426 1.1 nonaka { 1427 1.1 nonaka mp_int x, y, u, v, A, B, C, D; 1428 1.1 nonaka int res; 1429 1.1 nonaka 1430 1.1 nonaka /* b cannot be negative */ 1431 1.1 nonaka if (b->sign == MP_NEG || MP_ISZERO(b) == MP_YES) { 1432 1.1 nonaka return MP_VAL; 1433 1.1 nonaka } 1434 1.1 nonaka 1435 1.1 nonaka /* init temps */ 1436 1.1 nonaka if ((res = mp_init_multi(&x, &y, &u, &v, 1437 1.1 nonaka &A, &B, &C, &D, NULL)) != MP_OKAY) { 1438 1.1 nonaka return res; 1439 1.1 nonaka } 1440 1.1 nonaka 1441 1.1 nonaka /* x = a, y = b */ 1442 1.1 nonaka if ((res = modulo(a, b, &x)) != MP_OKAY) { 1443 1.1 nonaka goto LBL_ERR; 1444 1.1 nonaka } 1445 1.1 nonaka if ((res = mp_copy(b, &y)) != MP_OKAY) { 1446 1.1 nonaka goto LBL_ERR; 1447 1.1 nonaka } 1448 1.1 nonaka 1449 1.1 nonaka /* 2. [modified] if x,y are both even then return an error! */ 1450 1.1 nonaka if (BN_is_even(&x) == 1 && BN_is_even(&y) == 1) { 1451 1.1 nonaka res = MP_VAL; 1452 1.1 nonaka goto LBL_ERR; 1453 1.1 nonaka } 1454 1.1 nonaka 1455 1.1 nonaka /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ 1456 1.1 nonaka if ((res = mp_copy(&x, &u)) != MP_OKAY) { 1457 1.1 nonaka goto LBL_ERR; 1458 1.1 nonaka } 1459 1.1 nonaka if ((res = mp_copy(&y, &v)) != MP_OKAY) { 1460 1.1 nonaka goto LBL_ERR; 1461 1.1 nonaka } 1462 1.1 nonaka set_word(&A, 1); 1463 1.1 nonaka set_word(&D, 1); 1464 1.1 nonaka 1465 1.1 nonaka top: 1466 1.1 nonaka /* 4. while u is even do */ 1467 1.1 nonaka while (BN_is_even(&u) == 1) { 1468 1.1 nonaka /* 4.1 u = u/2 */ 1469 1.1 nonaka if ((res = half(&u, &u)) != MP_OKAY) { 1470 1.1 nonaka goto LBL_ERR; 1471 1.1 nonaka } 1472 1.1 nonaka /* 4.2 if A or B is odd then */ 1473 1.1 nonaka if (BN_is_odd(&A) == 1 || BN_is_odd(&B) == 1) { 1474 1.1 nonaka /* A = (A+y)/2, B = (B-x)/2 */ 1475 1.1 nonaka if ((res = signed_add(&A, &y, &A)) != MP_OKAY) { 1476 1.1 nonaka goto LBL_ERR; 1477 1.1 nonaka } 1478 1.1 nonaka if ((res = signed_subtract(&B, &x, &B)) != MP_OKAY) { 1479 1.1 nonaka goto LBL_ERR; 1480 1.1 nonaka } 1481 1.1 nonaka } 1482 1.1 nonaka /* A = A/2, B = B/2 */ 1483 1.1 nonaka if ((res = half(&A, &A)) != MP_OKAY) { 1484 1.1 nonaka goto LBL_ERR; 1485 1.1 nonaka } 1486 1.1 nonaka if ((res = half(&B, &B)) != MP_OKAY) { 1487 1.1 nonaka goto LBL_ERR; 1488 1.1 nonaka } 1489 1.1 nonaka } 1490 1.1 nonaka 1491 1.1 nonaka /* 5. while v is even do */ 1492 1.1 nonaka while (BN_is_even(&v) == 1) { 1493 1.1 nonaka /* 5.1 v = v/2 */ 1494 1.1 nonaka if ((res = half(&v, &v)) != MP_OKAY) { 1495 1.1 nonaka goto LBL_ERR; 1496 1.1 nonaka } 1497 1.1 nonaka /* 5.2 if C or D is odd then */ 1498 1.1 nonaka if (BN_is_odd(&C) == 1 || BN_is_odd(&D) == 1) { 1499 1.1 nonaka /* C = (C+y)/2, D = (D-x)/2 */ 1500 1.1 nonaka if ((res = signed_add(&C, &y, &C)) != MP_OKAY) { 1501 1.1 nonaka goto LBL_ERR; 1502 1.1 nonaka } 1503 1.1 nonaka if ((res = signed_subtract(&D, &x, &D)) != MP_OKAY) { 1504 1.1 nonaka goto LBL_ERR; 1505 1.1 nonaka } 1506 1.1 nonaka } 1507 1.1 nonaka /* C = C/2, D = D/2 */ 1508 1.1 nonaka if ((res = half(&C, &C)) != MP_OKAY) { 1509 1.1 nonaka goto LBL_ERR; 1510 1.1 nonaka } 1511 1.1 nonaka if ((res = half(&D, &D)) != MP_OKAY) { 1512 1.1 nonaka goto LBL_ERR; 1513 1.1 nonaka } 1514 1.1 nonaka } 1515 1.1 nonaka 1516 1.1 nonaka /* 6. if u >= v then */ 1517 1.1 nonaka if (signed_compare(&u, &v) != MP_LT) { 1518 1.1 nonaka /* u = u - v, A = A - C, B = B - D */ 1519 1.1 nonaka if ((res = signed_subtract(&u, &v, &u)) != MP_OKAY) { 1520 1.1 nonaka goto LBL_ERR; 1521 1.1 nonaka } 1522 1.1 nonaka 1523 1.1 nonaka if ((res = signed_subtract(&A, &C, &A)) != MP_OKAY) { 1524 1.1 nonaka goto LBL_ERR; 1525 1.1 nonaka } 1526 1.1 nonaka 1527 1.1 nonaka if ((res = signed_subtract(&B, &D, &B)) != MP_OKAY) { 1528 1.1 nonaka goto LBL_ERR; 1529 1.1 nonaka } 1530 1.1 nonaka } else { 1531 1.1 nonaka /* v - v - u, C = C - A, D = D - B */ 1532 1.1 nonaka if ((res = signed_subtract(&v, &u, &v)) != MP_OKAY) { 1533 1.1 nonaka goto LBL_ERR; 1534 1.1 nonaka } 1535 1.1 nonaka 1536 1.1 nonaka if ((res = signed_subtract(&C, &A, &C)) != MP_OKAY) { 1537 1.1 nonaka goto LBL_ERR; 1538 1.1 nonaka } 1539 1.1 nonaka 1540 1.1 nonaka if ((res = signed_subtract(&D, &B, &D)) != MP_OKAY) { 1541 1.1 nonaka goto LBL_ERR; 1542 1.1 nonaka } 1543 1.1 nonaka } 1544 1.1 nonaka 1545 1.1 nonaka /* if not zero goto step 4 */ 1546 1.1 nonaka if (BN_is_zero(&u) == 0) { 1547 1.1 nonaka goto top; 1548 1.1 nonaka } 1549 1.1 nonaka /* now a = C, b = D, gcd == g*v */ 1550 1.1 nonaka 1551 1.1 nonaka /* if v != 1 then there is no inverse */ 1552 1.1 nonaka if (compare_digit(&v, 1) != MP_EQ) { 1553 1.1 nonaka res = MP_VAL; 1554 1.1 nonaka goto LBL_ERR; 1555 1.1 nonaka } 1556 1.1 nonaka 1557 1.1 nonaka /* if its too low */ 1558 1.1 nonaka while (compare_digit(&C, 0) == MP_LT) { 1559 1.1 nonaka if ((res = signed_add(&C, b, &C)) != MP_OKAY) { 1560 1.1 nonaka goto LBL_ERR; 1561 1.1 nonaka } 1562 1.1 nonaka } 1563 1.1 nonaka 1564 1.1 nonaka /* too big */ 1565 1.1 nonaka while (compare_magnitude(&C, b) != MP_LT) { 1566 1.1 nonaka if ((res = signed_subtract(&C, b, &C)) != MP_OKAY) { 1567 1.1 nonaka goto LBL_ERR; 1568 1.1 nonaka } 1569 1.1 nonaka } 1570 1.1 nonaka 1571 1.1 nonaka /* C is now the inverse */ 1572 1.1 nonaka mp_exch(&C, c); 1573 1.1 nonaka res = MP_OKAY; 1574 1.1 nonaka LBL_ERR: 1575 1.1 nonaka mp_clear_multi(&x, &y, &u, &v, &A, &B, &C, &D, NULL); 1576 1.1 nonaka return res; 1577 1.1 nonaka } 1578 1.1 nonaka 1579 1.1 nonaka static int 1580 1.1 nonaka modular_inverse(mp_int *c, mp_int *a, mp_int *b) 1581 1.1 nonaka { 1582 1.1 nonaka /* b cannot be negative */ 1583 1.1 nonaka if (b->sign == MP_NEG || MP_ISZERO(b) == MP_YES) { 1584 1.1 nonaka return MP_VAL; 1585 1.1 nonaka } 1586 1.1 nonaka 1587 1.1 nonaka /* if the modulus is odd we can use a faster routine instead */ 1588 1.1 nonaka if (BN_is_odd(b) == 1) { 1589 1.1 nonaka return fast_modular_inverse(a, b, c); 1590 1.1 nonaka } 1591 1.1 nonaka return slow_modular_inverse(a, b, c); 1592 1.1 nonaka } 1593 1.1 nonaka 1594 1.1 nonaka /* b = |a| 1595 1.1 nonaka * 1596 1.1 nonaka * Simple function copies the input and fixes the sign to positive 1597 1.1 nonaka */ 1598 1.1 nonaka static int 1599 1.1 nonaka absolute(mp_int * a, mp_int * b) 1600 1.1 nonaka { 1601 1.1 nonaka int res; 1602 1.1 nonaka 1603 1.1 nonaka /* copy a to b */ 1604 1.1 nonaka if (a != b) { 1605 1.1 nonaka if ((res = mp_copy(a, b)) != MP_OKAY) { 1606 1.1 nonaka return res; 1607 1.1 nonaka } 1608 1.1 nonaka } 1609 1.1 nonaka 1610 1.1 nonaka /* force the sign of b to positive */ 1611 1.1 nonaka b->sign = MP_ZPOS; 1612 1.1 nonaka 1613 1.1 nonaka return MP_OKAY; 1614 1.1 nonaka } 1615 1.1 nonaka 1616 1.1 nonaka /* determines if reduce_2k_l can be used */ 1617 1.1 nonaka static int 1618 1.1 nonaka mp_reduce_is_2k_l(mp_int *a) 1619 1.1 nonaka { 1620 1.1 nonaka int ix, iy; 1621 1.1 nonaka 1622 1.1 nonaka if (a->used == 0) { 1623 1.1 nonaka return MP_NO; 1624 1.1 nonaka } else if (a->used == 1) { 1625 1.1 nonaka return MP_YES; 1626 1.1 nonaka } else if (a->used > 1) { 1627 1.1 nonaka /* if more than half of the digits are -1 we're sold */ 1628 1.1 nonaka for (iy = ix = 0; ix < a->used; ix++) { 1629 1.1 nonaka if (a->dp[ix] == MP_MASK) { 1630 1.1 nonaka ++iy; 1631 1.1 nonaka } 1632 1.1 nonaka } 1633 1.1 nonaka return (iy >= (a->used/2)) ? MP_YES : MP_NO; 1634 1.1 nonaka 1635 1.1 nonaka } 1636 1.1 nonaka return MP_NO; 1637 1.1 nonaka } 1638 1.1 nonaka 1639 1.1 nonaka /* computes a = 2**b 1640 1.1 nonaka * 1641 1.1 nonaka * Simple algorithm which zeroes the int, grows it then just sets one bit 1642 1.1 nonaka * as required. 1643 1.1 nonaka */ 1644 1.1 nonaka static int 1645 1.1 nonaka mp_2expt(mp_int * a, int b) 1646 1.1 nonaka { 1647 1.1 nonaka int res; 1648 1.1 nonaka 1649 1.1 nonaka /* zero a as per default */ 1650 1.1 nonaka mp_zero(a); 1651 1.1 nonaka 1652 1.2 dholland /* grow a to accommodate the single bit */ 1653 1.1 nonaka if ((res = mp_grow(a, b / DIGIT_BIT + 1)) != MP_OKAY) { 1654 1.1 nonaka return res; 1655 1.1 nonaka } 1656 1.1 nonaka 1657 1.1 nonaka /* set the used count of where the bit will go */ 1658 1.1 nonaka a->used = b / DIGIT_BIT + 1; 1659 1.1 nonaka 1660 1.1 nonaka /* put the single bit in its place */ 1661 1.1 nonaka a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT); 1662 1.1 nonaka 1663 1.1 nonaka return MP_OKAY; 1664 1.1 nonaka } 1665 1.1 nonaka 1666 1.1 nonaka /* pre-calculate the value required for Barrett reduction 1667 1.5 andvar * For a given modulus "b" it calculates the value required in "a" 1668 1.1 nonaka */ 1669 1.1 nonaka static int 1670 1.1 nonaka mp_reduce_setup(mp_int * a, mp_int * b) 1671 1.1 nonaka { 1672 1.1 nonaka int res; 1673 1.1 nonaka 1674 1.1 nonaka if ((res = mp_2expt(a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { 1675 1.1 nonaka return res; 1676 1.1 nonaka } 1677 1.1 nonaka return signed_divide(a, NULL, a, b); 1678 1.1 nonaka } 1679 1.1 nonaka 1680 1.1 nonaka /* b = a*2 */ 1681 1.1 nonaka static int 1682 1.1 nonaka doubled(mp_int * a, mp_int * b) 1683 1.1 nonaka { 1684 1.1 nonaka int x, res, oldused; 1685 1.1 nonaka 1686 1.2 dholland /* grow to accommodate result */ 1687 1.1 nonaka if (b->alloc < a->used + 1) { 1688 1.1 nonaka if ((res = mp_grow(b, a->used + 1)) != MP_OKAY) { 1689 1.1 nonaka return res; 1690 1.1 nonaka } 1691 1.1 nonaka } 1692 1.1 nonaka 1693 1.1 nonaka oldused = b->used; 1694 1.1 nonaka b->used = a->used; 1695 1.1 nonaka 1696 1.1 nonaka { 1697 1.1 nonaka mp_digit r, rr, *tmpa, *tmpb; 1698 1.1 nonaka 1699 1.1 nonaka /* alias for source */ 1700 1.1 nonaka tmpa = a->dp; 1701 1.1 nonaka 1702 1.1 nonaka /* alias for dest */ 1703 1.1 nonaka tmpb = b->dp; 1704 1.1 nonaka 1705 1.1 nonaka /* carry */ 1706 1.1 nonaka r = 0; 1707 1.1 nonaka for (x = 0; x < a->used; x++) { 1708 1.1 nonaka 1709 1.1 nonaka /* get what will be the *next* carry bit from the 1710 1.1 nonaka * MSB of the current digit 1711 1.1 nonaka */ 1712 1.1 nonaka rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); 1713 1.1 nonaka 1714 1.1 nonaka /* now shift up this digit, add in the carry [from the previous] */ 1715 1.1 nonaka *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; 1716 1.1 nonaka 1717 1.1 nonaka /* copy the carry that would be from the source 1718 1.1 nonaka * digit into the next iteration 1719 1.1 nonaka */ 1720 1.1 nonaka r = rr; 1721 1.1 nonaka } 1722 1.1 nonaka 1723 1.1 nonaka /* new leading digit? */ 1724 1.1 nonaka if (r != 0) { 1725 1.1 nonaka /* add a MSB which is always 1 at this point */ 1726 1.1 nonaka *tmpb = 1; 1727 1.1 nonaka ++(b->used); 1728 1.1 nonaka } 1729 1.1 nonaka 1730 1.1 nonaka /* now zero any excess digits on the destination 1731 1.1 nonaka * that we didn't write to 1732 1.1 nonaka */ 1733 1.1 nonaka tmpb = b->dp + b->used; 1734 1.1 nonaka for (x = b->used; x < oldused; x++) { 1735 1.1 nonaka *tmpb++ = 0; 1736 1.1 nonaka } 1737 1.1 nonaka } 1738 1.1 nonaka b->sign = a->sign; 1739 1.1 nonaka return MP_OKAY; 1740 1.1 nonaka } 1741 1.1 nonaka 1742 1.1 nonaka /* divide by three (based on routine from MPI and the GMP manual) */ 1743 1.1 nonaka static int 1744 1.1 nonaka third(mp_int * a, mp_int *c, mp_digit * d) 1745 1.1 nonaka { 1746 1.1 nonaka mp_int q; 1747 1.1 nonaka mp_word w, t; 1748 1.1 nonaka mp_digit b; 1749 1.1 nonaka int res, ix; 1750 1.1 nonaka 1751 1.1 nonaka /* b = 2**DIGIT_BIT / 3 */ 1752 1.1 nonaka b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); 1753 1.1 nonaka 1754 1.1 nonaka if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { 1755 1.1 nonaka return res; 1756 1.1 nonaka } 1757 1.1 nonaka 1758 1.1 nonaka q.used = a->used; 1759 1.1 nonaka q.sign = a->sign; 1760 1.1 nonaka w = 0; 1761 1.1 nonaka for (ix = a->used - 1; ix >= 0; ix--) { 1762 1.1 nonaka w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); 1763 1.1 nonaka 1764 1.1 nonaka if (w >= 3) { 1765 1.1 nonaka /* multiply w by [1/3] */ 1766 1.1 nonaka t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); 1767 1.1 nonaka 1768 1.1 nonaka /* now subtract 3 * [w/3] from w, to get the remainder */ 1769 1.1 nonaka w -= t+t+t; 1770 1.1 nonaka 1771 1.1 nonaka /* fixup the remainder as required since 1772 1.1 nonaka * the optimization is not exact. 1773 1.1 nonaka */ 1774 1.1 nonaka while (w >= 3) { 1775 1.1 nonaka t += 1; 1776 1.1 nonaka w -= 3; 1777 1.1 nonaka } 1778 1.1 nonaka } else { 1779 1.1 nonaka t = 0; 1780 1.1 nonaka } 1781 1.1 nonaka q.dp[ix] = (mp_digit)t; 1782 1.1 nonaka } 1783 1.1 nonaka 1784 1.1 nonaka /* [optional] store the remainder */ 1785 1.1 nonaka if (d != NULL) { 1786 1.1 nonaka *d = (mp_digit)w; 1787 1.1 nonaka } 1788 1.1 nonaka 1789 1.1 nonaka /* [optional] store the quotient */ 1790 1.1 nonaka if (c != NULL) { 1791 1.1 nonaka trim_unused_digits(&q); 1792 1.1 nonaka mp_exch(&q, c); 1793 1.1 nonaka } 1794 1.1 nonaka mp_clear(&q); 1795 1.1 nonaka 1796 1.1 nonaka return res; 1797 1.1 nonaka } 1798 1.1 nonaka 1799 1.1 nonaka /* multiplication using the Toom-Cook 3-way algorithm 1800 1.1 nonaka * 1801 1.1 nonaka * Much more complicated than Karatsuba but has a lower 1802 1.1 nonaka * asymptotic running time of O(N**1.464). This algorithm is 1803 1.1 nonaka * only particularly useful on VERY large inputs 1804 1.1 nonaka * (we're talking 1000s of digits here...). 1805 1.1 nonaka */ 1806 1.1 nonaka static int 1807 1.1 nonaka toom_cook_multiply(mp_int *a, mp_int *b, mp_int *c) 1808 1.1 nonaka { 1809 1.1 nonaka mp_int w0, w1, w2, w3, w4, tmp1, tmp2, a0, a1, a2, b0, b1, b2; 1810 1.1 nonaka int res, B; 1811 1.1 nonaka 1812 1.1 nonaka /* init temps */ 1813 1.1 nonaka if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, 1814 1.1 nonaka &a0, &a1, &a2, &b0, &b1, 1815 1.1 nonaka &b2, &tmp1, &tmp2, NULL)) != MP_OKAY) { 1816 1.1 nonaka return res; 1817 1.1 nonaka } 1818 1.1 nonaka 1819 1.1 nonaka /* B */ 1820 1.1 nonaka B = MIN(a->used, b->used) / 3; 1821 1.1 nonaka 1822 1.1 nonaka /* a = a2 * B**2 + a1 * B + a0 */ 1823 1.1 nonaka if ((res = modulo_2_to_power(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { 1824 1.1 nonaka goto ERR; 1825 1.1 nonaka } 1826 1.1 nonaka 1827 1.1 nonaka if ((res = mp_copy(a, &a1)) != MP_OKAY) { 1828 1.1 nonaka goto ERR; 1829 1.1 nonaka } 1830 1.1 nonaka rshift_digits(&a1, B); 1831 1.1 nonaka modulo_2_to_power(&a1, DIGIT_BIT * B, &a1); 1832 1.1 nonaka 1833 1.1 nonaka if ((res = mp_copy(a, &a2)) != MP_OKAY) { 1834 1.1 nonaka goto ERR; 1835 1.1 nonaka } 1836 1.1 nonaka rshift_digits(&a2, B*2); 1837 1.1 nonaka 1838 1.1 nonaka /* b = b2 * B**2 + b1 * B + b0 */ 1839 1.1 nonaka if ((res = modulo_2_to_power(b, DIGIT_BIT * B, &b0)) != MP_OKAY) { 1840 1.1 nonaka goto ERR; 1841 1.1 nonaka } 1842 1.1 nonaka 1843 1.1 nonaka if ((res = mp_copy(b, &b1)) != MP_OKAY) { 1844 1.1 nonaka goto ERR; 1845 1.1 nonaka } 1846 1.1 nonaka rshift_digits(&b1, B); 1847 1.1 nonaka modulo_2_to_power(&b1, DIGIT_BIT * B, &b1); 1848 1.1 nonaka 1849 1.1 nonaka if ((res = mp_copy(b, &b2)) != MP_OKAY) { 1850 1.1 nonaka goto ERR; 1851 1.1 nonaka } 1852 1.1 nonaka rshift_digits(&b2, B*2); 1853 1.1 nonaka 1854 1.1 nonaka /* w0 = a0*b0 */ 1855 1.1 nonaka if ((res = signed_multiply(&a0, &b0, &w0)) != MP_OKAY) { 1856 1.1 nonaka goto ERR; 1857 1.1 nonaka } 1858 1.1 nonaka 1859 1.1 nonaka /* w4 = a2 * b2 */ 1860 1.1 nonaka if ((res = signed_multiply(&a2, &b2, &w4)) != MP_OKAY) { 1861 1.1 nonaka goto ERR; 1862 1.1 nonaka } 1863 1.1 nonaka 1864 1.1 nonaka /* w1 = (a2 + 2(a1 + 2a0))(b2 + 2(b1 + 2b0)) */ 1865 1.1 nonaka if ((res = doubled(&a0, &tmp1)) != MP_OKAY) { 1866 1.1 nonaka goto ERR; 1867 1.1 nonaka } 1868 1.1 nonaka if ((res = signed_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { 1869 1.1 nonaka goto ERR; 1870 1.1 nonaka } 1871 1.1 nonaka if ((res = doubled(&tmp1, &tmp1)) != MP_OKAY) { 1872 1.1 nonaka goto ERR; 1873 1.1 nonaka } 1874 1.1 nonaka if ((res = signed_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { 1875 1.1 nonaka goto ERR; 1876 1.1 nonaka } 1877 1.1 nonaka 1878 1.1 nonaka if ((res = doubled(&b0, &tmp2)) != MP_OKAY) { 1879 1.1 nonaka goto ERR; 1880 1.1 nonaka } 1881 1.1 nonaka if ((res = signed_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { 1882 1.1 nonaka goto ERR; 1883 1.1 nonaka } 1884 1.1 nonaka if ((res = doubled(&tmp2, &tmp2)) != MP_OKAY) { 1885 1.1 nonaka goto ERR; 1886 1.1 nonaka } 1887 1.1 nonaka if ((res = signed_add(&tmp2, &b2, &tmp2)) != MP_OKAY) { 1888 1.1 nonaka goto ERR; 1889 1.1 nonaka } 1890 1.1 nonaka 1891 1.1 nonaka if ((res = signed_multiply(&tmp1, &tmp2, &w1)) != MP_OKAY) { 1892 1.1 nonaka goto ERR; 1893 1.1 nonaka } 1894 1.1 nonaka 1895 1.1 nonaka /* w3 = (a0 + 2(a1 + 2a2))(b0 + 2(b1 + 2b2)) */ 1896 1.1 nonaka if ((res = doubled(&a2, &tmp1)) != MP_OKAY) { 1897 1.1 nonaka goto ERR; 1898 1.1 nonaka } 1899 1.1 nonaka if ((res = signed_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { 1900 1.1 nonaka goto ERR; 1901 1.1 nonaka } 1902 1.1 nonaka if ((res = doubled(&tmp1, &tmp1)) != MP_OKAY) { 1903 1.1 nonaka goto ERR; 1904 1.1 nonaka } 1905 1.1 nonaka if ((res = signed_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { 1906 1.1 nonaka goto ERR; 1907 1.1 nonaka } 1908 1.1 nonaka 1909 1.1 nonaka if ((res = doubled(&b2, &tmp2)) != MP_OKAY) { 1910 1.1 nonaka goto ERR; 1911 1.1 nonaka } 1912 1.1 nonaka if ((res = signed_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { 1913 1.1 nonaka goto ERR; 1914 1.1 nonaka } 1915 1.1 nonaka if ((res = doubled(&tmp2, &tmp2)) != MP_OKAY) { 1916 1.1 nonaka goto ERR; 1917 1.1 nonaka } 1918 1.1 nonaka if ((res = signed_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { 1919 1.1 nonaka goto ERR; 1920 1.1 nonaka } 1921 1.1 nonaka 1922 1.1 nonaka if ((res = signed_multiply(&tmp1, &tmp2, &w3)) != MP_OKAY) { 1923 1.1 nonaka goto ERR; 1924 1.1 nonaka } 1925 1.1 nonaka 1926 1.1 nonaka 1927 1.1 nonaka /* w2 = (a2 + a1 + a0)(b2 + b1 + b0) */ 1928 1.1 nonaka if ((res = signed_add(&a2, &a1, &tmp1)) != MP_OKAY) { 1929 1.1 nonaka goto ERR; 1930 1.1 nonaka } 1931 1.1 nonaka if ((res = signed_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { 1932 1.1 nonaka goto ERR; 1933 1.1 nonaka } 1934 1.1 nonaka if ((res = signed_add(&b2, &b1, &tmp2)) != MP_OKAY) { 1935 1.1 nonaka goto ERR; 1936 1.1 nonaka } 1937 1.1 nonaka if ((res = signed_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { 1938 1.1 nonaka goto ERR; 1939 1.1 nonaka } 1940 1.1 nonaka if ((res = signed_multiply(&tmp1, &tmp2, &w2)) != MP_OKAY) { 1941 1.1 nonaka goto ERR; 1942 1.1 nonaka } 1943 1.1 nonaka 1944 1.1 nonaka /* now solve the matrix 1945 1.1 nonaka 1946 1.1 nonaka 0 0 0 0 1 1947 1.1 nonaka 1 2 4 8 16 1948 1.1 nonaka 1 1 1 1 1 1949 1.1 nonaka 16 8 4 2 1 1950 1.1 nonaka 1 0 0 0 0 1951 1.1 nonaka 1952 1.1 nonaka using 12 subtractions, 4 shifts, 1953 1.1 nonaka 2 small divisions and 1 small multiplication 1954 1.1 nonaka */ 1955 1.1 nonaka 1956 1.1 nonaka /* r1 - r4 */ 1957 1.1 nonaka if ((res = signed_subtract(&w1, &w4, &w1)) != MP_OKAY) { 1958 1.1 nonaka goto ERR; 1959 1.1 nonaka } 1960 1.1 nonaka /* r3 - r0 */ 1961 1.1 nonaka if ((res = signed_subtract(&w3, &w0, &w3)) != MP_OKAY) { 1962 1.1 nonaka goto ERR; 1963 1.1 nonaka } 1964 1.1 nonaka /* r1/2 */ 1965 1.1 nonaka if ((res = half(&w1, &w1)) != MP_OKAY) { 1966 1.1 nonaka goto ERR; 1967 1.1 nonaka } 1968 1.1 nonaka /* r3/2 */ 1969 1.1 nonaka if ((res = half(&w3, &w3)) != MP_OKAY) { 1970 1.1 nonaka goto ERR; 1971 1.1 nonaka } 1972 1.1 nonaka /* r2 - r0 - r4 */ 1973 1.1 nonaka if ((res = signed_subtract(&w2, &w0, &w2)) != MP_OKAY) { 1974 1.1 nonaka goto ERR; 1975 1.1 nonaka } 1976 1.1 nonaka if ((res = signed_subtract(&w2, &w4, &w2)) != MP_OKAY) { 1977 1.1 nonaka goto ERR; 1978 1.1 nonaka } 1979 1.1 nonaka /* r1 - r2 */ 1980 1.1 nonaka if ((res = signed_subtract(&w1, &w2, &w1)) != MP_OKAY) { 1981 1.1 nonaka goto ERR; 1982 1.1 nonaka } 1983 1.1 nonaka /* r3 - r2 */ 1984 1.1 nonaka if ((res = signed_subtract(&w3, &w2, &w3)) != MP_OKAY) { 1985 1.1 nonaka goto ERR; 1986 1.1 nonaka } 1987 1.1 nonaka /* r1 - 8r0 */ 1988 1.1 nonaka if ((res = lshift_bits(&w0, 3, &tmp1)) != MP_OKAY) { 1989 1.1 nonaka goto ERR; 1990 1.1 nonaka } 1991 1.1 nonaka if ((res = signed_subtract(&w1, &tmp1, &w1)) != MP_OKAY) { 1992 1.1 nonaka goto ERR; 1993 1.1 nonaka } 1994 1.1 nonaka /* r3 - 8r4 */ 1995 1.1 nonaka if ((res = lshift_bits(&w4, 3, &tmp1)) != MP_OKAY) { 1996 1.1 nonaka goto ERR; 1997 1.1 nonaka } 1998 1.1 nonaka if ((res = signed_subtract(&w3, &tmp1, &w3)) != MP_OKAY) { 1999 1.1 nonaka goto ERR; 2000 1.1 nonaka } 2001 1.1 nonaka /* 3r2 - r1 - r3 */ 2002 1.1 nonaka if ((res = multiply_digit(&w2, 3, &w2)) != MP_OKAY) { 2003 1.1 nonaka goto ERR; 2004 1.1 nonaka } 2005 1.1 nonaka if ((res = signed_subtract(&w2, &w1, &w2)) != MP_OKAY) { 2006 1.1 nonaka goto ERR; 2007 1.1 nonaka } 2008 1.1 nonaka if ((res = signed_subtract(&w2, &w3, &w2)) != MP_OKAY) { 2009 1.1 nonaka goto ERR; 2010 1.1 nonaka } 2011 1.1 nonaka /* r1 - r2 */ 2012 1.1 nonaka if ((res = signed_subtract(&w1, &w2, &w1)) != MP_OKAY) { 2013 1.1 nonaka goto ERR; 2014 1.1 nonaka } 2015 1.1 nonaka /* r3 - r2 */ 2016 1.1 nonaka if ((res = signed_subtract(&w3, &w2, &w3)) != MP_OKAY) { 2017 1.1 nonaka goto ERR; 2018 1.1 nonaka } 2019 1.1 nonaka /* r1/3 */ 2020 1.1 nonaka if ((res = third(&w1, &w1, NULL)) != MP_OKAY) { 2021 1.1 nonaka goto ERR; 2022 1.1 nonaka } 2023 1.1 nonaka /* r3/3 */ 2024 1.1 nonaka if ((res = third(&w3, &w3, NULL)) != MP_OKAY) { 2025 1.1 nonaka goto ERR; 2026 1.1 nonaka } 2027 1.1 nonaka 2028 1.1 nonaka /* at this point shift W[n] by B*n */ 2029 1.1 nonaka if ((res = lshift_digits(&w1, 1*B)) != MP_OKAY) { 2030 1.1 nonaka goto ERR; 2031 1.1 nonaka } 2032 1.1 nonaka if ((res = lshift_digits(&w2, 2*B)) != MP_OKAY) { 2033 1.1 nonaka goto ERR; 2034 1.1 nonaka } 2035 1.1 nonaka if ((res = lshift_digits(&w3, 3*B)) != MP_OKAY) { 2036 1.1 nonaka goto ERR; 2037 1.1 nonaka } 2038 1.1 nonaka if ((res = lshift_digits(&w4, 4*B)) != MP_OKAY) { 2039 1.1 nonaka goto ERR; 2040 1.1 nonaka } 2041 1.1 nonaka 2042 1.1 nonaka if ((res = signed_add(&w0, &w1, c)) != MP_OKAY) { 2043 1.1 nonaka goto ERR; 2044 1.1 nonaka } 2045 1.1 nonaka if ((res = signed_add(&w2, &w3, &tmp1)) != MP_OKAY) { 2046 1.1 nonaka goto ERR; 2047 1.1 nonaka } 2048 1.1 nonaka if ((res = signed_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { 2049 1.1 nonaka goto ERR; 2050 1.1 nonaka } 2051 1.1 nonaka if ((res = signed_add(&tmp1, c, c)) != MP_OKAY) { 2052 1.1 nonaka goto ERR; 2053 1.1 nonaka } 2054 1.1 nonaka 2055 1.1 nonaka ERR: 2056 1.1 nonaka mp_clear_multi(&w0, &w1, &w2, &w3, &w4, 2057 1.1 nonaka &a0, &a1, &a2, &b0, &b1, 2058 1.1 nonaka &b2, &tmp1, &tmp2, NULL); 2059 1.1 nonaka return res; 2060 1.1 nonaka } 2061 1.1 nonaka 2062 1.1 nonaka #define TOOM_MUL_CUTOFF 350 2063 1.1 nonaka #define KARATSUBA_MUL_CUTOFF 80 2064 1.1 nonaka 2065 1.1 nonaka /* c = |a| * |b| using Karatsuba Multiplication using 2066 1.1 nonaka * three half size multiplications 2067 1.1 nonaka * 2068 1.1 nonaka * Let B represent the radix [e.g. 2**DIGIT_BIT] and 2069 1.1 nonaka * let n represent half of the number of digits in 2070 1.1 nonaka * the min(a,b) 2071 1.1 nonaka * 2072 1.1 nonaka * a = a1 * B**n + a0 2073 1.1 nonaka * b = b1 * B**n + b0 2074 1.1 nonaka * 2075 1.1 nonaka * Then, a * b => 2076 1.1 nonaka a1b1 * B**2n + ((a1 + a0)(b1 + b0) - (a0b0 + a1b1)) * B + a0b0 2077 1.1 nonaka * 2078 1.1 nonaka * Note that a1b1 and a0b0 are used twice and only need to be 2079 1.1 nonaka * computed once. So in total three half size (half # of 2080 1.1 nonaka * digit) multiplications are performed, a0b0, a1b1 and 2081 1.1 nonaka * (a1+b1)(a0+b0) 2082 1.1 nonaka * 2083 1.1 nonaka * Note that a multiplication of half the digits requires 2084 1.1 nonaka * 1/4th the number of single precision multiplications so in 2085 1.1 nonaka * total after one call 25% of the single precision multiplications 2086 1.1 nonaka * are saved. Note also that the call to signed_multiply can end up back 2087 1.1 nonaka * in this function if the a0, a1, b0, or b1 are above the threshold. 2088 1.1 nonaka * This is known as divide-and-conquer and leads to the famous 2089 1.6 andvar * O(N**lg(3)) or O(N**1.584) work which is asymptotically lower than 2090 1.1 nonaka * the standard O(N**2) that the baseline/comba methods use. 2091 1.1 nonaka * Generally though the overhead of this method doesn't pay off 2092 1.1 nonaka * until a certain size (N ~ 80) is reached. 2093 1.1 nonaka */ 2094 1.1 nonaka static int 2095 1.1 nonaka karatsuba_multiply(mp_int * a, mp_int * b, mp_int * c) 2096 1.1 nonaka { 2097 1.1 nonaka mp_int x0, x1, y0, y1, t1, x0y0, x1y1; 2098 1.1 nonaka int B; 2099 1.1 nonaka int err; 2100 1.1 nonaka 2101 1.1 nonaka /* default the return code to an error */ 2102 1.1 nonaka err = MP_MEM; 2103 1.1 nonaka 2104 1.1 nonaka /* min # of digits */ 2105 1.1 nonaka B = MIN(a->used, b->used); 2106 1.1 nonaka 2107 1.1 nonaka /* now divide in two */ 2108 1.1 nonaka B = (int)((unsigned)B >> 1); 2109 1.1 nonaka 2110 1.1 nonaka /* init copy all the temps */ 2111 1.1 nonaka if (mp_init_size(&x0, B) != MP_OKAY) { 2112 1.1 nonaka goto ERR; 2113 1.1 nonaka } 2114 1.1 nonaka if (mp_init_size(&x1, a->used - B) != MP_OKAY) { 2115 1.1 nonaka goto X0; 2116 1.1 nonaka } 2117 1.1 nonaka if (mp_init_size(&y0, B) != MP_OKAY) { 2118 1.1 nonaka goto X1; 2119 1.1 nonaka } 2120 1.1 nonaka if (mp_init_size(&y1, b->used - B) != MP_OKAY) { 2121 1.1 nonaka goto Y0; 2122 1.1 nonaka } 2123 1.1 nonaka /* init temps */ 2124 1.1 nonaka if (mp_init_size(&t1, B * 2) != MP_OKAY) { 2125 1.1 nonaka goto Y1; 2126 1.1 nonaka } 2127 1.1 nonaka if (mp_init_size(&x0y0, B * 2) != MP_OKAY) { 2128 1.1 nonaka goto T1; 2129 1.1 nonaka } 2130 1.1 nonaka if (mp_init_size(&x1y1, B * 2) != MP_OKAY) { 2131 1.1 nonaka goto X0Y0; 2132 1.1 nonaka } 2133 1.1 nonaka /* now shift the digits */ 2134 1.1 nonaka x0.used = y0.used = B; 2135 1.1 nonaka x1.used = a->used - B; 2136 1.1 nonaka y1.used = b->used - B; 2137 1.1 nonaka 2138 1.1 nonaka { 2139 1.1 nonaka int x; 2140 1.1 nonaka mp_digit *tmpa, *tmpb, *tmpx, *tmpy; 2141 1.1 nonaka 2142 1.1 nonaka /* we copy the digits directly instead of using higher level functions 2143 1.1 nonaka * since we also need to shift the digits 2144 1.1 nonaka */ 2145 1.1 nonaka tmpa = a->dp; 2146 1.1 nonaka tmpb = b->dp; 2147 1.1 nonaka 2148 1.1 nonaka tmpx = x0.dp; 2149 1.1 nonaka tmpy = y0.dp; 2150 1.1 nonaka for (x = 0; x < B; x++) { 2151 1.1 nonaka *tmpx++ = *tmpa++; 2152 1.1 nonaka *tmpy++ = *tmpb++; 2153 1.1 nonaka } 2154 1.1 nonaka 2155 1.1 nonaka tmpx = x1.dp; 2156 1.1 nonaka for (x = B; x < a->used; x++) { 2157 1.1 nonaka *tmpx++ = *tmpa++; 2158 1.1 nonaka } 2159 1.1 nonaka 2160 1.1 nonaka tmpy = y1.dp; 2161 1.1 nonaka for (x = B; x < b->used; x++) { 2162 1.1 nonaka *tmpy++ = *tmpb++; 2163 1.1 nonaka } 2164 1.1 nonaka } 2165 1.1 nonaka 2166 1.1 nonaka /* only need to clamp the lower words since by definition the 2167 1.1 nonaka * upper words x1/y1 must have a known number of digits 2168 1.1 nonaka */ 2169 1.1 nonaka trim_unused_digits(&x0); 2170 1.1 nonaka trim_unused_digits(&y0); 2171 1.1 nonaka 2172 1.1 nonaka /* now calc the products x0y0 and x1y1 */ 2173 1.1 nonaka /* after this x0 is no longer required, free temp [x0==t2]! */ 2174 1.1 nonaka if (signed_multiply(&x0, &y0, &x0y0) != MP_OKAY) { 2175 1.1 nonaka goto X1Y1; /* x0y0 = x0*y0 */ 2176 1.1 nonaka } 2177 1.1 nonaka if (signed_multiply(&x1, &y1, &x1y1) != MP_OKAY) { 2178 1.1 nonaka goto X1Y1; /* x1y1 = x1*y1 */ 2179 1.1 nonaka } 2180 1.1 nonaka /* now calc x1+x0 and y1+y0 */ 2181 1.1 nonaka if (basic_add(&x1, &x0, &t1) != MP_OKAY) { 2182 1.1 nonaka goto X1Y1; /* t1 = x1 - x0 */ 2183 1.1 nonaka } 2184 1.1 nonaka if (basic_add(&y1, &y0, &x0) != MP_OKAY) { 2185 1.1 nonaka goto X1Y1; /* t2 = y1 - y0 */ 2186 1.1 nonaka } 2187 1.1 nonaka if (signed_multiply(&t1, &x0, &t1) != MP_OKAY) { 2188 1.1 nonaka goto X1Y1; /* t1 = (x1 + x0) * (y1 + y0) */ 2189 1.1 nonaka } 2190 1.1 nonaka /* add x0y0 */ 2191 1.1 nonaka if (signed_add(&x0y0, &x1y1, &x0) != MP_OKAY) { 2192 1.1 nonaka goto X1Y1; /* t2 = x0y0 + x1y1 */ 2193 1.1 nonaka } 2194 1.1 nonaka if (basic_subtract(&t1, &x0, &t1) != MP_OKAY) { 2195 1.1 nonaka goto X1Y1; /* t1 = (x1+x0)*(y1+y0) - (x1y1 + x0y0) */ 2196 1.1 nonaka } 2197 1.1 nonaka /* shift by B */ 2198 1.1 nonaka if (lshift_digits(&t1, B) != MP_OKAY) { 2199 1.1 nonaka goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))<<B */ 2200 1.1 nonaka } 2201 1.1 nonaka if (lshift_digits(&x1y1, B * 2) != MP_OKAY) { 2202 1.1 nonaka goto X1Y1; /* x1y1 = x1y1 << 2*B */ 2203 1.1 nonaka } 2204 1.1 nonaka if (signed_add(&x0y0, &t1, &t1) != MP_OKAY) { 2205 1.1 nonaka goto X1Y1; /* t1 = x0y0 + t1 */ 2206 1.1 nonaka } 2207 1.1 nonaka if (signed_add(&t1, &x1y1, c) != MP_OKAY) { 2208 1.1 nonaka goto X1Y1; /* t1 = x0y0 + t1 + x1y1 */ 2209 1.1 nonaka } 2210 1.1 nonaka /* Algorithm succeeded set the return code to MP_OKAY */ 2211 1.1 nonaka err = MP_OKAY; 2212 1.1 nonaka 2213 1.1 nonaka X1Y1: 2214 1.1 nonaka mp_clear(&x1y1); 2215 1.1 nonaka X0Y0: 2216 1.1 nonaka mp_clear(&x0y0); 2217 1.1 nonaka T1: 2218 1.1 nonaka mp_clear(&t1); 2219 1.1 nonaka Y1: 2220 1.1 nonaka mp_clear(&y1); 2221 1.1 nonaka Y0: 2222 1.1 nonaka mp_clear(&y0); 2223 1.1 nonaka X1: 2224 1.1 nonaka mp_clear(&x1); 2225 1.1 nonaka X0: 2226 1.1 nonaka mp_clear(&x0); 2227 1.1 nonaka ERR: 2228 1.1 nonaka return err; 2229 1.1 nonaka } 2230 1.1 nonaka 2231 1.1 nonaka /* Fast (comba) multiplier 2232 1.1 nonaka * 2233 1.1 nonaka * This is the fast column-array [comba] multiplier. It is 2234 1.1 nonaka * designed to compute the columns of the product first 2235 1.1 nonaka * then handle the carries afterwards. This has the effect 2236 1.1 nonaka * of making the nested loops that compute the columns very 2237 1.1 nonaka * simple and schedulable on super-scalar processors. 2238 1.1 nonaka * 2239 1.1 nonaka * This has been modified to produce a variable number of 2240 1.1 nonaka * digits of output so if say only a half-product is required 2241 1.1 nonaka * you don't have to compute the upper half (a feature 2242 1.1 nonaka * required for fast Barrett reduction). 2243 1.1 nonaka * 2244 1.1 nonaka * Based on Algorithm 14.12 on pp.595 of HAC. 2245 1.1 nonaka * 2246 1.1 nonaka */ 2247 1.1 nonaka static int 2248 1.1 nonaka fast_col_array_multiply(mp_int * a, mp_int * b, mp_int * c, int digs) 2249 1.1 nonaka { 2250 1.1 nonaka int olduse, res, pa, ix, iz; 2251 1.1 nonaka /*LINTED*/ 2252 1.1 nonaka mp_digit W[MP_WARRAY]; 2253 1.1 nonaka mp_word _W; 2254 1.1 nonaka 2255 1.1 nonaka /* grow the destination as required */ 2256 1.1 nonaka if (c->alloc < digs) { 2257 1.1 nonaka if ((res = mp_grow(c, digs)) != MP_OKAY) { 2258 1.1 nonaka return res; 2259 1.1 nonaka } 2260 1.1 nonaka } 2261 1.1 nonaka 2262 1.1 nonaka /* number of output digits to produce */ 2263 1.1 nonaka pa = MIN(digs, a->used + b->used); 2264 1.1 nonaka 2265 1.1 nonaka /* clear the carry */ 2266 1.1 nonaka _W = 0; 2267 1.1 nonaka for (ix = 0; ix < pa; ix++) { 2268 1.1 nonaka int tx, ty; 2269 1.1 nonaka int iy; 2270 1.1 nonaka mp_digit *tmpx, *tmpy; 2271 1.1 nonaka 2272 1.1 nonaka /* get offsets into the two bignums */ 2273 1.1 nonaka ty = MIN(b->used-1, ix); 2274 1.1 nonaka tx = ix - ty; 2275 1.1 nonaka 2276 1.1 nonaka /* setup temp aliases */ 2277 1.1 nonaka tmpx = a->dp + tx; 2278 1.1 nonaka tmpy = b->dp + ty; 2279 1.1 nonaka 2280 1.6 andvar /* this is the number of times the loop will iterate, essentially 2281 1.1 nonaka while (tx++ < a->used && ty-- >= 0) { ... } 2282 1.1 nonaka */ 2283 1.1 nonaka iy = MIN(a->used-tx, ty+1); 2284 1.1 nonaka 2285 1.1 nonaka /* execute loop */ 2286 1.1 nonaka for (iz = 0; iz < iy; ++iz) { 2287 1.1 nonaka _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); 2288 1.1 nonaka 2289 1.1 nonaka } 2290 1.1 nonaka 2291 1.1 nonaka /* store term */ 2292 1.1 nonaka W[ix] = ((mp_digit)_W) & MP_MASK; 2293 1.1 nonaka 2294 1.1 nonaka /* make next carry */ 2295 1.1 nonaka _W = _W >> ((mp_word)DIGIT_BIT); 2296 1.1 nonaka } 2297 1.1 nonaka 2298 1.1 nonaka /* setup dest */ 2299 1.1 nonaka olduse = c->used; 2300 1.1 nonaka c->used = pa; 2301 1.1 nonaka 2302 1.1 nonaka { 2303 1.1 nonaka mp_digit *tmpc; 2304 1.1 nonaka tmpc = c->dp; 2305 1.1 nonaka for (ix = 0; ix < pa+1; ix++) { 2306 1.1 nonaka /* now extract the previous digit [below the carry] */ 2307 1.3 mrg *tmpc++ = (ix < pa) ? W[ix] : 0; 2308 1.1 nonaka } 2309 1.1 nonaka 2310 1.1 nonaka /* clear unused digits [that existed in the old copy of c] */ 2311 1.1 nonaka for (; ix < olduse; ix++) { 2312 1.1 nonaka *tmpc++ = 0; 2313 1.1 nonaka } 2314 1.1 nonaka } 2315 1.1 nonaka trim_unused_digits(c); 2316 1.1 nonaka return MP_OKAY; 2317 1.1 nonaka } 2318 1.1 nonaka 2319 1.1 nonaka /* return 1 if we can use fast column array multiply */ 2320 1.1 nonaka /* 2321 1.1 nonaka * The fast multiplier can be used if the output will 2322 1.1 nonaka * have less than MP_WARRAY digits and the number of 2323 1.1 nonaka * digits won't affect carry propagation 2324 1.1 nonaka */ 2325 1.1 nonaka static inline int 2326 1.1 nonaka can_use_fast_column_array(int ndigits, int used) 2327 1.1 nonaka { 2328 1.1 nonaka return (((unsigned)ndigits < MP_WARRAY) && 2329 1.1 nonaka used < (1 << (unsigned)((CHAR_BIT * sizeof(mp_word)) - (2 * DIGIT_BIT)))); 2330 1.1 nonaka } 2331 1.1 nonaka 2332 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_fast_s_mp_mul_digs.c,v $ */ 2333 1.1 nonaka /* Revision: 1.2 $ */ 2334 1.1 nonaka /* Date: 2011/03/18 16:22:09 $ */ 2335 1.1 nonaka 2336 1.1 nonaka 2337 1.1 nonaka /* multiplies |a| * |b| and only computes upto digs digits of result 2338 1.1 nonaka * HAC pp. 595, Algorithm 14.12 Modified so you can control how 2339 1.1 nonaka * many digits of output are created. 2340 1.1 nonaka */ 2341 1.1 nonaka static int 2342 1.1 nonaka basic_multiply_partial_lower(mp_int * a, mp_int * b, mp_int * c, int digs) 2343 1.1 nonaka { 2344 1.1 nonaka mp_int t; 2345 1.1 nonaka int res, pa, pb, ix, iy; 2346 1.1 nonaka mp_digit u; 2347 1.1 nonaka mp_word r; 2348 1.1 nonaka mp_digit tmpx, *tmpt, *tmpy; 2349 1.1 nonaka 2350 1.1 nonaka /* can we use the fast multiplier? */ 2351 1.1 nonaka if (can_use_fast_column_array(digs, MIN(a->used, b->used))) { 2352 1.1 nonaka return fast_col_array_multiply(a, b, c, digs); 2353 1.1 nonaka } 2354 1.1 nonaka 2355 1.1 nonaka if ((res = mp_init_size(&t, digs)) != MP_OKAY) { 2356 1.1 nonaka return res; 2357 1.1 nonaka } 2358 1.1 nonaka t.used = digs; 2359 1.1 nonaka 2360 1.1 nonaka /* compute the digits of the product directly */ 2361 1.1 nonaka pa = a->used; 2362 1.1 nonaka for (ix = 0; ix < pa; ix++) { 2363 1.1 nonaka /* set the carry to zero */ 2364 1.1 nonaka u = 0; 2365 1.1 nonaka 2366 1.1 nonaka /* limit ourselves to making digs digits of output */ 2367 1.1 nonaka pb = MIN(b->used, digs - ix); 2368 1.1 nonaka 2369 1.1 nonaka /* setup some aliases */ 2370 1.1 nonaka /* copy of the digit from a used within the nested loop */ 2371 1.1 nonaka tmpx = a->dp[ix]; 2372 1.1 nonaka 2373 1.1 nonaka /* an alias for the destination shifted ix places */ 2374 1.1 nonaka tmpt = t.dp + ix; 2375 1.1 nonaka 2376 1.1 nonaka /* an alias for the digits of b */ 2377 1.1 nonaka tmpy = b->dp; 2378 1.1 nonaka 2379 1.1 nonaka /* compute the columns of the output and propagate the carry */ 2380 1.1 nonaka for (iy = 0; iy < pb; iy++) { 2381 1.1 nonaka /* compute the column as a mp_word */ 2382 1.1 nonaka r = ((mp_word)*tmpt) + 2383 1.1 nonaka ((mp_word)tmpx) * ((mp_word)*tmpy++) + 2384 1.1 nonaka ((mp_word) u); 2385 1.1 nonaka 2386 1.1 nonaka /* the new column is the lower part of the result */ 2387 1.1 nonaka *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); 2388 1.1 nonaka 2389 1.1 nonaka /* get the carry word from the result */ 2390 1.1 nonaka u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); 2391 1.1 nonaka } 2392 1.1 nonaka /* set carry if it is placed below digs */ 2393 1.1 nonaka if (ix + iy < digs) { 2394 1.1 nonaka *tmpt = u; 2395 1.1 nonaka } 2396 1.1 nonaka } 2397 1.1 nonaka 2398 1.1 nonaka trim_unused_digits(&t); 2399 1.1 nonaka mp_exch(&t, c); 2400 1.1 nonaka 2401 1.1 nonaka mp_clear(&t); 2402 1.1 nonaka return MP_OKAY; 2403 1.1 nonaka } 2404 1.1 nonaka 2405 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_s_mp_mul_digs.c,v $ */ 2406 1.1 nonaka /* Revision: 1.3 $ */ 2407 1.1 nonaka /* Date: 2011/03/18 16:43:04 $ */ 2408 1.1 nonaka 2409 1.1 nonaka /* high level multiplication (handles sign) */ 2410 1.1 nonaka static int 2411 1.1 nonaka signed_multiply(mp_int * a, mp_int * b, mp_int * c) 2412 1.1 nonaka { 2413 1.1 nonaka int res, neg; 2414 1.1 nonaka 2415 1.1 nonaka neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; 2416 1.1 nonaka /* use Toom-Cook? */ 2417 1.1 nonaka if (MIN(a->used, b->used) >= TOOM_MUL_CUTOFF) { 2418 1.1 nonaka res = toom_cook_multiply(a, b, c); 2419 1.1 nonaka } else if (MIN(a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { 2420 1.1 nonaka /* use Karatsuba? */ 2421 1.1 nonaka res = karatsuba_multiply(a, b, c); 2422 1.1 nonaka } else { 2423 1.1 nonaka /* can we use the fast multiplier? */ 2424 1.1 nonaka int digs = a->used + b->used + 1; 2425 1.1 nonaka 2426 1.1 nonaka if (can_use_fast_column_array(digs, MIN(a->used, b->used))) { 2427 1.1 nonaka res = fast_col_array_multiply(a, b, c, digs); 2428 1.1 nonaka } else { 2429 1.1 nonaka res = basic_multiply_partial_lower(a, b, c, (a)->used + (b)->used + 1); 2430 1.1 nonaka } 2431 1.1 nonaka } 2432 1.1 nonaka c->sign = (c->used > 0) ? neg : MP_ZPOS; 2433 1.1 nonaka return res; 2434 1.1 nonaka } 2435 1.1 nonaka 2436 1.1 nonaka /* this is a modified version of fast_s_mul_digs that only produces 2437 1.1 nonaka * output digits *above* digs. See the comments for fast_s_mul_digs 2438 1.1 nonaka * to see how it works. 2439 1.1 nonaka * 2440 1.1 nonaka * This is used in the Barrett reduction since for one of the multiplications 2441 1.1 nonaka * only the higher digits were needed. This essentially halves the work. 2442 1.1 nonaka * 2443 1.1 nonaka * Based on Algorithm 14.12 on pp.595 of HAC. 2444 1.1 nonaka */ 2445 1.1 nonaka static int 2446 1.1 nonaka fast_basic_multiply_partial_upper(mp_int * a, mp_int * b, mp_int * c, int digs) 2447 1.1 nonaka { 2448 1.1 nonaka int olduse, res, pa, ix, iz; 2449 1.1 nonaka mp_digit W[MP_WARRAY]; 2450 1.1 nonaka mp_word _W; 2451 1.1 nonaka 2452 1.1 nonaka /* grow the destination as required */ 2453 1.1 nonaka pa = a->used + b->used; 2454 1.1 nonaka if (c->alloc < pa) { 2455 1.1 nonaka if ((res = mp_grow(c, pa)) != MP_OKAY) { 2456 1.1 nonaka return res; 2457 1.1 nonaka } 2458 1.1 nonaka } 2459 1.1 nonaka 2460 1.1 nonaka /* number of output digits to produce */ 2461 1.1 nonaka pa = a->used + b->used; 2462 1.1 nonaka _W = 0; 2463 1.1 nonaka for (ix = digs; ix < pa; ix++) { 2464 1.1 nonaka int tx, ty, iy; 2465 1.1 nonaka mp_digit *tmpx, *tmpy; 2466 1.1 nonaka 2467 1.1 nonaka /* get offsets into the two bignums */ 2468 1.1 nonaka ty = MIN(b->used-1, ix); 2469 1.1 nonaka tx = ix - ty; 2470 1.1 nonaka 2471 1.1 nonaka /* setup temp aliases */ 2472 1.1 nonaka tmpx = a->dp + tx; 2473 1.1 nonaka tmpy = b->dp + ty; 2474 1.1 nonaka 2475 1.6 andvar /* this is the number of times the loop will iterate, essentially its 2476 1.1 nonaka while (tx++ < a->used && ty-- >= 0) { ... } 2477 1.1 nonaka */ 2478 1.1 nonaka iy = MIN(a->used-tx, ty+1); 2479 1.1 nonaka 2480 1.1 nonaka /* execute loop */ 2481 1.1 nonaka for (iz = 0; iz < iy; iz++) { 2482 1.1 nonaka _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); 2483 1.1 nonaka } 2484 1.1 nonaka 2485 1.1 nonaka /* store term */ 2486 1.1 nonaka W[ix] = ((mp_digit)_W) & MP_MASK; 2487 1.1 nonaka 2488 1.1 nonaka /* make next carry */ 2489 1.1 nonaka _W = _W >> ((mp_word)DIGIT_BIT); 2490 1.1 nonaka } 2491 1.1 nonaka 2492 1.1 nonaka /* setup dest */ 2493 1.1 nonaka olduse = c->used; 2494 1.1 nonaka c->used = pa; 2495 1.1 nonaka 2496 1.1 nonaka { 2497 1.1 nonaka mp_digit *tmpc; 2498 1.1 nonaka 2499 1.1 nonaka tmpc = c->dp + digs; 2500 1.1 nonaka for (ix = digs; ix < pa; ix++) { 2501 1.1 nonaka /* now extract the previous digit [below the carry] */ 2502 1.1 nonaka *tmpc++ = W[ix]; 2503 1.1 nonaka } 2504 1.1 nonaka 2505 1.1 nonaka /* clear unused digits [that existed in the old copy of c] */ 2506 1.1 nonaka for (; ix < olduse; ix++) { 2507 1.1 nonaka *tmpc++ = 0; 2508 1.1 nonaka } 2509 1.1 nonaka } 2510 1.1 nonaka trim_unused_digits(c); 2511 1.1 nonaka return MP_OKAY; 2512 1.1 nonaka } 2513 1.1 nonaka 2514 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_fast_s_mp_mul_high_digs.c,v $ */ 2515 1.1 nonaka /* Revision: 1.1.1.1 $ */ 2516 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 2517 1.1 nonaka 2518 1.1 nonaka /* multiplies |a| * |b| and does not compute the lower digs digits 2519 1.1 nonaka * [meant to get the higher part of the product] 2520 1.1 nonaka */ 2521 1.1 nonaka static int 2522 1.1 nonaka basic_multiply_partial_upper(mp_int * a, mp_int * b, mp_int * c, int digs) 2523 1.1 nonaka { 2524 1.1 nonaka mp_int t; 2525 1.1 nonaka int res, pa, pb, ix, iy; 2526 1.1 nonaka mp_digit carry; 2527 1.1 nonaka mp_word r; 2528 1.1 nonaka mp_digit tmpx, *tmpt, *tmpy; 2529 1.1 nonaka 2530 1.1 nonaka /* can we use the fast multiplier? */ 2531 1.1 nonaka if (can_use_fast_column_array(a->used + b->used + 1, MIN(a->used, b->used))) { 2532 1.1 nonaka return fast_basic_multiply_partial_upper(a, b, c, digs); 2533 1.1 nonaka } 2534 1.1 nonaka 2535 1.1 nonaka if ((res = mp_init_size(&t, a->used + b->used + 1)) != MP_OKAY) { 2536 1.1 nonaka return res; 2537 1.1 nonaka } 2538 1.1 nonaka t.used = a->used + b->used + 1; 2539 1.1 nonaka 2540 1.1 nonaka pa = a->used; 2541 1.1 nonaka pb = b->used; 2542 1.1 nonaka for (ix = 0; ix < pa; ix++) { 2543 1.1 nonaka /* clear the carry */ 2544 1.1 nonaka carry = 0; 2545 1.1 nonaka 2546 1.1 nonaka /* left hand side of A[ix] * B[iy] */ 2547 1.1 nonaka tmpx = a->dp[ix]; 2548 1.1 nonaka 2549 1.1 nonaka /* alias to the address of where the digits will be stored */ 2550 1.1 nonaka tmpt = &(t.dp[digs]); 2551 1.1 nonaka 2552 1.1 nonaka /* alias for where to read the right hand side from */ 2553 1.1 nonaka tmpy = b->dp + (digs - ix); 2554 1.1 nonaka 2555 1.1 nonaka for (iy = digs - ix; iy < pb; iy++) { 2556 1.1 nonaka /* calculate the double precision result */ 2557 1.1 nonaka r = ((mp_word)*tmpt) + 2558 1.1 nonaka ((mp_word)tmpx) * ((mp_word)*tmpy++) + 2559 1.1 nonaka ((mp_word) carry); 2560 1.1 nonaka 2561 1.1 nonaka /* get the lower part */ 2562 1.1 nonaka *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); 2563 1.1 nonaka 2564 1.1 nonaka /* carry the carry */ 2565 1.1 nonaka carry = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); 2566 1.1 nonaka } 2567 1.1 nonaka *tmpt = carry; 2568 1.1 nonaka } 2569 1.1 nonaka trim_unused_digits(&t); 2570 1.1 nonaka mp_exch(&t, c); 2571 1.1 nonaka mp_clear(&t); 2572 1.1 nonaka return MP_OKAY; 2573 1.1 nonaka } 2574 1.1 nonaka 2575 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_s_mp_mul_high_digs.c,v $ */ 2576 1.1 nonaka /* Revision: 1.3 $ */ 2577 1.1 nonaka /* Date: 2011/03/18 16:43:04 $ */ 2578 1.1 nonaka 2579 1.1 nonaka /* reduces x mod m, assumes 0 < x < m**2, mu is 2580 1.1 nonaka * precomputed via mp_reduce_setup. 2581 1.1 nonaka * From HAC pp.604 Algorithm 14.42 2582 1.1 nonaka */ 2583 1.1 nonaka static int 2584 1.1 nonaka mp_reduce(mp_int * x, mp_int * m, mp_int * mu) 2585 1.1 nonaka { 2586 1.1 nonaka mp_int q; 2587 1.1 nonaka int res, um = m->used; 2588 1.1 nonaka 2589 1.1 nonaka /* q = x */ 2590 1.1 nonaka if ((res = mp_init_copy(&q, x)) != MP_OKAY) { 2591 1.1 nonaka return res; 2592 1.1 nonaka } 2593 1.1 nonaka 2594 1.1 nonaka /* q1 = x / b**(k-1) */ 2595 1.1 nonaka rshift_digits(&q, um - 1); 2596 1.1 nonaka 2597 1.1 nonaka /* according to HAC this optimization is ok */ 2598 1.1 nonaka if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { 2599 1.1 nonaka if ((res = signed_multiply(&q, mu, &q)) != MP_OKAY) { 2600 1.1 nonaka goto CLEANUP; 2601 1.1 nonaka } 2602 1.1 nonaka } else { 2603 1.1 nonaka if ((res = basic_multiply_partial_upper(&q, mu, &q, um)) != MP_OKAY) { 2604 1.1 nonaka goto CLEANUP; 2605 1.1 nonaka } 2606 1.1 nonaka } 2607 1.1 nonaka 2608 1.1 nonaka /* q3 = q2 / b**(k+1) */ 2609 1.1 nonaka rshift_digits(&q, um + 1); 2610 1.1 nonaka 2611 1.1 nonaka /* x = x mod b**(k+1), quick (no division) */ 2612 1.1 nonaka if ((res = modulo_2_to_power(x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { 2613 1.1 nonaka goto CLEANUP; 2614 1.1 nonaka } 2615 1.1 nonaka 2616 1.1 nonaka /* q = q * m mod b**(k+1), quick (no division) */ 2617 1.1 nonaka if ((res = basic_multiply_partial_lower(&q, m, &q, um + 1)) != MP_OKAY) { 2618 1.1 nonaka goto CLEANUP; 2619 1.1 nonaka } 2620 1.1 nonaka 2621 1.1 nonaka /* x = x - q */ 2622 1.1 nonaka if ((res = signed_subtract(x, &q, x)) != MP_OKAY) { 2623 1.1 nonaka goto CLEANUP; 2624 1.1 nonaka } 2625 1.1 nonaka 2626 1.1 nonaka /* If x < 0, add b**(k+1) to it */ 2627 1.1 nonaka if (compare_digit(x, 0) == MP_LT) { 2628 1.1 nonaka set_word(&q, 1); 2629 1.1 nonaka if ((res = lshift_digits(&q, um + 1)) != MP_OKAY) { 2630 1.1 nonaka goto CLEANUP; 2631 1.1 nonaka } 2632 1.1 nonaka if ((res = signed_add(x, &q, x)) != MP_OKAY) { 2633 1.1 nonaka goto CLEANUP; 2634 1.1 nonaka } 2635 1.1 nonaka } 2636 1.1 nonaka 2637 1.1 nonaka /* Back off if it's too big */ 2638 1.1 nonaka while (signed_compare(x, m) != MP_LT) { 2639 1.1 nonaka if ((res = basic_subtract(x, m, x)) != MP_OKAY) { 2640 1.1 nonaka goto CLEANUP; 2641 1.1 nonaka } 2642 1.1 nonaka } 2643 1.1 nonaka 2644 1.1 nonaka CLEANUP: 2645 1.1 nonaka mp_clear(&q); 2646 1.1 nonaka 2647 1.1 nonaka return res; 2648 1.1 nonaka } 2649 1.1 nonaka 2650 1.1 nonaka /* determines the setup value */ 2651 1.1 nonaka static int 2652 1.1 nonaka mp_reduce_2k_setup_l(mp_int *a, mp_int *d) 2653 1.1 nonaka { 2654 1.1 nonaka int res; 2655 1.1 nonaka mp_int tmp; 2656 1.1 nonaka 2657 1.1 nonaka if ((res = mp_init(&tmp)) != MP_OKAY) { 2658 1.1 nonaka return res; 2659 1.1 nonaka } 2660 1.1 nonaka 2661 1.1 nonaka if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { 2662 1.1 nonaka goto ERR; 2663 1.1 nonaka } 2664 1.1 nonaka 2665 1.1 nonaka if ((res = basic_subtract(&tmp, a, d)) != MP_OKAY) { 2666 1.1 nonaka goto ERR; 2667 1.1 nonaka } 2668 1.1 nonaka 2669 1.1 nonaka ERR: 2670 1.1 nonaka mp_clear(&tmp); 2671 1.1 nonaka return res; 2672 1.1 nonaka } 2673 1.1 nonaka 2674 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_reduce_2k_setup_l.c,v $ */ 2675 1.1 nonaka /* Revision: 1.1.1.1 $ */ 2676 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 2677 1.1 nonaka 2678 1.1 nonaka /* reduces a modulo n where n is of the form 2**p - d 2679 1.1 nonaka This differs from reduce_2k since "d" can be larger 2680 1.1 nonaka than a single digit. 2681 1.1 nonaka */ 2682 1.1 nonaka static int 2683 1.1 nonaka mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) 2684 1.1 nonaka { 2685 1.1 nonaka mp_int q; 2686 1.1 nonaka int p, res; 2687 1.1 nonaka 2688 1.1 nonaka if ((res = mp_init(&q)) != MP_OKAY) { 2689 1.1 nonaka return res; 2690 1.1 nonaka } 2691 1.1 nonaka 2692 1.1 nonaka p = mp_count_bits(n); 2693 1.1 nonaka top: 2694 1.1 nonaka /* q = a/2**p, a = a mod 2**p */ 2695 1.1 nonaka if ((res = rshift_bits(a, p, &q, a)) != MP_OKAY) { 2696 1.1 nonaka goto ERR; 2697 1.1 nonaka } 2698 1.1 nonaka 2699 1.1 nonaka /* q = q * d */ 2700 1.1 nonaka if ((res = signed_multiply(&q, d, &q)) != MP_OKAY) { 2701 1.1 nonaka goto ERR; 2702 1.1 nonaka } 2703 1.1 nonaka 2704 1.1 nonaka /* a = a + q */ 2705 1.1 nonaka if ((res = basic_add(a, &q, a)) != MP_OKAY) { 2706 1.1 nonaka goto ERR; 2707 1.1 nonaka } 2708 1.1 nonaka 2709 1.1 nonaka if (compare_magnitude(a, n) != MP_LT) { 2710 1.1 nonaka basic_subtract(a, n, a); 2711 1.1 nonaka goto top; 2712 1.1 nonaka } 2713 1.1 nonaka 2714 1.1 nonaka ERR: 2715 1.1 nonaka mp_clear(&q); 2716 1.1 nonaka return res; 2717 1.1 nonaka } 2718 1.1 nonaka 2719 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_reduce_2k_l.c,v $ */ 2720 1.1 nonaka /* Revision: 1.1.1.1 $ */ 2721 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 2722 1.1 nonaka 2723 1.1 nonaka /* squaring using Toom-Cook 3-way algorithm */ 2724 1.1 nonaka static int 2725 1.1 nonaka toom_cook_square(mp_int *a, mp_int *b) 2726 1.1 nonaka { 2727 1.1 nonaka mp_int w0, w1, w2, w3, w4, tmp1, a0, a1, a2; 2728 1.1 nonaka int res, B; 2729 1.1 nonaka 2730 1.1 nonaka /* init temps */ 2731 1.1 nonaka if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL)) != MP_OKAY) { 2732 1.1 nonaka return res; 2733 1.1 nonaka } 2734 1.1 nonaka 2735 1.1 nonaka /* B */ 2736 1.1 nonaka B = a->used / 3; 2737 1.1 nonaka 2738 1.1 nonaka /* a = a2 * B**2 + a1 * B + a0 */ 2739 1.1 nonaka if ((res = modulo_2_to_power(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { 2740 1.1 nonaka goto ERR; 2741 1.1 nonaka } 2742 1.1 nonaka 2743 1.1 nonaka if ((res = mp_copy(a, &a1)) != MP_OKAY) { 2744 1.1 nonaka goto ERR; 2745 1.1 nonaka } 2746 1.1 nonaka rshift_digits(&a1, B); 2747 1.1 nonaka modulo_2_to_power(&a1, DIGIT_BIT * B, &a1); 2748 1.1 nonaka 2749 1.1 nonaka if ((res = mp_copy(a, &a2)) != MP_OKAY) { 2750 1.1 nonaka goto ERR; 2751 1.1 nonaka } 2752 1.1 nonaka rshift_digits(&a2, B*2); 2753 1.1 nonaka 2754 1.1 nonaka /* w0 = a0*a0 */ 2755 1.1 nonaka if ((res = square(&a0, &w0)) != MP_OKAY) { 2756 1.1 nonaka goto ERR; 2757 1.1 nonaka } 2758 1.1 nonaka 2759 1.1 nonaka /* w4 = a2 * a2 */ 2760 1.1 nonaka if ((res = square(&a2, &w4)) != MP_OKAY) { 2761 1.1 nonaka goto ERR; 2762 1.1 nonaka } 2763 1.1 nonaka 2764 1.1 nonaka /* w1 = (a2 + 2(a1 + 2a0))**2 */ 2765 1.1 nonaka if ((res = doubled(&a0, &tmp1)) != MP_OKAY) { 2766 1.1 nonaka goto ERR; 2767 1.1 nonaka } 2768 1.1 nonaka if ((res = signed_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { 2769 1.1 nonaka goto ERR; 2770 1.1 nonaka } 2771 1.1 nonaka if ((res = doubled(&tmp1, &tmp1)) != MP_OKAY) { 2772 1.1 nonaka goto ERR; 2773 1.1 nonaka } 2774 1.1 nonaka if ((res = signed_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { 2775 1.1 nonaka goto ERR; 2776 1.1 nonaka } 2777 1.1 nonaka 2778 1.1 nonaka if ((res = square(&tmp1, &w1)) != MP_OKAY) { 2779 1.1 nonaka goto ERR; 2780 1.1 nonaka } 2781 1.1 nonaka 2782 1.1 nonaka /* w3 = (a0 + 2(a1 + 2a2))**2 */ 2783 1.1 nonaka if ((res = doubled(&a2, &tmp1)) != MP_OKAY) { 2784 1.1 nonaka goto ERR; 2785 1.1 nonaka } 2786 1.1 nonaka if ((res = signed_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { 2787 1.1 nonaka goto ERR; 2788 1.1 nonaka } 2789 1.1 nonaka if ((res = doubled(&tmp1, &tmp1)) != MP_OKAY) { 2790 1.1 nonaka goto ERR; 2791 1.1 nonaka } 2792 1.1 nonaka if ((res = signed_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { 2793 1.1 nonaka goto ERR; 2794 1.1 nonaka } 2795 1.1 nonaka 2796 1.1 nonaka if ((res = square(&tmp1, &w3)) != MP_OKAY) { 2797 1.1 nonaka goto ERR; 2798 1.1 nonaka } 2799 1.1 nonaka 2800 1.1 nonaka 2801 1.1 nonaka /* w2 = (a2 + a1 + a0)**2 */ 2802 1.1 nonaka if ((res = signed_add(&a2, &a1, &tmp1)) != MP_OKAY) { 2803 1.1 nonaka goto ERR; 2804 1.1 nonaka } 2805 1.1 nonaka if ((res = signed_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { 2806 1.1 nonaka goto ERR; 2807 1.1 nonaka } 2808 1.1 nonaka if ((res = square(&tmp1, &w2)) != MP_OKAY) { 2809 1.1 nonaka goto ERR; 2810 1.1 nonaka } 2811 1.1 nonaka 2812 1.1 nonaka /* now solve the matrix 2813 1.1 nonaka 2814 1.1 nonaka 0 0 0 0 1 2815 1.1 nonaka 1 2 4 8 16 2816 1.1 nonaka 1 1 1 1 1 2817 1.1 nonaka 16 8 4 2 1 2818 1.1 nonaka 1 0 0 0 0 2819 1.1 nonaka 2820 1.1 nonaka using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication. 2821 1.1 nonaka */ 2822 1.1 nonaka 2823 1.1 nonaka /* r1 - r4 */ 2824 1.1 nonaka if ((res = signed_subtract(&w1, &w4, &w1)) != MP_OKAY) { 2825 1.1 nonaka goto ERR; 2826 1.1 nonaka } 2827 1.1 nonaka /* r3 - r0 */ 2828 1.1 nonaka if ((res = signed_subtract(&w3, &w0, &w3)) != MP_OKAY) { 2829 1.1 nonaka goto ERR; 2830 1.1 nonaka } 2831 1.1 nonaka /* r1/2 */ 2832 1.1 nonaka if ((res = half(&w1, &w1)) != MP_OKAY) { 2833 1.1 nonaka goto ERR; 2834 1.1 nonaka } 2835 1.1 nonaka /* r3/2 */ 2836 1.1 nonaka if ((res = half(&w3, &w3)) != MP_OKAY) { 2837 1.1 nonaka goto ERR; 2838 1.1 nonaka } 2839 1.1 nonaka /* r2 - r0 - r4 */ 2840 1.1 nonaka if ((res = signed_subtract(&w2, &w0, &w2)) != MP_OKAY) { 2841 1.1 nonaka goto ERR; 2842 1.1 nonaka } 2843 1.1 nonaka if ((res = signed_subtract(&w2, &w4, &w2)) != MP_OKAY) { 2844 1.1 nonaka goto ERR; 2845 1.1 nonaka } 2846 1.1 nonaka /* r1 - r2 */ 2847 1.1 nonaka if ((res = signed_subtract(&w1, &w2, &w1)) != MP_OKAY) { 2848 1.1 nonaka goto ERR; 2849 1.1 nonaka } 2850 1.1 nonaka /* r3 - r2 */ 2851 1.1 nonaka if ((res = signed_subtract(&w3, &w2, &w3)) != MP_OKAY) { 2852 1.1 nonaka goto ERR; 2853 1.1 nonaka } 2854 1.1 nonaka /* r1 - 8r0 */ 2855 1.1 nonaka if ((res = lshift_bits(&w0, 3, &tmp1)) != MP_OKAY) { 2856 1.1 nonaka goto ERR; 2857 1.1 nonaka } 2858 1.1 nonaka if ((res = signed_subtract(&w1, &tmp1, &w1)) != MP_OKAY) { 2859 1.1 nonaka goto ERR; 2860 1.1 nonaka } 2861 1.1 nonaka /* r3 - 8r4 */ 2862 1.1 nonaka if ((res = lshift_bits(&w4, 3, &tmp1)) != MP_OKAY) { 2863 1.1 nonaka goto ERR; 2864 1.1 nonaka } 2865 1.1 nonaka if ((res = signed_subtract(&w3, &tmp1, &w3)) != MP_OKAY) { 2866 1.1 nonaka goto ERR; 2867 1.1 nonaka } 2868 1.1 nonaka /* 3r2 - r1 - r3 */ 2869 1.1 nonaka if ((res = multiply_digit(&w2, 3, &w2)) != MP_OKAY) { 2870 1.1 nonaka goto ERR; 2871 1.1 nonaka } 2872 1.1 nonaka if ((res = signed_subtract(&w2, &w1, &w2)) != MP_OKAY) { 2873 1.1 nonaka goto ERR; 2874 1.1 nonaka } 2875 1.1 nonaka if ((res = signed_subtract(&w2, &w3, &w2)) != MP_OKAY) { 2876 1.1 nonaka goto ERR; 2877 1.1 nonaka } 2878 1.1 nonaka /* r1 - r2 */ 2879 1.1 nonaka if ((res = signed_subtract(&w1, &w2, &w1)) != MP_OKAY) { 2880 1.1 nonaka goto ERR; 2881 1.1 nonaka } 2882 1.1 nonaka /* r3 - r2 */ 2883 1.1 nonaka if ((res = signed_subtract(&w3, &w2, &w3)) != MP_OKAY) { 2884 1.1 nonaka goto ERR; 2885 1.1 nonaka } 2886 1.1 nonaka /* r1/3 */ 2887 1.1 nonaka if ((res = third(&w1, &w1, NULL)) != MP_OKAY) { 2888 1.1 nonaka goto ERR; 2889 1.1 nonaka } 2890 1.1 nonaka /* r3/3 */ 2891 1.1 nonaka if ((res = third(&w3, &w3, NULL)) != MP_OKAY) { 2892 1.1 nonaka goto ERR; 2893 1.1 nonaka } 2894 1.1 nonaka 2895 1.1 nonaka /* at this point shift W[n] by B*n */ 2896 1.1 nonaka if ((res = lshift_digits(&w1, 1*B)) != MP_OKAY) { 2897 1.1 nonaka goto ERR; 2898 1.1 nonaka } 2899 1.1 nonaka if ((res = lshift_digits(&w2, 2*B)) != MP_OKAY) { 2900 1.1 nonaka goto ERR; 2901 1.1 nonaka } 2902 1.1 nonaka if ((res = lshift_digits(&w3, 3*B)) != MP_OKAY) { 2903 1.1 nonaka goto ERR; 2904 1.1 nonaka } 2905 1.1 nonaka if ((res = lshift_digits(&w4, 4*B)) != MP_OKAY) { 2906 1.1 nonaka goto ERR; 2907 1.1 nonaka } 2908 1.1 nonaka 2909 1.1 nonaka if ((res = signed_add(&w0, &w1, b)) != MP_OKAY) { 2910 1.1 nonaka goto ERR; 2911 1.1 nonaka } 2912 1.1 nonaka if ((res = signed_add(&w2, &w3, &tmp1)) != MP_OKAY) { 2913 1.1 nonaka goto ERR; 2914 1.1 nonaka } 2915 1.1 nonaka if ((res = signed_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { 2916 1.1 nonaka goto ERR; 2917 1.1 nonaka } 2918 1.1 nonaka if ((res = signed_add(&tmp1, b, b)) != MP_OKAY) { 2919 1.1 nonaka goto ERR; 2920 1.1 nonaka } 2921 1.1 nonaka 2922 1.1 nonaka ERR: 2923 1.1 nonaka mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL); 2924 1.1 nonaka return res; 2925 1.1 nonaka } 2926 1.1 nonaka 2927 1.1 nonaka 2928 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_toom_sqr.c,v $ */ 2929 1.1 nonaka /* Revision: 1.1.1.1 $ */ 2930 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 2931 1.1 nonaka 2932 1.1 nonaka /* Karatsuba squaring, computes b = a*a using three 2933 1.1 nonaka * half size squarings 2934 1.1 nonaka * 2935 1.1 nonaka * See comments of karatsuba_mul for details. It 2936 1.1 nonaka * is essentially the same algorithm but merely 2937 1.1 nonaka * tuned to perform recursive squarings. 2938 1.1 nonaka */ 2939 1.1 nonaka static int 2940 1.1 nonaka karatsuba_square(mp_int * a, mp_int * b) 2941 1.1 nonaka { 2942 1.1 nonaka mp_int x0, x1, t1, t2, x0x0, x1x1; 2943 1.1 nonaka int B, err; 2944 1.1 nonaka 2945 1.1 nonaka err = MP_MEM; 2946 1.1 nonaka 2947 1.1 nonaka /* min # of digits */ 2948 1.1 nonaka B = a->used; 2949 1.1 nonaka 2950 1.1 nonaka /* now divide in two */ 2951 1.1 nonaka B = (unsigned)B >> 1; 2952 1.1 nonaka 2953 1.1 nonaka /* init copy all the temps */ 2954 1.1 nonaka if (mp_init_size(&x0, B) != MP_OKAY) { 2955 1.1 nonaka goto ERR; 2956 1.1 nonaka } 2957 1.1 nonaka if (mp_init_size(&x1, a->used - B) != MP_OKAY) { 2958 1.1 nonaka goto X0; 2959 1.1 nonaka } 2960 1.1 nonaka /* init temps */ 2961 1.1 nonaka if (mp_init_size(&t1, a->used * 2) != MP_OKAY) { 2962 1.1 nonaka goto X1; 2963 1.1 nonaka } 2964 1.1 nonaka if (mp_init_size(&t2, a->used * 2) != MP_OKAY) { 2965 1.1 nonaka goto T1; 2966 1.1 nonaka } 2967 1.1 nonaka if (mp_init_size(&x0x0, B * 2) != MP_OKAY) { 2968 1.1 nonaka goto T2; 2969 1.1 nonaka } 2970 1.1 nonaka if (mp_init_size(&x1x1, (a->used - B) * 2) != MP_OKAY) { 2971 1.1 nonaka goto X0X0; 2972 1.1 nonaka } 2973 1.1 nonaka 2974 1.1 nonaka memcpy(x0.dp, a->dp, B * sizeof(*x0.dp)); 2975 1.1 nonaka memcpy(x1.dp, &a->dp[B], (a->used - B) * sizeof(*x1.dp)); 2976 1.1 nonaka 2977 1.1 nonaka x0.used = B; 2978 1.1 nonaka x1.used = a->used - B; 2979 1.1 nonaka 2980 1.1 nonaka trim_unused_digits(&x0); 2981 1.1 nonaka 2982 1.1 nonaka /* now calc the products x0*x0 and x1*x1 */ 2983 1.1 nonaka if (square(&x0, &x0x0) != MP_OKAY) { 2984 1.1 nonaka goto X1X1; /* x0x0 = x0*x0 */ 2985 1.1 nonaka } 2986 1.1 nonaka if (square(&x1, &x1x1) != MP_OKAY) { 2987 1.1 nonaka goto X1X1; /* x1x1 = x1*x1 */ 2988 1.1 nonaka } 2989 1.1 nonaka /* now calc (x1+x0)**2 */ 2990 1.1 nonaka if (basic_add(&x1, &x0, &t1) != MP_OKAY) { 2991 1.1 nonaka goto X1X1; /* t1 = x1 - x0 */ 2992 1.1 nonaka } 2993 1.1 nonaka if (square(&t1, &t1) != MP_OKAY) { 2994 1.1 nonaka goto X1X1; /* t1 = (x1 - x0) * (x1 - x0) */ 2995 1.1 nonaka } 2996 1.1 nonaka /* add x0y0 */ 2997 1.1 nonaka if (basic_add(&x0x0, &x1x1, &t2) != MP_OKAY) { 2998 1.1 nonaka goto X1X1; /* t2 = x0x0 + x1x1 */ 2999 1.1 nonaka } 3000 1.1 nonaka if (basic_subtract(&t1, &t2, &t1) != MP_OKAY) { 3001 1.1 nonaka goto X1X1; /* t1 = (x1+x0)**2 - (x0x0 + x1x1) */ 3002 1.1 nonaka } 3003 1.1 nonaka /* shift by B */ 3004 1.1 nonaka if (lshift_digits(&t1, B) != MP_OKAY) { 3005 1.1 nonaka goto X1X1; /* t1 = (x0x0 + x1x1 - (x1-x0)*(x1-x0))<<B */ 3006 1.1 nonaka } 3007 1.1 nonaka if (lshift_digits(&x1x1, B * 2) != MP_OKAY) { 3008 1.1 nonaka goto X1X1; /* x1x1 = x1x1 << 2*B */ 3009 1.1 nonaka } 3010 1.1 nonaka if (signed_add(&x0x0, &t1, &t1) != MP_OKAY) { 3011 1.1 nonaka goto X1X1; /* t1 = x0x0 + t1 */ 3012 1.1 nonaka } 3013 1.1 nonaka if (signed_add(&t1, &x1x1, b) != MP_OKAY) { 3014 1.1 nonaka goto X1X1; /* t1 = x0x0 + t1 + x1x1 */ 3015 1.1 nonaka } 3016 1.1 nonaka err = MP_OKAY; 3017 1.1 nonaka 3018 1.1 nonaka X1X1: 3019 1.1 nonaka mp_clear(&x1x1); 3020 1.1 nonaka X0X0: 3021 1.1 nonaka mp_clear(&x0x0); 3022 1.1 nonaka T2: 3023 1.1 nonaka mp_clear(&t2); 3024 1.1 nonaka T1: 3025 1.1 nonaka mp_clear(&t1); 3026 1.1 nonaka X1: 3027 1.1 nonaka mp_clear(&x1); 3028 1.1 nonaka X0: 3029 1.1 nonaka mp_clear(&x0); 3030 1.1 nonaka ERR: 3031 1.1 nonaka return err; 3032 1.1 nonaka } 3033 1.1 nonaka 3034 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_karatsuba_sqr.c,v $ */ 3035 1.1 nonaka /* Revision: 1.2 $ */ 3036 1.1 nonaka /* Date: 2011/03/12 23:43:54 $ */ 3037 1.1 nonaka 3038 1.1 nonaka /* the jist of squaring... 3039 1.1 nonaka * you do like mult except the offset of the tmpx [one that 3040 1.1 nonaka * starts closer to zero] can't equal the offset of tmpy. 3041 1.1 nonaka * So basically you set up iy like before then you min it with 3042 1.1 nonaka * (ty-tx) so that it never happens. You double all those 3043 1.1 nonaka * you add in the inner loop 3044 1.1 nonaka 3045 1.1 nonaka After that loop you do the squares and add them in. 3046 1.1 nonaka */ 3047 1.1 nonaka 3048 1.1 nonaka static int 3049 1.1 nonaka fast_basic_square(mp_int * a, mp_int * b) 3050 1.1 nonaka { 3051 1.1 nonaka int olduse, res, pa, ix, iz; 3052 1.1 nonaka mp_digit W[MP_WARRAY], *tmpx; 3053 1.1 nonaka mp_word W1; 3054 1.1 nonaka 3055 1.1 nonaka /* grow the destination as required */ 3056 1.1 nonaka pa = a->used + a->used; 3057 1.1 nonaka if (b->alloc < pa) { 3058 1.1 nonaka if ((res = mp_grow(b, pa)) != MP_OKAY) { 3059 1.1 nonaka return res; 3060 1.1 nonaka } 3061 1.1 nonaka } 3062 1.1 nonaka 3063 1.1 nonaka /* number of output digits to produce */ 3064 1.1 nonaka W1 = 0; 3065 1.1 nonaka for (ix = 0; ix < pa; ix++) { 3066 1.1 nonaka int tx, ty, iy; 3067 1.1 nonaka mp_word _W; 3068 1.1 nonaka mp_digit *tmpy; 3069 1.1 nonaka 3070 1.1 nonaka /* clear counter */ 3071 1.1 nonaka _W = 0; 3072 1.1 nonaka 3073 1.1 nonaka /* get offsets into the two bignums */ 3074 1.1 nonaka ty = MIN(a->used-1, ix); 3075 1.1 nonaka tx = ix - ty; 3076 1.1 nonaka 3077 1.1 nonaka /* setup temp aliases */ 3078 1.1 nonaka tmpx = a->dp + tx; 3079 1.1 nonaka tmpy = a->dp + ty; 3080 1.1 nonaka 3081 1.6 andvar /* this is the number of times the loop will iterate, essentially 3082 1.1 nonaka while (tx++ < a->used && ty-- >= 0) { ... } 3083 1.1 nonaka */ 3084 1.1 nonaka iy = MIN(a->used-tx, ty+1); 3085 1.1 nonaka 3086 1.1 nonaka /* now for squaring tx can never equal ty 3087 1.1 nonaka * we halve the distance since they approach at a rate of 2x 3088 1.1 nonaka * and we have to round because odd cases need to be executed 3089 1.1 nonaka */ 3090 1.1 nonaka iy = MIN(iy, (int)((unsigned)(ty-tx+1)>>1)); 3091 1.1 nonaka 3092 1.1 nonaka /* execute loop */ 3093 1.1 nonaka for (iz = 0; iz < iy; iz++) { 3094 1.1 nonaka _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); 3095 1.1 nonaka } 3096 1.1 nonaka 3097 1.1 nonaka /* double the inner product and add carry */ 3098 1.1 nonaka _W = _W + _W + W1; 3099 1.1 nonaka 3100 1.1 nonaka /* even columns have the square term in them */ 3101 1.1 nonaka if ((ix&1) == 0) { 3102 1.1 nonaka _W += ((mp_word)a->dp[(unsigned)ix>>1])*((mp_word)a->dp[(unsigned)ix>>1]); 3103 1.1 nonaka } 3104 1.1 nonaka 3105 1.1 nonaka /* store it */ 3106 1.1 nonaka W[ix] = (mp_digit)(_W & MP_MASK); 3107 1.1 nonaka 3108 1.1 nonaka /* make next carry */ 3109 1.1 nonaka W1 = _W >> ((mp_word)DIGIT_BIT); 3110 1.1 nonaka } 3111 1.1 nonaka 3112 1.1 nonaka /* setup dest */ 3113 1.1 nonaka olduse = b->used; 3114 1.1 nonaka b->used = a->used+a->used; 3115 1.1 nonaka 3116 1.1 nonaka { 3117 1.1 nonaka mp_digit *tmpb; 3118 1.1 nonaka tmpb = b->dp; 3119 1.1 nonaka for (ix = 0; ix < pa; ix++) { 3120 1.1 nonaka *tmpb++ = W[ix] & MP_MASK; 3121 1.1 nonaka } 3122 1.1 nonaka 3123 1.1 nonaka /* clear unused digits [that existed in the old copy of c] */ 3124 1.1 nonaka for (; ix < olduse; ix++) { 3125 1.1 nonaka *tmpb++ = 0; 3126 1.1 nonaka } 3127 1.1 nonaka } 3128 1.1 nonaka trim_unused_digits(b); 3129 1.1 nonaka return MP_OKAY; 3130 1.1 nonaka } 3131 1.1 nonaka 3132 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_fast_s_mp_sqr.c,v $ */ 3133 1.1 nonaka /* Revision: 1.3 $ */ 3134 1.1 nonaka /* Date: 2011/03/18 16:43:04 $ */ 3135 1.1 nonaka 3136 1.1 nonaka /* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ 3137 1.1 nonaka static int 3138 1.1 nonaka basic_square(mp_int * a, mp_int * b) 3139 1.1 nonaka { 3140 1.1 nonaka mp_int t; 3141 1.1 nonaka int res, ix, iy, pa; 3142 1.1 nonaka mp_word r; 3143 1.1 nonaka mp_digit carry, tmpx, *tmpt; 3144 1.1 nonaka 3145 1.1 nonaka pa = a->used; 3146 1.1 nonaka if ((res = mp_init_size(&t, 2*pa + 1)) != MP_OKAY) { 3147 1.1 nonaka return res; 3148 1.1 nonaka } 3149 1.1 nonaka 3150 1.1 nonaka /* default used is maximum possible size */ 3151 1.1 nonaka t.used = 2*pa + 1; 3152 1.1 nonaka 3153 1.1 nonaka for (ix = 0; ix < pa; ix++) { 3154 1.1 nonaka /* first calculate the digit at 2*ix */ 3155 1.1 nonaka /* calculate double precision result */ 3156 1.1 nonaka r = ((mp_word) t.dp[2*ix]) + 3157 1.1 nonaka ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]); 3158 1.1 nonaka 3159 1.1 nonaka /* store lower part in result */ 3160 1.1 nonaka t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK)); 3161 1.1 nonaka 3162 1.1 nonaka /* get the carry */ 3163 1.1 nonaka carry = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); 3164 1.1 nonaka 3165 1.1 nonaka /* left hand side of A[ix] * A[iy] */ 3166 1.1 nonaka tmpx = a->dp[ix]; 3167 1.1 nonaka 3168 1.1 nonaka /* alias for where to store the results */ 3169 1.1 nonaka tmpt = t.dp + (2*ix + 1); 3170 1.1 nonaka 3171 1.1 nonaka for (iy = ix + 1; iy < pa; iy++) { 3172 1.1 nonaka /* first calculate the product */ 3173 1.1 nonaka r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); 3174 1.1 nonaka 3175 1.1 nonaka /* now calculate the double precision result, note we use 3176 1.1 nonaka * addition instead of *2 since it's easier to optimize 3177 1.1 nonaka */ 3178 1.1 nonaka r = ((mp_word) *tmpt) + r + r + ((mp_word) carry); 3179 1.1 nonaka 3180 1.1 nonaka /* store lower part */ 3181 1.1 nonaka *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); 3182 1.1 nonaka 3183 1.1 nonaka /* get carry */ 3184 1.1 nonaka carry = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); 3185 1.1 nonaka } 3186 1.1 nonaka /* propagate upwards */ 3187 1.1 nonaka while (carry != ((mp_digit) 0)) { 3188 1.1 nonaka r = ((mp_word) *tmpt) + ((mp_word) carry); 3189 1.1 nonaka *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); 3190 1.1 nonaka carry = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); 3191 1.1 nonaka } 3192 1.1 nonaka } 3193 1.1 nonaka 3194 1.1 nonaka trim_unused_digits(&t); 3195 1.1 nonaka mp_exch(&t, b); 3196 1.1 nonaka mp_clear(&t); 3197 1.1 nonaka return MP_OKAY; 3198 1.1 nonaka } 3199 1.1 nonaka 3200 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_s_mp_sqr.c,v $ */ 3201 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3202 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3203 1.1 nonaka 3204 1.1 nonaka #define TOOM_SQR_CUTOFF 400 3205 1.1 nonaka #define KARATSUBA_SQR_CUTOFF 120 3206 1.1 nonaka 3207 1.1 nonaka /* computes b = a*a */ 3208 1.1 nonaka static int 3209 1.1 nonaka square(mp_int * a, mp_int * b) 3210 1.1 nonaka { 3211 1.1 nonaka int res; 3212 1.1 nonaka 3213 1.1 nonaka /* use Toom-Cook? */ 3214 1.1 nonaka if (a->used >= TOOM_SQR_CUTOFF) { 3215 1.1 nonaka res = toom_cook_square(a, b); 3216 1.1 nonaka /* Karatsuba? */ 3217 1.1 nonaka } else if (a->used >= KARATSUBA_SQR_CUTOFF) { 3218 1.1 nonaka res = karatsuba_square(a, b); 3219 1.1 nonaka } else { 3220 1.1 nonaka /* can we use the fast comba multiplier? */ 3221 1.1 nonaka if (can_use_fast_column_array(a->used + a->used + 1, a->used)) { 3222 1.1 nonaka res = fast_basic_square(a, b); 3223 1.1 nonaka } else { 3224 1.1 nonaka res = basic_square(a, b); 3225 1.1 nonaka } 3226 1.1 nonaka } 3227 1.1 nonaka b->sign = MP_ZPOS; 3228 1.1 nonaka return res; 3229 1.1 nonaka } 3230 1.1 nonaka 3231 1.1 nonaka /* find window size */ 3232 1.1 nonaka static inline int 3233 1.1 nonaka find_window_size(mp_int *X) 3234 1.1 nonaka { 3235 1.1 nonaka int x; 3236 1.1 nonaka 3237 1.1 nonaka x = mp_count_bits(X); 3238 1.1 nonaka return (x <= 7) ? 2 : (x <= 36) ? 3 : (x <= 140) ? 4 : (x <= 450) ? 5 : (x <= 1303) ? 6 : (x <= 3529) ? 7 : 8; 3239 1.1 nonaka } 3240 1.1 nonaka 3241 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_sqr.c,v $ */ 3242 1.1 nonaka /* Revision: 1.3 $ */ 3243 1.1 nonaka /* Date: 2011/03/18 16:43:04 $ */ 3244 1.1 nonaka 3245 1.1 nonaka #define TAB_SIZE 256 3246 1.1 nonaka 3247 1.1 nonaka static int 3248 1.1 nonaka basic_exponent_mod(mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) 3249 1.1 nonaka { 3250 1.1 nonaka mp_digit buf; 3251 1.1 nonaka mp_int M[TAB_SIZE], res, mu; 3252 1.1 nonaka int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; 3253 1.1 nonaka int (*redux)(mp_int*,mp_int*,mp_int*); 3254 1.1 nonaka 3255 1.1 nonaka winsize = find_window_size(X); 3256 1.1 nonaka 3257 1.1 nonaka /* init M array */ 3258 1.1 nonaka /* init first cell */ 3259 1.1 nonaka if ((err = mp_init(&M[1])) != MP_OKAY) { 3260 1.1 nonaka return err; 3261 1.1 nonaka } 3262 1.1 nonaka 3263 1.1 nonaka /* now init the second half of the array */ 3264 1.1 nonaka for (x = 1<<(winsize-1); x < (1 << winsize); x++) { 3265 1.1 nonaka if ((err = mp_init(&M[x])) != MP_OKAY) { 3266 1.1 nonaka for (y = 1<<(winsize-1); y < x; y++) { 3267 1.1 nonaka mp_clear(&M[y]); 3268 1.1 nonaka } 3269 1.1 nonaka mp_clear(&M[1]); 3270 1.1 nonaka return err; 3271 1.1 nonaka } 3272 1.1 nonaka } 3273 1.1 nonaka 3274 1.1 nonaka /* create mu, used for Barrett reduction */ 3275 1.1 nonaka if ((err = mp_init(&mu)) != MP_OKAY) { 3276 1.1 nonaka goto LBL_M; 3277 1.1 nonaka } 3278 1.1 nonaka 3279 1.1 nonaka if (redmode == 0) { 3280 1.1 nonaka if ((err = mp_reduce_setup(&mu, P)) != MP_OKAY) { 3281 1.1 nonaka goto LBL_MU; 3282 1.1 nonaka } 3283 1.1 nonaka redux = mp_reduce; 3284 1.1 nonaka } else { 3285 1.1 nonaka if ((err = mp_reduce_2k_setup_l(P, &mu)) != MP_OKAY) { 3286 1.1 nonaka goto LBL_MU; 3287 1.1 nonaka } 3288 1.1 nonaka redux = mp_reduce_2k_l; 3289 1.1 nonaka } 3290 1.1 nonaka 3291 1.1 nonaka /* create M table 3292 1.1 nonaka * 3293 1.1 nonaka * The M table contains powers of the base, 3294 1.1 nonaka * e.g. M[x] = G**x mod P 3295 1.1 nonaka * 3296 1.1 nonaka * The first half of the table is not 3297 1.1 nonaka * computed though accept for M[0] and M[1] 3298 1.1 nonaka */ 3299 1.1 nonaka if ((err = modulo(G, P, &M[1])) != MP_OKAY) { 3300 1.1 nonaka goto LBL_MU; 3301 1.1 nonaka } 3302 1.1 nonaka 3303 1.1 nonaka /* compute the value at M[1<<(winsize-1)] by squaring 3304 1.1 nonaka * M[1] (winsize-1) times 3305 1.1 nonaka */ 3306 1.1 nonaka if ((err = mp_copy( &M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { 3307 1.1 nonaka goto LBL_MU; 3308 1.1 nonaka } 3309 1.1 nonaka 3310 1.1 nonaka for (x = 0; x < (winsize - 1); x++) { 3311 1.1 nonaka /* square it */ 3312 1.1 nonaka if ((err = square(&M[1 << (winsize - 1)], 3313 1.1 nonaka &M[1 << (winsize - 1)])) != MP_OKAY) { 3314 1.1 nonaka goto LBL_MU; 3315 1.1 nonaka } 3316 1.1 nonaka 3317 1.1 nonaka /* reduce modulo P */ 3318 1.1 nonaka if ((err = redux(&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { 3319 1.1 nonaka goto LBL_MU; 3320 1.1 nonaka } 3321 1.1 nonaka } 3322 1.1 nonaka 3323 1.1 nonaka /* create upper table, that is M[x] = M[x-1] * M[1] (mod P) 3324 1.1 nonaka * for x = (2**(winsize - 1) + 1) to (2**winsize - 1) 3325 1.1 nonaka */ 3326 1.1 nonaka for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { 3327 1.1 nonaka if ((err = signed_multiply(&M[x - 1], &M[1], &M[x])) != MP_OKAY) { 3328 1.1 nonaka goto LBL_MU; 3329 1.1 nonaka } 3330 1.1 nonaka if ((err = redux(&M[x], P, &mu)) != MP_OKAY) { 3331 1.1 nonaka goto LBL_MU; 3332 1.1 nonaka } 3333 1.1 nonaka } 3334 1.1 nonaka 3335 1.1 nonaka /* setup result */ 3336 1.1 nonaka if ((err = mp_init(&res)) != MP_OKAY) { 3337 1.1 nonaka goto LBL_MU; 3338 1.1 nonaka } 3339 1.1 nonaka set_word(&res, 1); 3340 1.1 nonaka 3341 1.1 nonaka /* set initial mode and bit cnt */ 3342 1.1 nonaka mode = 0; 3343 1.1 nonaka bitcnt = 1; 3344 1.1 nonaka buf = 0; 3345 1.1 nonaka digidx = X->used - 1; 3346 1.1 nonaka bitcpy = 0; 3347 1.1 nonaka bitbuf = 0; 3348 1.1 nonaka 3349 1.1 nonaka for (;;) { 3350 1.1 nonaka /* grab next digit as required */ 3351 1.1 nonaka if (--bitcnt == 0) { 3352 1.1 nonaka /* if digidx == -1 we are out of digits */ 3353 1.1 nonaka if (digidx == -1) { 3354 1.1 nonaka break; 3355 1.1 nonaka } 3356 1.1 nonaka /* read next digit and reset the bitcnt */ 3357 1.1 nonaka buf = X->dp[digidx--]; 3358 1.1 nonaka bitcnt = (int) DIGIT_BIT; 3359 1.1 nonaka } 3360 1.1 nonaka 3361 1.1 nonaka /* grab the next msb from the exponent */ 3362 1.1 nonaka y = (unsigned)(buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; 3363 1.1 nonaka buf <<= (mp_digit)1; 3364 1.1 nonaka 3365 1.1 nonaka /* if the bit is zero and mode == 0 then we ignore it 3366 1.1 nonaka * These represent the leading zero bits before the first 1 bit 3367 1.1 nonaka * in the exponent. Technically this opt is not required but it 3368 1.1 nonaka * does lower the # of trivial squaring/reductions used 3369 1.1 nonaka */ 3370 1.1 nonaka if (mode == 0 && y == 0) { 3371 1.1 nonaka continue; 3372 1.1 nonaka } 3373 1.1 nonaka 3374 1.1 nonaka /* if the bit is zero and mode == 1 then we square */ 3375 1.1 nonaka if (mode == 1 && y == 0) { 3376 1.1 nonaka if ((err = square(&res, &res)) != MP_OKAY) { 3377 1.1 nonaka goto LBL_RES; 3378 1.1 nonaka } 3379 1.1 nonaka if ((err = redux(&res, P, &mu)) != MP_OKAY) { 3380 1.1 nonaka goto LBL_RES; 3381 1.1 nonaka } 3382 1.1 nonaka continue; 3383 1.1 nonaka } 3384 1.1 nonaka 3385 1.1 nonaka /* else we add it to the window */ 3386 1.1 nonaka bitbuf |= (y << (winsize - ++bitcpy)); 3387 1.1 nonaka mode = 2; 3388 1.1 nonaka 3389 1.1 nonaka if (bitcpy == winsize) { 3390 1.1 nonaka /* ok window is filled so square as required and multiply */ 3391 1.1 nonaka /* square first */ 3392 1.1 nonaka for (x = 0; x < winsize; x++) { 3393 1.1 nonaka if ((err = square(&res, &res)) != MP_OKAY) { 3394 1.1 nonaka goto LBL_RES; 3395 1.1 nonaka } 3396 1.1 nonaka if ((err = redux(&res, P, &mu)) != MP_OKAY) { 3397 1.1 nonaka goto LBL_RES; 3398 1.1 nonaka } 3399 1.1 nonaka } 3400 1.1 nonaka 3401 1.1 nonaka /* then multiply */ 3402 1.1 nonaka if ((err = signed_multiply(&res, &M[bitbuf], &res)) != MP_OKAY) { 3403 1.1 nonaka goto LBL_RES; 3404 1.1 nonaka } 3405 1.1 nonaka if ((err = redux(&res, P, &mu)) != MP_OKAY) { 3406 1.1 nonaka goto LBL_RES; 3407 1.1 nonaka } 3408 1.1 nonaka 3409 1.1 nonaka /* empty window and reset */ 3410 1.1 nonaka bitcpy = 0; 3411 1.1 nonaka bitbuf = 0; 3412 1.1 nonaka mode = 1; 3413 1.1 nonaka } 3414 1.1 nonaka } 3415 1.1 nonaka 3416 1.1 nonaka /* if bits remain then square/multiply */ 3417 1.1 nonaka if (mode == 2 && bitcpy > 0) { 3418 1.1 nonaka /* square then multiply if the bit is set */ 3419 1.1 nonaka for (x = 0; x < bitcpy; x++) { 3420 1.1 nonaka if ((err = square(&res, &res)) != MP_OKAY) { 3421 1.1 nonaka goto LBL_RES; 3422 1.1 nonaka } 3423 1.1 nonaka if ((err = redux(&res, P, &mu)) != MP_OKAY) { 3424 1.1 nonaka goto LBL_RES; 3425 1.1 nonaka } 3426 1.1 nonaka 3427 1.1 nonaka bitbuf <<= 1; 3428 1.1 nonaka if ((bitbuf & (1 << winsize)) != 0) { 3429 1.1 nonaka /* then multiply */ 3430 1.1 nonaka if ((err = signed_multiply(&res, &M[1], &res)) != MP_OKAY) { 3431 1.1 nonaka goto LBL_RES; 3432 1.1 nonaka } 3433 1.1 nonaka if ((err = redux(&res, P, &mu)) != MP_OKAY) { 3434 1.1 nonaka goto LBL_RES; 3435 1.1 nonaka } 3436 1.1 nonaka } 3437 1.1 nonaka } 3438 1.1 nonaka } 3439 1.1 nonaka 3440 1.1 nonaka mp_exch(&res, Y); 3441 1.1 nonaka err = MP_OKAY; 3442 1.1 nonaka LBL_RES: 3443 1.1 nonaka mp_clear(&res); 3444 1.1 nonaka LBL_MU: 3445 1.1 nonaka mp_clear(&mu); 3446 1.1 nonaka LBL_M: 3447 1.1 nonaka mp_clear(&M[1]); 3448 1.1 nonaka for (x = 1<<(winsize-1); x < (1 << winsize); x++) { 3449 1.1 nonaka mp_clear(&M[x]); 3450 1.1 nonaka } 3451 1.1 nonaka return err; 3452 1.1 nonaka } 3453 1.1 nonaka 3454 1.1 nonaka /* determines if a number is a valid DR modulus */ 3455 1.1 nonaka static int 3456 1.1 nonaka is_diminished_radix_modulus(mp_int *a) 3457 1.1 nonaka { 3458 1.1 nonaka int ix; 3459 1.1 nonaka 3460 1.1 nonaka /* must be at least two digits */ 3461 1.1 nonaka if (a->used < 2) { 3462 1.1 nonaka return 0; 3463 1.1 nonaka } 3464 1.1 nonaka 3465 1.1 nonaka /* must be of the form b**k - a [a <= b] so all 3466 1.1 nonaka * but the first digit must be equal to -1 (mod b). 3467 1.1 nonaka */ 3468 1.1 nonaka for (ix = 1; ix < a->used; ix++) { 3469 1.1 nonaka if (a->dp[ix] != MP_MASK) { 3470 1.1 nonaka return 0; 3471 1.1 nonaka } 3472 1.1 nonaka } 3473 1.1 nonaka return 1; 3474 1.1 nonaka } 3475 1.1 nonaka 3476 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_dr_is_modulus.c,v $ */ 3477 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3478 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3479 1.1 nonaka 3480 1.1 nonaka /* determines if mp_reduce_2k can be used */ 3481 1.1 nonaka static int 3482 1.1 nonaka mp_reduce_is_2k(mp_int *a) 3483 1.1 nonaka { 3484 1.1 nonaka int ix, iy, iw; 3485 1.1 nonaka mp_digit iz; 3486 1.1 nonaka 3487 1.1 nonaka if (a->used == 0) { 3488 1.1 nonaka return MP_NO; 3489 1.1 nonaka } 3490 1.1 nonaka if (a->used == 1) { 3491 1.1 nonaka return MP_YES; 3492 1.1 nonaka } 3493 1.1 nonaka if (a->used > 1) { 3494 1.1 nonaka iy = mp_count_bits(a); 3495 1.1 nonaka iz = 1; 3496 1.1 nonaka iw = 1; 3497 1.1 nonaka 3498 1.1 nonaka /* Test every bit from the second digit up, must be 1 */ 3499 1.1 nonaka for (ix = DIGIT_BIT; ix < iy; ix++) { 3500 1.1 nonaka if ((a->dp[iw] & iz) == 0) { 3501 1.1 nonaka return MP_NO; 3502 1.1 nonaka } 3503 1.1 nonaka iz <<= 1; 3504 1.1 nonaka if (iz > (mp_digit)MP_MASK) { 3505 1.1 nonaka ++iw; 3506 1.1 nonaka iz = 1; 3507 1.1 nonaka } 3508 1.1 nonaka } 3509 1.1 nonaka } 3510 1.1 nonaka return MP_YES; 3511 1.1 nonaka } 3512 1.1 nonaka 3513 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_reduce_is_2k.c,v $ */ 3514 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3515 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3516 1.1 nonaka 3517 1.1 nonaka 3518 1.1 nonaka /* d = a * b (mod c) */ 3519 1.1 nonaka static int 3520 1.1 nonaka multiply_modulo(mp_int *d, mp_int * a, mp_int * b, mp_int * c) 3521 1.1 nonaka { 3522 1.1 nonaka mp_int t; 3523 1.1 nonaka int res; 3524 1.1 nonaka 3525 1.1 nonaka if ((res = mp_init(&t)) != MP_OKAY) { 3526 1.1 nonaka return res; 3527 1.1 nonaka } 3528 1.1 nonaka 3529 1.1 nonaka if ((res = signed_multiply(a, b, &t)) != MP_OKAY) { 3530 1.1 nonaka mp_clear(&t); 3531 1.1 nonaka return res; 3532 1.1 nonaka } 3533 1.1 nonaka res = modulo(&t, c, d); 3534 1.1 nonaka mp_clear(&t); 3535 1.1 nonaka return res; 3536 1.1 nonaka } 3537 1.1 nonaka 3538 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_mulmod.c,v $ */ 3539 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3540 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3541 1.1 nonaka 3542 1.1 nonaka /* setups the montgomery reduction stuff */ 3543 1.1 nonaka static int 3544 1.1 nonaka mp_montgomery_setup(mp_int * n, mp_digit * rho) 3545 1.1 nonaka { 3546 1.1 nonaka mp_digit x, b; 3547 1.1 nonaka 3548 1.1 nonaka /* fast inversion mod 2**k 3549 1.1 nonaka * 3550 1.1 nonaka * Based on the fact that 3551 1.1 nonaka * 3552 1.1 nonaka * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) 3553 1.1 nonaka * => 2*X*A - X*X*A*A = 1 3554 1.1 nonaka * => 2*(1) - (1) = 1 3555 1.1 nonaka */ 3556 1.1 nonaka b = n->dp[0]; 3557 1.1 nonaka 3558 1.1 nonaka if ((b & 1) == 0) { 3559 1.1 nonaka return MP_VAL; 3560 1.1 nonaka } 3561 1.1 nonaka 3562 1.1 nonaka x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ 3563 1.1 nonaka x *= 2 - b * x; /* here x*a==1 mod 2**8 */ 3564 1.1 nonaka x *= 2 - b * x; /* here x*a==1 mod 2**16 */ 3565 1.1 nonaka x *= 2 - b * x; /* here x*a==1 mod 2**32 */ 3566 1.1 nonaka if (/*CONSTCOND*/sizeof(mp_digit) == 8) { 3567 1.1 nonaka x *= 2 - b * x; /* here x*a==1 mod 2**64 */ 3568 1.1 nonaka } 3569 1.1 nonaka 3570 1.1 nonaka /* rho = -1/m mod b */ 3571 1.1 nonaka *rho = (unsigned long)(((mp_word)1 << ((mp_word) DIGIT_BIT)) - x) & MP_MASK; 3572 1.1 nonaka 3573 1.1 nonaka return MP_OKAY; 3574 1.1 nonaka } 3575 1.1 nonaka 3576 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_montgomery_setup.c,v $ */ 3577 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3578 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3579 1.1 nonaka 3580 1.1 nonaka /* computes xR**-1 == x (mod N) via Montgomery Reduction 3581 1.1 nonaka * 3582 1.1 nonaka * This is an optimized implementation of montgomery_reduce 3583 1.1 nonaka * which uses the comba method to quickly calculate the columns of the 3584 1.1 nonaka * reduction. 3585 1.1 nonaka * 3586 1.1 nonaka * Based on Algorithm 14.32 on pp.601 of HAC. 3587 1.1 nonaka */ 3588 1.1 nonaka static int 3589 1.1 nonaka fast_mp_montgomery_reduce(mp_int * x, mp_int * n, mp_digit rho) 3590 1.1 nonaka { 3591 1.1 nonaka int ix, res, olduse; 3592 1.1 nonaka /*LINTED*/ 3593 1.1 nonaka mp_word W[MP_WARRAY]; 3594 1.1 nonaka 3595 1.1 nonaka /* get old used count */ 3596 1.1 nonaka olduse = x->used; 3597 1.1 nonaka 3598 1.1 nonaka /* grow a as required */ 3599 1.1 nonaka if (x->alloc < n->used + 1) { 3600 1.1 nonaka if ((res = mp_grow(x, n->used + 1)) != MP_OKAY) { 3601 1.1 nonaka return res; 3602 1.1 nonaka } 3603 1.1 nonaka } 3604 1.1 nonaka 3605 1.1 nonaka /* first we have to get the digits of the input into 3606 1.1 nonaka * an array of double precision words W[...] 3607 1.1 nonaka */ 3608 1.1 nonaka { 3609 1.1 nonaka mp_word *_W; 3610 1.1 nonaka mp_digit *tmpx; 3611 1.1 nonaka 3612 1.1 nonaka /* alias for the W[] array */ 3613 1.1 nonaka _W = W; 3614 1.1 nonaka 3615 1.1 nonaka /* alias for the digits of x*/ 3616 1.1 nonaka tmpx = x->dp; 3617 1.1 nonaka 3618 1.1 nonaka /* copy the digits of a into W[0..a->used-1] */ 3619 1.1 nonaka for (ix = 0; ix < x->used; ix++) { 3620 1.1 nonaka *_W++ = *tmpx++; 3621 1.1 nonaka } 3622 1.1 nonaka 3623 1.1 nonaka /* zero the high words of W[a->used..m->used*2] */ 3624 1.1 nonaka for (; ix < n->used * 2 + 1; ix++) { 3625 1.1 nonaka *_W++ = 0; 3626 1.1 nonaka } 3627 1.1 nonaka } 3628 1.1 nonaka 3629 1.1 nonaka /* now we proceed to zero successive digits 3630 1.1 nonaka * from the least significant upwards 3631 1.1 nonaka */ 3632 1.1 nonaka for (ix = 0; ix < n->used; ix++) { 3633 1.1 nonaka /* mu = ai * m' mod b 3634 1.1 nonaka * 3635 1.1 nonaka * We avoid a double precision multiplication (which isn't required) 3636 1.1 nonaka * by casting the value down to a mp_digit. Note this requires 3637 1.1 nonaka * that W[ix-1] have the carry cleared (see after the inner loop) 3638 1.1 nonaka */ 3639 1.1 nonaka mp_digit mu; 3640 1.1 nonaka mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); 3641 1.1 nonaka 3642 1.1 nonaka /* a = a + mu * m * b**i 3643 1.1 nonaka * 3644 1.1 nonaka * This is computed in place and on the fly. The multiplication 3645 1.4 msaitoh * by b**i is handled by offsetting which columns the results 3646 1.1 nonaka * are added to. 3647 1.1 nonaka * 3648 1.1 nonaka * Note the comba method normally doesn't handle carries in the 3649 1.1 nonaka * inner loop In this case we fix the carry from the previous 3650 1.1 nonaka * column since the Montgomery reduction requires digits of the 3651 1.1 nonaka * result (so far) [see above] to work. This is 3652 1.1 nonaka * handled by fixing up one carry after the inner loop. The 3653 1.1 nonaka * carry fixups are done in order so after these loops the 3654 1.1 nonaka * first m->used words of W[] have the carries fixed 3655 1.1 nonaka */ 3656 1.1 nonaka { 3657 1.1 nonaka int iy; 3658 1.1 nonaka mp_digit *tmpn; 3659 1.1 nonaka mp_word *_W; 3660 1.1 nonaka 3661 1.1 nonaka /* alias for the digits of the modulus */ 3662 1.1 nonaka tmpn = n->dp; 3663 1.1 nonaka 3664 1.1 nonaka /* Alias for the columns set by an offset of ix */ 3665 1.1 nonaka _W = W + ix; 3666 1.1 nonaka 3667 1.1 nonaka /* inner loop */ 3668 1.1 nonaka for (iy = 0; iy < n->used; iy++) { 3669 1.1 nonaka *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); 3670 1.1 nonaka } 3671 1.1 nonaka } 3672 1.1 nonaka 3673 1.1 nonaka /* now fix carry for next digit, W[ix+1] */ 3674 1.1 nonaka W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); 3675 1.1 nonaka } 3676 1.1 nonaka 3677 1.1 nonaka /* now we have to propagate the carries and 3678 1.1 nonaka * shift the words downward [all those least 3679 1.1 nonaka * significant digits we zeroed]. 3680 1.1 nonaka */ 3681 1.1 nonaka { 3682 1.1 nonaka mp_digit *tmpx; 3683 1.1 nonaka mp_word *_W, *_W1; 3684 1.1 nonaka 3685 1.1 nonaka /* nox fix rest of carries */ 3686 1.1 nonaka 3687 1.1 nonaka /* alias for current word */ 3688 1.1 nonaka _W1 = W + ix; 3689 1.1 nonaka 3690 1.1 nonaka /* alias for next word, where the carry goes */ 3691 1.1 nonaka _W = W + ++ix; 3692 1.1 nonaka 3693 1.1 nonaka for (; ix <= n->used * 2 + 1; ix++) { 3694 1.1 nonaka *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); 3695 1.1 nonaka } 3696 1.1 nonaka 3697 1.1 nonaka /* copy out, A = A/b**n 3698 1.1 nonaka * 3699 1.1 nonaka * The result is A/b**n but instead of converting from an 3700 1.1 nonaka * array of mp_word to mp_digit than calling rshift_digits 3701 1.1 nonaka * we just copy them in the right order 3702 1.1 nonaka */ 3703 1.1 nonaka 3704 1.1 nonaka /* alias for destination word */ 3705 1.1 nonaka tmpx = x->dp; 3706 1.1 nonaka 3707 1.1 nonaka /* alias for shifted double precision result */ 3708 1.1 nonaka _W = W + n->used; 3709 1.1 nonaka 3710 1.1 nonaka for (ix = 0; ix < n->used + 1; ix++) { 3711 1.1 nonaka *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); 3712 1.1 nonaka } 3713 1.1 nonaka 3714 1.1 nonaka /* zero oldused digits, if the input a was larger than 3715 1.1 nonaka * m->used+1 we'll have to clear the digits 3716 1.1 nonaka */ 3717 1.1 nonaka for (; ix < olduse; ix++) { 3718 1.1 nonaka *tmpx++ = 0; 3719 1.1 nonaka } 3720 1.1 nonaka } 3721 1.1 nonaka 3722 1.1 nonaka /* set the max used and clamp */ 3723 1.1 nonaka x->used = n->used + 1; 3724 1.1 nonaka trim_unused_digits(x); 3725 1.1 nonaka 3726 1.1 nonaka /* if A >= m then A = A - m */ 3727 1.1 nonaka if (compare_magnitude(x, n) != MP_LT) { 3728 1.1 nonaka return basic_subtract(x, n, x); 3729 1.1 nonaka } 3730 1.1 nonaka return MP_OKAY; 3731 1.1 nonaka } 3732 1.1 nonaka 3733 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_fast_mp_montgomery_reduce.c,v $ */ 3734 1.1 nonaka /* Revision: 1.2 $ */ 3735 1.1 nonaka /* Date: 2011/03/18 16:22:09 $ */ 3736 1.1 nonaka 3737 1.1 nonaka /* computes xR**-1 == x (mod N) via Montgomery Reduction */ 3738 1.1 nonaka static int 3739 1.1 nonaka mp_montgomery_reduce(mp_int * x, mp_int * n, mp_digit rho) 3740 1.1 nonaka { 3741 1.1 nonaka int ix, res, digs; 3742 1.1 nonaka mp_digit mu; 3743 1.1 nonaka 3744 1.1 nonaka /* can the fast reduction [comba] method be used? 3745 1.1 nonaka * 3746 1.1 nonaka * Note that unlike in mul you're safely allowed *less* 3747 1.1 nonaka * than the available columns [255 per default] since carries 3748 1.1 nonaka * are fixed up in the inner loop. 3749 1.1 nonaka */ 3750 1.1 nonaka digs = n->used * 2 + 1; 3751 1.1 nonaka if (can_use_fast_column_array(digs, n->used)) { 3752 1.1 nonaka return fast_mp_montgomery_reduce(x, n, rho); 3753 1.1 nonaka } 3754 1.1 nonaka 3755 1.1 nonaka /* grow the input as required */ 3756 1.1 nonaka if (x->alloc < digs) { 3757 1.1 nonaka if ((res = mp_grow(x, digs)) != MP_OKAY) { 3758 1.1 nonaka return res; 3759 1.1 nonaka } 3760 1.1 nonaka } 3761 1.1 nonaka x->used = digs; 3762 1.1 nonaka 3763 1.1 nonaka for (ix = 0; ix < n->used; ix++) { 3764 1.1 nonaka /* mu = ai * rho mod b 3765 1.1 nonaka * 3766 1.1 nonaka * The value of rho must be precalculated via 3767 1.1 nonaka * montgomery_setup() such that 3768 1.1 nonaka * it equals -1/n0 mod b this allows the 3769 1.1 nonaka * following inner loop to reduce the 3770 1.1 nonaka * input one digit at a time 3771 1.1 nonaka */ 3772 1.1 nonaka mu = (mp_digit) (((mp_word)x->dp[ix]) * ((mp_word)rho) & MP_MASK); 3773 1.1 nonaka 3774 1.1 nonaka /* a = a + mu * m * b**i */ 3775 1.1 nonaka { 3776 1.1 nonaka int iy; 3777 1.1 nonaka mp_digit *tmpn, *tmpx, carry; 3778 1.1 nonaka mp_word r; 3779 1.1 nonaka 3780 1.1 nonaka /* alias for digits of the modulus */ 3781 1.1 nonaka tmpn = n->dp; 3782 1.1 nonaka 3783 1.1 nonaka /* alias for the digits of x [the input] */ 3784 1.1 nonaka tmpx = x->dp + ix; 3785 1.1 nonaka 3786 1.1 nonaka /* set the carry to zero */ 3787 1.1 nonaka carry = 0; 3788 1.1 nonaka 3789 1.1 nonaka /* Multiply and add in place */ 3790 1.1 nonaka for (iy = 0; iy < n->used; iy++) { 3791 1.1 nonaka /* compute product and sum */ 3792 1.1 nonaka r = ((mp_word)mu) * ((mp_word)*tmpn++) + 3793 1.1 nonaka ((mp_word) carry) + ((mp_word) * tmpx); 3794 1.1 nonaka 3795 1.1 nonaka /* get carry */ 3796 1.1 nonaka carry = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); 3797 1.1 nonaka 3798 1.1 nonaka /* fix digit */ 3799 1.1 nonaka *tmpx++ = (mp_digit)(r & ((mp_word) MP_MASK)); 3800 1.1 nonaka } 3801 1.1 nonaka /* At this point the ix'th digit of x should be zero */ 3802 1.1 nonaka 3803 1.1 nonaka 3804 1.1 nonaka /* propagate carries upwards as required*/ 3805 1.1 nonaka while (carry) { 3806 1.1 nonaka *tmpx += carry; 3807 1.1 nonaka carry = *tmpx >> DIGIT_BIT; 3808 1.1 nonaka *tmpx++ &= MP_MASK; 3809 1.1 nonaka } 3810 1.1 nonaka } 3811 1.1 nonaka } 3812 1.1 nonaka 3813 1.1 nonaka /* at this point the n.used'th least 3814 1.1 nonaka * significant digits of x are all zero 3815 1.1 nonaka * which means we can shift x to the 3816 1.1 nonaka * right by n.used digits and the 3817 1.1 nonaka * residue is unchanged. 3818 1.1 nonaka */ 3819 1.1 nonaka 3820 1.1 nonaka /* x = x/b**n.used */ 3821 1.1 nonaka trim_unused_digits(x); 3822 1.1 nonaka rshift_digits(x, n->used); 3823 1.1 nonaka 3824 1.1 nonaka /* if x >= n then x = x - n */ 3825 1.1 nonaka if (compare_magnitude(x, n) != MP_LT) { 3826 1.1 nonaka return basic_subtract(x, n, x); 3827 1.1 nonaka } 3828 1.1 nonaka 3829 1.1 nonaka return MP_OKAY; 3830 1.1 nonaka } 3831 1.1 nonaka 3832 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_montgomery_reduce.c,v $ */ 3833 1.1 nonaka /* Revision: 1.3 $ */ 3834 1.1 nonaka /* Date: 2011/03/18 16:43:04 $ */ 3835 1.1 nonaka 3836 1.1 nonaka /* determines the setup value */ 3837 1.1 nonaka static void 3838 1.1 nonaka diminished_radix_setup(mp_int *a, mp_digit *d) 3839 1.1 nonaka { 3840 1.1 nonaka /* the casts are required if DIGIT_BIT is one less than 3841 1.1 nonaka * the number of bits in a mp_digit [e.g. DIGIT_BIT==31] 3842 1.1 nonaka */ 3843 1.1 nonaka *d = (mp_digit)((((mp_word)1) << ((mp_word)DIGIT_BIT)) - 3844 1.1 nonaka ((mp_word)a->dp[0])); 3845 1.1 nonaka } 3846 1.1 nonaka 3847 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_dr_setup.c,v $ */ 3848 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3849 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3850 1.1 nonaka 3851 1.1 nonaka /* reduce "x" in place modulo "n" using the Diminished Radix algorithm. 3852 1.1 nonaka * 3853 1.1 nonaka * Based on algorithm from the paper 3854 1.1 nonaka * 3855 1.1 nonaka * "Generating Efficient Primes for Discrete Log Cryptosystems" 3856 1.1 nonaka * Chae Hoon Lim, Pil Joong Lee, 3857 1.1 nonaka * POSTECH Information Research Laboratories 3858 1.1 nonaka * 3859 1.1 nonaka * The modulus must be of a special format [see manual] 3860 1.1 nonaka * 3861 1.1 nonaka * Has been modified to use algorithm 7.10 from the LTM book instead 3862 1.1 nonaka * 3863 1.1 nonaka * Input x must be in the range 0 <= x <= (n-1)**2 3864 1.1 nonaka */ 3865 1.1 nonaka static int 3866 1.1 nonaka diminished_radix_reduce(mp_int * x, mp_int * n, mp_digit k) 3867 1.1 nonaka { 3868 1.1 nonaka int err, i, m; 3869 1.1 nonaka mp_word r; 3870 1.1 nonaka mp_digit mu, *tmpx1, *tmpx2; 3871 1.1 nonaka 3872 1.1 nonaka /* m = digits in modulus */ 3873 1.1 nonaka m = n->used; 3874 1.1 nonaka 3875 1.1 nonaka /* ensure that "x" has at least 2m digits */ 3876 1.1 nonaka if (x->alloc < m + m) { 3877 1.1 nonaka if ((err = mp_grow(x, m + m)) != MP_OKAY) { 3878 1.1 nonaka return err; 3879 1.1 nonaka } 3880 1.1 nonaka } 3881 1.1 nonaka 3882 1.1 nonaka /* top of loop, this is where the code resumes if 3883 1.1 nonaka * another reduction pass is required. 3884 1.1 nonaka */ 3885 1.1 nonaka top: 3886 1.1 nonaka /* aliases for digits */ 3887 1.1 nonaka /* alias for lower half of x */ 3888 1.1 nonaka tmpx1 = x->dp; 3889 1.1 nonaka 3890 1.1 nonaka /* alias for upper half of x, or x/B**m */ 3891 1.1 nonaka tmpx2 = x->dp + m; 3892 1.1 nonaka 3893 1.1 nonaka /* set carry to zero */ 3894 1.1 nonaka mu = 0; 3895 1.1 nonaka 3896 1.1 nonaka /* compute (x mod B**m) + k * [x/B**m] inline and inplace */ 3897 1.1 nonaka for (i = 0; i < m; i++) { 3898 1.1 nonaka r = ((mp_word)*tmpx2++) * ((mp_word)k) + *tmpx1 + mu; 3899 1.1 nonaka *tmpx1++ = (mp_digit)(r & MP_MASK); 3900 1.1 nonaka mu = (mp_digit)(r >> ((mp_word)DIGIT_BIT)); 3901 1.1 nonaka } 3902 1.1 nonaka 3903 1.1 nonaka /* set final carry */ 3904 1.1 nonaka *tmpx1++ = mu; 3905 1.1 nonaka 3906 1.1 nonaka /* zero words above m */ 3907 1.1 nonaka for (i = m + 1; i < x->used; i++) { 3908 1.1 nonaka *tmpx1++ = 0; 3909 1.1 nonaka } 3910 1.1 nonaka 3911 1.1 nonaka /* clamp, sub and return */ 3912 1.1 nonaka trim_unused_digits(x); 3913 1.1 nonaka 3914 1.1 nonaka /* if x >= n then subtract and reduce again 3915 1.1 nonaka * Each successive "recursion" makes the input smaller and smaller. 3916 1.1 nonaka */ 3917 1.1 nonaka if (compare_magnitude(x, n) != MP_LT) { 3918 1.1 nonaka basic_subtract(x, n, x); 3919 1.1 nonaka goto top; 3920 1.1 nonaka } 3921 1.1 nonaka return MP_OKAY; 3922 1.1 nonaka } 3923 1.1 nonaka 3924 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_dr_reduce.c,v $ */ 3925 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3926 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3927 1.1 nonaka 3928 1.1 nonaka /* determines the setup value */ 3929 1.1 nonaka static int 3930 1.1 nonaka mp_reduce_2k_setup(mp_int *a, mp_digit *d) 3931 1.1 nonaka { 3932 1.1 nonaka int res, p; 3933 1.1 nonaka mp_int tmp; 3934 1.1 nonaka 3935 1.1 nonaka if ((res = mp_init(&tmp)) != MP_OKAY) { 3936 1.1 nonaka return res; 3937 1.1 nonaka } 3938 1.1 nonaka 3939 1.1 nonaka p = mp_count_bits(a); 3940 1.1 nonaka if ((res = mp_2expt(&tmp, p)) != MP_OKAY) { 3941 1.1 nonaka mp_clear(&tmp); 3942 1.1 nonaka return res; 3943 1.1 nonaka } 3944 1.1 nonaka 3945 1.1 nonaka if ((res = basic_subtract(&tmp, a, &tmp)) != MP_OKAY) { 3946 1.1 nonaka mp_clear(&tmp); 3947 1.1 nonaka return res; 3948 1.1 nonaka } 3949 1.1 nonaka 3950 1.1 nonaka *d = tmp.dp[0]; 3951 1.1 nonaka mp_clear(&tmp); 3952 1.1 nonaka return MP_OKAY; 3953 1.1 nonaka } 3954 1.1 nonaka 3955 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_reduce_2k_setup.c,v $ */ 3956 1.1 nonaka /* Revision: 1.1.1.1 $ */ 3957 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 3958 1.1 nonaka 3959 1.1 nonaka /* reduces a modulo n where n is of the form 2**p - d */ 3960 1.1 nonaka static int 3961 1.1 nonaka mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) 3962 1.1 nonaka { 3963 1.1 nonaka mp_int q; 3964 1.1 nonaka int p, res; 3965 1.1 nonaka 3966 1.1 nonaka if ((res = mp_init(&q)) != MP_OKAY) { 3967 1.1 nonaka return res; 3968 1.1 nonaka } 3969 1.1 nonaka 3970 1.1 nonaka p = mp_count_bits(n); 3971 1.1 nonaka top: 3972 1.1 nonaka /* q = a/2**p, a = a mod 2**p */ 3973 1.1 nonaka if ((res = rshift_bits(a, p, &q, a)) != MP_OKAY) { 3974 1.1 nonaka goto ERR; 3975 1.1 nonaka } 3976 1.1 nonaka 3977 1.1 nonaka if (d != 1) { 3978 1.1 nonaka /* q = q * d */ 3979 1.1 nonaka if ((res = multiply_digit(&q, d, &q)) != MP_OKAY) { 3980 1.1 nonaka goto ERR; 3981 1.1 nonaka } 3982 1.1 nonaka } 3983 1.1 nonaka 3984 1.1 nonaka /* a = a + q */ 3985 1.1 nonaka if ((res = basic_add(a, &q, a)) != MP_OKAY) { 3986 1.1 nonaka goto ERR; 3987 1.1 nonaka } 3988 1.1 nonaka 3989 1.1 nonaka if (compare_magnitude(a, n) != MP_LT) { 3990 1.1 nonaka basic_subtract(a, n, a); 3991 1.1 nonaka goto top; 3992 1.1 nonaka } 3993 1.1 nonaka 3994 1.1 nonaka ERR: 3995 1.1 nonaka mp_clear(&q); 3996 1.1 nonaka return res; 3997 1.1 nonaka } 3998 1.1 nonaka 3999 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_reduce_2k.c,v $ */ 4000 1.1 nonaka /* Revision: 1.1.1.1 $ */ 4001 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 4002 1.1 nonaka 4003 1.1 nonaka /* 4004 1.1 nonaka * shifts with subtractions when the result is greater than b. 4005 1.1 nonaka * 4006 1.1 nonaka * The method is slightly modified to shift B unconditionally upto just under 4007 1.6 andvar * the leading bit of b. This saves a lot of multiple precision shifting. 4008 1.1 nonaka */ 4009 1.1 nonaka static int 4010 1.1 nonaka mp_montgomery_calc_normalization(mp_int * a, mp_int * b) 4011 1.1 nonaka { 4012 1.1 nonaka int x, bits, res; 4013 1.1 nonaka 4014 1.1 nonaka /* how many bits of last digit does b use */ 4015 1.1 nonaka bits = mp_count_bits(b) % DIGIT_BIT; 4016 1.1 nonaka 4017 1.1 nonaka if (b->used > 1) { 4018 1.1 nonaka if ((res = mp_2expt(a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { 4019 1.1 nonaka return res; 4020 1.1 nonaka } 4021 1.1 nonaka } else { 4022 1.1 nonaka set_word(a, 1); 4023 1.1 nonaka bits = 1; 4024 1.1 nonaka } 4025 1.1 nonaka 4026 1.1 nonaka 4027 1.1 nonaka /* now compute C = A * B mod b */ 4028 1.1 nonaka for (x = bits - 1; x < (int)DIGIT_BIT; x++) { 4029 1.1 nonaka if ((res = doubled(a, a)) != MP_OKAY) { 4030 1.1 nonaka return res; 4031 1.1 nonaka } 4032 1.1 nonaka if (compare_magnitude(a, b) != MP_LT) { 4033 1.1 nonaka if ((res = basic_subtract(a, b, a)) != MP_OKAY) { 4034 1.1 nonaka return res; 4035 1.1 nonaka } 4036 1.1 nonaka } 4037 1.1 nonaka } 4038 1.1 nonaka 4039 1.1 nonaka return MP_OKAY; 4040 1.1 nonaka } 4041 1.1 nonaka 4042 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_mp_montgomery_calc_normalization.c,v $ */ 4043 1.1 nonaka /* Revision: 1.1.1.1 $ */ 4044 1.1 nonaka /* Date: 2011/03/12 22:58:18 $ */ 4045 1.1 nonaka 4046 1.1 nonaka /* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 4047 1.1 nonaka * 4048 1.1 nonaka * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. 4049 1.1 nonaka * The value of k changes based on the size of the exponent. 4050 1.1 nonaka * 4051 1.1 nonaka * Uses Montgomery or Diminished Radix reduction [whichever appropriate] 4052 1.1 nonaka */ 4053 1.1 nonaka 4054 1.1 nonaka #define TAB_SIZE 256 4055 1.1 nonaka 4056 1.1 nonaka static int 4057 1.1 nonaka fast_exponent_modulo(mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) 4058 1.1 nonaka { 4059 1.1 nonaka mp_int M[TAB_SIZE], res; 4060 1.1 nonaka mp_digit buf, mp; 4061 1.1 nonaka int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; 4062 1.1 nonaka 4063 1.1 nonaka /* use a pointer to the reduction algorithm. This allows us to use 4064 1.1 nonaka * one of many reduction algorithms without modding the guts of 4065 1.1 nonaka * the code with if statements everywhere. 4066 1.1 nonaka */ 4067 1.1 nonaka int (*redux)(mp_int*,mp_int*,mp_digit); 4068 1.1 nonaka 4069 1.1 nonaka winsize = find_window_size(X); 4070 1.1 nonaka 4071 1.1 nonaka /* init M array */ 4072 1.1 nonaka /* init first cell */ 4073 1.1 nonaka if ((err = mp_init(&M[1])) != MP_OKAY) { 4074 1.1 nonaka return err; 4075 1.1 nonaka } 4076 1.1 nonaka 4077 1.1 nonaka /* now init the second half of the array */ 4078 1.1 nonaka for (x = 1<<(winsize-1); x < (1 << winsize); x++) { 4079 1.1 nonaka if ((err = mp_init(&M[x])) != MP_OKAY) { 4080 1.1 nonaka for (y = 1<<(winsize-1); y < x; y++) { 4081 1.1 nonaka mp_clear(&M[y]); 4082 1.1 nonaka } 4083 1.1 nonaka mp_clear(&M[1]); 4084 1.1 nonaka return err; 4085 1.1 nonaka } 4086 1.1 nonaka } 4087 1.1 nonaka 4088 1.1 nonaka /* determine and setup reduction code */ 4089 1.1 nonaka if (redmode == 0) { 4090 1.1 nonaka /* now setup montgomery */ 4091 1.1 nonaka if ((err = mp_montgomery_setup(P, &mp)) != MP_OKAY) { 4092 1.1 nonaka goto LBL_M; 4093 1.1 nonaka } 4094 1.1 nonaka 4095 1.1 nonaka /* automatically pick the comba one if available (saves quite a few calls/ifs) */ 4096 1.1 nonaka if (can_use_fast_column_array(P->used + P->used + 1, P->used)) { 4097 1.1 nonaka redux = fast_mp_montgomery_reduce; 4098 1.1 nonaka } else { 4099 1.1 nonaka /* use slower baseline Montgomery method */ 4100 1.1 nonaka redux = mp_montgomery_reduce; 4101 1.1 nonaka } 4102 1.1 nonaka } else if (redmode == 1) { 4103 1.1 nonaka /* setup DR reduction for moduli of the form B**k - b */ 4104 1.1 nonaka diminished_radix_setup(P, &mp); 4105 1.1 nonaka redux = diminished_radix_reduce; 4106 1.1 nonaka } else { 4107 1.1 nonaka /* setup DR reduction for moduli of the form 2**k - b */ 4108 1.1 nonaka if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { 4109 1.1 nonaka goto LBL_M; 4110 1.1 nonaka } 4111 1.1 nonaka redux = mp_reduce_2k; 4112 1.1 nonaka } 4113 1.1 nonaka 4114 1.1 nonaka /* setup result */ 4115 1.1 nonaka if ((err = mp_init(&res)) != MP_OKAY) { 4116 1.1 nonaka goto LBL_M; 4117 1.1 nonaka } 4118 1.1 nonaka 4119 1.1 nonaka /* create M table 4120 1.1 nonaka * 4121 1.1 nonaka 4122 1.1 nonaka * 4123 1.1 nonaka * The first half of the table is not computed though accept for M[0] and M[1] 4124 1.1 nonaka */ 4125 1.1 nonaka 4126 1.1 nonaka if (redmode == 0) { 4127 1.1 nonaka /* now we need R mod m */ 4128 1.1 nonaka if ((err = mp_montgomery_calc_normalization(&res, P)) != MP_OKAY) { 4129 1.1 nonaka goto LBL_RES; 4130 1.1 nonaka } 4131 1.1 nonaka 4132 1.1 nonaka /* now set M[1] to G * R mod m */ 4133 1.1 nonaka if ((err = multiply_modulo(&M[1], G, &res, P)) != MP_OKAY) { 4134 1.1 nonaka goto LBL_RES; 4135 1.1 nonaka } 4136 1.1 nonaka } else { 4137 1.1 nonaka set_word(&res, 1); 4138 1.1 nonaka if ((err = modulo(G, P, &M[1])) != MP_OKAY) { 4139 1.1 nonaka goto LBL_RES; 4140 1.1 nonaka } 4141 1.1 nonaka } 4142 1.1 nonaka 4143 1.1 nonaka /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ 4144 1.1 nonaka if ((err = mp_copy( &M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { 4145 1.1 nonaka goto LBL_RES; 4146 1.1 nonaka } 4147 1.1 nonaka 4148 1.1 nonaka for (x = 0; x < (winsize - 1); x++) { 4149 1.1 nonaka if ((err = square(&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { 4150 1.1 nonaka goto LBL_RES; 4151 1.1 nonaka } 4152 1.1 nonaka if ((err = (*redux)(&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { 4153 1.1 nonaka goto LBL_RES; 4154 1.1 nonaka } 4155 1.1 nonaka } 4156 1.1 nonaka 4157 1.1 nonaka /* create upper table */ 4158 1.1 nonaka for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { 4159 1.1 nonaka if ((err = signed_multiply(&M[x - 1], &M[1], &M[x])) != MP_OKAY) { 4160 1.1 nonaka goto LBL_RES; 4161 1.1 nonaka } 4162 1.1 nonaka if ((err = (*redux)(&M[x], P, mp)) != MP_OKAY) { 4163 1.1 nonaka goto LBL_RES; 4164 1.1 nonaka } 4165 1.1 nonaka } 4166 1.1 nonaka 4167 1.1 nonaka /* set initial mode and bit cnt */ 4168 1.1 nonaka mode = 0; 4169 1.1 nonaka bitcnt = 1; 4170 1.1 nonaka buf = 0; 4171 1.1 nonaka digidx = X->used - 1; 4172 1.1 nonaka bitcpy = 0; 4173 1.1 nonaka bitbuf = 0; 4174 1.1 nonaka 4175 1.1 nonaka for (;;) { 4176 1.1 nonaka /* grab next digit as required */ 4177 1.1 nonaka if (--bitcnt == 0) { 4178 1.1 nonaka /* if digidx == -1 we are out of digits so break */ 4179 1.1 nonaka if (digidx == -1) { 4180 1.1 nonaka break; 4181 1.1 nonaka } 4182 1.1 nonaka /* read next digit and reset bitcnt */ 4183 1.1 nonaka buf = X->dp[digidx--]; 4184 1.1 nonaka bitcnt = (int)DIGIT_BIT; 4185 1.1 nonaka } 4186 1.1 nonaka 4187 1.1 nonaka /* grab the next msb from the exponent */ 4188 1.1 nonaka y = (int)(mp_digit)((mp_digit)buf >> (unsigned)(DIGIT_BIT - 1)) & 1; 4189 1.1 nonaka buf <<= (mp_digit)1; 4190 1.1 nonaka 4191 1.1 nonaka /* if the bit is zero and mode == 0 then we ignore it 4192 1.1 nonaka * These represent the leading zero bits before the first 1 bit 4193 1.1 nonaka * in the exponent. Technically this opt is not required but it 4194 1.1 nonaka * does lower the # of trivial squaring/reductions used 4195 1.1 nonaka */ 4196 1.1 nonaka if (mode == 0 && y == 0) { 4197 1.1 nonaka continue; 4198 1.1 nonaka } 4199 1.1 nonaka 4200 1.1 nonaka /* if the bit is zero and mode == 1 then we square */ 4201 1.1 nonaka if (mode == 1 && y == 0) { 4202 1.1 nonaka if ((err = square(&res, &res)) != MP_OKAY) { 4203 1.1 nonaka goto LBL_RES; 4204 1.1 nonaka } 4205 1.1 nonaka if ((err = (*redux)(&res, P, mp)) != MP_OKAY) { 4206 1.1 nonaka goto LBL_RES; 4207 1.1 nonaka } 4208 1.1 nonaka continue; 4209 1.1 nonaka } 4210 1.1 nonaka 4211 1.1 nonaka /* else we add it to the window */ 4212 1.1 nonaka bitbuf |= (y << (winsize - ++bitcpy)); 4213 1.1 nonaka mode = 2; 4214 1.1 nonaka 4215 1.1 nonaka if (bitcpy == winsize) { 4216 1.1 nonaka /* ok window is filled so square as required and multiply */ 4217 1.1 nonaka /* square first */ 4218 1.1 nonaka for (x = 0; x < winsize; x++) { 4219 1.1 nonaka if ((err = square(&res, &res)) != MP_OKAY) { 4220 1.1 nonaka goto LBL_RES; 4221 1.1 nonaka } 4222 1.1 nonaka if ((err = (*redux)(&res, P, mp)) != MP_OKAY) { 4223 1.1 nonaka goto LBL_RES; 4224 1.1 nonaka } 4225 1.1 nonaka } 4226 1.1 nonaka 4227 1.1 nonaka /* then multiply */ 4228 1.1 nonaka if ((err = signed_multiply(&res, &M[bitbuf], &res)) != MP_OKAY) { 4229 1.1 nonaka goto LBL_RES; 4230 1.1 nonaka } 4231 1.1 nonaka if ((err = (*redux)(&res, P, mp)) != MP_OKAY) { 4232 1.1 nonaka goto LBL_RES; 4233 1.1 nonaka } 4234 1.1 nonaka 4235 1.1 nonaka /* empty window and reset */ 4236 1.1 nonaka bitcpy = 0; 4237 1.1 nonaka bitbuf = 0; 4238 1.1 nonaka mode = 1; 4239 1.1 nonaka } 4240 1.1 nonaka } 4241 1.1 nonaka 4242 1.1 nonaka /* if bits remain then square/multiply */ 4243 1.1 nonaka if (mode == 2 && bitcpy > 0) { 4244 1.1 nonaka /* square then multiply if the bit is set */ 4245 1.1 nonaka for (x = 0; x < bitcpy; x++) { 4246 1.1 nonaka if ((err = square(&res, &res)) != MP_OKAY) { 4247 1.1 nonaka goto LBL_RES; 4248 1.1 nonaka } 4249 1.1 nonaka if ((err = (*redux)(&res, P, mp)) != MP_OKAY) { 4250 1.1 nonaka goto LBL_RES; 4251 1.1 nonaka } 4252 1.1 nonaka 4253 1.1 nonaka /* get next bit of the window */ 4254 1.1 nonaka bitbuf <<= 1; 4255 1.1 nonaka if ((bitbuf & (1 << winsize)) != 0) { 4256 1.1 nonaka /* then multiply */ 4257 1.1 nonaka if ((err = signed_multiply(&res, &M[1], &res)) != MP_OKAY) { 4258 1.1 nonaka goto LBL_RES; 4259 1.1 nonaka } 4260 1.1 nonaka if ((err = (*redux)(&res, P, mp)) != MP_OKAY) { 4261 1.1 nonaka goto LBL_RES; 4262 1.1 nonaka } 4263 1.1 nonaka } 4264 1.1 nonaka } 4265 1.1 nonaka } 4266 1.1 nonaka 4267 1.1 nonaka if (redmode == 0) { 4268 1.1 nonaka /* fixup result if Montgomery reduction is used 4269 1.1 nonaka * recall that any value in a Montgomery system is 4270 1.1 nonaka * actually multiplied by R mod n. So we have 4271 1.1 nonaka * to reduce one more time to cancel out the factor 4272 1.1 nonaka * of R. 4273 1.1 nonaka */ 4274 1.1 nonaka if ((err = (*redux)(&res, P, mp)) != MP_OKAY) { 4275 1.1 nonaka goto LBL_RES; 4276 1.1 nonaka } 4277 1.1 nonaka } 4278 1.1 nonaka 4279 1.1 nonaka /* swap res with Y */ 4280 1.1 nonaka mp_exch(&res, Y); 4281 1.1 nonaka err = MP_OKAY; 4282 1.1 nonaka LBL_RES: 4283 1.1 nonaka mp_clear(&res); 4284 1.1 nonaka LBL_M: 4285 1.1 nonaka mp_clear(&M[1]); 4286 1.1 nonaka for (x = 1<<(winsize-1); x < (1 << winsize); x++) { 4287 1.1 nonaka mp_clear(&M[x]); 4288 1.1 nonaka } 4289 1.1 nonaka return err; 4290 1.1 nonaka } 4291 1.1 nonaka 4292 1.1 nonaka /* Source: /usr/cvsroot/libtommath/dist/libtommath/bn_fast_exponent_modulo.c,v $ */ 4293 1.1 nonaka /* Revision: 1.4 $ */ 4294 1.1 nonaka /* Date: 2011/03/18 16:43:04 $ */ 4295 1.1 nonaka 4296 1.1 nonaka /* this is a shell function that calls either the normal or Montgomery 4297 1.1 nonaka * exptmod functions. Originally the call to the montgomery code was 4298 1.6 andvar * embedded in the normal function but that wasted a lot of stack space 4299 1.1 nonaka * for nothing (since 99% of the time the Montgomery code would be called) 4300 1.1 nonaka */ 4301 1.1 nonaka static int 4302 1.1 nonaka exponent_modulo(mp_int * G, mp_int * X, mp_int * P, mp_int *Y) 4303 1.1 nonaka { 4304 1.1 nonaka int diminished_radix; 4305 1.1 nonaka 4306 1.1 nonaka /* modulus P must be positive */ 4307 1.1 nonaka if (P->sign == MP_NEG) { 4308 1.1 nonaka return MP_VAL; 4309 1.1 nonaka } 4310 1.1 nonaka 4311 1.1 nonaka /* if exponent X is negative we have to recurse */ 4312 1.1 nonaka if (X->sign == MP_NEG) { 4313 1.1 nonaka mp_int tmpG, tmpX; 4314 1.1 nonaka int err; 4315 1.1 nonaka 4316 1.1 nonaka /* first compute 1/G mod P */ 4317 1.1 nonaka if ((err = mp_init(&tmpG)) != MP_OKAY) { 4318 1.1 nonaka return err; 4319 1.1 nonaka } 4320 1.1 nonaka if ((err = modular_inverse(&tmpG, G, P)) != MP_OKAY) { 4321 1.1 nonaka mp_clear(&tmpG); 4322 1.1 nonaka return err; 4323 1.1 nonaka } 4324 1.1 nonaka 4325 1.1 nonaka /* now get |X| */ 4326 1.1 nonaka if ((err = mp_init(&tmpX)) != MP_OKAY) { 4327 1.1 nonaka mp_clear(&tmpG); 4328 1.1 nonaka return err; 4329 1.1 nonaka } 4330 1.1 nonaka if ((err = absolute(X, &tmpX)) != MP_OKAY) { 4331 1.1 nonaka mp_clear_multi(&tmpG, &tmpX, NULL); 4332 1.1 nonaka return err; 4333 1.1 nonaka } 4334 1.1 nonaka 4335 1.1 nonaka /* and now compute (1/G)**|X| instead of G**X [X < 0] */ 4336 1.1 nonaka err = exponent_modulo(&tmpG, &tmpX, P, Y); 4337 1.1 nonaka mp_clear_multi(&tmpG, &tmpX, NULL); 4338 1.1 nonaka return err; 4339 1.1 nonaka } 4340 1.1 nonaka 4341 1.1 nonaka /* modified diminished radix reduction */ 4342 1.1 nonaka if (mp_reduce_is_2k_l(P) == MP_YES) { 4343 1.1 nonaka return basic_exponent_mod(G, X, P, Y, 1); 4344 1.1 nonaka } 4345 1.1 nonaka 4346 1.1 nonaka /* is it a DR modulus? */ 4347 1.1 nonaka diminished_radix = is_diminished_radix_modulus(P); 4348 1.1 nonaka 4349 1.6 andvar /* if not, is it an unrestricted DR modulus? */ 4350 1.1 nonaka if (!diminished_radix) { 4351 1.1 nonaka diminished_radix = mp_reduce_is_2k(P) << 1; 4352 1.1 nonaka } 4353 1.1 nonaka 4354 1.1 nonaka /* if the modulus is odd or diminished_radix, use the montgomery method */ 4355 1.1 nonaka if (BN_is_odd(P) == 1 || diminished_radix) { 4356 1.1 nonaka return fast_exponent_modulo(G, X, P, Y, diminished_radix); 4357 1.1 nonaka } 4358 1.1 nonaka /* otherwise use the generic Barrett reduction technique */ 4359 1.1 nonaka return basic_exponent_mod(G, X, P, Y, 0); 4360 1.1 nonaka } 4361 1.1 nonaka 4362 1.1 nonaka /* reverse an array, used for radix code */ 4363 1.1 nonaka static void 4364 1.1 nonaka bn_reverse(unsigned char *s, int len) 4365 1.1 nonaka { 4366 1.1 nonaka int ix, iy; 4367 1.1 nonaka uint8_t t; 4368 1.1 nonaka 4369 1.1 nonaka for (ix = 0, iy = len - 1; ix < iy ; ix++, --iy) { 4370 1.1 nonaka t = s[ix]; 4371 1.1 nonaka s[ix] = s[iy]; 4372 1.1 nonaka s[iy] = t; 4373 1.1 nonaka } 4374 1.1 nonaka } 4375 1.1 nonaka 4376 1.1 nonaka static inline int 4377 1.1 nonaka is_power_of_two(mp_digit b, int *p) 4378 1.1 nonaka { 4379 1.1 nonaka int x; 4380 1.1 nonaka 4381 1.1 nonaka /* fast return if no power of two */ 4382 1.1 nonaka if ((b==0) || (b & (b-1))) { 4383 1.1 nonaka return 0; 4384 1.1 nonaka } 4385 1.1 nonaka 4386 1.1 nonaka for (x = 0; x < DIGIT_BIT; x++) { 4387 1.1 nonaka if (b == (((mp_digit)1)<<x)) { 4388 1.1 nonaka *p = x; 4389 1.1 nonaka return 1; 4390 1.1 nonaka } 4391 1.1 nonaka } 4392 1.1 nonaka return 0; 4393 1.1 nonaka } 4394 1.1 nonaka 4395 1.1 nonaka /* single digit division (based on routine from MPI) */ 4396 1.1 nonaka static int 4397 1.1 nonaka signed_divide_word(mp_int *a, mp_digit b, mp_int *c, mp_digit *d) 4398 1.1 nonaka { 4399 1.1 nonaka mp_int q; 4400 1.1 nonaka mp_word w; 4401 1.1 nonaka mp_digit t; 4402 1.1 nonaka int res, ix; 4403 1.1 nonaka 4404 1.1 nonaka /* cannot divide by zero */ 4405 1.1 nonaka if (b == 0) { 4406 1.1 nonaka return MP_VAL; 4407 1.1 nonaka } 4408 1.1 nonaka 4409 1.1 nonaka /* quick outs */ 4410 1.1 nonaka if (b == 1 || MP_ISZERO(a) == 1) { 4411 1.1 nonaka if (d != NULL) { 4412 1.1 nonaka *d = 0; 4413 1.1 nonaka } 4414 1.1 nonaka if (c != NULL) { 4415 1.1 nonaka return mp_copy(a, c); 4416 1.1 nonaka } 4417 1.1 nonaka return MP_OKAY; 4418 1.1 nonaka } 4419 1.1 nonaka 4420 1.1 nonaka /* power of two ? */ 4421 1.1 nonaka if (is_power_of_two(b, &ix) == 1) { 4422 1.1 nonaka if (d != NULL) { 4423 1.1 nonaka *d = a->dp[0] & ((((mp_digit)1)<<ix) - 1); 4424 1.1 nonaka } 4425 1.1 nonaka if (c != NULL) { 4426 1.1 nonaka return rshift_bits(a, ix, c, NULL); 4427 1.1 nonaka } 4428 1.1 nonaka return MP_OKAY; 4429 1.1 nonaka } 4430 1.1 nonaka 4431 1.1 nonaka /* three? */ 4432 1.1 nonaka if (b == 3) { 4433 1.1 nonaka return third(a, c, d); 4434 1.1 nonaka } 4435 1.1 nonaka 4436 1.1 nonaka /* no easy answer [c'est la vie]. Just division */ 4437 1.1 nonaka if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { 4438 1.1 nonaka return res; 4439 1.1 nonaka } 4440 1.1 nonaka 4441 1.1 nonaka q.used = a->used; 4442 1.1 nonaka q.sign = a->sign; 4443 1.1 nonaka w = 0; 4444 1.1 nonaka for (ix = a->used - 1; ix >= 0; ix--) { 4445 1.1 nonaka w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); 4446 1.1 nonaka 4447 1.1 nonaka if (w >= b) { 4448 1.1 nonaka t = (mp_digit)(w / b); 4449 1.1 nonaka w -= ((mp_word)t) * ((mp_word)b); 4450 1.1 nonaka } else { 4451 1.1 nonaka t = 0; 4452 1.1 nonaka } 4453 1.1 nonaka q.dp[ix] = (mp_digit)t; 4454 1.1 nonaka } 4455 1.1 nonaka 4456 1.1 nonaka if (d != NULL) { 4457 1.1 nonaka *d = (mp_digit)w; 4458 1.1 nonaka } 4459 1.1 nonaka 4460 1.1 nonaka if (c != NULL) { 4461 1.1 nonaka trim_unused_digits(&q); 4462 1.1 nonaka mp_exch(&q, c); 4463 1.1 nonaka } 4464 1.1 nonaka mp_clear(&q); 4465 1.1 nonaka 4466 1.1 nonaka return res; 4467 1.1 nonaka } 4468 1.1 nonaka 4469 1.1 nonaka static const mp_digit ltm_prime_tab[] = { 4470 1.1 nonaka 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 4471 1.1 nonaka 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 4472 1.1 nonaka 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, 4473 1.1 nonaka 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 4474 1.1 nonaka #ifndef MP_8BIT 4475 1.1 nonaka 0x0083, 4476 1.1 nonaka 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, 4477 1.1 nonaka 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, 4478 1.1 nonaka 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, 4479 1.1 nonaka 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, 4480 1.1 nonaka 4481 1.1 nonaka 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, 4482 1.1 nonaka 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, 4483 1.1 nonaka 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, 4484 1.1 nonaka 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, 4485 1.1 nonaka 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, 4486 1.1 nonaka 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, 4487 1.1 nonaka 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, 4488 1.1 nonaka 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, 4489 1.1 nonaka 4490 1.1 nonaka 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, 4491 1.1 nonaka 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, 4492 1.1 nonaka 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, 4493 1.1 nonaka 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, 4494 1.1 nonaka 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, 4495 1.1 nonaka 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, 4496 1.1 nonaka 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, 4497 1.1 nonaka 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, 4498 1.1 nonaka 4499 1.1 nonaka 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, 4500 1.1 nonaka 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, 4501 1.1 nonaka 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, 4502 1.1 nonaka 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, 4503 1.1 nonaka 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, 4504 1.1 nonaka 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, 4505 1.1 nonaka 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, 4506 1.1 nonaka 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 4507 1.1 nonaka #endif 4508 1.1 nonaka }; 4509 1.1 nonaka 4510 1.1 nonaka #define PRIME_SIZE __arraycount(ltm_prime_tab) 4511 1.1 nonaka 4512 1.1 nonaka static inline int 4513 1.1 nonaka mp_prime_is_divisible(mp_int *a, int *result) 4514 1.1 nonaka { 4515 1.1 nonaka int err, ix; 4516 1.1 nonaka mp_digit res; 4517 1.1 nonaka 4518 1.1 nonaka /* default to not */ 4519 1.1 nonaka *result = MP_NO; 4520 1.1 nonaka 4521 1.1 nonaka for (ix = 0; ix < (int)PRIME_SIZE; ix++) { 4522 1.1 nonaka /* what is a mod LBL_prime_tab[ix] */ 4523 1.1 nonaka if ((err = signed_divide_word(a, ltm_prime_tab[ix], NULL, &res)) != MP_OKAY) { 4524 1.1 nonaka return err; 4525 1.1 nonaka } 4526 1.1 nonaka 4527 1.1 nonaka /* is the residue zero? */ 4528 1.1 nonaka if (res == 0) { 4529 1.1 nonaka *result = MP_YES; 4530 1.1 nonaka return MP_OKAY; 4531 1.1 nonaka } 4532 1.1 nonaka } 4533 1.1 nonaka 4534 1.1 nonaka return MP_OKAY; 4535 1.1 nonaka } 4536 1.1 nonaka 4537 1.1 nonaka /* single digit addition */ 4538 1.1 nonaka static int 4539 1.1 nonaka add_single_digit(mp_int *a, mp_digit b, mp_int *c) 4540 1.1 nonaka { 4541 1.1 nonaka int res, ix, oldused; 4542 1.1 nonaka mp_digit *tmpa, *tmpc, mu; 4543 1.1 nonaka 4544 1.1 nonaka /* grow c as required */ 4545 1.1 nonaka if (c->alloc < a->used + 1) { 4546 1.1 nonaka if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { 4547 1.1 nonaka return res; 4548 1.1 nonaka } 4549 1.1 nonaka } 4550 1.1 nonaka 4551 1.1 nonaka /* if a is negative and |a| >= b, call c = |a| - b */ 4552 1.1 nonaka if (a->sign == MP_NEG && (a->used > 1 || a->dp[0] >= b)) { 4553 1.1 nonaka /* temporarily fix sign of a */ 4554 1.1 nonaka a->sign = MP_ZPOS; 4555 1.1 nonaka 4556 1.1 nonaka /* c = |a| - b */ 4557 1.1 nonaka res = signed_subtract_word(a, b, c); 4558 1.1 nonaka 4559 1.1 nonaka /* fix sign */ 4560 1.1 nonaka a->sign = c->sign = MP_NEG; 4561 1.1 nonaka 4562 1.1 nonaka /* clamp */ 4563 1.1 nonaka trim_unused_digits(c); 4564 1.1 nonaka 4565 1.1 nonaka return res; 4566 1.1 nonaka } 4567 1.1 nonaka 4568 1.1 nonaka /* old number of used digits in c */ 4569 1.1 nonaka oldused = c->used; 4570 1.1 nonaka 4571 1.1 nonaka /* sign always positive */ 4572 1.1 nonaka c->sign = MP_ZPOS; 4573 1.1 nonaka 4574 1.1 nonaka /* source alias */ 4575 1.1 nonaka tmpa = a->dp; 4576 1.1 nonaka 4577 1.1 nonaka /* destination alias */ 4578 1.1 nonaka tmpc = c->dp; 4579 1.1 nonaka 4580 1.1 nonaka /* if a is positive */ 4581 1.1 nonaka if (a->sign == MP_ZPOS) { 4582 1.1 nonaka /* add digit, after this we're propagating 4583 1.1 nonaka * the carry. 4584 1.1 nonaka */ 4585 1.1 nonaka *tmpc = *tmpa++ + b; 4586 1.1 nonaka mu = *tmpc >> DIGIT_BIT; 4587 1.1 nonaka *tmpc++ &= MP_MASK; 4588 1.1 nonaka 4589 1.1 nonaka /* now handle rest of the digits */ 4590 1.1 nonaka for (ix = 1; ix < a->used; ix++) { 4591 1.1 nonaka *tmpc = *tmpa++ + mu; 4592 1.1 nonaka mu = *tmpc >> DIGIT_BIT; 4593 1.1 nonaka *tmpc++ &= MP_MASK; 4594 1.1 nonaka } 4595 1.1 nonaka /* set final carry */ 4596 1.1 nonaka ix++; 4597 1.1 nonaka *tmpc++ = mu; 4598 1.1 nonaka 4599 1.1 nonaka /* setup size */ 4600 1.1 nonaka c->used = a->used + 1; 4601 1.1 nonaka } else { 4602 1.1 nonaka /* a was negative and |a| < b */ 4603 1.1 nonaka c->used = 1; 4604 1.1 nonaka 4605 1.1 nonaka /* the result is a single digit */ 4606 1.1 nonaka if (a->used == 1) { 4607 1.1 nonaka *tmpc++ = b - a->dp[0]; 4608 1.1 nonaka } else { 4609 1.1 nonaka *tmpc++ = b; 4610 1.1 nonaka } 4611 1.1 nonaka 4612 1.1 nonaka /* setup count so the clearing of oldused 4613 1.1 nonaka * can fall through correctly 4614 1.1 nonaka */ 4615 1.1 nonaka ix = 1; 4616 1.1 nonaka } 4617 1.1 nonaka 4618 1.1 nonaka /* now zero to oldused */ 4619 1.1 nonaka while (ix++ < oldused) { 4620 1.1 nonaka *tmpc++ = 0; 4621 1.1 nonaka } 4622 1.1 nonaka trim_unused_digits(c); 4623 1.1 nonaka 4624 1.1 nonaka return MP_OKAY; 4625 1.1 nonaka } 4626 1.1 nonaka 4627 1.1 nonaka /* single digit subtraction */ 4628 1.1 nonaka static int 4629 1.1 nonaka signed_subtract_word(mp_int *a, mp_digit b, mp_int *c) 4630 1.1 nonaka { 4631 1.1 nonaka mp_digit *tmpa, *tmpc, mu; 4632 1.1 nonaka int res, ix, oldused; 4633 1.1 nonaka 4634 1.1 nonaka /* grow c as required */ 4635 1.1 nonaka if (c->alloc < a->used + 1) { 4636 1.1 nonaka if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { 4637 1.1 nonaka return res; 4638 1.1 nonaka } 4639 1.1 nonaka } 4640 1.1 nonaka 4641 1.1 nonaka /* if a is negative just do an unsigned 4642 1.1 nonaka * addition [with fudged signs] 4643 1.1 nonaka */ 4644 1.1 nonaka if (a->sign == MP_NEG) { 4645 1.1 nonaka a->sign = MP_ZPOS; 4646 1.1 nonaka res = add_single_digit(a, b, c); 4647 1.1 nonaka a->sign = c->sign = MP_NEG; 4648 1.1 nonaka 4649 1.1 nonaka /* clamp */ 4650 1.1 nonaka trim_unused_digits(c); 4651 1.1 nonaka 4652 1.1 nonaka return res; 4653 1.1 nonaka } 4654 1.1 nonaka 4655 1.1 nonaka /* setup regs */ 4656 1.1 nonaka oldused = c->used; 4657 1.1 nonaka tmpa = a->dp; 4658 1.1 nonaka tmpc = c->dp; 4659 1.1 nonaka 4660 1.1 nonaka /* if a <= b simply fix the single digit */ 4661 1.1 nonaka if ((a->used == 1 && a->dp[0] <= b) || a->used == 0) { 4662 1.1 nonaka if (a->used == 1) { 4663 1.1 nonaka *tmpc++ = b - *tmpa; 4664 1.1 nonaka } else { 4665 1.1 nonaka *tmpc++ = b; 4666 1.1 nonaka } 4667 1.1 nonaka ix = 1; 4668 1.1 nonaka 4669 1.1 nonaka /* negative/1digit */ 4670 1.1 nonaka c->sign = MP_NEG; 4671 1.1 nonaka c->used = 1; 4672 1.1 nonaka } else { 4673 1.1 nonaka /* positive/size */ 4674 1.1 nonaka c->sign = MP_ZPOS; 4675 1.1 nonaka c->used = a->used; 4676 1.1 nonaka 4677 1.1 nonaka /* subtract first digit */ 4678 1.1 nonaka *tmpc = *tmpa++ - b; 4679 1.1 nonaka mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); 4680 1.1 nonaka *tmpc++ &= MP_MASK; 4681 1.1 nonaka 4682 1.1 nonaka /* handle rest of the digits */ 4683 1.1 nonaka for (ix = 1; ix < a->used; ix++) { 4684 1.1 nonaka *tmpc = *tmpa++ - mu; 4685 1.1 nonaka mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); 4686 1.1 nonaka *tmpc++ &= MP_MASK; 4687 1.1 nonaka } 4688 1.1 nonaka } 4689 1.1 nonaka 4690 1.1 nonaka /* zero excess digits */ 4691 1.1 nonaka while (ix++ < oldused) { 4692 1.1 nonaka *tmpc++ = 0; 4693 1.1 nonaka } 4694 1.1 nonaka trim_unused_digits(c); 4695 1.1 nonaka return MP_OKAY; 4696 1.1 nonaka } 4697 1.1 nonaka 4698 1.1 nonaka static const int lnz[16] = { 4699 1.1 nonaka 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 4700 1.1 nonaka }; 4701 1.1 nonaka 4702 1.1 nonaka /* Counts the number of lsbs which are zero before the first zero bit */ 4703 1.1 nonaka static int 4704 1.1 nonaka mp_cnt_lsb(mp_int *a) 4705 1.1 nonaka { 4706 1.1 nonaka int x; 4707 1.1 nonaka mp_digit q, qq; 4708 1.1 nonaka 4709 1.1 nonaka /* easy out */ 4710 1.1 nonaka if (MP_ISZERO(a) == 1) { 4711 1.1 nonaka return 0; 4712 1.1 nonaka } 4713 1.1 nonaka 4714 1.1 nonaka /* scan lower digits until non-zero */ 4715 1.1 nonaka for (x = 0; x < a->used && a->dp[x] == 0; x++) { 4716 1.1 nonaka } 4717 1.1 nonaka q = a->dp[x]; 4718 1.1 nonaka x *= DIGIT_BIT; 4719 1.1 nonaka 4720 1.1 nonaka /* now scan this digit until a 1 is found */ 4721 1.1 nonaka if ((q & 1) == 0) { 4722 1.1 nonaka do { 4723 1.1 nonaka qq = q & 15; 4724 1.1 nonaka /* LINTED previous op ensures range of qq */ 4725 1.1 nonaka x += lnz[qq]; 4726 1.1 nonaka q >>= 4; 4727 1.1 nonaka } while (qq == 0); 4728 1.1 nonaka } 4729 1.1 nonaka return x; 4730 1.1 nonaka } 4731 1.1 nonaka 4732 1.1 nonaka /* c = a * a (mod b) */ 4733 1.1 nonaka static int 4734 1.1 nonaka square_modulo(mp_int *a, mp_int *b, mp_int *c) 4735 1.1 nonaka { 4736 1.1 nonaka int res; 4737 1.1 nonaka mp_int t; 4738 1.1 nonaka 4739 1.1 nonaka if ((res = mp_init(&t)) != MP_OKAY) { 4740 1.1 nonaka return res; 4741 1.1 nonaka } 4742 1.1 nonaka 4743 1.1 nonaka if ((res = square(a, &t)) != MP_OKAY) { 4744 1.1 nonaka mp_clear(&t); 4745 1.1 nonaka return res; 4746 1.1 nonaka } 4747 1.1 nonaka res = modulo(&t, b, c); 4748 1.1 nonaka mp_clear(&t); 4749 1.1 nonaka return res; 4750 1.1 nonaka } 4751 1.1 nonaka 4752 1.1 nonaka static int 4753 1.1 nonaka mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result) 4754 1.1 nonaka { 4755 1.1 nonaka mp_int n1, y, r; 4756 1.1 nonaka int s, j, err; 4757 1.1 nonaka 4758 1.1 nonaka /* default */ 4759 1.1 nonaka *result = MP_NO; 4760 1.1 nonaka 4761 1.1 nonaka /* ensure b > 1 */ 4762 1.1 nonaka if (compare_digit(b, 1) != MP_GT) { 4763 1.1 nonaka return MP_VAL; 4764 1.1 nonaka } 4765 1.1 nonaka 4766 1.1 nonaka /* get n1 = a - 1 */ 4767 1.1 nonaka if ((err = mp_init_copy(&n1, a)) != MP_OKAY) { 4768 1.1 nonaka return err; 4769 1.1 nonaka } 4770 1.1 nonaka if ((err = signed_subtract_word(&n1, 1, &n1)) != MP_OKAY) { 4771 1.1 nonaka goto LBL_N1; 4772 1.1 nonaka } 4773 1.1 nonaka 4774 1.1 nonaka /* set 2**s * r = n1 */ 4775 1.1 nonaka if ((err = mp_init_copy(&r, &n1)) != MP_OKAY) { 4776 1.1 nonaka goto LBL_N1; 4777 1.1 nonaka } 4778 1.1 nonaka 4779 1.1 nonaka /* count the number of least significant bits 4780 1.1 nonaka * which are zero 4781 1.1 nonaka */ 4782 1.1 nonaka s = mp_cnt_lsb(&r); 4783 1.1 nonaka 4784 1.1 nonaka /* now divide n - 1 by 2**s */ 4785 1.1 nonaka if ((err = rshift_bits(&r, s, &r, NULL)) != MP_OKAY) { 4786 1.1 nonaka goto LBL_R; 4787 1.1 nonaka } 4788 1.1 nonaka 4789 1.1 nonaka /* compute y = b**r mod a */ 4790 1.1 nonaka if ((err = mp_init(&y)) != MP_OKAY) { 4791 1.1 nonaka goto LBL_R; 4792 1.1 nonaka } 4793 1.1 nonaka if ((err = exponent_modulo(b, &r, a, &y)) != MP_OKAY) { 4794 1.1 nonaka goto LBL_Y; 4795 1.1 nonaka } 4796 1.1 nonaka 4797 1.1 nonaka /* if y != 1 and y != n1 do */ 4798 1.1 nonaka if (compare_digit(&y, 1) != MP_EQ && signed_compare(&y, &n1) != MP_EQ) { 4799 1.1 nonaka j = 1; 4800 1.1 nonaka /* while j <= s-1 and y != n1 */ 4801 1.1 nonaka while ((j <= (s - 1)) && signed_compare(&y, &n1) != MP_EQ) { 4802 1.1 nonaka if ((err = square_modulo(&y, a, &y)) != MP_OKAY) { 4803 1.1 nonaka goto LBL_Y; 4804 1.1 nonaka } 4805 1.1 nonaka 4806 1.1 nonaka /* if y == 1 then composite */ 4807 1.1 nonaka if (compare_digit(&y, 1) == MP_EQ) { 4808 1.1 nonaka goto LBL_Y; 4809 1.1 nonaka } 4810 1.1 nonaka 4811 1.1 nonaka ++j; 4812 1.1 nonaka } 4813 1.1 nonaka 4814 1.1 nonaka /* if y != n1 then composite */ 4815 1.1 nonaka if (signed_compare(&y, &n1) != MP_EQ) { 4816 1.1 nonaka goto LBL_Y; 4817 1.1 nonaka } 4818 1.1 nonaka } 4819 1.1 nonaka 4820 1.1 nonaka /* probably prime now */ 4821 1.1 nonaka *result = MP_YES; 4822 1.1 nonaka LBL_Y: 4823 1.1 nonaka mp_clear(&y); 4824 1.1 nonaka LBL_R: 4825 1.1 nonaka mp_clear(&r); 4826 1.1 nonaka LBL_N1: 4827 1.1 nonaka mp_clear(&n1); 4828 1.1 nonaka return err; 4829 1.1 nonaka } 4830 1.1 nonaka 4831 1.1 nonaka /* performs a variable number of rounds of Miller-Rabin 4832 1.1 nonaka * 4833 1.1 nonaka * Probability of error after t rounds is no more than 4834 1.1 nonaka 4835 1.1 nonaka * 4836 1.1 nonaka * Sets result to 1 if probably prime, 0 otherwise 4837 1.1 nonaka */ 4838 1.1 nonaka static int 4839 1.1 nonaka mp_prime_is_prime(mp_int *a, int t, int *result) 4840 1.1 nonaka { 4841 1.1 nonaka mp_int b; 4842 1.1 nonaka int ix, err, res; 4843 1.1 nonaka 4844 1.1 nonaka /* default to no */ 4845 1.1 nonaka *result = MP_NO; 4846 1.1 nonaka 4847 1.1 nonaka /* valid value of t? */ 4848 1.1 nonaka if (t <= 0 || t > (int)PRIME_SIZE) { 4849 1.1 nonaka return MP_VAL; 4850 1.1 nonaka } 4851 1.1 nonaka 4852 1.1 nonaka /* is the input equal to one of the primes in the table? */ 4853 1.1 nonaka for (ix = 0; ix < (int)PRIME_SIZE; ix++) { 4854 1.1 nonaka if (compare_digit(a, ltm_prime_tab[ix]) == MP_EQ) { 4855 1.1 nonaka *result = 1; 4856 1.1 nonaka return MP_OKAY; 4857 1.1 nonaka } 4858 1.1 nonaka } 4859 1.1 nonaka 4860 1.1 nonaka /* first perform trial division */ 4861 1.1 nonaka if ((err = mp_prime_is_divisible(a, &res)) != MP_OKAY) { 4862 1.1 nonaka return err; 4863 1.1 nonaka } 4864 1.1 nonaka 4865 1.1 nonaka /* return if it was trivially divisible */ 4866 1.1 nonaka if (res == MP_YES) { 4867 1.1 nonaka return MP_OKAY; 4868 1.1 nonaka } 4869 1.1 nonaka 4870 1.1 nonaka /* now perform the miller-rabin rounds */ 4871 1.1 nonaka if ((err = mp_init(&b)) != MP_OKAY) { 4872 1.1 nonaka return err; 4873 1.1 nonaka } 4874 1.1 nonaka 4875 1.1 nonaka for (ix = 0; ix < t; ix++) { 4876 1.1 nonaka /* set the prime */ 4877 1.1 nonaka set_word(&b, ltm_prime_tab[ix]); 4878 1.1 nonaka 4879 1.1 nonaka if ((err = mp_prime_miller_rabin(a, &b, &res)) != MP_OKAY) { 4880 1.1 nonaka goto LBL_B; 4881 1.1 nonaka } 4882 1.1 nonaka 4883 1.1 nonaka if (res == MP_NO) { 4884 1.1 nonaka goto LBL_B; 4885 1.1 nonaka } 4886 1.1 nonaka } 4887 1.1 nonaka 4888 1.1 nonaka /* passed the test */ 4889 1.1 nonaka *result = MP_YES; 4890 1.1 nonaka LBL_B: 4891 1.1 nonaka mp_clear(&b); 4892 1.1 nonaka return err; 4893 1.1 nonaka } 4894 1.1 nonaka 4895 1.6 andvar /* returns size of ASCII representation */ 4896 1.1 nonaka static int 4897 1.1 nonaka mp_radix_size(mp_int *a, int radix, int *size) 4898 1.1 nonaka { 4899 1.1 nonaka int res, digs; 4900 1.1 nonaka mp_int t; 4901 1.1 nonaka mp_digit d; 4902 1.1 nonaka 4903 1.1 nonaka *size = 0; 4904 1.1 nonaka 4905 1.1 nonaka /* special case for binary */ 4906 1.1 nonaka if (radix == 2) { 4907 1.1 nonaka *size = mp_count_bits(a) + (a->sign == MP_NEG ? 1 : 0) + 1; 4908 1.1 nonaka return MP_OKAY; 4909 1.1 nonaka } 4910 1.1 nonaka 4911 1.1 nonaka /* make sure the radix is in range */ 4912 1.1 nonaka if (radix < 2 || radix > 64) { 4913 1.1 nonaka return MP_VAL; 4914 1.1 nonaka } 4915 1.1 nonaka 4916 1.1 nonaka if (MP_ISZERO(a) == MP_YES) { 4917 1.1 nonaka *size = 2; 4918 1.1 nonaka return MP_OKAY; 4919 1.1 nonaka } 4920 1.1 nonaka 4921 1.1 nonaka /* digs is the digit count */ 4922 1.1 nonaka digs = 0; 4923 1.1 nonaka 4924 1.1 nonaka /* if it's negative add one for the sign */ 4925 1.1 nonaka if (a->sign == MP_NEG) { 4926 1.1 nonaka ++digs; 4927 1.1 nonaka } 4928 1.1 nonaka 4929 1.1 nonaka /* init a copy of the input */ 4930 1.1 nonaka if ((res = mp_init_copy(&t, a)) != MP_OKAY) { 4931 1.1 nonaka return res; 4932 1.1 nonaka } 4933 1.1 nonaka 4934 1.1 nonaka /* force temp to positive */ 4935 1.1 nonaka t.sign = MP_ZPOS; 4936 1.1 nonaka 4937 1.1 nonaka /* fetch out all of the digits */ 4938 1.1 nonaka while (MP_ISZERO(&t) == MP_NO) { 4939 1.1 nonaka if ((res = signed_divide_word(&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { 4940 1.1 nonaka mp_clear(&t); 4941 1.1 nonaka return res; 4942 1.1 nonaka } 4943 1.1 nonaka ++digs; 4944 1.1 nonaka } 4945 1.1 nonaka mp_clear(&t); 4946 1.1 nonaka 4947 1.1 nonaka /* return digs + 1, the 1 is for the NULL byte that would be required. */ 4948 1.1 nonaka *size = digs + 1; 4949 1.1 nonaka return MP_OKAY; 4950 1.1 nonaka } 4951 1.1 nonaka 4952 1.1 nonaka static const char *mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; 4953 1.1 nonaka 4954 1.1 nonaka /* stores a bignum as a ASCII string in a given radix (2..64) 4955 1.1 nonaka * 4956 1.1 nonaka * Stores upto maxlen-1 chars and always a NULL byte 4957 1.1 nonaka */ 4958 1.1 nonaka static int 4959 1.1 nonaka mp_toradix_n(mp_int * a, char *str, int radix, int maxlen) 4960 1.1 nonaka { 4961 1.1 nonaka int res, digs; 4962 1.1 nonaka mp_int t; 4963 1.1 nonaka mp_digit d; 4964 1.1 nonaka char *_s = str; 4965 1.1 nonaka 4966 1.1 nonaka /* check range of the maxlen, radix */ 4967 1.1 nonaka if (maxlen < 2 || radix < 2 || radix > 64) { 4968 1.1 nonaka return MP_VAL; 4969 1.1 nonaka } 4970 1.1 nonaka 4971 1.1 nonaka /* quick out if its zero */ 4972 1.1 nonaka if (MP_ISZERO(a) == MP_YES) { 4973 1.1 nonaka *str++ = '0'; 4974 1.1 nonaka *str = '\0'; 4975 1.1 nonaka return MP_OKAY; 4976 1.1 nonaka } 4977 1.1 nonaka 4978 1.1 nonaka if ((res = mp_init_copy(&t, a)) != MP_OKAY) { 4979 1.1 nonaka return res; 4980 1.1 nonaka } 4981 1.1 nonaka 4982 1.1 nonaka /* if it is negative output a - */ 4983 1.1 nonaka if (t.sign == MP_NEG) { 4984 1.1 nonaka /* we have to reverse our digits later... but not the - sign!! */ 4985 1.1 nonaka ++_s; 4986 1.1 nonaka 4987 1.1 nonaka /* store the flag and mark the number as positive */ 4988 1.1 nonaka *str++ = '-'; 4989 1.1 nonaka t.sign = MP_ZPOS; 4990 1.1 nonaka 4991 1.1 nonaka /* subtract a char */ 4992 1.1 nonaka --maxlen; 4993 1.1 nonaka } 4994 1.1 nonaka 4995 1.1 nonaka digs = 0; 4996 1.1 nonaka while (MP_ISZERO(&t) == 0) { 4997 1.1 nonaka if (--maxlen < 1) { 4998 1.1 nonaka /* no more room */ 4999 1.1 nonaka break; 5000 1.1 nonaka } 5001 1.1 nonaka if ((res = signed_divide_word(&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { 5002 1.1 nonaka mp_clear(&t); 5003 1.1 nonaka return res; 5004 1.1 nonaka } 5005 1.1 nonaka /* LINTED -- radix' range is checked above, limits d's range */ 5006 1.1 nonaka *str++ = mp_s_rmap[d]; 5007 1.1 nonaka ++digs; 5008 1.1 nonaka } 5009 1.1 nonaka 5010 1.1 nonaka /* reverse the digits of the string. In this case _s points 5011 1.6 andvar * to the first digit [excluding the sign] of the number 5012 1.1 nonaka */ 5013 1.1 nonaka bn_reverse((unsigned char *)_s, digs); 5014 1.1 nonaka 5015 1.1 nonaka /* append a NULL so the string is properly terminated */ 5016 1.1 nonaka *str = '\0'; 5017 1.1 nonaka 5018 1.1 nonaka mp_clear(&t); 5019 1.1 nonaka return MP_OKAY; 5020 1.1 nonaka } 5021 1.1 nonaka 5022 1.1 nonaka static char * 5023 1.1 nonaka formatbn(const BIGNUM *a, const int radix) 5024 1.1 nonaka { 5025 1.1 nonaka char *s; 5026 1.1 nonaka int len; 5027 1.1 nonaka 5028 1.1 nonaka if (mp_radix_size(__UNCONST(a), radix, &len) != MP_OKAY) { 5029 1.1 nonaka return NULL; 5030 1.1 nonaka } 5031 1.1 nonaka if ((s = allocate(1, (size_t)len)) != NULL) { 5032 1.1 nonaka if (mp_toradix_n(__UNCONST(a), s, radix, len) != MP_OKAY) { 5033 1.1 nonaka deallocate(s, (size_t)len); 5034 1.1 nonaka return NULL; 5035 1.1 nonaka } 5036 1.1 nonaka } 5037 1.1 nonaka return s; 5038 1.1 nonaka } 5039 1.1 nonaka 5040 1.1 nonaka static int 5041 1.1 nonaka mp_getradix_num(mp_int *a, int radix, char *s) 5042 1.1 nonaka { 5043 1.1 nonaka int err, ch, neg, y; 5044 1.1 nonaka 5045 1.1 nonaka /* clear a */ 5046 1.1 nonaka mp_zero(a); 5047 1.1 nonaka 5048 1.1 nonaka /* if first digit is - then set negative */ 5049 1.1 nonaka if ((ch = *s++) == '-') { 5050 1.1 nonaka neg = MP_NEG; 5051 1.1 nonaka ch = *s++; 5052 1.1 nonaka } else { 5053 1.1 nonaka neg = MP_ZPOS; 5054 1.1 nonaka } 5055 1.1 nonaka 5056 1.1 nonaka for (;;) { 5057 1.1 nonaka /* find y in the radix map */ 5058 1.1 nonaka for (y = 0; y < radix; y++) { 5059 1.1 nonaka if (mp_s_rmap[y] == ch) { 5060 1.1 nonaka break; 5061 1.1 nonaka } 5062 1.1 nonaka } 5063 1.1 nonaka if (y == radix) { 5064 1.1 nonaka break; 5065 1.1 nonaka } 5066 1.1 nonaka 5067 1.1 nonaka /* shift up and add */ 5068 1.1 nonaka if ((err = multiply_digit(a, radix, a)) != MP_OKAY) { 5069 1.1 nonaka return err; 5070 1.1 nonaka } 5071 1.1 nonaka if ((err = add_single_digit(a, y, a)) != MP_OKAY) { 5072 1.1 nonaka return err; 5073 1.1 nonaka } 5074 1.1 nonaka 5075 1.1 nonaka ch = *s++; 5076 1.1 nonaka } 5077 1.1 nonaka if (compare_digit(a, 0) != MP_EQ) { 5078 1.1 nonaka a->sign = neg; 5079 1.1 nonaka } 5080 1.1 nonaka 5081 1.1 nonaka return MP_OKAY; 5082 1.1 nonaka } 5083 1.1 nonaka 5084 1.1 nonaka static int 5085 1.1 nonaka getbn(BIGNUM **a, const char *str, int radix) 5086 1.1 nonaka { 5087 1.1 nonaka int len; 5088 1.1 nonaka 5089 1.1 nonaka if (a == NULL || str == NULL || (*a = BN_new()) == NULL) { 5090 1.1 nonaka return 0; 5091 1.1 nonaka } 5092 1.1 nonaka if (mp_getradix_num(*a, radix, __UNCONST(str)) != MP_OKAY) { 5093 1.1 nonaka return 0; 5094 1.1 nonaka } 5095 1.1 nonaka mp_radix_size(__UNCONST(*a), radix, &len); 5096 1.1 nonaka return len - 1; 5097 1.1 nonaka } 5098 1.1 nonaka 5099 1.1 nonaka /* d = a - b (mod c) */ 5100 1.1 nonaka static int 5101 1.1 nonaka subtract_modulo(mp_int *a, mp_int *b, mp_int *c, mp_int *d) 5102 1.1 nonaka { 5103 1.1 nonaka int res; 5104 1.1 nonaka mp_int t; 5105 1.1 nonaka 5106 1.1 nonaka 5107 1.1 nonaka if ((res = mp_init(&t)) != MP_OKAY) { 5108 1.1 nonaka return res; 5109 1.1 nonaka } 5110 1.1 nonaka 5111 1.1 nonaka if ((res = signed_subtract(a, b, &t)) != MP_OKAY) { 5112 1.1 nonaka mp_clear(&t); 5113 1.1 nonaka return res; 5114 1.1 nonaka } 5115 1.1 nonaka res = modulo(&t, c, d); 5116 1.1 nonaka mp_clear(&t); 5117 1.1 nonaka return res; 5118 1.1 nonaka } 5119 1.1 nonaka 5120 1.1 nonaka /* bn_mp_gcd.c */ 5121 1.1 nonaka /* Greatest Common Divisor using the binary method */ 5122 1.1 nonaka static int 5123 1.1 nonaka mp_gcd(mp_int *a, mp_int *b, mp_int *c) 5124 1.1 nonaka { 5125 1.1 nonaka mp_int u, v; 5126 1.1 nonaka int k, u_lsb, v_lsb, res; 5127 1.1 nonaka 5128 1.1 nonaka /* either zero than gcd is the largest */ 5129 1.1 nonaka if (BN_is_zero(a) == MP_YES) { 5130 1.1 nonaka return absolute(b, c); 5131 1.1 nonaka } 5132 1.1 nonaka if (BN_is_zero(b) == MP_YES) { 5133 1.1 nonaka return absolute(a, c); 5134 1.1 nonaka } 5135 1.1 nonaka 5136 1.1 nonaka /* get copies of a and b we can modify */ 5137 1.1 nonaka if ((res = mp_init_copy(&u, a)) != MP_OKAY) { 5138 1.1 nonaka return res; 5139 1.1 nonaka } 5140 1.1 nonaka 5141 1.1 nonaka if ((res = mp_init_copy(&v, b)) != MP_OKAY) { 5142 1.1 nonaka goto LBL_U; 5143 1.1 nonaka } 5144 1.1 nonaka 5145 1.1 nonaka /* must be positive for the remainder of the algorithm */ 5146 1.1 nonaka u.sign = v.sign = MP_ZPOS; 5147 1.1 nonaka 5148 1.1 nonaka /* B1. Find the common power of two for u and v */ 5149 1.1 nonaka u_lsb = mp_cnt_lsb(&u); 5150 1.1 nonaka v_lsb = mp_cnt_lsb(&v); 5151 1.1 nonaka k = MIN(u_lsb, v_lsb); 5152 1.1 nonaka 5153 1.1 nonaka if (k > 0) { 5154 1.1 nonaka /* divide the power of two out */ 5155 1.1 nonaka if ((res = rshift_bits(&u, k, &u, NULL)) != MP_OKAY) { 5156 1.1 nonaka goto LBL_V; 5157 1.1 nonaka } 5158 1.1 nonaka 5159 1.1 nonaka if ((res = rshift_bits(&v, k, &v, NULL)) != MP_OKAY) { 5160 1.1 nonaka goto LBL_V; 5161 1.1 nonaka } 5162 1.1 nonaka } 5163 1.1 nonaka 5164 1.1 nonaka /* divide any remaining factors of two out */ 5165 1.1 nonaka if (u_lsb != k) { 5166 1.1 nonaka if ((res = rshift_bits(&u, u_lsb - k, &u, NULL)) != MP_OKAY) { 5167 1.1 nonaka goto LBL_V; 5168 1.1 nonaka } 5169 1.1 nonaka } 5170 1.1 nonaka 5171 1.1 nonaka if (v_lsb != k) { 5172 1.1 nonaka if ((res = rshift_bits(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { 5173 1.1 nonaka goto LBL_V; 5174 1.1 nonaka } 5175 1.1 nonaka } 5176 1.1 nonaka 5177 1.1 nonaka while (BN_is_zero(&v) == 0) { 5178 1.1 nonaka /* make sure v is the largest */ 5179 1.1 nonaka if (compare_magnitude(&u, &v) == MP_GT) { 5180 1.1 nonaka /* swap u and v to make sure v is >= u */ 5181 1.1 nonaka mp_exch(&u, &v); 5182 1.1 nonaka } 5183 1.1 nonaka 5184 1.1 nonaka /* subtract smallest from largest */ 5185 1.1 nonaka if ((res = signed_subtract(&v, &u, &v)) != MP_OKAY) { 5186 1.1 nonaka goto LBL_V; 5187 1.1 nonaka } 5188 1.1 nonaka 5189 1.1 nonaka /* Divide out all factors of two */ 5190 1.1 nonaka if ((res = rshift_bits(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { 5191 1.1 nonaka goto LBL_V; 5192 1.1 nonaka } 5193 1.1 nonaka } 5194 1.1 nonaka 5195 1.1 nonaka /* multiply by 2**k which we divided out at the beginning */ 5196 1.1 nonaka if ((res = lshift_bits(&u, k, c)) != MP_OKAY) { 5197 1.1 nonaka goto LBL_V; 5198 1.1 nonaka } 5199 1.1 nonaka c->sign = MP_ZPOS; 5200 1.1 nonaka res = MP_OKAY; 5201 1.1 nonaka LBL_V: 5202 1.1 nonaka mp_clear (&u); 5203 1.1 nonaka LBL_U: 5204 1.1 nonaka mp_clear (&v); 5205 1.1 nonaka return res; 5206 1.1 nonaka } 5207 1.1 nonaka 5208 1.1 nonaka /**************************************************************************/ 5209 1.1 nonaka 5210 1.1 nonaka /* BIGNUM emulation layer */ 5211 1.1 nonaka 5212 1.6 andvar /* essentially, these are just wrappers around the libtommath functions */ 5213 1.1 nonaka /* usually the order of args changes */ 5214 1.1 nonaka /* the BIGNUM API tends to have more const poisoning */ 5215 1.1 nonaka /* these wrappers also check the arguments passed for sanity */ 5216 1.1 nonaka 5217 1.1 nonaka BIGNUM * 5218 1.1 nonaka BN_bin2bn(const uint8_t *data, int len, BIGNUM *ret) 5219 1.1 nonaka { 5220 1.1 nonaka if (data == NULL) { 5221 1.1 nonaka return BN_new(); 5222 1.1 nonaka } 5223 1.1 nonaka if (ret == NULL) { 5224 1.1 nonaka ret = BN_new(); 5225 1.1 nonaka } 5226 1.1 nonaka return (mp_read_unsigned_bin(ret, data, len) == MP_OKAY) ? ret : NULL; 5227 1.1 nonaka } 5228 1.1 nonaka 5229 1.1 nonaka /* store in unsigned [big endian] format */ 5230 1.1 nonaka int 5231 1.1 nonaka BN_bn2bin(const BIGNUM *a, unsigned char *b) 5232 1.1 nonaka { 5233 1.1 nonaka BIGNUM t; 5234 1.1 nonaka int x; 5235 1.1 nonaka 5236 1.1 nonaka if (a == NULL || b == NULL) { 5237 1.1 nonaka return -1; 5238 1.1 nonaka } 5239 1.1 nonaka if (mp_init_copy (&t, __UNCONST(a)) != MP_OKAY) { 5240 1.1 nonaka return -1; 5241 1.1 nonaka } 5242 1.1 nonaka for (x = 0; !BN_is_zero(&t) ; ) { 5243 1.1 nonaka b[x++] = (unsigned char) (t.dp[0] & 0xff); 5244 1.1 nonaka if (rshift_bits(&t, 8, &t, NULL) != MP_OKAY) { 5245 1.1 nonaka mp_clear(&t); 5246 1.1 nonaka return -1; 5247 1.1 nonaka } 5248 1.1 nonaka } 5249 1.1 nonaka bn_reverse(b, x); 5250 1.1 nonaka mp_clear(&t); 5251 1.1 nonaka return x; 5252 1.1 nonaka } 5253 1.1 nonaka 5254 1.1 nonaka void 5255 1.1 nonaka BN_init(BIGNUM *a) 5256 1.1 nonaka { 5257 1.1 nonaka if (a != NULL) { 5258 1.1 nonaka mp_init(a); 5259 1.1 nonaka } 5260 1.1 nonaka } 5261 1.1 nonaka 5262 1.1 nonaka BIGNUM * 5263 1.1 nonaka BN_new(void) 5264 1.1 nonaka { 5265 1.1 nonaka BIGNUM *a; 5266 1.1 nonaka 5267 1.1 nonaka if ((a = allocate(1, sizeof(*a))) != NULL) { 5268 1.1 nonaka mp_init(a); 5269 1.1 nonaka } 5270 1.1 nonaka return a; 5271 1.1 nonaka } 5272 1.1 nonaka 5273 1.1 nonaka /* copy, b = a */ 5274 1.1 nonaka int 5275 1.1 nonaka BN_copy(BIGNUM *b, const BIGNUM *a) 5276 1.1 nonaka { 5277 1.1 nonaka if (a == NULL || b == NULL) { 5278 1.1 nonaka return MP_VAL; 5279 1.1 nonaka } 5280 1.1 nonaka return mp_copy(__UNCONST(a), b); 5281 1.1 nonaka } 5282 1.1 nonaka 5283 1.1 nonaka BIGNUM * 5284 1.1 nonaka BN_dup(const BIGNUM *a) 5285 1.1 nonaka { 5286 1.1 nonaka BIGNUM *ret; 5287 1.1 nonaka 5288 1.1 nonaka if (a == NULL) { 5289 1.1 nonaka return NULL; 5290 1.1 nonaka } 5291 1.1 nonaka if ((ret = BN_new()) != NULL) { 5292 1.1 nonaka BN_copy(ret, a); 5293 1.1 nonaka } 5294 1.1 nonaka return ret; 5295 1.1 nonaka } 5296 1.1 nonaka 5297 1.1 nonaka void 5298 1.1 nonaka BN_swap(BIGNUM *a, BIGNUM *b) 5299 1.1 nonaka { 5300 1.1 nonaka if (a && b) { 5301 1.1 nonaka mp_exch(a, b); 5302 1.1 nonaka } 5303 1.1 nonaka } 5304 1.1 nonaka 5305 1.1 nonaka int 5306 1.1 nonaka BN_lshift(BIGNUM *r, const BIGNUM *a, int n) 5307 1.1 nonaka { 5308 1.1 nonaka if (r == NULL || a == NULL || n < 0) { 5309 1.1 nonaka return 0; 5310 1.1 nonaka } 5311 1.1 nonaka BN_copy(r, a); 5312 1.1 nonaka return lshift_digits(r, n) == MP_OKAY; 5313 1.1 nonaka } 5314 1.1 nonaka 5315 1.1 nonaka int 5316 1.1 nonaka BN_lshift1(BIGNUM *r, BIGNUM *a) 5317 1.1 nonaka { 5318 1.1 nonaka if (r == NULL || a == NULL) { 5319 1.1 nonaka return 0; 5320 1.1 nonaka } 5321 1.1 nonaka BN_copy(r, a); 5322 1.1 nonaka return lshift_digits(r, 1) == MP_OKAY; 5323 1.1 nonaka } 5324 1.1 nonaka 5325 1.1 nonaka int 5326 1.1 nonaka BN_rshift(BIGNUM *r, const BIGNUM *a, int n) 5327 1.1 nonaka { 5328 1.1 nonaka if (r == NULL || a == NULL || n < 0) { 5329 1.1 nonaka return MP_VAL; 5330 1.1 nonaka } 5331 1.1 nonaka BN_copy(r, a); 5332 1.1 nonaka return rshift_digits(r, n) == MP_OKAY; 5333 1.1 nonaka } 5334 1.1 nonaka 5335 1.1 nonaka int 5336 1.1 nonaka BN_rshift1(BIGNUM *r, BIGNUM *a) 5337 1.1 nonaka { 5338 1.1 nonaka if (r == NULL || a == NULL) { 5339 1.1 nonaka return 0; 5340 1.1 nonaka } 5341 1.1 nonaka BN_copy(r, a); 5342 1.1 nonaka return rshift_digits(r, 1) == MP_OKAY; 5343 1.1 nonaka } 5344 1.1 nonaka 5345 1.1 nonaka int 5346 1.1 nonaka BN_set_word(BIGNUM *a, BN_ULONG w) 5347 1.1 nonaka { 5348 1.1 nonaka if (a == NULL) { 5349 1.1 nonaka return 0; 5350 1.1 nonaka } 5351 1.1 nonaka set_word(a, w); 5352 1.1 nonaka return 1; 5353 1.1 nonaka } 5354 1.1 nonaka 5355 1.1 nonaka int 5356 1.1 nonaka BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) 5357 1.1 nonaka { 5358 1.1 nonaka if (a == NULL || b == NULL || r == NULL) { 5359 1.1 nonaka return 0; 5360 1.1 nonaka } 5361 1.1 nonaka return signed_add(__UNCONST(a), __UNCONST(b), r) == MP_OKAY; 5362 1.1 nonaka } 5363 1.1 nonaka 5364 1.1 nonaka int 5365 1.1 nonaka BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b) 5366 1.1 nonaka { 5367 1.1 nonaka if (a == NULL || b == NULL || r == NULL) { 5368 1.1 nonaka return 0; 5369 1.1 nonaka } 5370 1.1 nonaka return signed_subtract(__UNCONST(a), __UNCONST(b), r) == MP_OKAY; 5371 1.1 nonaka } 5372 1.1 nonaka 5373 1.1 nonaka int 5374 1.1 nonaka BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) 5375 1.1 nonaka { 5376 1.1 nonaka if (a == NULL || b == NULL || r == NULL) { 5377 1.1 nonaka return 0; 5378 1.1 nonaka } 5379 1.1 nonaka USE_ARG(ctx); 5380 1.1 nonaka return signed_multiply(__UNCONST(a), __UNCONST(b), r) == MP_OKAY; 5381 1.1 nonaka } 5382 1.1 nonaka 5383 1.1 nonaka int 5384 1.1 nonaka BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a, const BIGNUM *d, BN_CTX *ctx) 5385 1.1 nonaka { 5386 1.1 nonaka if ((dv == NULL && rem == NULL) || a == NULL || d == NULL) { 5387 1.1 nonaka return 0; 5388 1.1 nonaka } 5389 1.1 nonaka USE_ARG(ctx); 5390 1.1 nonaka return signed_divide(dv, rem, __UNCONST(a), __UNCONST(d)) == MP_OKAY; 5391 1.1 nonaka } 5392 1.1 nonaka 5393 1.1 nonaka /* perform a bit operation on the 2 bignums */ 5394 1.1 nonaka int 5395 1.1 nonaka BN_bitop(BIGNUM *r, const BIGNUM *a, char op, const BIGNUM *b) 5396 1.1 nonaka { 5397 1.1 nonaka unsigned ndigits; 5398 1.1 nonaka mp_digit ad; 5399 1.1 nonaka mp_digit bd; 5400 1.1 nonaka int i; 5401 1.1 nonaka 5402 1.1 nonaka if (a == NULL || b == NULL || r == NULL) { 5403 1.1 nonaka return 0; 5404 1.1 nonaka } 5405 1.1 nonaka if (BN_cmp(__UNCONST(a), __UNCONST(b)) >= 0) { 5406 1.1 nonaka BN_copy(r, a); 5407 1.1 nonaka ndigits = a->used; 5408 1.1 nonaka } else { 5409 1.1 nonaka BN_copy(r, b); 5410 1.1 nonaka ndigits = b->used; 5411 1.1 nonaka } 5412 1.1 nonaka for (i = 0 ; i < (int)ndigits ; i++) { 5413 1.1 nonaka ad = (i > a->used) ? 0 : a->dp[i]; 5414 1.1 nonaka bd = (i > b->used) ? 0 : b->dp[i]; 5415 1.1 nonaka switch(op) { 5416 1.1 nonaka case '&': 5417 1.1 nonaka r->dp[i] = (ad & bd); 5418 1.1 nonaka break; 5419 1.1 nonaka case '|': 5420 1.1 nonaka r->dp[i] = (ad | bd); 5421 1.1 nonaka break; 5422 1.1 nonaka case '^': 5423 1.1 nonaka r->dp[i] = (ad ^ bd); 5424 1.1 nonaka break; 5425 1.1 nonaka default: 5426 1.1 nonaka break; 5427 1.1 nonaka } 5428 1.1 nonaka } 5429 1.1 nonaka return 1; 5430 1.1 nonaka } 5431 1.1 nonaka 5432 1.1 nonaka void 5433 1.1 nonaka BN_free(BIGNUM *a) 5434 1.1 nonaka { 5435 1.1 nonaka if (a) { 5436 1.1 nonaka mp_clear(a); 5437 1.1 nonaka free(a); 5438 1.1 nonaka } 5439 1.1 nonaka } 5440 1.1 nonaka 5441 1.1 nonaka void 5442 1.1 nonaka BN_clear(BIGNUM *a) 5443 1.1 nonaka { 5444 1.1 nonaka if (a) { 5445 1.1 nonaka mp_clear(a); 5446 1.1 nonaka } 5447 1.1 nonaka } 5448 1.1 nonaka 5449 1.1 nonaka void 5450 1.1 nonaka BN_clear_free(BIGNUM *a) 5451 1.1 nonaka { 5452 1.1 nonaka BN_clear(a); 5453 1.1 nonaka free(a); 5454 1.1 nonaka } 5455 1.1 nonaka 5456 1.1 nonaka int 5457 1.1 nonaka BN_num_bytes(const BIGNUM *a) 5458 1.1 nonaka { 5459 1.1 nonaka if (a == NULL) { 5460 1.1 nonaka return MP_VAL; 5461 1.1 nonaka } 5462 1.1 nonaka return mp_unsigned_bin_size(__UNCONST(a)); 5463 1.1 nonaka } 5464 1.1 nonaka 5465 1.1 nonaka int 5466 1.1 nonaka BN_num_bits(const BIGNUM *a) 5467 1.1 nonaka { 5468 1.1 nonaka if (a == NULL) { 5469 1.1 nonaka return 0; 5470 1.1 nonaka } 5471 1.1 nonaka return mp_count_bits(a); 5472 1.1 nonaka } 5473 1.1 nonaka 5474 1.1 nonaka void 5475 1.1 nonaka BN_set_negative(BIGNUM *a, int n) 5476 1.1 nonaka { 5477 1.1 nonaka if (a) { 5478 1.1 nonaka a->sign = (n) ? MP_NEG : 0; 5479 1.1 nonaka } 5480 1.1 nonaka } 5481 1.1 nonaka 5482 1.1 nonaka int 5483 1.1 nonaka BN_cmp(BIGNUM *a, BIGNUM *b) 5484 1.1 nonaka { 5485 1.1 nonaka if (a == NULL || b == NULL) { 5486 1.1 nonaka return MP_VAL; 5487 1.1 nonaka } 5488 1.1 nonaka switch(signed_compare(a, b)) { 5489 1.1 nonaka case MP_LT: 5490 1.1 nonaka return -1; 5491 1.1 nonaka case MP_GT: 5492 1.1 nonaka return 1; 5493 1.1 nonaka case MP_EQ: 5494 1.1 nonaka default: 5495 1.1 nonaka return 0; 5496 1.1 nonaka } 5497 1.1 nonaka } 5498 1.1 nonaka 5499 1.1 nonaka int 5500 1.1 nonaka BN_mod_exp(BIGNUM *Y, BIGNUM *G, BIGNUM *X, BIGNUM *P, BN_CTX *ctx) 5501 1.1 nonaka { 5502 1.1 nonaka if (Y == NULL || G == NULL || X == NULL || P == NULL) { 5503 1.1 nonaka return MP_VAL; 5504 1.1 nonaka } 5505 1.1 nonaka USE_ARG(ctx); 5506 1.1 nonaka return exponent_modulo(G, X, P, Y) == MP_OKAY; 5507 1.1 nonaka } 5508 1.1 nonaka 5509 1.1 nonaka BIGNUM * 5510 1.1 nonaka BN_mod_inverse(BIGNUM *r, BIGNUM *a, const BIGNUM *n, BN_CTX *ctx) 5511 1.1 nonaka { 5512 1.1 nonaka USE_ARG(ctx); 5513 1.1 nonaka if (r == NULL || a == NULL || n == NULL) { 5514 1.1 nonaka return NULL; 5515 1.1 nonaka } 5516 1.1 nonaka return (modular_inverse(r, a, __UNCONST(n)) == MP_OKAY) ? r : NULL; 5517 1.1 nonaka } 5518 1.1 nonaka 5519 1.1 nonaka int 5520 1.1 nonaka BN_mod_mul(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m, BN_CTX *ctx) 5521 1.1 nonaka { 5522 1.1 nonaka USE_ARG(ctx); 5523 1.1 nonaka if (ret == NULL || a == NULL || b == NULL || m == NULL) { 5524 1.1 nonaka return 0; 5525 1.1 nonaka } 5526 1.1 nonaka return multiply_modulo(ret, a, b, __UNCONST(m)) == MP_OKAY; 5527 1.1 nonaka } 5528 1.1 nonaka 5529 1.1 nonaka BN_CTX * 5530 1.1 nonaka BN_CTX_new(void) 5531 1.1 nonaka { 5532 1.1 nonaka return allocate(1, sizeof(BN_CTX)); 5533 1.1 nonaka } 5534 1.1 nonaka 5535 1.1 nonaka void 5536 1.1 nonaka BN_CTX_init(BN_CTX *c) 5537 1.1 nonaka { 5538 1.1 nonaka if (c != NULL) { 5539 1.1 nonaka c->arraysize = 15; 5540 1.1 nonaka if ((c->v = allocate(sizeof(*c->v), c->arraysize)) == NULL) { 5541 1.1 nonaka c->arraysize = 0; 5542 1.1 nonaka } 5543 1.1 nonaka } 5544 1.1 nonaka } 5545 1.1 nonaka 5546 1.1 nonaka BIGNUM * 5547 1.1 nonaka BN_CTX_get(BN_CTX *ctx) 5548 1.1 nonaka { 5549 1.1 nonaka if (ctx == NULL || ctx->v == NULL || ctx->arraysize == 0 || ctx->count == ctx->arraysize - 1) { 5550 1.1 nonaka return NULL; 5551 1.1 nonaka } 5552 1.1 nonaka return ctx->v[ctx->count++] = BN_new(); 5553 1.1 nonaka } 5554 1.1 nonaka 5555 1.1 nonaka void 5556 1.1 nonaka BN_CTX_start(BN_CTX *ctx) 5557 1.1 nonaka { 5558 1.1 nonaka BN_CTX_init(ctx); 5559 1.1 nonaka } 5560 1.1 nonaka 5561 1.1 nonaka void 5562 1.1 nonaka BN_CTX_free(BN_CTX *c) 5563 1.1 nonaka { 5564 1.1 nonaka unsigned i; 5565 1.1 nonaka 5566 1.1 nonaka if (c != NULL && c->v != NULL) { 5567 1.1 nonaka for (i = 0 ; i < c->count ; i++) { 5568 1.1 nonaka BN_clear_free(c->v[i]); 5569 1.1 nonaka } 5570 1.1 nonaka deallocate(c->v, sizeof(*c->v) * c->arraysize); 5571 1.1 nonaka } 5572 1.1 nonaka } 5573 1.1 nonaka 5574 1.1 nonaka void 5575 1.1 nonaka BN_CTX_end(BN_CTX *ctx) 5576 1.1 nonaka { 5577 1.1 nonaka BN_CTX_free(ctx); 5578 1.1 nonaka } 5579 1.1 nonaka 5580 1.1 nonaka char * 5581 1.1 nonaka BN_bn2hex(const BIGNUM *a) 5582 1.1 nonaka { 5583 1.1 nonaka return (a == NULL) ? NULL : formatbn(a, 16); 5584 1.1 nonaka } 5585 1.1 nonaka 5586 1.1 nonaka char * 5587 1.1 nonaka BN_bn2dec(const BIGNUM *a) 5588 1.1 nonaka { 5589 1.1 nonaka return (a == NULL) ? NULL : formatbn(a, 10); 5590 1.1 nonaka } 5591 1.1 nonaka 5592 1.1 nonaka char * 5593 1.1 nonaka BN_bn2radix(const BIGNUM *a, unsigned radix) 5594 1.1 nonaka { 5595 1.1 nonaka return (a == NULL) ? NULL : formatbn(a, (int)radix); 5596 1.1 nonaka } 5597 1.1 nonaka 5598 1.1 nonaka int 5599 1.1 nonaka BN_print_fp(FILE *fp, const BIGNUM *a) 5600 1.1 nonaka { 5601 1.1 nonaka char *s; 5602 1.1 nonaka int ret; 5603 1.1 nonaka 5604 1.1 nonaka if (fp == NULL || a == NULL) { 5605 1.1 nonaka return 0; 5606 1.1 nonaka } 5607 1.1 nonaka s = BN_bn2hex(a); 5608 1.1 nonaka ret = fprintf(fp, "%s", s); 5609 1.1 nonaka deallocate(s, strlen(s) + 1); 5610 1.1 nonaka return ret; 5611 1.1 nonaka } 5612 1.1 nonaka 5613 1.1 nonaka #ifdef BN_RAND_NEEDED 5614 1.1 nonaka int 5615 1.1 nonaka BN_rand(BIGNUM *rnd, int bits, int top, int bottom) 5616 1.1 nonaka { 5617 1.1 nonaka uint64_t r; 5618 1.1 nonaka int digits; 5619 1.1 nonaka int i; 5620 1.1 nonaka 5621 1.1 nonaka if (rnd == NULL) { 5622 1.1 nonaka return 0; 5623 1.1 nonaka } 5624 1.1 nonaka mp_init_size(rnd, digits = howmany(bits, DIGIT_BIT)); 5625 1.1 nonaka for (i = 0 ; i < digits ; i++) { 5626 1.1 nonaka r = (uint64_t)arc4random(); 5627 1.1 nonaka r <<= 32; 5628 1.1 nonaka r |= arc4random(); 5629 1.1 nonaka rnd->dp[i] = (r & MP_MASK); 5630 1.1 nonaka rnd->used += 1; 5631 1.1 nonaka } 5632 1.1 nonaka if (top == 0) { 5633 1.1 nonaka rnd->dp[rnd->used - 1] |= (((mp_digit)1)<<((mp_digit)DIGIT_BIT)); 5634 1.1 nonaka } 5635 1.1 nonaka if (top == 1) { 5636 1.1 nonaka rnd->dp[rnd->used - 1] |= (((mp_digit)1)<<((mp_digit)DIGIT_BIT)); 5637 1.1 nonaka rnd->dp[rnd->used - 1] |= (((mp_digit)1)<<((mp_digit)(DIGIT_BIT - 1))); 5638 1.1 nonaka } 5639 1.1 nonaka if (bottom) { 5640 1.1 nonaka rnd->dp[0] |= 0x1; 5641 1.1 nonaka } 5642 1.1 nonaka return 1; 5643 1.1 nonaka } 5644 1.1 nonaka 5645 1.1 nonaka int 5646 1.1 nonaka BN_rand_range(BIGNUM *rnd, BIGNUM *range) 5647 1.1 nonaka { 5648 1.1 nonaka if (rnd == NULL || range == NULL || BN_is_zero(range)) { 5649 1.1 nonaka return 0; 5650 1.1 nonaka } 5651 1.1 nonaka BN_rand(rnd, BN_num_bits(range), 1, 0); 5652 1.1 nonaka return modulo(rnd, range, rnd) == MP_OKAY; 5653 1.1 nonaka } 5654 1.1 nonaka #endif 5655 1.1 nonaka 5656 1.1 nonaka int 5657 1.1 nonaka BN_is_prime(const BIGNUM *a, int checks, void (*callback)(int, int, void *), BN_CTX *ctx, void *cb_arg) 5658 1.1 nonaka { 5659 1.1 nonaka int primality; 5660 1.1 nonaka 5661 1.1 nonaka if (a == NULL) { 5662 1.1 nonaka return 0; 5663 1.1 nonaka } 5664 1.1 nonaka USE_ARG(ctx); 5665 1.1 nonaka USE_ARG(cb_arg); 5666 1.1 nonaka USE_ARG(callback); 5667 1.1 nonaka return (mp_prime_is_prime(__UNCONST(a), checks, &primality) == MP_OKAY) ? primality : 0; 5668 1.1 nonaka } 5669 1.1 nonaka 5670 1.1 nonaka const BIGNUM * 5671 1.1 nonaka BN_value_one(void) 5672 1.1 nonaka { 5673 1.1 nonaka static mp_digit digit = 1UL; 5674 1.1 nonaka static const BIGNUM one = { &digit, 1, 1, 0 }; 5675 1.1 nonaka 5676 1.1 nonaka return &one; 5677 1.1 nonaka } 5678 1.1 nonaka 5679 1.1 nonaka int 5680 1.1 nonaka BN_hex2bn(BIGNUM **a, const char *str) 5681 1.1 nonaka { 5682 1.1 nonaka return getbn(a, str, 16); 5683 1.1 nonaka } 5684 1.1 nonaka 5685 1.1 nonaka int 5686 1.1 nonaka BN_dec2bn(BIGNUM **a, const char *str) 5687 1.1 nonaka { 5688 1.1 nonaka return getbn(a, str, 10); 5689 1.1 nonaka } 5690 1.1 nonaka 5691 1.1 nonaka int 5692 1.1 nonaka BN_radix2bn(BIGNUM **a, const char *str, unsigned radix) 5693 1.1 nonaka { 5694 1.1 nonaka return getbn(a, str, (int)radix); 5695 1.1 nonaka } 5696 1.1 nonaka 5697 1.1 nonaka int 5698 1.1 nonaka BN_mod_sub(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m, BN_CTX *ctx) 5699 1.1 nonaka { 5700 1.1 nonaka USE_ARG(ctx); 5701 1.1 nonaka if (r == NULL || a == NULL || b == NULL || m == NULL) { 5702 1.1 nonaka return 0; 5703 1.1 nonaka } 5704 1.1 nonaka return subtract_modulo(a, b, __UNCONST(m), r) == MP_OKAY; 5705 1.1 nonaka } 5706 1.1 nonaka 5707 1.1 nonaka int 5708 1.1 nonaka BN_is_bit_set(const BIGNUM *a, int n) 5709 1.1 nonaka { 5710 1.1 nonaka if (a == NULL || n < 0 || n >= a->used * DIGIT_BIT) { 5711 1.1 nonaka return 0; 5712 1.1 nonaka } 5713 1.1 nonaka return (a->dp[n / DIGIT_BIT] & (1 << (n % DIGIT_BIT))) ? 1 : 0; 5714 1.1 nonaka } 5715 1.1 nonaka 5716 1.1 nonaka /* raise 'a' to power of 'b' */ 5717 1.1 nonaka int 5718 1.1 nonaka BN_raise(BIGNUM *res, BIGNUM *a, BIGNUM *b) 5719 1.1 nonaka { 5720 1.1 nonaka uint64_t exponent; 5721 1.1 nonaka BIGNUM *power; 5722 1.1 nonaka BIGNUM *temp; 5723 1.1 nonaka char *t; 5724 1.1 nonaka 5725 1.1 nonaka t = BN_bn2dec(b); 5726 1.1 nonaka exponent = (uint64_t)strtoull(t, NULL, 10); 5727 1.1 nonaka free(t); 5728 1.1 nonaka if (exponent == 0) { 5729 1.1 nonaka BN_copy(res, BN_value_one()); 5730 1.1 nonaka } else { 5731 1.1 nonaka power = BN_dup(a); 5732 1.1 nonaka for ( ; (exponent & 1) == 0 ; exponent >>= 1) { 5733 1.1 nonaka BN_mul(power, power, power, NULL); 5734 1.1 nonaka } 5735 1.1 nonaka temp = BN_dup(power); 5736 1.1 nonaka for (exponent >>= 1 ; exponent > 0 ; exponent >>= 1) { 5737 1.1 nonaka BN_mul(power, power, power, NULL); 5738 1.1 nonaka if (exponent & 1) { 5739 1.1 nonaka BN_mul(temp, power, temp, NULL); 5740 1.1 nonaka } 5741 1.1 nonaka } 5742 1.1 nonaka BN_copy(res, temp); 5743 1.1 nonaka BN_free(power); 5744 1.1 nonaka BN_free(temp); 5745 1.1 nonaka } 5746 1.1 nonaka return 1; 5747 1.1 nonaka } 5748 1.1 nonaka 5749 1.1 nonaka /* compute the factorial */ 5750 1.1 nonaka int 5751 1.1 nonaka BN_factorial(BIGNUM *res, BIGNUM *f) 5752 1.1 nonaka { 5753 1.1 nonaka BIGNUM *one; 5754 1.1 nonaka BIGNUM *i; 5755 1.1 nonaka 5756 1.1 nonaka i = BN_dup(f); 5757 1.1 nonaka one = __UNCONST(BN_value_one()); 5758 1.1 nonaka BN_sub(i, i, one); 5759 1.1 nonaka BN_copy(res, f); 5760 1.1 nonaka while (BN_cmp(i, one) > 0) { 5761 1.1 nonaka BN_mul(res, res, i, NULL); 5762 1.1 nonaka BN_sub(i, i, one); 5763 1.1 nonaka } 5764 1.1 nonaka BN_free(i); 5765 1.1 nonaka return 1; 5766 1.1 nonaka } 5767 1.1 nonaka 5768 1.1 nonaka /* get greatest common divisor */ 5769 1.1 nonaka int 5770 1.1 nonaka BN_gcd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) 5771 1.1 nonaka { 5772 1.1 nonaka return mp_gcd(a, b, r); 5773 1.1 nonaka } 5774