Home | History | Annotate | Line # | Download | only in nvmectl
      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