Mercurial > trustbridge > nss-cmake-static
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(") = 0; | |
3366 /* Make room for the quotient */ | |
3367 MP_CHECKOK( mp_init_size(", 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(", 1); | |
3381 DIGIT(", 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(", 0) = d; | |
3394 MP_CHECKOK( s_mp_norm(&rem, ", &norm) ); | |
3395 if (norm) | |
3396 d <<= norm; | |
3397 MP_DIGIT(", 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(", 1) ); | |
3414 DIGIT(", 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("); | |
3429 mp_exch(", mp); | |
3430 CLEANUP: | |
3431 mp_clear("); | |
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 */ |