comparison nss/lib/freebl/mpi/mpi.c @ 0:1e5118fa0cb1

This is NSS with a Cmake Buildsyste To compile a static NSS library for Windows we've used the Chromium-NSS fork and added a Cmake buildsystem to compile it statically for Windows. See README.chromium for chromium changes and README.trustbridge for our modifications.
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 28 Jul 2014 10:47:06 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1e5118fa0cb1
1 /*
2 * mpi.c
3 *
4 * Arbitrary precision integer arithmetic library
5 *
6 * This Source Code Form is subject to the terms of the Mozilla Public
7 * License, v. 2.0. If a copy of the MPL was not distributed with this
8 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
9
10 #include "mpi-priv.h"
11 #if defined(OSF1)
12 #include <c_asm.h>
13 #endif
14
15 #if defined(__arm__) && \
16 ((defined(__thumb__) && !defined(__thumb2__)) || defined(__ARM_ARCH_3__))
17 /* 16-bit thumb or ARM v3 doesn't work inlined assember version */
18 #undef MP_ASSEMBLY_MULTIPLY
19 #undef MP_ASSEMBLY_SQUARE
20 #endif
21
22 #if MP_LOGTAB
23 /*
24 A table of the logs of 2 for various bases (the 0 and 1 entries of
25 this table are meaningless and should not be referenced).
26
27 This table is used to compute output lengths for the mp_toradix()
28 function. Since a number n in radix r takes up about log_r(n)
29 digits, we estimate the output size by taking the least integer
30 greater than log_r(n), where:
31
32 log_r(n) = log_2(n) * log_r(2)
33
34 This table, therefore, is a table of log_r(2) for 2 <= r <= 36,
35 which are the output bases supported.
36 */
37 #include "logtab.h"
38 #endif
39
40 /* {{{ Constant strings */
41
42 /* Constant strings returned by mp_strerror() */
43 static const char *mp_err_string[] = {
44 "unknown result code", /* say what? */
45 "boolean true", /* MP_OKAY, MP_YES */
46 "boolean false", /* MP_NO */
47 "out of memory", /* MP_MEM */
48 "argument out of range", /* MP_RANGE */
49 "invalid input parameter", /* MP_BADARG */
50 "result is undefined" /* MP_UNDEF */
51 };
52
53 /* Value to digit maps for radix conversion */
54
55 /* s_dmap_1 - standard digits and letters */
56 static const char *s_dmap_1 =
57 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
58
59 /* }}} */
60
61 unsigned long mp_allocs;
62 unsigned long mp_frees;
63 unsigned long mp_copies;
64
65 /* {{{ Default precision manipulation */
66
67 /* Default precision for newly created mp_int's */
68 static mp_size s_mp_defprec = MP_DEFPREC;
69
70 mp_size mp_get_prec(void)
71 {
72 return s_mp_defprec;
73
74 } /* end mp_get_prec() */
75
76 void mp_set_prec(mp_size prec)
77 {
78 if(prec == 0)
79 s_mp_defprec = MP_DEFPREC;
80 else
81 s_mp_defprec = prec;
82
83 } /* end mp_set_prec() */
84
85 /* }}} */
86
87 /*------------------------------------------------------------------------*/
88 /* {{{ mp_init(mp) */
89
90 /*
91 mp_init(mp)
92
93 Initialize a new zero-valued mp_int. Returns MP_OKAY if successful,
94 MP_MEM if memory could not be allocated for the structure.
95 */
96
97 mp_err mp_init(mp_int *mp)
98 {
99 return mp_init_size(mp, s_mp_defprec);
100
101 } /* end mp_init() */
102
103 /* }}} */
104
105 /* {{{ mp_init_size(mp, prec) */
106
107 /*
108 mp_init_size(mp, prec)
109
110 Initialize a new zero-valued mp_int with at least the given
111 precision; returns MP_OKAY if successful, or MP_MEM if memory could
112 not be allocated for the structure.
113 */
114
115 mp_err mp_init_size(mp_int *mp, mp_size prec)
116 {
117 ARGCHK(mp != NULL && prec > 0, MP_BADARG);
118
119 prec = MP_ROUNDUP(prec, s_mp_defprec);
120 if((DIGITS(mp) = s_mp_alloc(prec, sizeof(mp_digit))) == NULL)
121 return MP_MEM;
122
123 SIGN(mp) = ZPOS;
124 USED(mp) = 1;
125 ALLOC(mp) = prec;
126
127 return MP_OKAY;
128
129 } /* end mp_init_size() */
130
131 /* }}} */
132
133 /* {{{ mp_init_copy(mp, from) */
134
135 /*
136 mp_init_copy(mp, from)
137
138 Initialize mp as an exact copy of from. Returns MP_OKAY if
139 successful, MP_MEM if memory could not be allocated for the new
140 structure.
141 */
142
143 mp_err mp_init_copy(mp_int *mp, const mp_int *from)
144 {
145 ARGCHK(mp != NULL && from != NULL, MP_BADARG);
146
147 if(mp == from)
148 return MP_OKAY;
149
150 if((DIGITS(mp) = s_mp_alloc(ALLOC(from), sizeof(mp_digit))) == NULL)
151 return MP_MEM;
152
153 s_mp_copy(DIGITS(from), DIGITS(mp), USED(from));
154 USED(mp) = USED(from);
155 ALLOC(mp) = ALLOC(from);
156 SIGN(mp) = SIGN(from);
157
158 return MP_OKAY;
159
160 } /* end mp_init_copy() */
161
162 /* }}} */
163
164 /* {{{ mp_copy(from, to) */
165
166 /*
167 mp_copy(from, to)
168
169 Copies the mp_int 'from' to the mp_int 'to'. It is presumed that
170 'to' has already been initialized (if not, use mp_init_copy()
171 instead). If 'from' and 'to' are identical, nothing happens.
172 */
173
174 mp_err mp_copy(const mp_int *from, mp_int *to)
175 {
176 ARGCHK(from != NULL && to != NULL, MP_BADARG);
177
178 if(from == to)
179 return MP_OKAY;
180
181 { /* copy */
182 mp_digit *tmp;
183
184 /*
185 If the allocated buffer in 'to' already has enough space to hold
186 all the used digits of 'from', we'll re-use it to avoid hitting
187 the memory allocater more than necessary; otherwise, we'd have
188 to grow anyway, so we just allocate a hunk and make the copy as
189 usual
190 */
191 if(ALLOC(to) >= USED(from)) {
192 s_mp_setz(DIGITS(to) + USED(from), ALLOC(to) - USED(from));
193 s_mp_copy(DIGITS(from), DIGITS(to), USED(from));
194
195 } else {
196 if((tmp = s_mp_alloc(ALLOC(from), sizeof(mp_digit))) == NULL)
197 return MP_MEM;
198
199 s_mp_copy(DIGITS(from), tmp, USED(from));
200
201 if(DIGITS(to) != NULL) {
202 #if MP_CRYPTO
203 s_mp_setz(DIGITS(to), ALLOC(to));
204 #endif
205 s_mp_free(DIGITS(to));
206 }
207
208 DIGITS(to) = tmp;
209 ALLOC(to) = ALLOC(from);
210 }
211
212 /* Copy the precision and sign from the original */
213 USED(to) = USED(from);
214 SIGN(to) = SIGN(from);
215 } /* end copy */
216
217 return MP_OKAY;
218
219 } /* end mp_copy() */
220
221 /* }}} */
222
223 /* {{{ mp_exch(mp1, mp2) */
224
225 /*
226 mp_exch(mp1, mp2)
227
228 Exchange mp1 and mp2 without allocating any intermediate memory
229 (well, unless you count the stack space needed for this call and the
230 locals it creates...). This cannot fail.
231 */
232
233 void mp_exch(mp_int *mp1, mp_int *mp2)
234 {
235 #if MP_ARGCHK == 2
236 assert(mp1 != NULL && mp2 != NULL);
237 #else
238 if(mp1 == NULL || mp2 == NULL)
239 return;
240 #endif
241
242 s_mp_exch(mp1, mp2);
243
244 } /* end mp_exch() */
245
246 /* }}} */
247
248 /* {{{ mp_clear(mp) */
249
250 /*
251 mp_clear(mp)
252
253 Release the storage used by an mp_int, and void its fields so that
254 if someone calls mp_clear() again for the same int later, we won't
255 get tollchocked.
256 */
257
258 void mp_clear(mp_int *mp)
259 {
260 if(mp == NULL)
261 return;
262
263 if(DIGITS(mp) != NULL) {
264 #if MP_CRYPTO
265 s_mp_setz(DIGITS(mp), ALLOC(mp));
266 #endif
267 s_mp_free(DIGITS(mp));
268 DIGITS(mp) = NULL;
269 }
270
271 USED(mp) = 0;
272 ALLOC(mp) = 0;
273
274 } /* end mp_clear() */
275
276 /* }}} */
277
278 /* {{{ mp_zero(mp) */
279
280 /*
281 mp_zero(mp)
282
283 Set mp to zero. Does not change the allocated size of the structure,
284 and therefore cannot fail (except on a bad argument, which we ignore)
285 */
286 void mp_zero(mp_int *mp)
287 {
288 if(mp == NULL)
289 return;
290
291 s_mp_setz(DIGITS(mp), ALLOC(mp));
292 USED(mp) = 1;
293 SIGN(mp) = ZPOS;
294
295 } /* end mp_zero() */
296
297 /* }}} */
298
299 /* {{{ mp_set(mp, d) */
300
301 void mp_set(mp_int *mp, mp_digit d)
302 {
303 if(mp == NULL)
304 return;
305
306 mp_zero(mp);
307 DIGIT(mp, 0) = d;
308
309 } /* end mp_set() */
310
311 /* }}} */
312
313 /* {{{ mp_set_int(mp, z) */
314
315 mp_err mp_set_int(mp_int *mp, long z)
316 {
317 int ix;
318 unsigned long v = labs(z);
319 mp_err res;
320
321 ARGCHK(mp != NULL, MP_BADARG);
322
323 mp_zero(mp);
324 if(z == 0)
325 return MP_OKAY; /* shortcut for zero */
326
327 if (sizeof v <= sizeof(mp_digit)) {
328 DIGIT(mp,0) = v;
329 } else {
330 for (ix = sizeof(long) - 1; ix >= 0; ix--) {
331 if ((res = s_mp_mul_d(mp, (UCHAR_MAX + 1))) != MP_OKAY)
332 return res;
333
334 res = s_mp_add_d(mp, (mp_digit)((v >> (ix * CHAR_BIT)) & UCHAR_MAX));
335 if (res != MP_OKAY)
336 return res;
337 }
338 }
339 if(z < 0)
340 SIGN(mp) = NEG;
341
342 return MP_OKAY;
343
344 } /* end mp_set_int() */
345
346 /* }}} */
347
348 /* {{{ mp_set_ulong(mp, z) */
349
350 mp_err mp_set_ulong(mp_int *mp, unsigned long z)
351 {
352 int ix;
353 mp_err res;
354
355 ARGCHK(mp != NULL, MP_BADARG);
356
357 mp_zero(mp);
358 if(z == 0)
359 return MP_OKAY; /* shortcut for zero */
360
361 if (sizeof z <= sizeof(mp_digit)) {
362 DIGIT(mp,0) = z;
363 } else {
364 for (ix = sizeof(long) - 1; ix >= 0; ix--) {
365 if ((res = s_mp_mul_d(mp, (UCHAR_MAX + 1))) != MP_OKAY)
366 return res;
367
368 res = s_mp_add_d(mp, (mp_digit)((z >> (ix * CHAR_BIT)) & UCHAR_MAX));
369 if (res != MP_OKAY)
370 return res;
371 }
372 }
373 return MP_OKAY;
374 } /* end mp_set_ulong() */
375
376 /* }}} */
377
378 /*------------------------------------------------------------------------*/
379 /* {{{ Digit arithmetic */
380
381 /* {{{ mp_add_d(a, d, b) */
382
383 /*
384 mp_add_d(a, d, b)
385
386 Compute the sum b = a + d, for a single digit d. Respects the sign of
387 its primary addend (single digits are unsigned anyway).
388 */
389
390 mp_err mp_add_d(const mp_int *a, mp_digit d, mp_int *b)
391 {
392 mp_int tmp;
393 mp_err res;
394
395 ARGCHK(a != NULL && b != NULL, MP_BADARG);
396
397 if((res = mp_init_copy(&tmp, a)) != MP_OKAY)
398 return res;
399
400 if(SIGN(&tmp) == ZPOS) {
401 if((res = s_mp_add_d(&tmp, d)) != MP_OKAY)
402 goto CLEANUP;
403 } else if(s_mp_cmp_d(&tmp, d) >= 0) {
404 if((res = s_mp_sub_d(&tmp, d)) != MP_OKAY)
405 goto CLEANUP;
406 } else {
407 mp_neg(&tmp, &tmp);
408
409 DIGIT(&tmp, 0) = d - DIGIT(&tmp, 0);
410 }
411
412 if(s_mp_cmp_d(&tmp, 0) == 0)
413 SIGN(&tmp) = ZPOS;
414
415 s_mp_exch(&tmp, b);
416
417 CLEANUP:
418 mp_clear(&tmp);
419 return res;
420
421 } /* end mp_add_d() */
422
423 /* }}} */
424
425 /* {{{ mp_sub_d(a, d, b) */
426
427 /*
428 mp_sub_d(a, d, b)
429
430 Compute the difference b = a - d, for a single digit d. Respects the
431 sign of its subtrahend (single digits are unsigned anyway).
432 */
433
434 mp_err mp_sub_d(const mp_int *a, mp_digit d, mp_int *b)
435 {
436 mp_int tmp;
437 mp_err res;
438
439 ARGCHK(a != NULL && b != NULL, MP_BADARG);
440
441 if((res = mp_init_copy(&tmp, a)) != MP_OKAY)
442 return res;
443
444 if(SIGN(&tmp) == NEG) {
445 if((res = s_mp_add_d(&tmp, d)) != MP_OKAY)
446 goto CLEANUP;
447 } else if(s_mp_cmp_d(&tmp, d) >= 0) {
448 if((res = s_mp_sub_d(&tmp, d)) != MP_OKAY)
449 goto CLEANUP;
450 } else {
451 mp_neg(&tmp, &tmp);
452
453 DIGIT(&tmp, 0) = d - DIGIT(&tmp, 0);
454 SIGN(&tmp) = NEG;
455 }
456
457 if(s_mp_cmp_d(&tmp, 0) == 0)
458 SIGN(&tmp) = ZPOS;
459
460 s_mp_exch(&tmp, b);
461
462 CLEANUP:
463 mp_clear(&tmp);
464 return res;
465
466 } /* end mp_sub_d() */
467
468 /* }}} */
469
470 /* {{{ mp_mul_d(a, d, b) */
471
472 /*
473 mp_mul_d(a, d, b)
474
475 Compute the product b = a * d, for a single digit d. Respects the sign
476 of its multiplicand (single digits are unsigned anyway)
477 */
478
479 mp_err mp_mul_d(const mp_int *a, mp_digit d, mp_int *b)
480 {
481 mp_err res;
482
483 ARGCHK(a != NULL && b != NULL, MP_BADARG);
484
485 if(d == 0) {
486 mp_zero(b);
487 return MP_OKAY;
488 }
489
490 if((res = mp_copy(a, b)) != MP_OKAY)
491 return res;
492
493 res = s_mp_mul_d(b, d);
494
495 return res;
496
497 } /* end mp_mul_d() */
498
499 /* }}} */
500
501 /* {{{ mp_mul_2(a, c) */
502
503 mp_err mp_mul_2(const mp_int *a, mp_int *c)
504 {
505 mp_err res;
506
507 ARGCHK(a != NULL && c != NULL, MP_BADARG);
508
509 if((res = mp_copy(a, c)) != MP_OKAY)
510 return res;
511
512 return s_mp_mul_2(c);
513
514 } /* end mp_mul_2() */
515
516 /* }}} */
517
518 /* {{{ mp_div_d(a, d, q, r) */
519
520 /*
521 mp_div_d(a, d, q, r)
522
523 Compute the quotient q = a / d and remainder r = a mod d, for a
524 single digit d. Respects the sign of its divisor (single digits are
525 unsigned anyway).
526 */
527
528 mp_err mp_div_d(const mp_int *a, mp_digit d, mp_int *q, mp_digit *r)
529 {
530 mp_err res;
531 mp_int qp;
532 mp_digit rem;
533 int pow;
534
535 ARGCHK(a != NULL, MP_BADARG);
536
537 if(d == 0)
538 return MP_RANGE;
539
540 /* Shortcut for powers of two ... */
541 if((pow = s_mp_ispow2d(d)) >= 0) {
542 mp_digit mask;
543
544 mask = ((mp_digit)1 << pow) - 1;
545 rem = DIGIT(a, 0) & mask;
546
547 if(q) {
548 mp_copy(a, q);
549 s_mp_div_2d(q, pow);
550 }
551
552 if(r)
553 *r = rem;
554
555 return MP_OKAY;
556 }
557
558 if((res = mp_init_copy(&qp, a)) != MP_OKAY)
559 return res;
560
561 res = s_mp_div_d(&qp, d, &rem);
562
563 if(s_mp_cmp_d(&qp, 0) == 0)
564 SIGN(q) = ZPOS;
565
566 if(r)
567 *r = rem;
568
569 if(q)
570 s_mp_exch(&qp, q);
571
572 mp_clear(&qp);
573 return res;
574
575 } /* end mp_div_d() */
576
577 /* }}} */
578
579 /* {{{ mp_div_2(a, c) */
580
581 /*
582 mp_div_2(a, c)
583
584 Compute c = a / 2, disregarding the remainder.
585 */
586
587 mp_err mp_div_2(const mp_int *a, mp_int *c)
588 {
589 mp_err res;
590
591 ARGCHK(a != NULL && c != NULL, MP_BADARG);
592
593 if((res = mp_copy(a, c)) != MP_OKAY)
594 return res;
595
596 s_mp_div_2(c);
597
598 return MP_OKAY;
599
600 } /* end mp_div_2() */
601
602 /* }}} */
603
604 /* {{{ mp_expt_d(a, d, b) */
605
606 mp_err mp_expt_d(const mp_int *a, mp_digit d, mp_int *c)
607 {
608 mp_int s, x;
609 mp_err res;
610
611 ARGCHK(a != NULL && c != NULL, MP_BADARG);
612
613 if((res = mp_init(&s)) != MP_OKAY)
614 return res;
615 if((res = mp_init_copy(&x, a)) != MP_OKAY)
616 goto X;
617
618 DIGIT(&s, 0) = 1;
619
620 while(d != 0) {
621 if(d & 1) {
622 if((res = s_mp_mul(&s, &x)) != MP_OKAY)
623 goto CLEANUP;
624 }
625
626 d /= 2;
627
628 if((res = s_mp_sqr(&x)) != MP_OKAY)
629 goto CLEANUP;
630 }
631
632 s_mp_exch(&s, c);
633
634 CLEANUP:
635 mp_clear(&x);
636 X:
637 mp_clear(&s);
638
639 return res;
640
641 } /* end mp_expt_d() */
642
643 /* }}} */
644
645 /* }}} */
646
647 /*------------------------------------------------------------------------*/
648 /* {{{ Full arithmetic */
649
650 /* {{{ mp_abs(a, b) */
651
652 /*
653 mp_abs(a, b)
654
655 Compute b = |a|. 'a' and 'b' may be identical.
656 */
657
658 mp_err mp_abs(const mp_int *a, mp_int *b)
659 {
660 mp_err res;
661
662 ARGCHK(a != NULL && b != NULL, MP_BADARG);
663
664 if((res = mp_copy(a, b)) != MP_OKAY)
665 return res;
666
667 SIGN(b) = ZPOS;
668
669 return MP_OKAY;
670
671 } /* end mp_abs() */
672
673 /* }}} */
674
675 /* {{{ mp_neg(a, b) */
676
677 /*
678 mp_neg(a, b)
679
680 Compute b = -a. 'a' and 'b' may be identical.
681 */
682
683 mp_err mp_neg(const mp_int *a, mp_int *b)
684 {
685 mp_err res;
686
687 ARGCHK(a != NULL && b != NULL, MP_BADARG);
688
689 if((res = mp_copy(a, b)) != MP_OKAY)
690 return res;
691
692 if(s_mp_cmp_d(b, 0) == MP_EQ)
693 SIGN(b) = ZPOS;
694 else
695 SIGN(b) = (SIGN(b) == NEG) ? ZPOS : NEG;
696
697 return MP_OKAY;
698
699 } /* end mp_neg() */
700
701 /* }}} */
702
703 /* {{{ mp_add(a, b, c) */
704
705 /*
706 mp_add(a, b, c)
707
708 Compute c = a + b. All parameters may be identical.
709 */
710
711 mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c)
712 {
713 mp_err res;
714
715 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
716
717 if(SIGN(a) == SIGN(b)) { /* same sign: add values, keep sign */
718 MP_CHECKOK( s_mp_add_3arg(a, b, c) );
719 } else if(s_mp_cmp(a, b) >= 0) { /* different sign: |a| >= |b| */
720 MP_CHECKOK( s_mp_sub_3arg(a, b, c) );
721 } else { /* different sign: |a| < |b| */
722 MP_CHECKOK( s_mp_sub_3arg(b, a, c) );
723 }
724
725 if (s_mp_cmp_d(c, 0) == MP_EQ)
726 SIGN(c) = ZPOS;
727
728 CLEANUP:
729 return res;
730
731 } /* end mp_add() */
732
733 /* }}} */
734
735 /* {{{ mp_sub(a, b, c) */
736
737 /*
738 mp_sub(a, b, c)
739
740 Compute c = a - b. All parameters may be identical.
741 */
742
743 mp_err mp_sub(const mp_int *a, const mp_int *b, mp_int *c)
744 {
745 mp_err res;
746 int magDiff;
747
748 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
749
750 if (a == b) {
751 mp_zero(c);
752 return MP_OKAY;
753 }
754
755 if (MP_SIGN(a) != MP_SIGN(b)) {
756 MP_CHECKOK( s_mp_add_3arg(a, b, c) );
757 } else if (!(magDiff = s_mp_cmp(a, b))) {
758 mp_zero(c);
759 res = MP_OKAY;
760 } else if (magDiff > 0) {
761 MP_CHECKOK( s_mp_sub_3arg(a, b, c) );
762 } else {
763 MP_CHECKOK( s_mp_sub_3arg(b, a, c) );
764 MP_SIGN(c) = !MP_SIGN(a);
765 }
766
767 if (s_mp_cmp_d(c, 0) == MP_EQ)
768 MP_SIGN(c) = MP_ZPOS;
769
770 CLEANUP:
771 return res;
772
773 } /* end mp_sub() */
774
775 /* }}} */
776
777 /* {{{ mp_mul(a, b, c) */
778
779 /*
780 mp_mul(a, b, c)
781
782 Compute c = a * b. All parameters may be identical.
783 */
784 mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int * c)
785 {
786 mp_digit *pb;
787 mp_int tmp;
788 mp_err res;
789 mp_size ib;
790 mp_size useda, usedb;
791
792 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
793
794 if (a == c) {
795 if ((res = mp_init_copy(&tmp, a)) != MP_OKAY)
796 return res;
797 if (a == b)
798 b = &tmp;
799 a = &tmp;
800 } else if (b == c) {
801 if ((res = mp_init_copy(&tmp, b)) != MP_OKAY)
802 return res;
803 b = &tmp;
804 } else {
805 MP_DIGITS(&tmp) = 0;
806 }
807
808 if (MP_USED(a) < MP_USED(b)) {
809 const mp_int *xch = b; /* switch a and b, to do fewer outer loops */
810 b = a;
811 a = xch;
812 }
813
814 MP_USED(c) = 1; MP_DIGIT(c, 0) = 0;
815 if((res = s_mp_pad(c, USED(a) + USED(b))) != MP_OKAY)
816 goto CLEANUP;
817
818 #ifdef NSS_USE_COMBA
819 if ((MP_USED(a) == MP_USED(b)) && IS_POWER_OF_2(MP_USED(b))) {
820 if (MP_USED(a) == 4) {
821 s_mp_mul_comba_4(a, b, c);
822 goto CLEANUP;
823 }
824 if (MP_USED(a) == 8) {
825 s_mp_mul_comba_8(a, b, c);
826 goto CLEANUP;
827 }
828 if (MP_USED(a) == 16) {
829 s_mp_mul_comba_16(a, b, c);
830 goto CLEANUP;
831 }
832 if (MP_USED(a) == 32) {
833 s_mp_mul_comba_32(a, b, c);
834 goto CLEANUP;
835 }
836 }
837 #endif
838
839 pb = MP_DIGITS(b);
840 s_mpv_mul_d(MP_DIGITS(a), MP_USED(a), *pb++, MP_DIGITS(c));
841
842 /* Outer loop: Digits of b */
843 useda = MP_USED(a);
844 usedb = MP_USED(b);
845 for (ib = 1; ib < usedb; ib++) {
846 mp_digit b_i = *pb++;
847
848 /* Inner product: Digits of a */
849 if (b_i)
850 s_mpv_mul_d_add(MP_DIGITS(a), useda, b_i, MP_DIGITS(c) + ib);
851 else
852 MP_DIGIT(c, ib + useda) = b_i;
853 }
854
855 s_mp_clamp(c);
856
857 if(SIGN(a) == SIGN(b) || s_mp_cmp_d(c, 0) == MP_EQ)
858 SIGN(c) = ZPOS;
859 else
860 SIGN(c) = NEG;
861
862 CLEANUP:
863 mp_clear(&tmp);
864 return res;
865 } /* end mp_mul() */
866
867 /* }}} */
868
869 /* {{{ mp_sqr(a, sqr) */
870
871 #if MP_SQUARE
872 /*
873 Computes the square of a. This can be done more
874 efficiently than a general multiplication, because many of the
875 computation steps are redundant when squaring. The inner product
876 step is a bit more complicated, but we save a fair number of
877 iterations of the multiplication loop.
878 */
879
880 /* sqr = a^2; Caller provides both a and tmp; */
881 mp_err mp_sqr(const mp_int *a, mp_int *sqr)
882 {
883 mp_digit *pa;
884 mp_digit d;
885 mp_err res;
886 mp_size ix;
887 mp_int tmp;
888 int count;
889
890 ARGCHK(a != NULL && sqr != NULL, MP_BADARG);
891
892 if (a == sqr) {
893 if((res = mp_init_copy(&tmp, a)) != MP_OKAY)
894 return res;
895 a = &tmp;
896 } else {
897 DIGITS(&tmp) = 0;
898 res = MP_OKAY;
899 }
900
901 ix = 2 * MP_USED(a);
902 if (ix > MP_ALLOC(sqr)) {
903 MP_USED(sqr) = 1;
904 MP_CHECKOK( s_mp_grow(sqr, ix) );
905 }
906 MP_USED(sqr) = ix;
907 MP_DIGIT(sqr, 0) = 0;
908
909 #ifdef NSS_USE_COMBA
910 if (IS_POWER_OF_2(MP_USED(a))) {
911 if (MP_USED(a) == 4) {
912 s_mp_sqr_comba_4(a, sqr);
913 goto CLEANUP;
914 }
915 if (MP_USED(a) == 8) {
916 s_mp_sqr_comba_8(a, sqr);
917 goto CLEANUP;
918 }
919 if (MP_USED(a) == 16) {
920 s_mp_sqr_comba_16(a, sqr);
921 goto CLEANUP;
922 }
923 if (MP_USED(a) == 32) {
924 s_mp_sqr_comba_32(a, sqr);
925 goto CLEANUP;
926 }
927 }
928 #endif
929
930 pa = MP_DIGITS(a);
931 count = MP_USED(a) - 1;
932 if (count > 0) {
933 d = *pa++;
934 s_mpv_mul_d(pa, count, d, MP_DIGITS(sqr) + 1);
935 for (ix = 3; --count > 0; ix += 2) {
936 d = *pa++;
937 s_mpv_mul_d_add(pa, count, d, MP_DIGITS(sqr) + ix);
938 } /* for(ix ...) */
939 MP_DIGIT(sqr, MP_USED(sqr)-1) = 0; /* above loop stopped short of this. */
940
941 /* now sqr *= 2 */
942 s_mp_mul_2(sqr);
943 } else {
944 MP_DIGIT(sqr, 1) = 0;
945 }
946
947 /* now add the squares of the digits of a to sqr. */
948 s_mpv_sqr_add_prop(MP_DIGITS(a), MP_USED(a), MP_DIGITS(sqr));
949
950 SIGN(sqr) = ZPOS;
951 s_mp_clamp(sqr);
952
953 CLEANUP:
954 mp_clear(&tmp);
955 return res;
956
957 } /* end mp_sqr() */
958 #endif
959
960 /* }}} */
961
962 /* {{{ mp_div(a, b, q, r) */
963
964 /*
965 mp_div(a, b, q, r)
966
967 Compute q = a / b and r = a mod b. Input parameters may be re-used
968 as output parameters. If q or r is NULL, that portion of the
969 computation will be discarded (although it will still be computed)
970 */
971 mp_err mp_div(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r)
972 {
973 mp_err res;
974 mp_int *pQ, *pR;
975 mp_int qtmp, rtmp, btmp;
976 int cmp;
977 mp_sign signA;
978 mp_sign signB;
979
980 ARGCHK(a != NULL && b != NULL, MP_BADARG);
981
982 signA = MP_SIGN(a);
983 signB = MP_SIGN(b);
984
985 if(mp_cmp_z(b) == MP_EQ)
986 return MP_RANGE;
987
988 DIGITS(&qtmp) = 0;
989 DIGITS(&rtmp) = 0;
990 DIGITS(&btmp) = 0;
991
992 /* Set up some temporaries... */
993 if (!r || r == a || r == b) {
994 MP_CHECKOK( mp_init_copy(&rtmp, a) );
995 pR = &rtmp;
996 } else {
997 MP_CHECKOK( mp_copy(a, r) );
998 pR = r;
999 }
1000
1001 if (!q || q == a || q == b) {
1002 MP_CHECKOK( mp_init_size(&qtmp, MP_USED(a)) );
1003 pQ = &qtmp;
1004 } else {
1005 MP_CHECKOK( s_mp_pad(q, MP_USED(a)) );
1006 pQ = q;
1007 mp_zero(pQ);
1008 }
1009
1010 /*
1011 If |a| <= |b|, we can compute the solution without division;
1012 otherwise, we actually do the work required.
1013 */
1014 if ((cmp = s_mp_cmp(a, b)) <= 0) {
1015 if (cmp) {
1016 /* r was set to a above. */
1017 mp_zero(pQ);
1018 } else {
1019 mp_set(pQ, 1);
1020 mp_zero(pR);
1021 }
1022 } else {
1023 MP_CHECKOK( mp_init_copy(&btmp, b) );
1024 MP_CHECKOK( s_mp_div(pR, &btmp, pQ) );
1025 }
1026
1027 /* Compute the signs for the output */
1028 MP_SIGN(pR) = signA; /* Sr = Sa */
1029 /* Sq = ZPOS if Sa == Sb */ /* Sq = NEG if Sa != Sb */
1030 MP_SIGN(pQ) = (signA == signB) ? ZPOS : NEG;
1031
1032 if(s_mp_cmp_d(pQ, 0) == MP_EQ)
1033 SIGN(pQ) = ZPOS;
1034 if(s_mp_cmp_d(pR, 0) == MP_EQ)
1035 SIGN(pR) = ZPOS;
1036
1037 /* Copy output, if it is needed */
1038 if(q && q != pQ)
1039 s_mp_exch(pQ, q);
1040
1041 if(r && r != pR)
1042 s_mp_exch(pR, r);
1043
1044 CLEANUP:
1045 mp_clear(&btmp);
1046 mp_clear(&rtmp);
1047 mp_clear(&qtmp);
1048
1049 return res;
1050
1051 } /* end mp_div() */
1052
1053 /* }}} */
1054
1055 /* {{{ mp_div_2d(a, d, q, r) */
1056
1057 mp_err mp_div_2d(const mp_int *a, mp_digit d, mp_int *q, mp_int *r)
1058 {
1059 mp_err res;
1060
1061 ARGCHK(a != NULL, MP_BADARG);
1062
1063 if(q) {
1064 if((res = mp_copy(a, q)) != MP_OKAY)
1065 return res;
1066 }
1067 if(r) {
1068 if((res = mp_copy(a, r)) != MP_OKAY)
1069 return res;
1070 }
1071 if(q) {
1072 s_mp_div_2d(q, d);
1073 }
1074 if(r) {
1075 s_mp_mod_2d(r, d);
1076 }
1077
1078 return MP_OKAY;
1079
1080 } /* end mp_div_2d() */
1081
1082 /* }}} */
1083
1084 /* {{{ mp_expt(a, b, c) */
1085
1086 /*
1087 mp_expt(a, b, c)
1088
1089 Compute c = a ** b, that is, raise a to the b power. Uses a
1090 standard iterative square-and-multiply technique.
1091 */
1092
1093 mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c)
1094 {
1095 mp_int s, x;
1096 mp_err res;
1097 mp_digit d;
1098 int dig, bit;
1099
1100 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
1101
1102 if(mp_cmp_z(b) < 0)
1103 return MP_RANGE;
1104
1105 if((res = mp_init(&s)) != MP_OKAY)
1106 return res;
1107
1108 mp_set(&s, 1);
1109
1110 if((res = mp_init_copy(&x, a)) != MP_OKAY)
1111 goto X;
1112
1113 /* Loop over low-order digits in ascending order */
1114 for(dig = 0; dig < (USED(b) - 1); dig++) {
1115 d = DIGIT(b, dig);
1116
1117 /* Loop over bits of each non-maximal digit */
1118 for(bit = 0; bit < DIGIT_BIT; bit++) {
1119 if(d & 1) {
1120 if((res = s_mp_mul(&s, &x)) != MP_OKAY)
1121 goto CLEANUP;
1122 }
1123
1124 d >>= 1;
1125
1126 if((res = s_mp_sqr(&x)) != MP_OKAY)
1127 goto CLEANUP;
1128 }
1129 }
1130
1131 /* Consider now the last digit... */
1132 d = DIGIT(b, dig);
1133
1134 while(d) {
1135 if(d & 1) {
1136 if((res = s_mp_mul(&s, &x)) != MP_OKAY)
1137 goto CLEANUP;
1138 }
1139
1140 d >>= 1;
1141
1142 if((res = s_mp_sqr(&x)) != MP_OKAY)
1143 goto CLEANUP;
1144 }
1145
1146 if(mp_iseven(b))
1147 SIGN(&s) = SIGN(a);
1148
1149 res = mp_copy(&s, c);
1150
1151 CLEANUP:
1152 mp_clear(&x);
1153 X:
1154 mp_clear(&s);
1155
1156 return res;
1157
1158 } /* end mp_expt() */
1159
1160 /* }}} */
1161
1162 /* {{{ mp_2expt(a, k) */
1163
1164 /* Compute a = 2^k */
1165
1166 mp_err mp_2expt(mp_int *a, mp_digit k)
1167 {
1168 ARGCHK(a != NULL, MP_BADARG);
1169
1170 return s_mp_2expt(a, k);
1171
1172 } /* end mp_2expt() */
1173
1174 /* }}} */
1175
1176 /* {{{ mp_mod(a, m, c) */
1177
1178 /*
1179 mp_mod(a, m, c)
1180
1181 Compute c = a (mod m). Result will always be 0 <= c < m.
1182 */
1183
1184 mp_err mp_mod(const mp_int *a, const mp_int *m, mp_int *c)
1185 {
1186 mp_err res;
1187 int mag;
1188
1189 ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG);
1190
1191 if(SIGN(m) == NEG)
1192 return MP_RANGE;
1193
1194 /*
1195 If |a| > m, we need to divide to get the remainder and take the
1196 absolute value.
1197
1198 If |a| < m, we don't need to do any division, just copy and adjust
1199 the sign (if a is negative).
1200
1201 If |a| == m, we can simply set the result to zero.
1202
1203 This order is intended to minimize the average path length of the
1204 comparison chain on common workloads -- the most frequent cases are
1205 that |a| != m, so we do those first.
1206 */
1207 if((mag = s_mp_cmp(a, m)) > 0) {
1208 if((res = mp_div(a, m, NULL, c)) != MP_OKAY)
1209 return res;
1210
1211 if(SIGN(c) == NEG) {
1212 if((res = mp_add(c, m, c)) != MP_OKAY)
1213 return res;
1214 }
1215
1216 } else if(mag < 0) {
1217 if((res = mp_copy(a, c)) != MP_OKAY)
1218 return res;
1219
1220 if(mp_cmp_z(a) < 0) {
1221 if((res = mp_add(c, m, c)) != MP_OKAY)
1222 return res;
1223
1224 }
1225
1226 } else {
1227 mp_zero(c);
1228
1229 }
1230
1231 return MP_OKAY;
1232
1233 } /* end mp_mod() */
1234
1235 /* }}} */
1236
1237 /* {{{ mp_mod_d(a, d, c) */
1238
1239 /*
1240 mp_mod_d(a, d, c)
1241
1242 Compute c = a (mod d). Result will always be 0 <= c < d
1243 */
1244 mp_err mp_mod_d(const mp_int *a, mp_digit d, mp_digit *c)
1245 {
1246 mp_err res;
1247 mp_digit rem;
1248
1249 ARGCHK(a != NULL && c != NULL, MP_BADARG);
1250
1251 if(s_mp_cmp_d(a, d) > 0) {
1252 if((res = mp_div_d(a, d, NULL, &rem)) != MP_OKAY)
1253 return res;
1254
1255 } else {
1256 if(SIGN(a) == NEG)
1257 rem = d - DIGIT(a, 0);
1258 else
1259 rem = DIGIT(a, 0);
1260 }
1261
1262 if(c)
1263 *c = rem;
1264
1265 return MP_OKAY;
1266
1267 } /* end mp_mod_d() */
1268
1269 /* }}} */
1270
1271 /* {{{ mp_sqrt(a, b) */
1272
1273 /*
1274 mp_sqrt(a, b)
1275
1276 Compute the integer square root of a, and store the result in b.
1277 Uses an integer-arithmetic version of Newton's iterative linear
1278 approximation technique to determine this value; the result has the
1279 following two properties:
1280
1281 b^2 <= a
1282 (b+1)^2 >= a
1283
1284 It is a range error to pass a negative value.
1285 */
1286 mp_err mp_sqrt(const mp_int *a, mp_int *b)
1287 {
1288 mp_int x, t;
1289 mp_err res;
1290 mp_size used;
1291
1292 ARGCHK(a != NULL && b != NULL, MP_BADARG);
1293
1294 /* Cannot take square root of a negative value */
1295 if(SIGN(a) == NEG)
1296 return MP_RANGE;
1297
1298 /* Special cases for zero and one, trivial */
1299 if(mp_cmp_d(a, 1) <= 0)
1300 return mp_copy(a, b);
1301
1302 /* Initialize the temporaries we'll use below */
1303 if((res = mp_init_size(&t, USED(a))) != MP_OKAY)
1304 return res;
1305
1306 /* Compute an initial guess for the iteration as a itself */
1307 if((res = mp_init_copy(&x, a)) != MP_OKAY)
1308 goto X;
1309
1310 used = MP_USED(&x);
1311 if (used > 1) {
1312 s_mp_rshd(&x, used / 2);
1313 }
1314
1315 for(;;) {
1316 /* t = (x * x) - a */
1317 mp_copy(&x, &t); /* can't fail, t is big enough for original x */
1318 if((res = mp_sqr(&t, &t)) != MP_OKAY ||
1319 (res = mp_sub(&t, a, &t)) != MP_OKAY)
1320 goto CLEANUP;
1321
1322 /* t = t / 2x */
1323 s_mp_mul_2(&x);
1324 if((res = mp_div(&t, &x, &t, NULL)) != MP_OKAY)
1325 goto CLEANUP;
1326 s_mp_div_2(&x);
1327
1328 /* Terminate the loop, if the quotient is zero */
1329 if(mp_cmp_z(&t) == MP_EQ)
1330 break;
1331
1332 /* x = x - t */
1333 if((res = mp_sub(&x, &t, &x)) != MP_OKAY)
1334 goto CLEANUP;
1335
1336 }
1337
1338 /* Copy result to output parameter */
1339 mp_sub_d(&x, 1, &x);
1340 s_mp_exch(&x, b);
1341
1342 CLEANUP:
1343 mp_clear(&x);
1344 X:
1345 mp_clear(&t);
1346
1347 return res;
1348
1349 } /* end mp_sqrt() */
1350
1351 /* }}} */
1352
1353 /* }}} */
1354
1355 /*------------------------------------------------------------------------*/
1356 /* {{{ Modular arithmetic */
1357
1358 #if MP_MODARITH
1359 /* {{{ mp_addmod(a, b, m, c) */
1360
1361 /*
1362 mp_addmod(a, b, m, c)
1363
1364 Compute c = (a + b) mod m
1365 */
1366
1367 mp_err mp_addmod(const mp_int *a, const mp_int *b, const mp_int *m, mp_int *c)
1368 {
1369 mp_err res;
1370
1371 ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG);
1372
1373 if((res = mp_add(a, b, c)) != MP_OKAY)
1374 return res;
1375 if((res = mp_mod(c, m, c)) != MP_OKAY)
1376 return res;
1377
1378 return MP_OKAY;
1379
1380 }
1381
1382 /* }}} */
1383
1384 /* {{{ mp_submod(a, b, m, c) */
1385
1386 /*
1387 mp_submod(a, b, m, c)
1388
1389 Compute c = (a - b) mod m
1390 */
1391
1392 mp_err mp_submod(const mp_int *a, const mp_int *b, const mp_int *m, mp_int *c)
1393 {
1394 mp_err res;
1395
1396 ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG);
1397
1398 if((res = mp_sub(a, b, c)) != MP_OKAY)
1399 return res;
1400 if((res = mp_mod(c, m, c)) != MP_OKAY)
1401 return res;
1402
1403 return MP_OKAY;
1404
1405 }
1406
1407 /* }}} */
1408
1409 /* {{{ mp_mulmod(a, b, m, c) */
1410
1411 /*
1412 mp_mulmod(a, b, m, c)
1413
1414 Compute c = (a * b) mod m
1415 */
1416
1417 mp_err mp_mulmod(const mp_int *a, const mp_int *b, const mp_int *m, mp_int *c)
1418 {
1419 mp_err res;
1420
1421 ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG);
1422
1423 if((res = mp_mul(a, b, c)) != MP_OKAY)
1424 return res;
1425 if((res = mp_mod(c, m, c)) != MP_OKAY)
1426 return res;
1427
1428 return MP_OKAY;
1429
1430 }
1431
1432 /* }}} */
1433
1434 /* {{{ mp_sqrmod(a, m, c) */
1435
1436 #if MP_SQUARE
1437 mp_err mp_sqrmod(const mp_int *a, const mp_int *m, mp_int *c)
1438 {
1439 mp_err res;
1440
1441 ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG);
1442
1443 if((res = mp_sqr(a, c)) != MP_OKAY)
1444 return res;
1445 if((res = mp_mod(c, m, c)) != MP_OKAY)
1446 return res;
1447
1448 return MP_OKAY;
1449
1450 } /* end mp_sqrmod() */
1451 #endif
1452
1453 /* }}} */
1454
1455 /* {{{ s_mp_exptmod(a, b, m, c) */
1456
1457 /*
1458 s_mp_exptmod(a, b, m, c)
1459
1460 Compute c = (a ** b) mod m. Uses a standard square-and-multiply
1461 method with modular reductions at each step. (This is basically the
1462 same code as mp_expt(), except for the addition of the reductions)
1463
1464 The modular reductions are done using Barrett's algorithm (see
1465 s_mp_reduce() below for details)
1466 */
1467
1468 mp_err s_mp_exptmod(const mp_int *a, const mp_int *b, const mp_int *m, mp_int *c)
1469 {
1470 mp_int s, x, mu;
1471 mp_err res;
1472 mp_digit d;
1473 int dig, bit;
1474
1475 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
1476
1477 if(mp_cmp_z(b) < 0 || mp_cmp_z(m) <= 0)
1478 return MP_RANGE;
1479
1480 if((res = mp_init(&s)) != MP_OKAY)
1481 return res;
1482 if((res = mp_init_copy(&x, a)) != MP_OKAY ||
1483 (res = mp_mod(&x, m, &x)) != MP_OKAY)
1484 goto X;
1485 if((res = mp_init(&mu)) != MP_OKAY)
1486 goto MU;
1487
1488 mp_set(&s, 1);
1489
1490 /* mu = b^2k / m */
1491 s_mp_add_d(&mu, 1);
1492 s_mp_lshd(&mu, 2 * USED(m));
1493 if((res = mp_div(&mu, m, &mu, NULL)) != MP_OKAY)
1494 goto CLEANUP;
1495
1496 /* Loop over digits of b in ascending order, except highest order */
1497 for(dig = 0; dig < (USED(b) - 1); dig++) {
1498 d = DIGIT(b, dig);
1499
1500 /* Loop over the bits of the lower-order digits */
1501 for(bit = 0; bit < DIGIT_BIT; bit++) {
1502 if(d & 1) {
1503 if((res = s_mp_mul(&s, &x)) != MP_OKAY)
1504 goto CLEANUP;
1505 if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY)
1506 goto CLEANUP;
1507 }
1508
1509 d >>= 1;
1510
1511 if((res = s_mp_sqr(&x)) != MP_OKAY)
1512 goto CLEANUP;
1513 if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY)
1514 goto CLEANUP;
1515 }
1516 }
1517
1518 /* Now do the last digit... */
1519 d = DIGIT(b, dig);
1520
1521 while(d) {
1522 if(d & 1) {
1523 if((res = s_mp_mul(&s, &x)) != MP_OKAY)
1524 goto CLEANUP;
1525 if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY)
1526 goto CLEANUP;
1527 }
1528
1529 d >>= 1;
1530
1531 if((res = s_mp_sqr(&x)) != MP_OKAY)
1532 goto CLEANUP;
1533 if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY)
1534 goto CLEANUP;
1535 }
1536
1537 s_mp_exch(&s, c);
1538
1539 CLEANUP:
1540 mp_clear(&mu);
1541 MU:
1542 mp_clear(&x);
1543 X:
1544 mp_clear(&s);
1545
1546 return res;
1547
1548 } /* end s_mp_exptmod() */
1549
1550 /* }}} */
1551
1552 /* {{{ mp_exptmod_d(a, d, m, c) */
1553
1554 mp_err mp_exptmod_d(const mp_int *a, mp_digit d, const mp_int *m, mp_int *c)
1555 {
1556 mp_int s, x;
1557 mp_err res;
1558
1559 ARGCHK(a != NULL && c != NULL, MP_BADARG);
1560
1561 if((res = mp_init(&s)) != MP_OKAY)
1562 return res;
1563 if((res = mp_init_copy(&x, a)) != MP_OKAY)
1564 goto X;
1565
1566 mp_set(&s, 1);
1567
1568 while(d != 0) {
1569 if(d & 1) {
1570 if((res = s_mp_mul(&s, &x)) != MP_OKAY ||
1571 (res = mp_mod(&s, m, &s)) != MP_OKAY)
1572 goto CLEANUP;
1573 }
1574
1575 d /= 2;
1576
1577 if((res = s_mp_sqr(&x)) != MP_OKAY ||
1578 (res = mp_mod(&x, m, &x)) != MP_OKAY)
1579 goto CLEANUP;
1580 }
1581
1582 s_mp_exch(&s, c);
1583
1584 CLEANUP:
1585 mp_clear(&x);
1586 X:
1587 mp_clear(&s);
1588
1589 return res;
1590
1591 } /* end mp_exptmod_d() */
1592
1593 /* }}} */
1594 #endif /* if MP_MODARITH */
1595
1596 /* }}} */
1597
1598 /*------------------------------------------------------------------------*/
1599 /* {{{ Comparison functions */
1600
1601 /* {{{ mp_cmp_z(a) */
1602
1603 /*
1604 mp_cmp_z(a)
1605
1606 Compare a <=> 0. Returns <0 if a<0, 0 if a=0, >0 if a>0.
1607 */
1608
1609 int mp_cmp_z(const mp_int *a)
1610 {
1611 if(SIGN(a) == NEG)
1612 return MP_LT;
1613 else if(USED(a) == 1 && DIGIT(a, 0) == 0)
1614 return MP_EQ;
1615 else
1616 return MP_GT;
1617
1618 } /* end mp_cmp_z() */
1619
1620 /* }}} */
1621
1622 /* {{{ mp_cmp_d(a, d) */
1623
1624 /*
1625 mp_cmp_d(a, d)
1626
1627 Compare a <=> d. Returns <0 if a<d, 0 if a=d, >0 if a>d
1628 */
1629
1630 int mp_cmp_d(const mp_int *a, mp_digit d)
1631 {
1632 ARGCHK(a != NULL, MP_EQ);
1633
1634 if(SIGN(a) == NEG)
1635 return MP_LT;
1636
1637 return s_mp_cmp_d(a, d);
1638
1639 } /* end mp_cmp_d() */
1640
1641 /* }}} */
1642
1643 /* {{{ mp_cmp(a, b) */
1644
1645 int mp_cmp(const mp_int *a, const mp_int *b)
1646 {
1647 ARGCHK(a != NULL && b != NULL, MP_EQ);
1648
1649 if(SIGN(a) == SIGN(b)) {
1650 int mag;
1651
1652 if((mag = s_mp_cmp(a, b)) == MP_EQ)
1653 return MP_EQ;
1654
1655 if(SIGN(a) == ZPOS)
1656 return mag;
1657 else
1658 return -mag;
1659
1660 } else if(SIGN(a) == ZPOS) {
1661 return MP_GT;
1662 } else {
1663 return MP_LT;
1664 }
1665
1666 } /* end mp_cmp() */
1667
1668 /* }}} */
1669
1670 /* {{{ mp_cmp_mag(a, b) */
1671
1672 /*
1673 mp_cmp_mag(a, b)
1674
1675 Compares |a| <=> |b|, and returns an appropriate comparison result
1676 */
1677
1678 int mp_cmp_mag(mp_int *a, mp_int *b)
1679 {
1680 ARGCHK(a != NULL && b != NULL, MP_EQ);
1681
1682 return s_mp_cmp(a, b);
1683
1684 } /* end mp_cmp_mag() */
1685
1686 /* }}} */
1687
1688 /* {{{ mp_cmp_int(a, z) */
1689
1690 /*
1691 This just converts z to an mp_int, and uses the existing comparison
1692 routines. This is sort of inefficient, but it's not clear to me how
1693 frequently this wil get used anyway. For small positive constants,
1694 you can always use mp_cmp_d(), and for zero, there is mp_cmp_z().
1695 */
1696 int mp_cmp_int(const mp_int *a, long z)
1697 {
1698 mp_int tmp;
1699 int out;
1700
1701 ARGCHK(a != NULL, MP_EQ);
1702
1703 mp_init(&tmp); mp_set_int(&tmp, z);
1704 out = mp_cmp(a, &tmp);
1705 mp_clear(&tmp);
1706
1707 return out;
1708
1709 } /* end mp_cmp_int() */
1710
1711 /* }}} */
1712
1713 /* {{{ mp_isodd(a) */
1714
1715 /*
1716 mp_isodd(a)
1717
1718 Returns a true (non-zero) value if a is odd, false (zero) otherwise.
1719 */
1720 int mp_isodd(const mp_int *a)
1721 {
1722 ARGCHK(a != NULL, 0);
1723
1724 return (int)(DIGIT(a, 0) & 1);
1725
1726 } /* end mp_isodd() */
1727
1728 /* }}} */
1729
1730 /* {{{ mp_iseven(a) */
1731
1732 int mp_iseven(const mp_int *a)
1733 {
1734 return !mp_isodd(a);
1735
1736 } /* end mp_iseven() */
1737
1738 /* }}} */
1739
1740 /* }}} */
1741
1742 /*------------------------------------------------------------------------*/
1743 /* {{{ Number theoretic functions */
1744
1745 #if MP_NUMTH
1746 /* {{{ mp_gcd(a, b, c) */
1747
1748 /*
1749 Like the old mp_gcd() function, except computes the GCD using the
1750 binary algorithm due to Josef Stein in 1961 (via Knuth).
1751 */
1752 mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c)
1753 {
1754 mp_err res;
1755 mp_int u, v, t;
1756 mp_size k = 0;
1757
1758 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
1759
1760 if(mp_cmp_z(a) == MP_EQ && mp_cmp_z(b) == MP_EQ)
1761 return MP_RANGE;
1762 if(mp_cmp_z(a) == MP_EQ) {
1763 return mp_copy(b, c);
1764 } else if(mp_cmp_z(b) == MP_EQ) {
1765 return mp_copy(a, c);
1766 }
1767
1768 if((res = mp_init(&t)) != MP_OKAY)
1769 return res;
1770 if((res = mp_init_copy(&u, a)) != MP_OKAY)
1771 goto U;
1772 if((res = mp_init_copy(&v, b)) != MP_OKAY)
1773 goto V;
1774
1775 SIGN(&u) = ZPOS;
1776 SIGN(&v) = ZPOS;
1777
1778 /* Divide out common factors of 2 until at least 1 of a, b is even */
1779 while(mp_iseven(&u) && mp_iseven(&v)) {
1780 s_mp_div_2(&u);
1781 s_mp_div_2(&v);
1782 ++k;
1783 }
1784
1785 /* Initialize t */
1786 if(mp_isodd(&u)) {
1787 if((res = mp_copy(&v, &t)) != MP_OKAY)
1788 goto CLEANUP;
1789
1790 /* t = -v */
1791 if(SIGN(&v) == ZPOS)
1792 SIGN(&t) = NEG;
1793 else
1794 SIGN(&t) = ZPOS;
1795
1796 } else {
1797 if((res = mp_copy(&u, &t)) != MP_OKAY)
1798 goto CLEANUP;
1799
1800 }
1801
1802 for(;;) {
1803 while(mp_iseven(&t)) {
1804 s_mp_div_2(&t);
1805 }
1806
1807 if(mp_cmp_z(&t) == MP_GT) {
1808 if((res = mp_copy(&t, &u)) != MP_OKAY)
1809 goto CLEANUP;
1810
1811 } else {
1812 if((res = mp_copy(&t, &v)) != MP_OKAY)
1813 goto CLEANUP;
1814
1815 /* v = -t */
1816 if(SIGN(&t) == ZPOS)
1817 SIGN(&v) = NEG;
1818 else
1819 SIGN(&v) = ZPOS;
1820 }
1821
1822 if((res = mp_sub(&u, &v, &t)) != MP_OKAY)
1823 goto CLEANUP;
1824
1825 if(s_mp_cmp_d(&t, 0) == MP_EQ)
1826 break;
1827 }
1828
1829 s_mp_2expt(&v, k); /* v = 2^k */
1830 res = mp_mul(&u, &v, c); /* c = u * v */
1831
1832 CLEANUP:
1833 mp_clear(&v);
1834 V:
1835 mp_clear(&u);
1836 U:
1837 mp_clear(&t);
1838
1839 return res;
1840
1841 } /* end mp_gcd() */
1842
1843 /* }}} */
1844
1845 /* {{{ mp_lcm(a, b, c) */
1846
1847 /* We compute the least common multiple using the rule:
1848
1849 ab = [a, b](a, b)
1850
1851 ... by computing the product, and dividing out the gcd.
1852 */
1853
1854 mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c)
1855 {
1856 mp_int gcd, prod;
1857 mp_err res;
1858
1859 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG);
1860
1861 /* Set up temporaries */
1862 if((res = mp_init(&gcd)) != MP_OKAY)
1863 return res;
1864 if((res = mp_init(&prod)) != MP_OKAY)
1865 goto GCD;
1866
1867 if((res = mp_mul(a, b, &prod)) != MP_OKAY)
1868 goto CLEANUP;
1869 if((res = mp_gcd(a, b, &gcd)) != MP_OKAY)
1870 goto CLEANUP;
1871
1872 res = mp_div(&prod, &gcd, c, NULL);
1873
1874 CLEANUP:
1875 mp_clear(&prod);
1876 GCD:
1877 mp_clear(&gcd);
1878
1879 return res;
1880
1881 } /* end mp_lcm() */
1882
1883 /* }}} */
1884
1885 /* {{{ mp_xgcd(a, b, g, x, y) */
1886
1887 /*
1888 mp_xgcd(a, b, g, x, y)
1889
1890 Compute g = (a, b) and values x and y satisfying Bezout's identity
1891 (that is, ax + by = g). This uses the binary extended GCD algorithm
1892 based on the Stein algorithm used for mp_gcd()
1893 See algorithm 14.61 in Handbook of Applied Cryptogrpahy.
1894 */
1895
1896 mp_err mp_xgcd(const mp_int *a, const mp_int *b, mp_int *g, mp_int *x, mp_int *y)
1897 {
1898 mp_int gx, xc, yc, u, v, A, B, C, D;
1899 mp_int *clean[9];
1900 mp_err res;
1901 int last = -1;
1902
1903 if(mp_cmp_z(b) == 0)
1904 return MP_RANGE;
1905
1906 /* Initialize all these variables we need */
1907 MP_CHECKOK( mp_init(&u) );
1908 clean[++last] = &u;
1909 MP_CHECKOK( mp_init(&v) );
1910 clean[++last] = &v;
1911 MP_CHECKOK( mp_init(&gx) );
1912 clean[++last] = &gx;
1913 MP_CHECKOK( mp_init(&A) );
1914 clean[++last] = &A;
1915 MP_CHECKOK( mp_init(&B) );
1916 clean[++last] = &B;
1917 MP_CHECKOK( mp_init(&C) );
1918 clean[++last] = &C;
1919 MP_CHECKOK( mp_init(&D) );
1920 clean[++last] = &D;
1921 MP_CHECKOK( mp_init_copy(&xc, a) );
1922 clean[++last] = &xc;
1923 mp_abs(&xc, &xc);
1924 MP_CHECKOK( mp_init_copy(&yc, b) );
1925 clean[++last] = &yc;
1926 mp_abs(&yc, &yc);
1927
1928 mp_set(&gx, 1);
1929
1930 /* Divide by two until at least one of them is odd */
1931 while(mp_iseven(&xc) && mp_iseven(&yc)) {
1932 mp_size nx = mp_trailing_zeros(&xc);
1933 mp_size ny = mp_trailing_zeros(&yc);
1934 mp_size n = MP_MIN(nx, ny);
1935 s_mp_div_2d(&xc,n);
1936 s_mp_div_2d(&yc,n);
1937 MP_CHECKOK( s_mp_mul_2d(&gx,n) );
1938 }
1939
1940 mp_copy(&xc, &u);
1941 mp_copy(&yc, &v);
1942 mp_set(&A, 1); mp_set(&D, 1);
1943
1944 /* Loop through binary GCD algorithm */
1945 do {
1946 while(mp_iseven(&u)) {
1947 s_mp_div_2(&u);
1948
1949 if(mp_iseven(&A) && mp_iseven(&B)) {
1950 s_mp_div_2(&A); s_mp_div_2(&B);
1951 } else {
1952 MP_CHECKOK( mp_add(&A, &yc, &A) );
1953 s_mp_div_2(&A);
1954 MP_CHECKOK( mp_sub(&B, &xc, &B) );
1955 s_mp_div_2(&B);
1956 }
1957 }
1958
1959 while(mp_iseven(&v)) {
1960 s_mp_div_2(&v);
1961
1962 if(mp_iseven(&C) && mp_iseven(&D)) {
1963 s_mp_div_2(&C); s_mp_div_2(&D);
1964 } else {
1965 MP_CHECKOK( mp_add(&C, &yc, &C) );
1966 s_mp_div_2(&C);
1967 MP_CHECKOK( mp_sub(&D, &xc, &D) );
1968 s_mp_div_2(&D);
1969 }
1970 }
1971
1972 if(mp_cmp(&u, &v) >= 0) {
1973 MP_CHECKOK( mp_sub(&u, &v, &u) );
1974 MP_CHECKOK( mp_sub(&A, &C, &A) );
1975 MP_CHECKOK( mp_sub(&B, &D, &B) );
1976 } else {
1977 MP_CHECKOK( mp_sub(&v, &u, &v) );
1978 MP_CHECKOK( mp_sub(&C, &A, &C) );
1979 MP_CHECKOK( mp_sub(&D, &B, &D) );
1980 }
1981 } while (mp_cmp_z(&u) != 0);
1982
1983 /* copy results to output */
1984 if(x)
1985 MP_CHECKOK( mp_copy(&C, x) );
1986
1987 if(y)
1988 MP_CHECKOK( mp_copy(&D, y) );
1989
1990 if(g)
1991 MP_CHECKOK( mp_mul(&gx, &v, g) );
1992
1993 CLEANUP:
1994 while(last >= 0)
1995 mp_clear(clean[last--]);
1996
1997 return res;
1998
1999 } /* end mp_xgcd() */
2000
2001 /* }}} */
2002
2003 mp_size mp_trailing_zeros(const mp_int *mp)
2004 {
2005 mp_digit d;
2006 mp_size n = 0;
2007 int ix;
2008
2009 if (!mp || !MP_DIGITS(mp) || !mp_cmp_z(mp))
2010 return n;
2011
2012 for (ix = 0; !(d = MP_DIGIT(mp,ix)) && (ix < MP_USED(mp)); ++ix)
2013 n += MP_DIGIT_BIT;
2014 if (!d)
2015 return 0; /* shouldn't happen, but ... */
2016 #if !defined(MP_USE_UINT_DIGIT)
2017 if (!(d & 0xffffffffU)) {
2018 d >>= 32;
2019 n += 32;
2020 }
2021 #endif
2022 if (!(d & 0xffffU)) {
2023 d >>= 16;
2024 n += 16;
2025 }
2026 if (!(d & 0xffU)) {
2027 d >>= 8;
2028 n += 8;
2029 }
2030 if (!(d & 0xfU)) {
2031 d >>= 4;
2032 n += 4;
2033 }
2034 if (!(d & 0x3U)) {
2035 d >>= 2;
2036 n += 2;
2037 }
2038 if (!(d & 0x1U)) {
2039 d >>= 1;
2040 n += 1;
2041 }
2042 #if MP_ARGCHK == 2
2043 assert(0 != (d & 1));
2044 #endif
2045 return n;
2046 }
2047
2048 /* Given a and prime p, computes c and k such that a*c == 2**k (mod p).
2049 ** Returns k (positive) or error (negative).
2050 ** This technique from the paper "Fast Modular Reciprocals" (unpublished)
2051 ** by Richard Schroeppel (a.k.a. Captain Nemo).
2052 */
2053 mp_err s_mp_almost_inverse(const mp_int *a, const mp_int *p, mp_int *c)
2054 {
2055 mp_err res;
2056 mp_err k = 0;
2057 mp_int d, f, g;
2058
2059 ARGCHK(a && p && c, MP_BADARG);
2060
2061 MP_DIGITS(&d) = 0;
2062 MP_DIGITS(&f) = 0;
2063 MP_DIGITS(&g) = 0;
2064 MP_CHECKOK( mp_init(&d) );
2065 MP_CHECKOK( mp_init_copy(&f, a) ); /* f = a */
2066 MP_CHECKOK( mp_init_copy(&g, p) ); /* g = p */
2067
2068 mp_set(c, 1);
2069 mp_zero(&d);
2070
2071 if (mp_cmp_z(&f) == 0) {
2072 res = MP_UNDEF;
2073 } else
2074 for (;;) {
2075 int diff_sign;
2076 while (mp_iseven(&f)) {
2077 mp_size n = mp_trailing_zeros(&f);
2078 if (!n) {
2079 res = MP_UNDEF;
2080 goto CLEANUP;
2081 }
2082 s_mp_div_2d(&f, n);
2083 MP_CHECKOK( s_mp_mul_2d(&d, n) );
2084 k += n;
2085 }
2086 if (mp_cmp_d(&f, 1) == MP_EQ) { /* f == 1 */
2087 res = k;
2088 break;
2089 }
2090 diff_sign = mp_cmp(&f, &g);
2091 if (diff_sign < 0) { /* f < g */
2092 s_mp_exch(&f, &g);
2093 s_mp_exch(c, &d);
2094 } else if (diff_sign == 0) { /* f == g */
2095 res = MP_UNDEF; /* a and p are not relatively prime */
2096 break;
2097 }
2098 if ((MP_DIGIT(&f,0) % 4) == (MP_DIGIT(&g,0) % 4)) {
2099 MP_CHECKOK( mp_sub(&f, &g, &f) ); /* f = f - g */
2100 MP_CHECKOK( mp_sub(c, &d, c) ); /* c = c - d */
2101 } else {
2102 MP_CHECKOK( mp_add(&f, &g, &f) ); /* f = f + g */
2103 MP_CHECKOK( mp_add(c, &d, c) ); /* c = c + d */
2104 }
2105 }
2106 if (res >= 0) {
2107 while (MP_SIGN(c) != MP_ZPOS) {
2108 MP_CHECKOK( mp_add(c, p, c) );
2109 }
2110 res = k;
2111 }
2112
2113 CLEANUP:
2114 mp_clear(&d);
2115 mp_clear(&f);
2116 mp_clear(&g);
2117 return res;
2118 }
2119
2120 /* Compute T = (P ** -1) mod MP_RADIX. Also works for 16-bit mp_digits.
2121 ** This technique from the paper "Fast Modular Reciprocals" (unpublished)
2122 ** by Richard Schroeppel (a.k.a. Captain Nemo).
2123 */
2124 mp_digit s_mp_invmod_radix(mp_digit P)
2125 {
2126 mp_digit T = P;
2127 T *= 2 - (P * T);
2128 T *= 2 - (P * T);
2129 T *= 2 - (P * T);
2130 T *= 2 - (P * T);
2131 #if !defined(MP_USE_UINT_DIGIT)
2132 T *= 2 - (P * T);
2133 T *= 2 - (P * T);
2134 #endif
2135 return T;
2136 }
2137
2138 /* Given c, k, and prime p, where a*c == 2**k (mod p),
2139 ** Compute x = (a ** -1) mod p. This is similar to Montgomery reduction.
2140 ** This technique from the paper "Fast Modular Reciprocals" (unpublished)
2141 ** by Richard Schroeppel (a.k.a. Captain Nemo).
2142 */
2143 mp_err s_mp_fixup_reciprocal(const mp_int *c, const mp_int *p, int k, mp_int *x)
2144 {
2145 int k_orig = k;
2146 mp_digit r;
2147 mp_size ix;
2148 mp_err res;
2149
2150 if (mp_cmp_z(c) < 0) { /* c < 0 */
2151 MP_CHECKOK( mp_add(c, p, x) ); /* x = c + p */
2152 } else {
2153 MP_CHECKOK( mp_copy(c, x) ); /* x = c */
2154 }
2155
2156 /* make sure x is large enough */
2157 ix = MP_HOWMANY(k, MP_DIGIT_BIT) + MP_USED(p) + 1;
2158 ix = MP_MAX(ix, MP_USED(x));
2159 MP_CHECKOK( s_mp_pad(x, ix) );
2160
2161 r = 0 - s_mp_invmod_radix(MP_DIGIT(p,0));
2162
2163 for (ix = 0; k > 0; ix++) {
2164 int j = MP_MIN(k, MP_DIGIT_BIT);
2165 mp_digit v = r * MP_DIGIT(x, ix);
2166 if (j < MP_DIGIT_BIT) {
2167 v &= ((mp_digit)1 << j) - 1; /* v = v mod (2 ** j) */
2168 }
2169 s_mp_mul_d_add_offset(p, v, x, ix); /* x += p * v * (RADIX ** ix) */
2170 k -= j;
2171 }
2172 s_mp_clamp(x);
2173 s_mp_div_2d(x, k_orig);
2174 res = MP_OKAY;
2175
2176 CLEANUP:
2177 return res;
2178 }
2179
2180 /* compute mod inverse using Schroeppel's method, only if m is odd */
2181 mp_err s_mp_invmod_odd_m(const mp_int *a, const mp_int *m, mp_int *c)
2182 {
2183 int k;
2184 mp_err res;
2185 mp_int x;
2186
2187 ARGCHK(a && m && c, MP_BADARG);
2188
2189 if(mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0)
2190 return MP_RANGE;
2191 if (mp_iseven(m))
2192 return MP_UNDEF;
2193
2194 MP_DIGITS(&x) = 0;
2195
2196 if (a == c) {
2197 if ((res = mp_init_copy(&x, a)) != MP_OKAY)
2198 return res;
2199 if (a == m)
2200 m = &x;
2201 a = &x;
2202 } else if (m == c) {
2203 if ((res = mp_init_copy(&x, m)) != MP_OKAY)
2204 return res;
2205 m = &x;
2206 } else {
2207 MP_DIGITS(&x) = 0;
2208 }
2209
2210 MP_CHECKOK( s_mp_almost_inverse(a, m, c) );
2211 k = res;
2212 MP_CHECKOK( s_mp_fixup_reciprocal(c, m, k, c) );
2213 CLEANUP:
2214 mp_clear(&x);
2215 return res;
2216 }
2217
2218 /* Known good algorithm for computing modular inverse. But slow. */
2219 mp_err mp_invmod_xgcd(const mp_int *a, const mp_int *m, mp_int *c)
2220 {
2221 mp_int g, x;
2222 mp_err res;
2223
2224 ARGCHK(a && m && c, MP_BADARG);
2225
2226 if(mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0)
2227 return MP_RANGE;
2228
2229 MP_DIGITS(&g) = 0;
2230 MP_DIGITS(&x) = 0;
2231 MP_CHECKOK( mp_init(&x) );
2232 MP_CHECKOK( mp_init(&g) );
2233
2234 MP_CHECKOK( mp_xgcd(a, m, &g, &x, NULL) );
2235
2236 if (mp_cmp_d(&g, 1) != MP_EQ) {
2237 res = MP_UNDEF;
2238 goto CLEANUP;
2239 }
2240
2241 res = mp_mod(&x, m, c);
2242 SIGN(c) = SIGN(a);
2243
2244 CLEANUP:
2245 mp_clear(&x);
2246 mp_clear(&g);
2247
2248 return res;
2249 }
2250
2251 /* modular inverse where modulus is 2**k. */
2252 /* c = a**-1 mod 2**k */
2253 mp_err s_mp_invmod_2d(const mp_int *a, mp_size k, mp_int *c)
2254 {
2255 mp_err res;
2256 mp_size ix = k + 4;
2257 mp_int t0, t1, val, tmp, two2k;
2258
2259 static const mp_digit d2 = 2;
2260 static const mp_int two = { MP_ZPOS, 1, 1, (mp_digit *)&d2 };
2261
2262 if (mp_iseven(a))
2263 return MP_UNDEF;
2264 if (k <= MP_DIGIT_BIT) {
2265 mp_digit i = s_mp_invmod_radix(MP_DIGIT(a,0));
2266 if (k < MP_DIGIT_BIT)
2267 i &= ((mp_digit)1 << k) - (mp_digit)1;
2268 mp_set(c, i);
2269 return MP_OKAY;
2270 }
2271 MP_DIGITS(&t0) = 0;
2272 MP_DIGITS(&t1) = 0;
2273 MP_DIGITS(&val) = 0;
2274 MP_DIGITS(&tmp) = 0;
2275 MP_DIGITS(&two2k) = 0;
2276 MP_CHECKOK( mp_init_copy(&val, a) );
2277 s_mp_mod_2d(&val, k);
2278 MP_CHECKOK( mp_init_copy(&t0, &val) );
2279 MP_CHECKOK( mp_init_copy(&t1, &t0) );
2280 MP_CHECKOK( mp_init(&tmp) );
2281 MP_CHECKOK( mp_init(&two2k) );
2282 MP_CHECKOK( s_mp_2expt(&two2k, k) );
2283 do {
2284 MP_CHECKOK( mp_mul(&val, &t1, &tmp) );
2285 MP_CHECKOK( mp_sub(&two, &tmp, &tmp) );
2286 MP_CHECKOK( mp_mul(&t1, &tmp, &t1) );
2287 s_mp_mod_2d(&t1, k);
2288 while (MP_SIGN(&t1) != MP_ZPOS) {
2289 MP_CHECKOK( mp_add(&t1, &two2k, &t1) );
2290 }
2291 if (mp_cmp(&t1, &t0) == MP_EQ)
2292 break;
2293 MP_CHECKOK( mp_copy(&t1, &t0) );
2294 } while (--ix > 0);
2295 if (!ix) {
2296 res = MP_UNDEF;
2297 } else {
2298 mp_exch(c, &t1);
2299 }
2300
2301 CLEANUP:
2302 mp_clear(&t0);
2303 mp_clear(&t1);
2304 mp_clear(&val);
2305 mp_clear(&tmp);
2306 mp_clear(&two2k);
2307 return res;
2308 }
2309
2310 mp_err s_mp_invmod_even_m(const mp_int *a, const mp_int *m, mp_int *c)
2311 {
2312 mp_err res;
2313 mp_size k;
2314 mp_int oddFactor, evenFactor; /* factors of the modulus */
2315 mp_int oddPart, evenPart; /* parts to combine via CRT. */
2316 mp_int C2, tmp1, tmp2;
2317
2318 /*static const mp_digit d1 = 1; */
2319 /*static const mp_int one = { MP_ZPOS, 1, 1, (mp_digit *)&d1 }; */
2320
2321 if ((res = s_mp_ispow2(m)) >= 0) {
2322 k = res;
2323 return s_mp_invmod_2d(a, k, c);
2324 }
2325 MP_DIGITS(&oddFactor) = 0;
2326 MP_DIGITS(&evenFactor) = 0;
2327 MP_DIGITS(&oddPart) = 0;
2328 MP_DIGITS(&evenPart) = 0;
2329 MP_DIGITS(&C2) = 0;
2330 MP_DIGITS(&tmp1) = 0;
2331 MP_DIGITS(&tmp2) = 0;
2332
2333 MP_CHECKOK( mp_init_copy(&oddFactor, m) ); /* oddFactor = m */
2334 MP_CHECKOK( mp_init(&evenFactor) );
2335 MP_CHECKOK( mp_init(&oddPart) );
2336 MP_CHECKOK( mp_init(&evenPart) );
2337 MP_CHECKOK( mp_init(&C2) );
2338 MP_CHECKOK( mp_init(&tmp1) );
2339 MP_CHECKOK( mp_init(&tmp2) );
2340
2341 k = mp_trailing_zeros(m);
2342 s_mp_div_2d(&oddFactor, k);
2343 MP_CHECKOK( s_mp_2expt(&evenFactor, k) );
2344
2345 /* compute a**-1 mod oddFactor. */
2346 MP_CHECKOK( s_mp_invmod_odd_m(a, &oddFactor, &oddPart) );
2347 /* compute a**-1 mod evenFactor, where evenFactor == 2**k. */
2348 MP_CHECKOK( s_mp_invmod_2d( a, k, &evenPart) );
2349
2350 /* Use Chinese Remainer theorem to compute a**-1 mod m. */
2351 /* let m1 = oddFactor, v1 = oddPart,
2352 * let m2 = evenFactor, v2 = evenPart.
2353 */
2354
2355 /* Compute C2 = m1**-1 mod m2. */
2356 MP_CHECKOK( s_mp_invmod_2d(&oddFactor, k, &C2) );
2357
2358 /* compute u = (v2 - v1)*C2 mod m2 */
2359 MP_CHECKOK( mp_sub(&evenPart, &oddPart, &tmp1) );
2360 MP_CHECKOK( mp_mul(&tmp1, &C2, &tmp2) );
2361 s_mp_mod_2d(&tmp2, k);
2362 while (MP_SIGN(&tmp2) != MP_ZPOS) {
2363 MP_CHECKOK( mp_add(&tmp2, &evenFactor, &tmp2) );
2364 }
2365
2366 /* compute answer = v1 + u*m1 */
2367 MP_CHECKOK( mp_mul(&tmp2, &oddFactor, c) );
2368 MP_CHECKOK( mp_add(&oddPart, c, c) );
2369 /* not sure this is necessary, but it's low cost if not. */
2370 MP_CHECKOK( mp_mod(c, m, c) );
2371
2372 CLEANUP:
2373 mp_clear(&oddFactor);
2374 mp_clear(&evenFactor);
2375 mp_clear(&oddPart);
2376 mp_clear(&evenPart);
2377 mp_clear(&C2);
2378 mp_clear(&tmp1);
2379 mp_clear(&tmp2);
2380 return res;
2381 }
2382
2383
2384 /* {{{ mp_invmod(a, m, c) */
2385
2386 /*
2387 mp_invmod(a, m, c)
2388
2389 Compute c = a^-1 (mod m), if there is an inverse for a (mod m).
2390 This is equivalent to the question of whether (a, m) = 1. If not,
2391 MP_UNDEF is returned, and there is no inverse.
2392 */
2393
2394 mp_err mp_invmod(const mp_int *a, const mp_int *m, mp_int *c)
2395 {
2396
2397 ARGCHK(a && m && c, MP_BADARG);
2398
2399 if(mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0)
2400 return MP_RANGE;
2401
2402 if (mp_isodd(m)) {
2403 return s_mp_invmod_odd_m(a, m, c);
2404 }
2405 if (mp_iseven(a))
2406 return MP_UNDEF; /* not invertable */
2407
2408 return s_mp_invmod_even_m(a, m, c);
2409
2410 } /* end mp_invmod() */
2411
2412 /* }}} */
2413 #endif /* if MP_NUMTH */
2414
2415 /* }}} */
2416
2417 /*------------------------------------------------------------------------*/
2418 /* {{{ mp_print(mp, ofp) */
2419
2420 #if MP_IOFUNC
2421 /*
2422 mp_print(mp, ofp)
2423
2424 Print a textual representation of the given mp_int on the output
2425 stream 'ofp'. Output is generated using the internal radix.
2426 */
2427
2428 void mp_print(mp_int *mp, FILE *ofp)
2429 {
2430 int ix;
2431
2432 if(mp == NULL || ofp == NULL)
2433 return;
2434
2435 fputc((SIGN(mp) == NEG) ? '-' : '+', ofp);
2436
2437 for(ix = USED(mp) - 1; ix >= 0; ix--) {
2438 fprintf(ofp, DIGIT_FMT, DIGIT(mp, ix));
2439 }
2440
2441 } /* end mp_print() */
2442
2443 #endif /* if MP_IOFUNC */
2444
2445 /* }}} */
2446
2447 /*------------------------------------------------------------------------*/
2448 /* {{{ More I/O Functions */
2449
2450 /* {{{ mp_read_raw(mp, str, len) */
2451
2452 /*
2453 mp_read_raw(mp, str, len)
2454
2455 Read in a raw value (base 256) into the given mp_int
2456 */
2457
2458 mp_err mp_read_raw(mp_int *mp, char *str, int len)
2459 {
2460 int ix;
2461 mp_err res;
2462 unsigned char *ustr = (unsigned char *)str;
2463
2464 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG);
2465
2466 mp_zero(mp);
2467
2468 /* Get sign from first byte */
2469 if(ustr[0])
2470 SIGN(mp) = NEG;
2471 else
2472 SIGN(mp) = ZPOS;
2473
2474 /* Read the rest of the digits */
2475 for(ix = 1; ix < len; ix++) {
2476 if((res = mp_mul_d(mp, 256, mp)) != MP_OKAY)
2477 return res;
2478 if((res = mp_add_d(mp, ustr[ix], mp)) != MP_OKAY)
2479 return res;
2480 }
2481
2482 return MP_OKAY;
2483
2484 } /* end mp_read_raw() */
2485
2486 /* }}} */
2487
2488 /* {{{ mp_raw_size(mp) */
2489
2490 int mp_raw_size(mp_int *mp)
2491 {
2492 ARGCHK(mp != NULL, 0);
2493
2494 return (USED(mp) * sizeof(mp_digit)) + 1;
2495
2496 } /* end mp_raw_size() */
2497
2498 /* }}} */
2499
2500 /* {{{ mp_toraw(mp, str) */
2501
2502 mp_err mp_toraw(mp_int *mp, char *str)
2503 {
2504 int ix, jx, pos = 1;
2505
2506 ARGCHK(mp != NULL && str != NULL, MP_BADARG);
2507
2508 str[0] = (char)SIGN(mp);
2509
2510 /* Iterate over each digit... */
2511 for(ix = USED(mp) - 1; ix >= 0; ix--) {
2512 mp_digit d = DIGIT(mp, ix);
2513
2514 /* Unpack digit bytes, high order first */
2515 for(jx = sizeof(mp_digit) - 1; jx >= 0; jx--) {
2516 str[pos++] = (char)(d >> (jx * CHAR_BIT));
2517 }
2518 }
2519
2520 return MP_OKAY;
2521
2522 } /* end mp_toraw() */
2523
2524 /* }}} */
2525
2526 /* {{{ mp_read_radix(mp, str, radix) */
2527
2528 /*
2529 mp_read_radix(mp, str, radix)
2530
2531 Read an integer from the given string, and set mp to the resulting
2532 value. The input is presumed to be in base 10. Leading non-digit
2533 characters are ignored, and the function reads until a non-digit
2534 character or the end of the string.
2535 */
2536
2537 mp_err mp_read_radix(mp_int *mp, const char *str, int radix)
2538 {
2539 int ix = 0, val = 0;
2540 mp_err res;
2541 mp_sign sig = ZPOS;
2542
2543 ARGCHK(mp != NULL && str != NULL && radix >= 2 && radix <= MAX_RADIX,
2544 MP_BADARG);
2545
2546 mp_zero(mp);
2547
2548 /* Skip leading non-digit characters until a digit or '-' or '+' */
2549 while(str[ix] &&
2550 (s_mp_tovalue(str[ix], radix) < 0) &&
2551 str[ix] != '-' &&
2552 str[ix] != '+') {
2553 ++ix;
2554 }
2555
2556 if(str[ix] == '-') {
2557 sig = NEG;
2558 ++ix;
2559 } else if(str[ix] == '+') {
2560 sig = ZPOS; /* this is the default anyway... */
2561 ++ix;
2562 }
2563
2564 while((val = s_mp_tovalue(str[ix], radix)) >= 0) {
2565 if((res = s_mp_mul_d(mp, radix)) != MP_OKAY)
2566 return res;
2567 if((res = s_mp_add_d(mp, val)) != MP_OKAY)
2568 return res;
2569 ++ix;
2570 }
2571
2572 if(s_mp_cmp_d(mp, 0) == MP_EQ)
2573 SIGN(mp) = ZPOS;
2574 else
2575 SIGN(mp) = sig;
2576
2577 return MP_OKAY;
2578
2579 } /* end mp_read_radix() */
2580
2581 mp_err mp_read_variable_radix(mp_int *a, const char * str, int default_radix)
2582 {
2583 int radix = default_radix;
2584 int cx;
2585 mp_sign sig = ZPOS;
2586 mp_err res;
2587
2588 /* Skip leading non-digit characters until a digit or '-' or '+' */
2589 while ((cx = *str) != 0 &&
2590 (s_mp_tovalue(cx, radix) < 0) &&
2591 cx != '-' &&
2592 cx != '+') {
2593 ++str;
2594 }
2595
2596 if (cx == '-') {
2597 sig = NEG;
2598 ++str;
2599 } else if (cx == '+') {
2600 sig = ZPOS; /* this is the default anyway... */
2601 ++str;
2602 }
2603
2604 if (str[0] == '0') {
2605 if ((str[1] | 0x20) == 'x') {
2606 radix = 16;
2607 str += 2;
2608 } else {
2609 radix = 8;
2610 str++;
2611 }
2612 }
2613 res = mp_read_radix(a, str, radix);
2614 if (res == MP_OKAY) {
2615 MP_SIGN(a) = (s_mp_cmp_d(a, 0) == MP_EQ) ? ZPOS : sig;
2616 }
2617 return res;
2618 }
2619
2620 /* }}} */
2621
2622 /* {{{ mp_radix_size(mp, radix) */
2623
2624 int mp_radix_size(mp_int *mp, int radix)
2625 {
2626 int bits;
2627
2628 if(!mp || radix < 2 || radix > MAX_RADIX)
2629 return 0;
2630
2631 bits = USED(mp) * DIGIT_BIT - 1;
2632
2633 return s_mp_outlen(bits, radix);
2634
2635 } /* end mp_radix_size() */
2636
2637 /* }}} */
2638
2639 /* {{{ mp_toradix(mp, str, radix) */
2640
2641 mp_err mp_toradix(mp_int *mp, char *str, int radix)
2642 {
2643 int ix, pos = 0;
2644
2645 ARGCHK(mp != NULL && str != NULL, MP_BADARG);
2646 ARGCHK(radix > 1 && radix <= MAX_RADIX, MP_RANGE);
2647
2648 if(mp_cmp_z(mp) == MP_EQ) {
2649 str[0] = '0';
2650 str[1] = '\0';
2651 } else {
2652 mp_err res;
2653 mp_int tmp;
2654 mp_sign sgn;
2655 mp_digit rem, rdx = (mp_digit)radix;
2656 char ch;
2657
2658 if((res = mp_init_copy(&tmp, mp)) != MP_OKAY)
2659 return res;
2660
2661 /* Save sign for later, and take absolute value */
2662 sgn = SIGN(&tmp); SIGN(&tmp) = ZPOS;
2663
2664 /* Generate output digits in reverse order */
2665 while(mp_cmp_z(&tmp) != 0) {
2666 if((res = mp_div_d(&tmp, rdx, &tmp, &rem)) != MP_OKAY) {
2667 mp_clear(&tmp);
2668 return res;
2669 }
2670
2671 /* Generate digits, use capital letters */
2672 ch = s_mp_todigit(rem, radix, 0);
2673
2674 str[pos++] = ch;
2675 }
2676
2677 /* Add - sign if original value was negative */
2678 if(sgn == NEG)
2679 str[pos++] = '-';
2680
2681 /* Add trailing NUL to end the string */
2682 str[pos--] = '\0';
2683
2684 /* Reverse the digits and sign indicator */
2685 ix = 0;
2686 while(ix < pos) {
2687 char tmp = str[ix];
2688
2689 str[ix] = str[pos];
2690 str[pos] = tmp;
2691 ++ix;
2692 --pos;
2693 }
2694
2695 mp_clear(&tmp);
2696 }
2697
2698 return MP_OKAY;
2699
2700 } /* end mp_toradix() */
2701
2702 /* }}} */
2703
2704 /* {{{ mp_tovalue(ch, r) */
2705
2706 int mp_tovalue(char ch, int r)
2707 {
2708 return s_mp_tovalue(ch, r);
2709
2710 } /* end mp_tovalue() */
2711
2712 /* }}} */
2713
2714 /* }}} */
2715
2716 /* {{{ mp_strerror(ec) */
2717
2718 /*
2719 mp_strerror(ec)
2720
2721 Return a string describing the meaning of error code 'ec'. The
2722 string returned is allocated in static memory, so the caller should
2723 not attempt to modify or free the memory associated with this
2724 string.
2725 */
2726 const char *mp_strerror(mp_err ec)
2727 {
2728 int aec = (ec < 0) ? -ec : ec;
2729
2730 /* Code values are negative, so the senses of these comparisons
2731 are accurate */
2732 if(ec < MP_LAST_CODE || ec > MP_OKAY) {
2733 return mp_err_string[0]; /* unknown error code */
2734 } else {
2735 return mp_err_string[aec + 1];
2736 }
2737
2738 } /* end mp_strerror() */
2739
2740 /* }}} */
2741
2742 /*========================================================================*/
2743 /*------------------------------------------------------------------------*/
2744 /* Static function definitions (internal use only) */
2745
2746 /* {{{ Memory management */
2747
2748 /* {{{ s_mp_grow(mp, min) */
2749
2750 /* Make sure there are at least 'min' digits allocated to mp */
2751 mp_err s_mp_grow(mp_int *mp, mp_size min)
2752 {
2753 if(min > ALLOC(mp)) {
2754 mp_digit *tmp;
2755
2756 /* Set min to next nearest default precision block size */
2757 min = MP_ROUNDUP(min, s_mp_defprec);
2758
2759 if((tmp = s_mp_alloc(min, sizeof(mp_digit))) == NULL)
2760 return MP_MEM;
2761
2762 s_mp_copy(DIGITS(mp), tmp, USED(mp));
2763
2764 #if MP_CRYPTO
2765 s_mp_setz(DIGITS(mp), ALLOC(mp));
2766 #endif
2767 s_mp_free(DIGITS(mp));
2768 DIGITS(mp) = tmp;
2769 ALLOC(mp) = min;
2770 }
2771
2772 return MP_OKAY;
2773
2774 } /* end s_mp_grow() */
2775
2776 /* }}} */
2777
2778 /* {{{ s_mp_pad(mp, min) */
2779
2780 /* Make sure the used size of mp is at least 'min', growing if needed */
2781 mp_err s_mp_pad(mp_int *mp, mp_size min)
2782 {
2783 if(min > USED(mp)) {
2784 mp_err res;
2785
2786 /* Make sure there is room to increase precision */
2787 if (min > ALLOC(mp)) {
2788 if ((res = s_mp_grow(mp, min)) != MP_OKAY)
2789 return res;
2790 } else {
2791 s_mp_setz(DIGITS(mp) + USED(mp), min - USED(mp));
2792 }
2793
2794 /* Increase precision; should already be 0-filled */
2795 USED(mp) = min;
2796 }
2797
2798 return MP_OKAY;
2799
2800 } /* end s_mp_pad() */
2801
2802 /* }}} */
2803
2804 /* {{{ s_mp_setz(dp, count) */
2805
2806 #if MP_MACRO == 0
2807 /* Set 'count' digits pointed to by dp to be zeroes */
2808 void s_mp_setz(mp_digit *dp, mp_size count)
2809 {
2810 #if MP_MEMSET == 0
2811 int ix;
2812
2813 for(ix = 0; ix < count; ix++)
2814 dp[ix] = 0;
2815 #else
2816 memset(dp, 0, count * sizeof(mp_digit));
2817 #endif
2818
2819 } /* end s_mp_setz() */
2820 #endif
2821
2822 /* }}} */
2823
2824 /* {{{ s_mp_copy(sp, dp, count) */
2825
2826 #if MP_MACRO == 0
2827 /* Copy 'count' digits from sp to dp */
2828 void s_mp_copy(const mp_digit *sp, mp_digit *dp, mp_size count)
2829 {
2830 #if MP_MEMCPY == 0
2831 int ix;
2832
2833 for(ix = 0; ix < count; ix++)
2834 dp[ix] = sp[ix];
2835 #else
2836 memcpy(dp, sp, count * sizeof(mp_digit));
2837 #endif
2838 ++mp_copies;
2839
2840 } /* end s_mp_copy() */
2841 #endif
2842
2843 /* }}} */
2844
2845 /* {{{ s_mp_alloc(nb, ni) */
2846
2847 #if MP_MACRO == 0
2848 /* Allocate ni records of nb bytes each, and return a pointer to that */
2849 void *s_mp_alloc(size_t nb, size_t ni)
2850 {
2851 ++mp_allocs;
2852 return calloc(nb, ni);
2853
2854 } /* end s_mp_alloc() */
2855 #endif
2856
2857 /* }}} */
2858
2859 /* {{{ s_mp_free(ptr) */
2860
2861 #if MP_MACRO == 0
2862 /* Free the memory pointed to by ptr */
2863 void s_mp_free(void *ptr)
2864 {
2865 if(ptr) {
2866 ++mp_frees;
2867 free(ptr);
2868 }
2869 } /* end s_mp_free() */
2870 #endif
2871
2872 /* }}} */
2873
2874 /* {{{ s_mp_clamp(mp) */
2875
2876 #if MP_MACRO == 0
2877 /* Remove leading zeroes from the given value */
2878 void s_mp_clamp(mp_int *mp)
2879 {
2880 mp_size used = MP_USED(mp);
2881 while (used > 1 && DIGIT(mp, used - 1) == 0)
2882 --used;
2883 MP_USED(mp) = used;
2884 } /* end s_mp_clamp() */
2885 #endif
2886
2887 /* }}} */
2888
2889 /* {{{ s_mp_exch(a, b) */
2890
2891 /* Exchange the data for a and b; (b, a) = (a, b) */
2892 void s_mp_exch(mp_int *a, mp_int *b)
2893 {
2894 mp_int tmp;
2895
2896 tmp = *a;
2897 *a = *b;
2898 *b = tmp;
2899
2900 } /* end s_mp_exch() */
2901
2902 /* }}} */
2903
2904 /* }}} */
2905
2906 /* {{{ Arithmetic helpers */
2907
2908 /* {{{ s_mp_lshd(mp, p) */
2909
2910 /*
2911 Shift mp leftward by p digits, growing if needed, and zero-filling
2912 the in-shifted digits at the right end. This is a convenient
2913 alternative to multiplication by powers of the radix
2914 */
2915
2916 mp_err s_mp_lshd(mp_int *mp, mp_size p)
2917 {
2918 mp_err res;
2919 mp_size pos;
2920 int ix;
2921
2922 if(p == 0)
2923 return MP_OKAY;
2924
2925 if (MP_USED(mp) == 1 && MP_DIGIT(mp, 0) == 0)
2926 return MP_OKAY;
2927
2928 if((res = s_mp_pad(mp, USED(mp) + p)) != MP_OKAY)
2929 return res;
2930
2931 pos = USED(mp) - 1;
2932
2933 /* Shift all the significant figures over as needed */
2934 for(ix = pos - p; ix >= 0; ix--)
2935 DIGIT(mp, ix + p) = DIGIT(mp, ix);
2936
2937 /* Fill the bottom digits with zeroes */
2938 for(ix = 0; ix < p; ix++)
2939 DIGIT(mp, ix) = 0;
2940
2941 return MP_OKAY;
2942
2943 } /* end s_mp_lshd() */
2944
2945 /* }}} */
2946
2947 /* {{{ s_mp_mul_2d(mp, d) */
2948
2949 /*
2950 Multiply the integer by 2^d, where d is a number of bits. This
2951 amounts to a bitwise shift of the value.
2952 */
2953 mp_err s_mp_mul_2d(mp_int *mp, mp_digit d)
2954 {
2955 mp_err res;
2956 mp_digit dshift, bshift;
2957 mp_digit mask;
2958
2959 ARGCHK(mp != NULL, MP_BADARG);
2960
2961 dshift = d / MP_DIGIT_BIT;
2962 bshift = d % MP_DIGIT_BIT;
2963 /* bits to be shifted out of the top word */
2964 mask = ((mp_digit)~0 << (MP_DIGIT_BIT - bshift));
2965 mask &= MP_DIGIT(mp, MP_USED(mp) - 1);
2966
2967 if (MP_OKAY != (res = s_mp_pad(mp, MP_USED(mp) + dshift + (mask != 0) )))
2968 return res;
2969
2970 if (dshift && MP_OKAY != (res = s_mp_lshd(mp, dshift)))
2971 return res;
2972
2973 if (bshift) {
2974 mp_digit *pa = MP_DIGITS(mp);
2975 mp_digit *alim = pa + MP_USED(mp);
2976 mp_digit prev = 0;
2977
2978 for (pa += dshift; pa < alim; ) {
2979 mp_digit x = *pa;
2980 *pa++ = (x << bshift) | prev;
2981 prev = x >> (DIGIT_BIT - bshift);
2982 }
2983 }
2984
2985 s_mp_clamp(mp);
2986 return MP_OKAY;
2987 } /* end s_mp_mul_2d() */
2988
2989 /* {{{ s_mp_rshd(mp, p) */
2990
2991 /*
2992 Shift mp rightward by p digits. Maintains the invariant that
2993 digits above the precision are all zero. Digits shifted off the
2994 end are lost. Cannot fail.
2995 */
2996
2997 void s_mp_rshd(mp_int *mp, mp_size p)
2998 {
2999 mp_size ix;
3000 mp_digit *src, *dst;
3001
3002 if(p == 0)
3003 return;
3004
3005 /* Shortcut when all digits are to be shifted off */
3006 if(p >= USED(mp)) {
3007 s_mp_setz(DIGITS(mp), ALLOC(mp));
3008 USED(mp) = 1;
3009 SIGN(mp) = ZPOS;
3010 return;
3011 }
3012
3013 /* Shift all the significant figures over as needed */
3014 dst = MP_DIGITS(mp);
3015 src = dst + p;
3016 for (ix = USED(mp) - p; ix > 0; ix--)
3017 *dst++ = *src++;
3018
3019 MP_USED(mp) -= p;
3020 /* Fill the top digits with zeroes */
3021 while (p-- > 0)
3022 *dst++ = 0;
3023
3024 #if 0
3025 /* Strip off any leading zeroes */
3026 s_mp_clamp(mp);
3027 #endif
3028
3029 } /* end s_mp_rshd() */
3030
3031 /* }}} */
3032
3033 /* {{{ s_mp_div_2(mp) */
3034
3035 /* Divide by two -- take advantage of radix properties to do it fast */
3036 void s_mp_div_2(mp_int *mp)
3037 {
3038 s_mp_div_2d(mp, 1);
3039
3040 } /* end s_mp_div_2() */
3041
3042 /* }}} */
3043
3044 /* {{{ s_mp_mul_2(mp) */
3045
3046 mp_err s_mp_mul_2(mp_int *mp)
3047 {
3048 mp_digit *pd;
3049 int ix, used;
3050 mp_digit kin = 0;
3051
3052 /* Shift digits leftward by 1 bit */
3053 used = MP_USED(mp);
3054 pd = MP_DIGITS(mp);
3055 for (ix = 0; ix < used; ix++) {
3056 mp_digit d = *pd;
3057 *pd++ = (d << 1) | kin;
3058 kin = (d >> (DIGIT_BIT - 1));
3059 }
3060
3061 /* Deal with rollover from last digit */
3062 if (kin) {
3063 if (ix >= ALLOC(mp)) {
3064 mp_err res;
3065 if((res = s_mp_grow(mp, ALLOC(mp) + 1)) != MP_OKAY)
3066 return res;
3067 }
3068
3069 DIGIT(mp, ix) = kin;
3070 USED(mp) += 1;
3071 }
3072
3073 return MP_OKAY;
3074
3075 } /* end s_mp_mul_2() */
3076
3077 /* }}} */
3078
3079 /* {{{ s_mp_mod_2d(mp, d) */
3080
3081 /*
3082 Remainder the integer by 2^d, where d is a number of bits. This
3083 amounts to a bitwise AND of the value, and does not require the full
3084 division code
3085 */
3086 void s_mp_mod_2d(mp_int *mp, mp_digit d)
3087 {
3088 mp_size ndig = (d / DIGIT_BIT), nbit = (d % DIGIT_BIT);
3089 mp_size ix;
3090 mp_digit dmask;
3091
3092 if(ndig >= USED(mp))
3093 return;
3094
3095 /* Flush all the bits above 2^d in its digit */
3096 dmask = ((mp_digit)1 << nbit) - 1;
3097 DIGIT(mp, ndig) &= dmask;
3098
3099 /* Flush all digits above the one with 2^d in it */
3100 for(ix = ndig + 1; ix < USED(mp); ix++)
3101 DIGIT(mp, ix) = 0;
3102
3103 s_mp_clamp(mp);
3104
3105 } /* end s_mp_mod_2d() */
3106
3107 /* }}} */
3108
3109 /* {{{ s_mp_div_2d(mp, d) */
3110
3111 /*
3112 Divide the integer by 2^d, where d is a number of bits. This
3113 amounts to a bitwise shift of the value, and does not require the
3114 full division code (used in Barrett reduction, see below)
3115 */
3116 void s_mp_div_2d(mp_int *mp, mp_digit d)
3117 {
3118 int ix;
3119 mp_digit save, next, mask;
3120
3121 s_mp_rshd(mp, d / DIGIT_BIT);
3122 d %= DIGIT_BIT;
3123 if (d) {
3124 mask = ((mp_digit)1 << d) - 1;
3125 save = 0;
3126 for(ix = USED(mp) - 1; ix >= 0; ix--) {
3127 next = DIGIT(mp, ix) & mask;
3128 DIGIT(mp, ix) = (DIGIT(mp, ix) >> d) | (save << (DIGIT_BIT - d));
3129 save = next;
3130 }
3131 }
3132 s_mp_clamp(mp);
3133
3134 } /* end s_mp_div_2d() */
3135
3136 /* }}} */
3137
3138 /* {{{ s_mp_norm(a, b, *d) */
3139
3140 /*
3141 s_mp_norm(a, b, *d)
3142
3143 Normalize a and b for division, where b is the divisor. In order
3144 that we might make good guesses for quotient digits, we want the
3145 leading digit of b to be at least half the radix, which we
3146 accomplish by multiplying a and b by a power of 2. The exponent
3147 (shift count) is placed in *pd, so that the remainder can be shifted
3148 back at the end of the division process.
3149 */
3150
3151 mp_err s_mp_norm(mp_int *a, mp_int *b, mp_digit *pd)
3152 {
3153 mp_digit d;
3154 mp_digit mask;
3155 mp_digit b_msd;
3156 mp_err res = MP_OKAY;
3157
3158 d = 0;
3159 mask = DIGIT_MAX & ~(DIGIT_MAX >> 1); /* mask is msb of digit */
3160 b_msd = DIGIT(b, USED(b) - 1);
3161 while (!(b_msd & mask)) {
3162 b_msd <<= 1;
3163 ++d;
3164 }
3165
3166 if (d) {
3167 MP_CHECKOK( s_mp_mul_2d(a, d) );
3168 MP_CHECKOK( s_mp_mul_2d(b, d) );
3169 }
3170
3171 *pd = d;
3172 CLEANUP:
3173 return res;
3174
3175 } /* end s_mp_norm() */
3176
3177 /* }}} */
3178
3179 /* }}} */
3180
3181 /* {{{ Primitive digit arithmetic */
3182
3183 /* {{{ s_mp_add_d(mp, d) */
3184
3185 /* Add d to |mp| in place */
3186 mp_err s_mp_add_d(mp_int *mp, mp_digit d) /* unsigned digit addition */
3187 {
3188 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3189 mp_word w, k = 0;
3190 mp_size ix = 1;
3191
3192 w = (mp_word)DIGIT(mp, 0) + d;
3193 DIGIT(mp, 0) = ACCUM(w);
3194 k = CARRYOUT(w);
3195
3196 while(ix < USED(mp) && k) {
3197 w = (mp_word)DIGIT(mp, ix) + k;
3198 DIGIT(mp, ix) = ACCUM(w);
3199 k = CARRYOUT(w);
3200 ++ix;
3201 }
3202
3203 if(k != 0) {
3204 mp_err res;
3205
3206 if((res = s_mp_pad(mp, USED(mp) + 1)) != MP_OKAY)
3207 return res;
3208
3209 DIGIT(mp, ix) = (mp_digit)k;
3210 }
3211
3212 return MP_OKAY;
3213 #else
3214 mp_digit * pmp = MP_DIGITS(mp);
3215 mp_digit sum, mp_i, carry = 0;
3216 mp_err res = MP_OKAY;
3217 int used = (int)MP_USED(mp);
3218
3219 mp_i = *pmp;
3220 *pmp++ = sum = d + mp_i;
3221 carry = (sum < d);
3222 while (carry && --used > 0) {
3223 mp_i = *pmp;
3224 *pmp++ = sum = carry + mp_i;
3225 carry = !sum;
3226 }
3227 if (carry && !used) {
3228 /* mp is growing */
3229 used = MP_USED(mp);
3230 MP_CHECKOK( s_mp_pad(mp, used + 1) );
3231 MP_DIGIT(mp, used) = carry;
3232 }
3233 CLEANUP:
3234 return res;
3235 #endif
3236 } /* end s_mp_add_d() */
3237
3238 /* }}} */
3239
3240 /* {{{ s_mp_sub_d(mp, d) */
3241
3242 /* Subtract d from |mp| in place, assumes |mp| > d */
3243 mp_err s_mp_sub_d(mp_int *mp, mp_digit d) /* unsigned digit subtract */
3244 {
3245 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3246 mp_word w, b = 0;
3247 mp_size ix = 1;
3248
3249 /* Compute initial subtraction */
3250 w = (RADIX + (mp_word)DIGIT(mp, 0)) - d;
3251 b = CARRYOUT(w) ? 0 : 1;
3252 DIGIT(mp, 0) = ACCUM(w);
3253
3254 /* Propagate borrows leftward */
3255 while(b && ix < USED(mp)) {
3256 w = (RADIX + (mp_word)DIGIT(mp, ix)) - b;
3257 b = CARRYOUT(w) ? 0 : 1;
3258 DIGIT(mp, ix) = ACCUM(w);
3259 ++ix;
3260 }
3261
3262 /* Remove leading zeroes */
3263 s_mp_clamp(mp);
3264
3265 /* If we have a borrow out, it's a violation of the input invariant */
3266 if(b)
3267 return MP_RANGE;
3268 else
3269 return MP_OKAY;
3270 #else
3271 mp_digit *pmp = MP_DIGITS(mp);
3272 mp_digit mp_i, diff, borrow;
3273 mp_size used = MP_USED(mp);
3274
3275 mp_i = *pmp;
3276 *pmp++ = diff = mp_i - d;
3277 borrow = (diff > mp_i);
3278 while (borrow && --used) {
3279 mp_i = *pmp;
3280 *pmp++ = diff = mp_i - borrow;
3281 borrow = (diff > mp_i);
3282 }
3283 s_mp_clamp(mp);
3284 return (borrow && !used) ? MP_RANGE : MP_OKAY;
3285 #endif
3286 } /* end s_mp_sub_d() */
3287
3288 /* }}} */
3289
3290 /* {{{ s_mp_mul_d(a, d) */
3291
3292 /* Compute a = a * d, single digit multiplication */
3293 mp_err s_mp_mul_d(mp_int *a, mp_digit d)
3294 {
3295 mp_err res;
3296 mp_size used;
3297 int pow;
3298
3299 if (!d) {
3300 mp_zero(a);
3301 return MP_OKAY;
3302 }
3303 if (d == 1)
3304 return MP_OKAY;
3305 if (0 <= (pow = s_mp_ispow2d(d))) {
3306 return s_mp_mul_2d(a, (mp_digit)pow);
3307 }
3308
3309 used = MP_USED(a);
3310 MP_CHECKOK( s_mp_pad(a, used + 1) );
3311
3312 s_mpv_mul_d(MP_DIGITS(a), used, d, MP_DIGITS(a));
3313
3314 s_mp_clamp(a);
3315
3316 CLEANUP:
3317 return res;
3318
3319 } /* end s_mp_mul_d() */
3320
3321 /* }}} */
3322
3323 /* {{{ s_mp_div_d(mp, d, r) */
3324
3325 /*
3326 s_mp_div_d(mp, d, r)
3327
3328 Compute the quotient mp = mp / d and remainder r = mp mod d, for a
3329 single digit d. If r is null, the remainder will be discarded.
3330 */
3331
3332 mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r)
3333 {
3334 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_DIV_WORD)
3335 mp_word w = 0, q;
3336 #else
3337 mp_digit w, q;
3338 #endif
3339 int ix;
3340 mp_err res;
3341 mp_int quot;
3342 mp_int rem;
3343
3344 if(d == 0)
3345 return MP_RANGE;
3346 if (d == 1) {
3347 if (r)
3348 *r = 0;
3349 return MP_OKAY;
3350 }
3351 /* could check for power of 2 here, but mp_div_d does that. */
3352 if (MP_USED(mp) == 1) {
3353 mp_digit n = MP_DIGIT(mp,0);
3354 mp_digit rem;
3355
3356 q = n / d;
3357 rem = n % d;
3358 MP_DIGIT(mp,0) = q;
3359 if (r)
3360 *r = rem;
3361 return MP_OKAY;
3362 }
3363
3364 MP_DIGITS(&rem) = 0;
3365 MP_DIGITS(&quot) = 0;
3366 /* Make room for the quotient */
3367 MP_CHECKOK( mp_init_size(&quot, USED(mp)) );
3368
3369 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_DIV_WORD)
3370 for(ix = USED(mp) - 1; ix >= 0; ix--) {
3371 w = (w << DIGIT_BIT) | DIGIT(mp, ix);
3372
3373 if(w >= d) {
3374 q = w / d;
3375 w = w % d;
3376 } else {
3377 q = 0;
3378 }
3379
3380 s_mp_lshd(&quot, 1);
3381 DIGIT(&quot, 0) = (mp_digit)q;
3382 }
3383 #else
3384 {
3385 mp_digit p;
3386 #if !defined(MP_ASSEMBLY_DIV_2DX1D)
3387 mp_digit norm;
3388 #endif
3389
3390 MP_CHECKOK( mp_init_copy(&rem, mp) );
3391
3392 #if !defined(MP_ASSEMBLY_DIV_2DX1D)
3393 MP_DIGIT(&quot, 0) = d;
3394 MP_CHECKOK( s_mp_norm(&rem, &quot, &norm) );
3395 if (norm)
3396 d <<= norm;
3397 MP_DIGIT(&quot, 0) = 0;
3398 #endif
3399
3400 p = 0;
3401 for (ix = USED(&rem) - 1; ix >= 0; ix--) {
3402 w = DIGIT(&rem, ix);
3403
3404 if (p) {
3405 MP_CHECKOK( s_mpv_div_2dx1d(p, w, d, &q, &w) );
3406 } else if (w >= d) {
3407 q = w / d;
3408 w = w % d;
3409 } else {
3410 q = 0;
3411 }
3412
3413 MP_CHECKOK( s_mp_lshd(&quot, 1) );
3414 DIGIT(&quot, 0) = q;
3415 p = w;
3416 }
3417 #if !defined(MP_ASSEMBLY_DIV_2DX1D)
3418 if (norm)
3419 w >>= norm;
3420 #endif
3421 }
3422 #endif
3423
3424 /* Deliver the remainder, if desired */
3425 if(r)
3426 *r = (mp_digit)w;
3427
3428 s_mp_clamp(&quot);
3429 mp_exch(&quot, mp);
3430 CLEANUP:
3431 mp_clear(&quot);
3432 mp_clear(&rem);
3433
3434 return res;
3435 } /* end s_mp_div_d() */
3436
3437 /* }}} */
3438
3439
3440 /* }}} */
3441
3442 /* {{{ Primitive full arithmetic */
3443
3444 /* {{{ s_mp_add(a, b) */
3445
3446 /* Compute a = |a| + |b| */
3447 mp_err s_mp_add(mp_int *a, const mp_int *b) /* magnitude addition */
3448 {
3449 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3450 mp_word w = 0;
3451 #else
3452 mp_digit d, sum, carry = 0;
3453 #endif
3454 mp_digit *pa, *pb;
3455 mp_size ix;
3456 mp_size used;
3457 mp_err res;
3458
3459 /* Make sure a has enough precision for the output value */
3460 if((USED(b) > USED(a)) && (res = s_mp_pad(a, USED(b))) != MP_OKAY)
3461 return res;
3462
3463 /*
3464 Add up all digits up to the precision of b. If b had initially
3465 the same precision as a, or greater, we took care of it by the
3466 padding step above, so there is no problem. If b had initially
3467 less precision, we'll have to make sure the carry out is duly
3468 propagated upward among the higher-order digits of the sum.
3469 */
3470 pa = MP_DIGITS(a);
3471 pb = MP_DIGITS(b);
3472 used = MP_USED(b);
3473 for(ix = 0; ix < used; ix++) {
3474 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3475 w = w + *pa + *pb++;
3476 *pa++ = ACCUM(w);
3477 w = CARRYOUT(w);
3478 #else
3479 d = *pa;
3480 sum = d + *pb++;
3481 d = (sum < d); /* detect overflow */
3482 *pa++ = sum += carry;
3483 carry = d + (sum < carry); /* detect overflow */
3484 #endif
3485 }
3486
3487 /* If we run out of 'b' digits before we're actually done, make
3488 sure the carries get propagated upward...
3489 */
3490 used = MP_USED(a);
3491 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3492 while (w && ix < used) {
3493 w = w + *pa;
3494 *pa++ = ACCUM(w);
3495 w = CARRYOUT(w);
3496 ++ix;
3497 }
3498 #else
3499 while (carry && ix < used) {
3500 sum = carry + *pa;
3501 *pa++ = sum;
3502 carry = !sum;
3503 ++ix;
3504 }
3505 #endif
3506
3507 /* If there's an overall carry out, increase precision and include
3508 it. We could have done this initially, but why touch the memory
3509 allocator unless we're sure we have to?
3510 */
3511 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3512 if (w) {
3513 if((res = s_mp_pad(a, used + 1)) != MP_OKAY)
3514 return res;
3515
3516 DIGIT(a, ix) = (mp_digit)w;
3517 }
3518 #else
3519 if (carry) {
3520 if((res = s_mp_pad(a, used + 1)) != MP_OKAY)
3521 return res;
3522
3523 DIGIT(a, used) = carry;
3524 }
3525 #endif
3526
3527 return MP_OKAY;
3528 } /* end s_mp_add() */
3529
3530 /* }}} */
3531
3532 /* Compute c = |a| + |b| */ /* magnitude addition */
3533 mp_err s_mp_add_3arg(const mp_int *a, const mp_int *b, mp_int *c)
3534 {
3535 mp_digit *pa, *pb, *pc;
3536 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3537 mp_word w = 0;
3538 #else
3539 mp_digit sum, carry = 0, d;
3540 #endif
3541 mp_size ix;
3542 mp_size used;
3543 mp_err res;
3544
3545 MP_SIGN(c) = MP_SIGN(a);
3546 if (MP_USED(a) < MP_USED(b)) {
3547 const mp_int *xch = a;
3548 a = b;
3549 b = xch;
3550 }
3551
3552 /* Make sure a has enough precision for the output value */
3553 if (MP_OKAY != (res = s_mp_pad(c, MP_USED(a))))
3554 return res;
3555
3556 /*
3557 Add up all digits up to the precision of b. If b had initially
3558 the same precision as a, or greater, we took care of it by the
3559 exchange step above, so there is no problem. If b had initially
3560 less precision, we'll have to make sure the carry out is duly
3561 propagated upward among the higher-order digits of the sum.
3562 */
3563 pa = MP_DIGITS(a);
3564 pb = MP_DIGITS(b);
3565 pc = MP_DIGITS(c);
3566 used = MP_USED(b);
3567 for (ix = 0; ix < used; ix++) {
3568 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3569 w = w + *pa++ + *pb++;
3570 *pc++ = ACCUM(w);
3571 w = CARRYOUT(w);
3572 #else
3573 d = *pa++;
3574 sum = d + *pb++;
3575 d = (sum < d); /* detect overflow */
3576 *pc++ = sum += carry;
3577 carry = d + (sum < carry); /* detect overflow */
3578 #endif
3579 }
3580
3581 /* If we run out of 'b' digits before we're actually done, make
3582 sure the carries get propagated upward...
3583 */
3584 for (used = MP_USED(a); ix < used; ++ix) {
3585 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3586 w = w + *pa++;
3587 *pc++ = ACCUM(w);
3588 w = CARRYOUT(w);
3589 #else
3590 *pc++ = sum = carry + *pa++;
3591 carry = (sum < carry);
3592 #endif
3593 }
3594
3595 /* If there's an overall carry out, increase precision and include
3596 it. We could have done this initially, but why touch the memory
3597 allocator unless we're sure we have to?
3598 */
3599 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3600 if (w) {
3601 if((res = s_mp_pad(c, used + 1)) != MP_OKAY)
3602 return res;
3603
3604 DIGIT(c, used) = (mp_digit)w;
3605 ++used;
3606 }
3607 #else
3608 if (carry) {
3609 if((res = s_mp_pad(c, used + 1)) != MP_OKAY)
3610 return res;
3611
3612 DIGIT(c, used) = carry;
3613 ++used;
3614 }
3615 #endif
3616 MP_USED(c) = used;
3617 return MP_OKAY;
3618 }
3619 /* {{{ s_mp_add_offset(a, b, offset) */
3620
3621 /* Compute a = |a| + ( |b| * (RADIX ** offset) ) */
3622 mp_err s_mp_add_offset(mp_int *a, mp_int *b, mp_size offset)
3623 {
3624 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3625 mp_word w, k = 0;
3626 #else
3627 mp_digit d, sum, carry = 0;
3628 #endif
3629 mp_size ib;
3630 mp_size ia;
3631 mp_size lim;
3632 mp_err res;
3633
3634 /* Make sure a has enough precision for the output value */
3635 lim = MP_USED(b) + offset;
3636 if((lim > USED(a)) && (res = s_mp_pad(a, lim)) != MP_OKAY)
3637 return res;
3638
3639 /*
3640 Add up all digits up to the precision of b. If b had initially
3641 the same precision as a, or greater, we took care of it by the
3642 padding step above, so there is no problem. If b had initially
3643 less precision, we'll have to make sure the carry out is duly
3644 propagated upward among the higher-order digits of the sum.
3645 */
3646 lim = USED(b);
3647 for(ib = 0, ia = offset; ib < lim; ib++, ia++) {
3648 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3649 w = (mp_word)DIGIT(a, ia) + DIGIT(b, ib) + k;
3650 DIGIT(a, ia) = ACCUM(w);
3651 k = CARRYOUT(w);
3652 #else
3653 d = MP_DIGIT(a, ia);
3654 sum = d + MP_DIGIT(b, ib);
3655 d = (sum < d);
3656 MP_DIGIT(a,ia) = sum += carry;
3657 carry = d + (sum < carry);
3658 #endif
3659 }
3660
3661 /* If we run out of 'b' digits before we're actually done, make
3662 sure the carries get propagated upward...
3663 */
3664 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3665 for (lim = MP_USED(a); k && (ia < lim); ++ia) {
3666 w = (mp_word)DIGIT(a, ia) + k;
3667 DIGIT(a, ia) = ACCUM(w);
3668 k = CARRYOUT(w);
3669 }
3670 #else
3671 for (lim = MP_USED(a); carry && (ia < lim); ++ia) {
3672 d = MP_DIGIT(a, ia);
3673 MP_DIGIT(a,ia) = sum = d + carry;
3674 carry = (sum < d);
3675 }
3676 #endif
3677
3678 /* If there's an overall carry out, increase precision and include
3679 it. We could have done this initially, but why touch the memory
3680 allocator unless we're sure we have to?
3681 */
3682 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_ADD_WORD)
3683 if(k) {
3684 if((res = s_mp_pad(a, USED(a) + 1)) != MP_OKAY)
3685 return res;
3686
3687 DIGIT(a, ia) = (mp_digit)k;
3688 }
3689 #else
3690 if (carry) {
3691 if((res = s_mp_pad(a, lim + 1)) != MP_OKAY)
3692 return res;
3693
3694 DIGIT(a, lim) = carry;
3695 }
3696 #endif
3697 s_mp_clamp(a);
3698
3699 return MP_OKAY;
3700
3701 } /* end s_mp_add_offset() */
3702
3703 /* }}} */
3704
3705 /* {{{ s_mp_sub(a, b) */
3706
3707 /* Compute a = |a| - |b|, assumes |a| >= |b| */
3708 mp_err s_mp_sub(mp_int *a, const mp_int *b) /* magnitude subtract */
3709 {
3710 mp_digit *pa, *pb, *limit;
3711 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3712 mp_sword w = 0;
3713 #else
3714 mp_digit d, diff, borrow = 0;
3715 #endif
3716
3717 /*
3718 Subtract and propagate borrow. Up to the precision of b, this
3719 accounts for the digits of b; after that, we just make sure the
3720 carries get to the right place. This saves having to pad b out to
3721 the precision of a just to make the loops work right...
3722 */
3723 pa = MP_DIGITS(a);
3724 pb = MP_DIGITS(b);
3725 limit = pb + MP_USED(b);
3726 while (pb < limit) {
3727 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3728 w = w + *pa - *pb++;
3729 *pa++ = ACCUM(w);
3730 w >>= MP_DIGIT_BIT;
3731 #else
3732 d = *pa;
3733 diff = d - *pb++;
3734 d = (diff > d); /* detect borrow */
3735 if (borrow && --diff == MP_DIGIT_MAX)
3736 ++d;
3737 *pa++ = diff;
3738 borrow = d;
3739 #endif
3740 }
3741 limit = MP_DIGITS(a) + MP_USED(a);
3742 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3743 while (w && pa < limit) {
3744 w = w + *pa;
3745 *pa++ = ACCUM(w);
3746 w >>= MP_DIGIT_BIT;
3747 }
3748 #else
3749 while (borrow && pa < limit) {
3750 d = *pa;
3751 *pa++ = diff = d - borrow;
3752 borrow = (diff > d);
3753 }
3754 #endif
3755
3756 /* Clobber any leading zeroes we created */
3757 s_mp_clamp(a);
3758
3759 /*
3760 If there was a borrow out, then |b| > |a| in violation
3761 of our input invariant. We've already done the work,
3762 but we'll at least complain about it...
3763 */
3764 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3765 return w ? MP_RANGE : MP_OKAY;
3766 #else
3767 return borrow ? MP_RANGE : MP_OKAY;
3768 #endif
3769 } /* end s_mp_sub() */
3770
3771 /* }}} */
3772
3773 /* Compute c = |a| - |b|, assumes |a| >= |b| */ /* magnitude subtract */
3774 mp_err s_mp_sub_3arg(const mp_int *a, const mp_int *b, mp_int *c)
3775 {
3776 mp_digit *pa, *pb, *pc;
3777 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3778 mp_sword w = 0;
3779 #else
3780 mp_digit d, diff, borrow = 0;
3781 #endif
3782 int ix, limit;
3783 mp_err res;
3784
3785 MP_SIGN(c) = MP_SIGN(a);
3786
3787 /* Make sure a has enough precision for the output value */
3788 if (MP_OKAY != (res = s_mp_pad(c, MP_USED(a))))
3789 return res;
3790
3791 /*
3792 Subtract and propagate borrow. Up to the precision of b, this
3793 accounts for the digits of b; after that, we just make sure the
3794 carries get to the right place. This saves having to pad b out to
3795 the precision of a just to make the loops work right...
3796 */
3797 pa = MP_DIGITS(a);
3798 pb = MP_DIGITS(b);
3799 pc = MP_DIGITS(c);
3800 limit = MP_USED(b);
3801 for (ix = 0; ix < limit; ++ix) {
3802 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3803 w = w + *pa++ - *pb++;
3804 *pc++ = ACCUM(w);
3805 w >>= MP_DIGIT_BIT;
3806 #else
3807 d = *pa++;
3808 diff = d - *pb++;
3809 d = (diff > d);
3810 if (borrow && --diff == MP_DIGIT_MAX)
3811 ++d;
3812 *pc++ = diff;
3813 borrow = d;
3814 #endif
3815 }
3816 for (limit = MP_USED(a); ix < limit; ++ix) {
3817 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3818 w = w + *pa++;
3819 *pc++ = ACCUM(w);
3820 w >>= MP_DIGIT_BIT;
3821 #else
3822 d = *pa++;
3823 *pc++ = diff = d - borrow;
3824 borrow = (diff > d);
3825 #endif
3826 }
3827
3828 /* Clobber any leading zeroes we created */
3829 MP_USED(c) = ix;
3830 s_mp_clamp(c);
3831
3832 /*
3833 If there was a borrow out, then |b| > |a| in violation
3834 of our input invariant. We've already done the work,
3835 but we'll at least complain about it...
3836 */
3837 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_SUB_WORD)
3838 return w ? MP_RANGE : MP_OKAY;
3839 #else
3840 return borrow ? MP_RANGE : MP_OKAY;
3841 #endif
3842 }
3843 /* {{{ s_mp_mul(a, b) */
3844
3845 /* Compute a = |a| * |b| */
3846 mp_err s_mp_mul(mp_int *a, const mp_int *b)
3847 {
3848 return mp_mul(a, b, a);
3849 } /* end s_mp_mul() */
3850
3851 /* }}} */
3852
3853 #if defined(MP_USE_UINT_DIGIT) && defined(MP_USE_LONG_LONG_MULTIPLY)
3854 /* This trick works on Sparc V8 CPUs with the Workshop compilers. */
3855 #define MP_MUL_DxD(a, b, Phi, Plo) \
3856 { unsigned long long product = (unsigned long long)a * b; \
3857 Plo = (mp_digit)product; \
3858 Phi = (mp_digit)(product >> MP_DIGIT_BIT); }
3859 #elif defined(OSF1)
3860 #define MP_MUL_DxD(a, b, Phi, Plo) \
3861 { Plo = asm ("mulq %a0, %a1, %v0", a, b);\
3862 Phi = asm ("umulh %a0, %a1, %v0", a, b); }
3863 #else
3864 #define MP_MUL_DxD(a, b, Phi, Plo) \
3865 { mp_digit a0b1, a1b0; \
3866 Plo = (a & MP_HALF_DIGIT_MAX) * (b & MP_HALF_DIGIT_MAX); \
3867 Phi = (a >> MP_HALF_DIGIT_BIT) * (b >> MP_HALF_DIGIT_BIT); \
3868 a0b1 = (a & MP_HALF_DIGIT_MAX) * (b >> MP_HALF_DIGIT_BIT); \
3869 a1b0 = (a >> MP_HALF_DIGIT_BIT) * (b & MP_HALF_DIGIT_MAX); \
3870 a1b0 += a0b1; \
3871 Phi += a1b0 >> MP_HALF_DIGIT_BIT; \
3872 if (a1b0 < a0b1) \
3873 Phi += MP_HALF_RADIX; \
3874 a1b0 <<= MP_HALF_DIGIT_BIT; \
3875 Plo += a1b0; \
3876 if (Plo < a1b0) \
3877 ++Phi; \
3878 }
3879 #endif
3880
3881 #if !defined(MP_ASSEMBLY_MULTIPLY)
3882 /* c = a * b */
3883 void s_mpv_mul_d(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
3884 {
3885 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_MUL_WORD)
3886 mp_digit d = 0;
3887
3888 /* Inner product: Digits of a */
3889 while (a_len--) {
3890 mp_word w = ((mp_word)b * *a++) + d;
3891 *c++ = ACCUM(w);
3892 d = CARRYOUT(w);
3893 }
3894 *c = d;
3895 #else
3896 mp_digit carry = 0;
3897 while (a_len--) {
3898 mp_digit a_i = *a++;
3899 mp_digit a0b0, a1b1;
3900
3901 MP_MUL_DxD(a_i, b, a1b1, a0b0);
3902
3903 a0b0 += carry;
3904 if (a0b0 < carry)
3905 ++a1b1;
3906 *c++ = a0b0;
3907 carry = a1b1;
3908 }
3909 *c = carry;
3910 #endif
3911 }
3912
3913 /* c += a * b */
3914 void s_mpv_mul_d_add(const mp_digit *a, mp_size a_len, mp_digit b,
3915 mp_digit *c)
3916 {
3917 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_MUL_WORD)
3918 mp_digit d = 0;
3919
3920 /* Inner product: Digits of a */
3921 while (a_len--) {
3922 mp_word w = ((mp_word)b * *a++) + *c + d;
3923 *c++ = ACCUM(w);
3924 d = CARRYOUT(w);
3925 }
3926 *c = d;
3927 #else
3928 mp_digit carry = 0;
3929 while (a_len--) {
3930 mp_digit a_i = *a++;
3931 mp_digit a0b0, a1b1;
3932
3933 MP_MUL_DxD(a_i, b, a1b1, a0b0);
3934
3935 a0b0 += carry;
3936 if (a0b0 < carry)
3937 ++a1b1;
3938 a0b0 += a_i = *c;
3939 if (a0b0 < a_i)
3940 ++a1b1;
3941 *c++ = a0b0;
3942 carry = a1b1;
3943 }
3944 *c = carry;
3945 #endif
3946 }
3947
3948 /* Presently, this is only used by the Montgomery arithmetic code. */
3949 /* c += a * b */
3950 void s_mpv_mul_d_add_prop(const mp_digit *a, mp_size a_len, mp_digit b, mp_digit *c)
3951 {
3952 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_MUL_WORD)
3953 mp_digit d = 0;
3954
3955 /* Inner product: Digits of a */
3956 while (a_len--) {
3957 mp_word w = ((mp_word)b * *a++) + *c + d;
3958 *c++ = ACCUM(w);
3959 d = CARRYOUT(w);
3960 }
3961
3962 while (d) {
3963 mp_word w = (mp_word)*c + d;
3964 *c++ = ACCUM(w);
3965 d = CARRYOUT(w);
3966 }
3967 #else
3968 mp_digit carry = 0;
3969 while (a_len--) {
3970 mp_digit a_i = *a++;
3971 mp_digit a0b0, a1b1;
3972
3973 MP_MUL_DxD(a_i, b, a1b1, a0b0);
3974
3975 a0b0 += carry;
3976 if (a0b0 < carry)
3977 ++a1b1;
3978
3979 a0b0 += a_i = *c;
3980 if (a0b0 < a_i)
3981 ++a1b1;
3982
3983 *c++ = a0b0;
3984 carry = a1b1;
3985 }
3986 while (carry) {
3987 mp_digit c_i = *c;
3988 carry += c_i;
3989 *c++ = carry;
3990 carry = carry < c_i;
3991 }
3992 #endif
3993 }
3994 #endif
3995
3996 #if defined(MP_USE_UINT_DIGIT) && defined(MP_USE_LONG_LONG_MULTIPLY)
3997 /* This trick works on Sparc V8 CPUs with the Workshop compilers. */
3998 #define MP_SQR_D(a, Phi, Plo) \
3999 { unsigned long long square = (unsigned long long)a * a; \
4000 Plo = (mp_digit)square; \
4001 Phi = (mp_digit)(square >> MP_DIGIT_BIT); }
4002 #elif defined(OSF1)
4003 #define MP_SQR_D(a, Phi, Plo) \
4004 { Plo = asm ("mulq %a0, %a0, %v0", a);\
4005 Phi = asm ("umulh %a0, %a0, %v0", a); }
4006 #else
4007 #define MP_SQR_D(a, Phi, Plo) \
4008 { mp_digit Pmid; \
4009 Plo = (a & MP_HALF_DIGIT_MAX) * (a & MP_HALF_DIGIT_MAX); \
4010 Phi = (a >> MP_HALF_DIGIT_BIT) * (a >> MP_HALF_DIGIT_BIT); \
4011 Pmid = (a & MP_HALF_DIGIT_MAX) * (a >> MP_HALF_DIGIT_BIT); \
4012 Phi += Pmid >> (MP_HALF_DIGIT_BIT - 1); \
4013 Pmid <<= (MP_HALF_DIGIT_BIT + 1); \
4014 Plo += Pmid; \
4015 if (Plo < Pmid) \
4016 ++Phi; \
4017 }
4018 #endif
4019
4020 #if !defined(MP_ASSEMBLY_SQUARE)
4021 /* Add the squares of the digits of a to the digits of b. */
4022 void s_mpv_sqr_add_prop(const mp_digit *pa, mp_size a_len, mp_digit *ps)
4023 {
4024 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_MUL_WORD)
4025 mp_word w;
4026 mp_digit d;
4027 mp_size ix;
4028
4029 w = 0;
4030 #define ADD_SQUARE(n) \
4031 d = pa[n]; \
4032 w += (d * (mp_word)d) + ps[2*n]; \
4033 ps[2*n] = ACCUM(w); \
4034 w = (w >> DIGIT_BIT) + ps[2*n+1]; \
4035 ps[2*n+1] = ACCUM(w); \
4036 w = (w >> DIGIT_BIT)
4037
4038 for (ix = a_len; ix >= 4; ix -= 4) {
4039 ADD_SQUARE(0);
4040 ADD_SQUARE(1);
4041 ADD_SQUARE(2);
4042 ADD_SQUARE(3);
4043 pa += 4;
4044 ps += 8;
4045 }
4046 if (ix) {
4047 ps += 2*ix;
4048 pa += ix;
4049 switch (ix) {
4050 case 3: ADD_SQUARE(-3); /* FALLTHRU */
4051 case 2: ADD_SQUARE(-2); /* FALLTHRU */
4052 case 1: ADD_SQUARE(-1); /* FALLTHRU */
4053 case 0: break;
4054 }
4055 }
4056 while (w) {
4057 w += *ps;
4058 *ps++ = ACCUM(w);
4059 w = (w >> DIGIT_BIT);
4060 }
4061 #else
4062 mp_digit carry = 0;
4063 while (a_len--) {
4064 mp_digit a_i = *pa++;
4065 mp_digit a0a0, a1a1;
4066
4067 MP_SQR_D(a_i, a1a1, a0a0);
4068
4069 /* here a1a1 and a0a0 constitute a_i ** 2 */
4070 a0a0 += carry;
4071 if (a0a0 < carry)
4072 ++a1a1;
4073
4074 /* now add to ps */
4075 a0a0 += a_i = *ps;
4076 if (a0a0 < a_i)
4077 ++a1a1;
4078 *ps++ = a0a0;
4079 a1a1 += a_i = *ps;
4080 carry = (a1a1 < a_i);
4081 *ps++ = a1a1;
4082 }
4083 while (carry) {
4084 mp_digit s_i = *ps;
4085 carry += s_i;
4086 *ps++ = carry;
4087 carry = carry < s_i;
4088 }
4089 #endif
4090 }
4091 #endif
4092
4093 #if (defined(MP_NO_MP_WORD) || defined(MP_NO_DIV_WORD)) \
4094 && !defined(MP_ASSEMBLY_DIV_2DX1D)
4095 /*
4096 ** Divide 64-bit (Nhi,Nlo) by 32-bit divisor, which must be normalized
4097 ** so its high bit is 1. This code is from NSPR.
4098 */
4099 mp_err s_mpv_div_2dx1d(mp_digit Nhi, mp_digit Nlo, mp_digit divisor,
4100 mp_digit *qp, mp_digit *rp)
4101 {
4102 mp_digit d1, d0, q1, q0;
4103 mp_digit r1, r0, m;
4104
4105 d1 = divisor >> MP_HALF_DIGIT_BIT;
4106 d0 = divisor & MP_HALF_DIGIT_MAX;
4107 r1 = Nhi % d1;
4108 q1 = Nhi / d1;
4109 m = q1 * d0;
4110 r1 = (r1 << MP_HALF_DIGIT_BIT) | (Nlo >> MP_HALF_DIGIT_BIT);
4111 if (r1 < m) {
4112 q1--, r1 += divisor;
4113 if (r1 >= divisor && r1 < m) {
4114 q1--, r1 += divisor;
4115 }
4116 }
4117 r1 -= m;
4118 r0 = r1 % d1;
4119 q0 = r1 / d1;
4120 m = q0 * d0;
4121 r0 = (r0 << MP_HALF_DIGIT_BIT) | (Nlo & MP_HALF_DIGIT_MAX);
4122 if (r0 < m) {
4123 q0--, r0 += divisor;
4124 if (r0 >= divisor && r0 < m) {
4125 q0--, r0 += divisor;
4126 }
4127 }
4128 if (qp)
4129 *qp = (q1 << MP_HALF_DIGIT_BIT) | q0;
4130 if (rp)
4131 *rp = r0 - m;
4132 return MP_OKAY;
4133 }
4134 #endif
4135
4136 #if MP_SQUARE
4137 /* {{{ s_mp_sqr(a) */
4138
4139 mp_err s_mp_sqr(mp_int *a)
4140 {
4141 mp_err res;
4142 mp_int tmp;
4143
4144 if((res = mp_init_size(&tmp, 2 * USED(a))) != MP_OKAY)
4145 return res;
4146 res = mp_sqr(a, &tmp);
4147 if (res == MP_OKAY) {
4148 s_mp_exch(&tmp, a);
4149 }
4150 mp_clear(&tmp);
4151 return res;
4152 }
4153
4154 /* }}} */
4155 #endif
4156
4157 /* {{{ s_mp_div(a, b) */
4158
4159 /*
4160 s_mp_div(a, b)
4161
4162 Compute a = a / b and b = a mod b. Assumes b > a.
4163 */
4164
4165 mp_err s_mp_div(mp_int *rem, /* i: dividend, o: remainder */
4166 mp_int *div, /* i: divisor */
4167 mp_int *quot) /* i: 0; o: quotient */
4168 {
4169 mp_int part, t;
4170 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_DIV_WORD)
4171 mp_word q_msd;
4172 #else
4173 mp_digit q_msd;
4174 #endif
4175 mp_err res;
4176 mp_digit d;
4177 mp_digit div_msd;
4178 int ix;
4179
4180 if(mp_cmp_z(div) == 0)
4181 return MP_RANGE;
4182
4183 DIGITS(&t) = 0;
4184 /* Shortcut if divisor is power of two */
4185 if((ix = s_mp_ispow2(div)) >= 0) {
4186 MP_CHECKOK( mp_copy(rem, quot) );
4187 s_mp_div_2d(quot, (mp_digit)ix);
4188 s_mp_mod_2d(rem, (mp_digit)ix);
4189
4190 return MP_OKAY;
4191 }
4192
4193 MP_SIGN(rem) = ZPOS;
4194 MP_SIGN(div) = ZPOS;
4195
4196 /* A working temporary for division */
4197 MP_CHECKOK( mp_init_size(&t, MP_ALLOC(rem)));
4198
4199 /* Normalize to optimize guessing */
4200 MP_CHECKOK( s_mp_norm(rem, div, &d) );
4201
4202 part = *rem;
4203
4204 /* Perform the division itself...woo! */
4205 MP_USED(quot) = MP_ALLOC(quot);
4206
4207 /* Find a partial substring of rem which is at least div */
4208 /* If we didn't find one, we're finished dividing */
4209 while (MP_USED(rem) > MP_USED(div) || s_mp_cmp(rem, div) >= 0) {
4210 int i;
4211 int unusedRem;
4212
4213 unusedRem = MP_USED(rem) - MP_USED(div);
4214 MP_DIGITS(&part) = MP_DIGITS(rem) + unusedRem;
4215 MP_ALLOC(&part) = MP_ALLOC(rem) - unusedRem;
4216 MP_USED(&part) = MP_USED(div);
4217 if (s_mp_cmp(&part, div) < 0) {
4218 -- unusedRem;
4219 #if MP_ARGCHK == 2
4220 assert(unusedRem >= 0);
4221 #endif
4222 -- MP_DIGITS(&part);
4223 ++ MP_USED(&part);
4224 ++ MP_ALLOC(&part);
4225 }
4226
4227 /* Compute a guess for the next quotient digit */
4228 q_msd = MP_DIGIT(&part, MP_USED(&part) - 1);
4229 div_msd = MP_DIGIT(div, MP_USED(div) - 1);
4230 if (q_msd >= div_msd) {
4231 q_msd = 1;
4232 } else if (MP_USED(&part) > 1) {
4233 #if !defined(MP_NO_MP_WORD) && !defined(MP_NO_DIV_WORD)
4234 q_msd = (q_msd << MP_DIGIT_BIT) | MP_DIGIT(&part, MP_USED(&part) - 2);
4235 q_msd /= div_msd;
4236 if (q_msd == RADIX)
4237 --q_msd;
4238 #else
4239 mp_digit r;
4240 MP_CHECKOK( s_mpv_div_2dx1d(q_msd, MP_DIGIT(&part, MP_USED(&part) - 2),
4241 div_msd, &q_msd, &r) );
4242 #endif
4243 } else {
4244 q_msd = 0;
4245 }
4246 #if MP_ARGCHK == 2
4247 assert(q_msd > 0); /* This case should never occur any more. */
4248 #endif
4249 if (q_msd <= 0)
4250 break;
4251
4252 /* See what that multiplies out to */
4253 mp_copy(div, &t);
4254 MP_CHECKOK( s_mp_mul_d(&t, (mp_digit)q_msd) );
4255
4256 /*
4257 If it's too big, back it off. We should not have to do this
4258 more than once, or, in rare cases, twice. Knuth describes a
4259 method by which this could be reduced to a maximum of once, but
4260 I didn't implement that here.
4261 * When using s_mpv_div_2dx1d, we may have to do this 3 times.
4262 */
4263 for (i = 4; s_mp_cmp(&t, &part) > 0 && i > 0; --i) {
4264 --q_msd;
4265 s_mp_sub(&t, div); /* t -= div */
4266 }
4267 if (i < 0) {
4268 res = MP_RANGE;
4269 goto CLEANUP;
4270 }
4271
4272 /* At this point, q_msd should be the right next digit */
4273 MP_CHECKOK( s_mp_sub(&part, &t) ); /* part -= t */
4274 s_mp_clamp(rem);
4275
4276 /*
4277 Include the digit in the quotient. We allocated enough memory
4278 for any quotient we could ever possibly get, so we should not
4279 have to check for failures here
4280 */
4281 MP_DIGIT(quot, unusedRem) = (mp_digit)q_msd;
4282 }
4283
4284 /* Denormalize remainder */
4285 if (d) {
4286 s_mp_div_2d(rem, d);
4287 }
4288
4289 s_mp_clamp(quot);
4290
4291 CLEANUP:
4292 mp_clear(&t);
4293
4294 return res;
4295
4296 } /* end s_mp_div() */
4297
4298
4299 /* }}} */
4300
4301 /* {{{ s_mp_2expt(a, k) */
4302
4303 mp_err s_mp_2expt(mp_int *a, mp_digit k)
4304 {
4305 mp_err res;
4306 mp_size dig, bit;
4307
4308 dig = k / DIGIT_BIT;
4309 bit = k % DIGIT_BIT;
4310
4311 mp_zero(a);
4312 if((res = s_mp_pad(a, dig + 1)) != MP_OKAY)
4313 return res;
4314
4315 DIGIT(a, dig) |= ((mp_digit)1 << bit);
4316
4317 return MP_OKAY;
4318
4319 } /* end s_mp_2expt() */
4320
4321 /* }}} */
4322
4323 /* {{{ s_mp_reduce(x, m, mu) */
4324
4325 /*
4326 Compute Barrett reduction, x (mod m), given a precomputed value for
4327 mu = b^2k / m, where b = RADIX and k = #digits(m). This should be
4328 faster than straight division, when many reductions by the same
4329 value of m are required (such as in modular exponentiation). This
4330 can nearly halve the time required to do modular exponentiation,
4331 as compared to using the full integer divide to reduce.
4332
4333 This algorithm was derived from the _Handbook of Applied
4334 Cryptography_ by Menezes, Oorschot and VanStone, Ch. 14,
4335 pp. 603-604.
4336 */
4337
4338 mp_err s_mp_reduce(mp_int *x, const mp_int *m, const mp_int *mu)
4339 {
4340 mp_int q;
4341 mp_err res;
4342
4343 if((res = mp_init_copy(&q, x)) != MP_OKAY)
4344 return res;
4345
4346 s_mp_rshd(&q, USED(m) - 1); /* q1 = x / b^(k-1) */
4347 s_mp_mul(&q, mu); /* q2 = q1 * mu */
4348 s_mp_rshd(&q, USED(m) + 1); /* q3 = q2 / b^(k+1) */
4349
4350 /* x = x mod b^(k+1), quick (no division) */
4351 s_mp_mod_2d(x, DIGIT_BIT * (USED(m) + 1));
4352
4353 /* q = q * m mod b^(k+1), quick (no division) */
4354 s_mp_mul(&q, m);
4355 s_mp_mod_2d(&q, DIGIT_BIT * (USED(m) + 1));
4356
4357 /* x = x - q */
4358 if((res = mp_sub(x, &q, x)) != MP_OKAY)
4359 goto CLEANUP;
4360
4361 /* If x < 0, add b^(k+1) to it */
4362 if(mp_cmp_z(x) < 0) {
4363 mp_set(&q, 1);
4364 if((res = s_mp_lshd(&q, USED(m) + 1)) != MP_OKAY)
4365 goto CLEANUP;
4366 if((res = mp_add(x, &q, x)) != MP_OKAY)
4367 goto CLEANUP;
4368 }
4369
4370 /* Back off if it's too big */
4371 while(mp_cmp(x, m) >= 0) {
4372 if((res = s_mp_sub(x, m)) != MP_OKAY)
4373 break;
4374 }
4375
4376 CLEANUP:
4377 mp_clear(&q);
4378
4379 return res;
4380
4381 } /* end s_mp_reduce() */
4382
4383 /* }}} */
4384
4385 /* }}} */
4386
4387 /* {{{ Primitive comparisons */
4388
4389 /* {{{ s_mp_cmp(a, b) */
4390
4391 /* Compare |a| <=> |b|, return 0 if equal, <0 if a<b, >0 if a>b */
4392 int s_mp_cmp(const mp_int *a, const mp_int *b)
4393 {
4394 mp_size used_a = MP_USED(a);
4395 {
4396 mp_size used_b = MP_USED(b);
4397
4398 if (used_a > used_b)
4399 goto IS_GT;
4400 if (used_a < used_b)
4401 goto IS_LT;
4402 }
4403 {
4404 mp_digit *pa, *pb;
4405 mp_digit da = 0, db = 0;
4406
4407 #define CMP_AB(n) if ((da = pa[n]) != (db = pb[n])) goto done
4408
4409 pa = MP_DIGITS(a) + used_a;
4410 pb = MP_DIGITS(b) + used_a;
4411 while (used_a >= 4) {
4412 pa -= 4;
4413 pb -= 4;
4414 used_a -= 4;
4415 CMP_AB(3);
4416 CMP_AB(2);
4417 CMP_AB(1);
4418 CMP_AB(0);
4419 }
4420 while (used_a-- > 0 && ((da = *--pa) == (db = *--pb)))
4421 /* do nothing */;
4422 done:
4423 if (da > db)
4424 goto IS_GT;
4425 if (da < db)
4426 goto IS_LT;
4427 }
4428 return MP_EQ;
4429 IS_LT:
4430 return MP_LT;
4431 IS_GT:
4432 return MP_GT;
4433 } /* end s_mp_cmp() */
4434
4435 /* }}} */
4436
4437 /* {{{ s_mp_cmp_d(a, d) */
4438
4439 /* Compare |a| <=> d, return 0 if equal, <0 if a<d, >0 if a>d */
4440 int s_mp_cmp_d(const mp_int *a, mp_digit d)
4441 {
4442 if(USED(a) > 1)
4443 return MP_GT;
4444
4445 if(DIGIT(a, 0) < d)
4446 return MP_LT;
4447 else if(DIGIT(a, 0) > d)
4448 return MP_GT;
4449 else
4450 return MP_EQ;
4451
4452 } /* end s_mp_cmp_d() */
4453
4454 /* }}} */
4455
4456 /* {{{ s_mp_ispow2(v) */
4457
4458 /*
4459 Returns -1 if the value is not a power of two; otherwise, it returns
4460 k such that v = 2^k, i.e. lg(v).
4461 */
4462 int s_mp_ispow2(const mp_int *v)
4463 {
4464 mp_digit d;
4465 int extra = 0, ix;
4466
4467 ix = MP_USED(v) - 1;
4468 d = MP_DIGIT(v, ix); /* most significant digit of v */
4469
4470 extra = s_mp_ispow2d(d);
4471 if (extra < 0 || ix == 0)
4472 return extra;
4473
4474 while (--ix >= 0) {
4475 if (DIGIT(v, ix) != 0)
4476 return -1; /* not a power of two */
4477 extra += MP_DIGIT_BIT;
4478 }
4479
4480 return extra;
4481
4482 } /* end s_mp_ispow2() */
4483
4484 /* }}} */
4485
4486 /* {{{ s_mp_ispow2d(d) */
4487
4488 int s_mp_ispow2d(mp_digit d)
4489 {
4490 if ((d != 0) && ((d & (d-1)) == 0)) { /* d is a power of 2 */
4491 int pow = 0;
4492 #if defined (MP_USE_UINT_DIGIT)
4493 if (d & 0xffff0000U)
4494 pow += 16;
4495 if (d & 0xff00ff00U)
4496 pow += 8;
4497 if (d & 0xf0f0f0f0U)
4498 pow += 4;
4499 if (d & 0xccccccccU)
4500 pow += 2;
4501 if (d & 0xaaaaaaaaU)
4502 pow += 1;
4503 #elif defined(MP_USE_LONG_LONG_DIGIT)
4504 if (d & 0xffffffff00000000ULL)
4505 pow += 32;
4506 if (d & 0xffff0000ffff0000ULL)
4507 pow += 16;
4508 if (d & 0xff00ff00ff00ff00ULL)
4509 pow += 8;
4510 if (d & 0xf0f0f0f0f0f0f0f0ULL)
4511 pow += 4;
4512 if (d & 0xccccccccccccccccULL)
4513 pow += 2;
4514 if (d & 0xaaaaaaaaaaaaaaaaULL)
4515 pow += 1;
4516 #elif defined(MP_USE_LONG_DIGIT)
4517 if (d & 0xffffffff00000000UL)
4518 pow += 32;
4519 if (d & 0xffff0000ffff0000UL)
4520 pow += 16;
4521 if (d & 0xff00ff00ff00ff00UL)
4522 pow += 8;
4523 if (d & 0xf0f0f0f0f0f0f0f0UL)
4524 pow += 4;
4525 if (d & 0xccccccccccccccccUL)
4526 pow += 2;
4527 if (d & 0xaaaaaaaaaaaaaaaaUL)
4528 pow += 1;
4529 #else
4530 #error "unknown type for mp_digit"
4531 #endif
4532 return pow;
4533 }
4534 return -1;
4535
4536 } /* end s_mp_ispow2d() */
4537
4538 /* }}} */
4539
4540 /* }}} */
4541
4542 /* {{{ Primitive I/O helpers */
4543
4544 /* {{{ s_mp_tovalue(ch, r) */
4545
4546 /*
4547 Convert the given character to its digit value, in the given radix.
4548 If the given character is not understood in the given radix, -1 is
4549 returned. Otherwise the digit's numeric value is returned.
4550
4551 The results will be odd if you use a radix < 2 or > 62, you are
4552 expected to know what you're up to.
4553 */
4554 int s_mp_tovalue(char ch, int r)
4555 {
4556 int val, xch;
4557
4558 if(r > 36)
4559 xch = ch;
4560 else
4561 xch = toupper(ch);
4562
4563 if(isdigit(xch))
4564 val = xch - '0';
4565 else if(isupper(xch))
4566 val = xch - 'A' + 10;
4567 else if(islower(xch))
4568 val = xch - 'a' + 36;
4569 else if(xch == '+')
4570 val = 62;
4571 else if(xch == '/')
4572 val = 63;
4573 else
4574 return -1;
4575
4576 if(val < 0 || val >= r)
4577 return -1;
4578
4579 return val;
4580
4581 } /* end s_mp_tovalue() */
4582
4583 /* }}} */
4584
4585 /* {{{ s_mp_todigit(val, r, low) */
4586
4587 /*
4588 Convert val to a radix-r digit, if possible. If val is out of range
4589 for r, returns zero. Otherwise, returns an ASCII character denoting
4590 the value in the given radix.
4591
4592 The results may be odd if you use a radix < 2 or > 64, you are
4593 expected to know what you're doing.
4594 */
4595
4596 char s_mp_todigit(mp_digit val, int r, int low)
4597 {
4598 char ch;
4599
4600 if(val >= r)
4601 return 0;
4602
4603 ch = s_dmap_1[val];
4604
4605 if(r <= 36 && low)
4606 ch = tolower(ch);
4607
4608 return ch;
4609
4610 } /* end s_mp_todigit() */
4611
4612 /* }}} */
4613
4614 /* {{{ s_mp_outlen(bits, radix) */
4615
4616 /*
4617 Return an estimate for how long a string is needed to hold a radix
4618 r representation of a number with 'bits' significant bits, plus an
4619 extra for a zero terminator (assuming C style strings here)
4620 */
4621 int s_mp_outlen(int bits, int r)
4622 {
4623 return (int)((double)bits * LOG_V_2(r) + 1.5) + 1;
4624
4625 } /* end s_mp_outlen() */
4626
4627 /* }}} */
4628
4629 /* }}} */
4630
4631 /* {{{ mp_read_unsigned_octets(mp, str, len) */
4632 /* mp_read_unsigned_octets(mp, str, len)
4633 Read in a raw value (base 256) into the given mp_int
4634 No sign bit, number is positive. Leading zeros ignored.
4635 */
4636
4637 mp_err
4638 mp_read_unsigned_octets(mp_int *mp, const unsigned char *str, mp_size len)
4639 {
4640 int count;
4641 mp_err res;
4642 mp_digit d;
4643
4644 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG);
4645
4646 mp_zero(mp);
4647
4648 count = len % sizeof(mp_digit);
4649 if (count) {
4650 for (d = 0; count-- > 0; --len) {
4651 d = (d << 8) | *str++;
4652 }
4653 MP_DIGIT(mp, 0) = d;
4654 }
4655
4656 /* Read the rest of the digits */
4657 for(; len > 0; len -= sizeof(mp_digit)) {
4658 for (d = 0, count = sizeof(mp_digit); count > 0; --count) {
4659 d = (d << 8) | *str++;
4660 }
4661 if (MP_EQ == mp_cmp_z(mp)) {
4662 if (!d)
4663 continue;
4664 } else {
4665 if((res = s_mp_lshd(mp, 1)) != MP_OKAY)
4666 return res;
4667 }
4668 MP_DIGIT(mp, 0) = d;
4669 }
4670 return MP_OKAY;
4671 } /* end mp_read_unsigned_octets() */
4672 /* }}} */
4673
4674 /* {{{ mp_unsigned_octet_size(mp) */
4675 int
4676 mp_unsigned_octet_size(const mp_int *mp)
4677 {
4678 int bytes;
4679 int ix;
4680 mp_digit d = 0;
4681
4682 ARGCHK(mp != NULL, MP_BADARG);
4683 ARGCHK(MP_ZPOS == SIGN(mp), MP_BADARG);
4684
4685 bytes = (USED(mp) * sizeof(mp_digit));
4686
4687 /* subtract leading zeros. */
4688 /* Iterate over each digit... */
4689 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4690 d = DIGIT(mp, ix);
4691 if (d)
4692 break;
4693 bytes -= sizeof(d);
4694 }
4695 if (!bytes)
4696 return 1;
4697
4698 /* Have MSD, check digit bytes, high order first */
4699 for(ix = sizeof(mp_digit) - 1; ix >= 0; ix--) {
4700 unsigned char x = (unsigned char)(d >> (ix * CHAR_BIT));
4701 if (x)
4702 break;
4703 --bytes;
4704 }
4705 return bytes;
4706 } /* end mp_unsigned_octet_size() */
4707 /* }}} */
4708
4709 /* {{{ mp_to_unsigned_octets(mp, str) */
4710 /* output a buffer of big endian octets no longer than specified. */
4711 mp_err
4712 mp_to_unsigned_octets(const mp_int *mp, unsigned char *str, mp_size maxlen)
4713 {
4714 int ix, pos = 0;
4715 int bytes;
4716
4717 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4718
4719 bytes = mp_unsigned_octet_size(mp);
4720 ARGCHK(bytes >= 0 && bytes <= maxlen, MP_BADARG);
4721
4722 /* Iterate over each digit... */
4723 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4724 mp_digit d = DIGIT(mp, ix);
4725 int jx;
4726
4727 /* Unpack digit bytes, high order first */
4728 for(jx = sizeof(mp_digit) - 1; jx >= 0; jx--) {
4729 unsigned char x = (unsigned char)(d >> (jx * CHAR_BIT));
4730 if (!pos && !x) /* suppress leading zeros */
4731 continue;
4732 str[pos++] = x;
4733 }
4734 }
4735 if (!pos)
4736 str[pos++] = 0;
4737 return pos;
4738 } /* end mp_to_unsigned_octets() */
4739 /* }}} */
4740
4741 /* {{{ mp_to_signed_octets(mp, str) */
4742 /* output a buffer of big endian octets no longer than specified. */
4743 mp_err
4744 mp_to_signed_octets(const mp_int *mp, unsigned char *str, mp_size maxlen)
4745 {
4746 int ix, pos = 0;
4747 int bytes;
4748
4749 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4750
4751 bytes = mp_unsigned_octet_size(mp);
4752 ARGCHK(bytes >= 0 && bytes <= maxlen, MP_BADARG);
4753
4754 /* Iterate over each digit... */
4755 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4756 mp_digit d = DIGIT(mp, ix);
4757 int jx;
4758
4759 /* Unpack digit bytes, high order first */
4760 for(jx = sizeof(mp_digit) - 1; jx >= 0; jx--) {
4761 unsigned char x = (unsigned char)(d >> (jx * CHAR_BIT));
4762 if (!pos) {
4763 if (!x) /* suppress leading zeros */
4764 continue;
4765 if (x & 0x80) { /* add one leading zero to make output positive. */
4766 ARGCHK(bytes + 1 <= maxlen, MP_BADARG);
4767 if (bytes + 1 > maxlen)
4768 return MP_BADARG;
4769 str[pos++] = 0;
4770 }
4771 }
4772 str[pos++] = x;
4773 }
4774 }
4775 if (!pos)
4776 str[pos++] = 0;
4777 return pos;
4778 } /* end mp_to_signed_octets() */
4779 /* }}} */
4780
4781 /* {{{ mp_to_fixlen_octets(mp, str) */
4782 /* output a buffer of big endian octets exactly as long as requested. */
4783 mp_err
4784 mp_to_fixlen_octets(const mp_int *mp, unsigned char *str, mp_size length)
4785 {
4786 int ix, pos = 0;
4787 int bytes;
4788
4789 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4790
4791 bytes = mp_unsigned_octet_size(mp);
4792 ARGCHK(bytes >= 0 && bytes <= length, MP_BADARG);
4793
4794 /* place any needed leading zeros */
4795 for (;length > bytes; --length) {
4796 *str++ = 0;
4797 }
4798
4799 /* Iterate over each digit... */
4800 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4801 mp_digit d = DIGIT(mp, ix);
4802 int jx;
4803
4804 /* Unpack digit bytes, high order first */
4805 for(jx = sizeof(mp_digit) - 1; jx >= 0; jx--) {
4806 unsigned char x = (unsigned char)(d >> (jx * CHAR_BIT));
4807 if (!pos && !x) /* suppress leading zeros */
4808 continue;
4809 str[pos++] = x;
4810 }
4811 }
4812 if (!pos)
4813 str[pos++] = 0;
4814 return MP_OKAY;
4815 } /* end mp_to_fixlen_octets() */
4816 /* }}} */
4817
4818
4819 /*------------------------------------------------------------------------*/
4820 /* HERE THERE BE DRAGONS */
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)