bignum.c revision 1.3 1 1.3 mrg /* $NetBSD: bignum.c,v 1.3 2019/10/04 09:16:38 mrg 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.1 nonaka * trimed 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.1 nonaka /* compare maginitude 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.1 nonaka * For a given modulus "b" it calulates 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.1 nonaka * O(N**lg(3)) or O(N**1.584) work which is asymptopically 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.1 nonaka /* this is the number of times the loop will iterrate, 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.1 nonaka /* this is the number of times the loop will iterrate, 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.1 nonaka /* this is the number of times the loop will iterrate, 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.1 nonaka * by b**i is handled by offseting 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.1 nonaka * the leading bit of b. This saves alot 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.1 nonaka * embedded in the normal function but that wasted alot 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.1 nonaka /* if not, is it a 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.1 nonaka /* returns size of ASCII reprensentation */
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.1 nonaka * to the first digit [exluding 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.1 nonaka /* essentiually, 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