Mercurial > dropbear
comparison libtommath/mtest/mpi.c @ 302:973fccb59ea4 ucc-axis-hack
propagate from branch 'au.asn.ucc.matt.dropbear' (head 11034278bd1917bebcbdc69cf53b1891ce9db121)
to branch 'au.asn.ucc.matt.dropbear.ucc-axis-hack' (head 10a1f614fec73d0820c3f61160d9db409b9beb46)
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 25 Mar 2006 12:59:58 +0000 |
parents | eed26cff980b |
children | 5ff8218bcee9 |
comparison
equal
deleted
inserted
replaced
299:740e782679be | 302:973fccb59ea4 |
---|---|
1 /* | |
2 mpi.c | |
3 | |
4 by Michael J. Fromberger <[email protected]> | |
5 Copyright (C) 1998 Michael J. Fromberger, All Rights Reserved | |
6 | |
7 Arbitrary precision integer arithmetic library | |
8 | |
9 $Id: mpi.c,v 1.22 2001/09/14 15:11:20 sting Exp sting $ | |
10 */ | |
11 | |
12 #include "mpi.h" | |
13 #include <stdlib.h> | |
14 #include <string.h> | |
15 #include <ctype.h> | |
16 | |
17 #if MP_DEBUG | |
18 #include <stdio.h> | |
19 | |
20 #define DIAG(T,V) {fprintf(stderr,T);mp_print(V,stderr);fputc('\n',stderr);} | |
21 #else | |
22 #define DIAG(T,V) | |
23 #endif | |
24 | |
25 /* | |
26 If MP_LOGTAB is not defined, use the math library to compute the | |
27 logarithms on the fly. Otherwise, use the static table below. | |
28 Pick which works best for your system. | |
29 */ | |
30 #if MP_LOGTAB | |
31 | |
32 /* {{{ s_logv_2[] - log table for 2 in various bases */ | |
33 | |
34 /* | |
35 A table of the logs of 2 for various bases (the 0 and 1 entries of | |
36 this table are meaningless and should not be referenced). | |
37 | |
38 This table is used to compute output lengths for the mp_toradix() | |
39 function. Since a number n in radix r takes up about log_r(n) | |
40 digits, we estimate the output size by taking the least integer | |
41 greater than log_r(n), where: | |
42 | |
43 log_r(n) = log_2(n) * log_r(2) | |
44 | |
45 This table, therefore, is a table of log_r(2) for 2 <= r <= 36, | |
46 which are the output bases supported. | |
47 */ | |
48 | |
49 #include "logtab.h" | |
50 | |
51 /* }}} */ | |
52 #define LOG_V_2(R) s_logv_2[(R)] | |
53 | |
54 #else | |
55 | |
56 #include <math.h> | |
57 #define LOG_V_2(R) (log(2.0)/log(R)) | |
58 | |
59 #endif | |
60 | |
61 /* Default precision for newly created mp_int's */ | |
62 static unsigned int s_mp_defprec = MP_DEFPREC; | |
63 | |
64 /* {{{ Digit arithmetic macros */ | |
65 | |
66 /* | |
67 When adding and multiplying digits, the results can be larger than | |
68 can be contained in an mp_digit. Thus, an mp_word is used. These | |
69 macros mask off the upper and lower digits of the mp_word (the | |
70 mp_word may be more than 2 mp_digits wide, but we only concern | |
71 ourselves with the low-order 2 mp_digits) | |
72 | |
73 If your mp_word DOES have more than 2 mp_digits, you need to | |
74 uncomment the first line, and comment out the second. | |
75 */ | |
76 | |
77 /* #define CARRYOUT(W) (((W)>>DIGIT_BIT)&MP_DIGIT_MAX) */ | |
78 #define CARRYOUT(W) ((W)>>DIGIT_BIT) | |
79 #define ACCUM(W) ((W)&MP_DIGIT_MAX) | |
80 | |
81 /* }}} */ | |
82 | |
83 /* {{{ Comparison constants */ | |
84 | |
85 #define MP_LT -1 | |
86 #define MP_EQ 0 | |
87 #define MP_GT 1 | |
88 | |
89 /* }}} */ | |
90 | |
91 /* {{{ Constant strings */ | |
92 | |
93 /* Constant strings returned by mp_strerror() */ | |
94 static const char *mp_err_string[] = { | |
95 "unknown result code", /* say what? */ | |
96 "boolean true", /* MP_OKAY, MP_YES */ | |
97 "boolean false", /* MP_NO */ | |
98 "out of memory", /* MP_MEM */ | |
99 "argument out of range", /* MP_RANGE */ | |
100 "invalid input parameter", /* MP_BADARG */ | |
101 "result is undefined" /* MP_UNDEF */ | |
102 }; | |
103 | |
104 /* Value to digit maps for radix conversion */ | |
105 | |
106 /* s_dmap_1 - standard digits and letters */ | |
107 static const char *s_dmap_1 = | |
108 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; | |
109 | |
110 #if 0 | |
111 /* s_dmap_2 - base64 ordering for digits */ | |
112 static const char *s_dmap_2 = | |
113 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |
114 #endif | |
115 | |
116 /* }}} */ | |
117 | |
118 /* {{{ Static function declarations */ | |
119 | |
120 /* | |
121 If MP_MACRO is false, these will be defined as actual functions; | |
122 otherwise, suitable macro definitions will be used. This works | |
123 around the fact that ANSI C89 doesn't support an 'inline' keyword | |
124 (although I hear C9x will ... about bloody time). At present, the | |
125 macro definitions are identical to the function bodies, but they'll | |
126 expand in place, instead of generating a function call. | |
127 | |
128 I chose these particular functions to be made into macros because | |
129 some profiling showed they are called a lot on a typical workload, | |
130 and yet they are primarily housekeeping. | |
131 */ | |
132 #if MP_MACRO == 0 | |
133 void s_mp_setz(mp_digit *dp, mp_size count); /* zero digits */ | |
134 void s_mp_copy(mp_digit *sp, mp_digit *dp, mp_size count); /* copy */ | |
135 void *s_mp_alloc(size_t nb, size_t ni); /* general allocator */ | |
136 void s_mp_free(void *ptr); /* general free function */ | |
137 #else | |
138 | |
139 /* Even if these are defined as macros, we need to respect the settings | |
140 of the MP_MEMSET and MP_MEMCPY configuration options... | |
141 */ | |
142 #if MP_MEMSET == 0 | |
143 #define s_mp_setz(dp, count) \ | |
144 {int ix;for(ix=0;ix<(count);ix++)(dp)[ix]=0;} | |
145 #else | |
146 #define s_mp_setz(dp, count) memset(dp, 0, (count) * sizeof(mp_digit)) | |
147 #endif /* MP_MEMSET */ | |
148 | |
149 #if MP_MEMCPY == 0 | |
150 #define s_mp_copy(sp, dp, count) \ | |
151 {int ix;for(ix=0;ix<(count);ix++)(dp)[ix]=(sp)[ix];} | |
152 #else | |
153 #define s_mp_copy(sp, dp, count) memcpy(dp, sp, (count) * sizeof(mp_digit)) | |
154 #endif /* MP_MEMCPY */ | |
155 | |
156 #define s_mp_alloc(nb, ni) calloc(nb, ni) | |
157 #define s_mp_free(ptr) {if(ptr) free(ptr);} | |
158 #endif /* MP_MACRO */ | |
159 | |
160 mp_err s_mp_grow(mp_int *mp, mp_size min); /* increase allocated size */ | |
161 mp_err s_mp_pad(mp_int *mp, mp_size min); /* left pad with zeroes */ | |
162 | |
163 void s_mp_clamp(mp_int *mp); /* clip leading zeroes */ | |
164 | |
165 void s_mp_exch(mp_int *a, mp_int *b); /* swap a and b in place */ | |
166 | |
167 mp_err s_mp_lshd(mp_int *mp, mp_size p); /* left-shift by p digits */ | |
168 void s_mp_rshd(mp_int *mp, mp_size p); /* right-shift by p digits */ | |
169 void s_mp_div_2d(mp_int *mp, mp_digit d); /* divide by 2^d in place */ | |
170 void s_mp_mod_2d(mp_int *mp, mp_digit d); /* modulo 2^d in place */ | |
171 mp_err s_mp_mul_2d(mp_int *mp, mp_digit d); /* multiply by 2^d in place*/ | |
172 void s_mp_div_2(mp_int *mp); /* divide by 2 in place */ | |
173 mp_err s_mp_mul_2(mp_int *mp); /* multiply by 2 in place */ | |
174 mp_digit s_mp_norm(mp_int *a, mp_int *b); /* normalize for division */ | |
175 mp_err s_mp_add_d(mp_int *mp, mp_digit d); /* unsigned digit addition */ | |
176 mp_err s_mp_sub_d(mp_int *mp, mp_digit d); /* unsigned digit subtract */ | |
177 mp_err s_mp_mul_d(mp_int *mp, mp_digit d); /* unsigned digit multiply */ | |
178 mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r); | |
179 /* unsigned digit divide */ | |
180 mp_err s_mp_reduce(mp_int *x, mp_int *m, mp_int *mu); | |
181 /* Barrett reduction */ | |
182 mp_err s_mp_add(mp_int *a, mp_int *b); /* magnitude addition */ | |
183 mp_err s_mp_sub(mp_int *a, mp_int *b); /* magnitude subtract */ | |
184 mp_err s_mp_mul(mp_int *a, mp_int *b); /* magnitude multiply */ | |
185 #if 0 | |
186 void s_mp_kmul(mp_digit *a, mp_digit *b, mp_digit *out, mp_size len); | |
187 /* multiply buffers in place */ | |
188 #endif | |
189 #if MP_SQUARE | |
190 mp_err s_mp_sqr(mp_int *a); /* magnitude square */ | |
191 #else | |
192 #define s_mp_sqr(a) s_mp_mul(a, a) | |
193 #endif | |
194 mp_err s_mp_div(mp_int *a, mp_int *b); /* magnitude divide */ | |
195 mp_err s_mp_2expt(mp_int *a, mp_digit k); /* a = 2^k */ | |
196 int s_mp_cmp(mp_int *a, mp_int *b); /* magnitude comparison */ | |
197 int s_mp_cmp_d(mp_int *a, mp_digit d); /* magnitude digit compare */ | |
198 int s_mp_ispow2(mp_int *v); /* is v a power of 2? */ | |
199 int s_mp_ispow2d(mp_digit d); /* is d a power of 2? */ | |
200 | |
201 int s_mp_tovalue(char ch, int r); /* convert ch to value */ | |
202 char s_mp_todigit(int val, int r, int low); /* convert val to digit */ | |
203 int s_mp_outlen(int bits, int r); /* output length in bytes */ | |
204 | |
205 /* }}} */ | |
206 | |
207 /* {{{ Default precision manipulation */ | |
208 | |
209 unsigned int mp_get_prec(void) | |
210 { | |
211 return s_mp_defprec; | |
212 | |
213 } /* end mp_get_prec() */ | |
214 | |
215 void mp_set_prec(unsigned int prec) | |
216 { | |
217 if(prec == 0) | |
218 s_mp_defprec = MP_DEFPREC; | |
219 else | |
220 s_mp_defprec = prec; | |
221 | |
222 } /* end mp_set_prec() */ | |
223 | |
224 /* }}} */ | |
225 | |
226 /*------------------------------------------------------------------------*/ | |
227 /* {{{ mp_init(mp) */ | |
228 | |
229 /* | |
230 mp_init(mp) | |
231 | |
232 Initialize a new zero-valued mp_int. Returns MP_OKAY if successful, | |
233 MP_MEM if memory could not be allocated for the structure. | |
234 */ | |
235 | |
236 mp_err mp_init(mp_int *mp) | |
237 { | |
238 return mp_init_size(mp, s_mp_defprec); | |
239 | |
240 } /* end mp_init() */ | |
241 | |
242 /* }}} */ | |
243 | |
244 /* {{{ mp_init_array(mp[], count) */ | |
245 | |
246 mp_err mp_init_array(mp_int mp[], int count) | |
247 { | |
248 mp_err res; | |
249 int pos; | |
250 | |
251 ARGCHK(mp !=NULL && count > 0, MP_BADARG); | |
252 | |
253 for(pos = 0; pos < count; ++pos) { | |
254 if((res = mp_init(&mp[pos])) != MP_OKAY) | |
255 goto CLEANUP; | |
256 } | |
257 | |
258 return MP_OKAY; | |
259 | |
260 CLEANUP: | |
261 while(--pos >= 0) | |
262 mp_clear(&mp[pos]); | |
263 | |
264 return res; | |
265 | |
266 } /* end mp_init_array() */ | |
267 | |
268 /* }}} */ | |
269 | |
270 /* {{{ mp_init_size(mp, prec) */ | |
271 | |
272 /* | |
273 mp_init_size(mp, prec) | |
274 | |
275 Initialize a new zero-valued mp_int with at least the given | |
276 precision; returns MP_OKAY if successful, or MP_MEM if memory could | |
277 not be allocated for the structure. | |
278 */ | |
279 | |
280 mp_err mp_init_size(mp_int *mp, mp_size prec) | |
281 { | |
282 ARGCHK(mp != NULL && prec > 0, MP_BADARG); | |
283 | |
284 if((DIGITS(mp) = s_mp_alloc(prec, sizeof(mp_digit))) == NULL) | |
285 return MP_MEM; | |
286 | |
287 SIGN(mp) = MP_ZPOS; | |
288 USED(mp) = 1; | |
289 ALLOC(mp) = prec; | |
290 | |
291 return MP_OKAY; | |
292 | |
293 } /* end mp_init_size() */ | |
294 | |
295 /* }}} */ | |
296 | |
297 /* {{{ mp_init_copy(mp, from) */ | |
298 | |
299 /* | |
300 mp_init_copy(mp, from) | |
301 | |
302 Initialize mp as an exact copy of from. Returns MP_OKAY if | |
303 successful, MP_MEM if memory could not be allocated for the new | |
304 structure. | |
305 */ | |
306 | |
307 mp_err mp_init_copy(mp_int *mp, mp_int *from) | |
308 { | |
309 ARGCHK(mp != NULL && from != NULL, MP_BADARG); | |
310 | |
311 if(mp == from) | |
312 return MP_OKAY; | |
313 | |
314 if((DIGITS(mp) = s_mp_alloc(USED(from), sizeof(mp_digit))) == NULL) | |
315 return MP_MEM; | |
316 | |
317 s_mp_copy(DIGITS(from), DIGITS(mp), USED(from)); | |
318 USED(mp) = USED(from); | |
319 ALLOC(mp) = USED(from); | |
320 SIGN(mp) = SIGN(from); | |
321 | |
322 return MP_OKAY; | |
323 | |
324 } /* end mp_init_copy() */ | |
325 | |
326 /* }}} */ | |
327 | |
328 /* {{{ mp_copy(from, to) */ | |
329 | |
330 /* | |
331 mp_copy(from, to) | |
332 | |
333 Copies the mp_int 'from' to the mp_int 'to'. It is presumed that | |
334 'to' has already been initialized (if not, use mp_init_copy() | |
335 instead). If 'from' and 'to' are identical, nothing happens. | |
336 */ | |
337 | |
338 mp_err mp_copy(mp_int *from, mp_int *to) | |
339 { | |
340 ARGCHK(from != NULL && to != NULL, MP_BADARG); | |
341 | |
342 if(from == to) | |
343 return MP_OKAY; | |
344 | |
345 { /* copy */ | |
346 mp_digit *tmp; | |
347 | |
348 /* | |
349 If the allocated buffer in 'to' already has enough space to hold | |
350 all the used digits of 'from', we'll re-use it to avoid hitting | |
351 the memory allocater more than necessary; otherwise, we'd have | |
352 to grow anyway, so we just allocate a hunk and make the copy as | |
353 usual | |
354 */ | |
355 if(ALLOC(to) >= USED(from)) { | |
356 s_mp_setz(DIGITS(to) + USED(from), ALLOC(to) - USED(from)); | |
357 s_mp_copy(DIGITS(from), DIGITS(to), USED(from)); | |
358 | |
359 } else { | |
360 if((tmp = s_mp_alloc(USED(from), sizeof(mp_digit))) == NULL) | |
361 return MP_MEM; | |
362 | |
363 s_mp_copy(DIGITS(from), tmp, USED(from)); | |
364 | |
365 if(DIGITS(to) != NULL) { | |
366 #if MP_CRYPTO | |
367 s_mp_setz(DIGITS(to), ALLOC(to)); | |
368 #endif | |
369 s_mp_free(DIGITS(to)); | |
370 } | |
371 | |
372 DIGITS(to) = tmp; | |
373 ALLOC(to) = USED(from); | |
374 } | |
375 | |
376 /* Copy the precision and sign from the original */ | |
377 USED(to) = USED(from); | |
378 SIGN(to) = SIGN(from); | |
379 } /* end copy */ | |
380 | |
381 return MP_OKAY; | |
382 | |
383 } /* end mp_copy() */ | |
384 | |
385 /* }}} */ | |
386 | |
387 /* {{{ mp_exch(mp1, mp2) */ | |
388 | |
389 /* | |
390 mp_exch(mp1, mp2) | |
391 | |
392 Exchange mp1 and mp2 without allocating any intermediate memory | |
393 (well, unless you count the stack space needed for this call and the | |
394 locals it creates...). This cannot fail. | |
395 */ | |
396 | |
397 void mp_exch(mp_int *mp1, mp_int *mp2) | |
398 { | |
399 #if MP_ARGCHK == 2 | |
400 assert(mp1 != NULL && mp2 != NULL); | |
401 #else | |
402 if(mp1 == NULL || mp2 == NULL) | |
403 return; | |
404 #endif | |
405 | |
406 s_mp_exch(mp1, mp2); | |
407 | |
408 } /* end mp_exch() */ | |
409 | |
410 /* }}} */ | |
411 | |
412 /* {{{ mp_clear(mp) */ | |
413 | |
414 /* | |
415 mp_clear(mp) | |
416 | |
417 Release the storage used by an mp_int, and void its fields so that | |
418 if someone calls mp_clear() again for the same int later, we won't | |
419 get tollchocked. | |
420 */ | |
421 | |
422 void mp_clear(mp_int *mp) | |
423 { | |
424 if(mp == NULL) | |
425 return; | |
426 | |
427 if(DIGITS(mp) != NULL) { | |
428 #if MP_CRYPTO | |
429 s_mp_setz(DIGITS(mp), ALLOC(mp)); | |
430 #endif | |
431 s_mp_free(DIGITS(mp)); | |
432 DIGITS(mp) = NULL; | |
433 } | |
434 | |
435 USED(mp) = 0; | |
436 ALLOC(mp) = 0; | |
437 | |
438 } /* end mp_clear() */ | |
439 | |
440 /* }}} */ | |
441 | |
442 /* {{{ mp_clear_array(mp[], count) */ | |
443 | |
444 void mp_clear_array(mp_int mp[], int count) | |
445 { | |
446 ARGCHK(mp != NULL && count > 0, MP_BADARG); | |
447 | |
448 while(--count >= 0) | |
449 mp_clear(&mp[count]); | |
450 | |
451 } /* end mp_clear_array() */ | |
452 | |
453 /* }}} */ | |
454 | |
455 /* {{{ mp_zero(mp) */ | |
456 | |
457 /* | |
458 mp_zero(mp) | |
459 | |
460 Set mp to zero. Does not change the allocated size of the structure, | |
461 and therefore cannot fail (except on a bad argument, which we ignore) | |
462 */ | |
463 void mp_zero(mp_int *mp) | |
464 { | |
465 if(mp == NULL) | |
466 return; | |
467 | |
468 s_mp_setz(DIGITS(mp), ALLOC(mp)); | |
469 USED(mp) = 1; | |
470 SIGN(mp) = MP_ZPOS; | |
471 | |
472 } /* end mp_zero() */ | |
473 | |
474 /* }}} */ | |
475 | |
476 /* {{{ mp_set(mp, d) */ | |
477 | |
478 void mp_set(mp_int *mp, mp_digit d) | |
479 { | |
480 if(mp == NULL) | |
481 return; | |
482 | |
483 mp_zero(mp); | |
484 DIGIT(mp, 0) = d; | |
485 | |
486 } /* end mp_set() */ | |
487 | |
488 /* }}} */ | |
489 | |
490 /* {{{ mp_set_int(mp, z) */ | |
491 | |
492 mp_err mp_set_int(mp_int *mp, long z) | |
493 { | |
494 int ix; | |
495 unsigned long v = abs(z); | |
496 mp_err res; | |
497 | |
498 ARGCHK(mp != NULL, MP_BADARG); | |
499 | |
500 mp_zero(mp); | |
501 if(z == 0) | |
502 return MP_OKAY; /* shortcut for zero */ | |
503 | |
504 for(ix = sizeof(long) - 1; ix >= 0; ix--) { | |
505 | |
506 if((res = s_mp_mul_2d(mp, CHAR_BIT)) != MP_OKAY) | |
507 return res; | |
508 | |
509 res = s_mp_add_d(mp, | |
510 (mp_digit)((v >> (ix * CHAR_BIT)) & UCHAR_MAX)); | |
511 if(res != MP_OKAY) | |
512 return res; | |
513 | |
514 } | |
515 | |
516 if(z < 0) | |
517 SIGN(mp) = MP_NEG; | |
518 | |
519 return MP_OKAY; | |
520 | |
521 } /* end mp_set_int() */ | |
522 | |
523 /* }}} */ | |
524 | |
525 /*------------------------------------------------------------------------*/ | |
526 /* {{{ Digit arithmetic */ | |
527 | |
528 /* {{{ mp_add_d(a, d, b) */ | |
529 | |
530 /* | |
531 mp_add_d(a, d, b) | |
532 | |
533 Compute the sum b = a + d, for a single digit d. Respects the sign of | |
534 its primary addend (single digits are unsigned anyway). | |
535 */ | |
536 | |
537 mp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b) | |
538 { | |
539 mp_err res = MP_OKAY; | |
540 | |
541 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
542 | |
543 if((res = mp_copy(a, b)) != MP_OKAY) | |
544 return res; | |
545 | |
546 if(SIGN(b) == MP_ZPOS) { | |
547 res = s_mp_add_d(b, d); | |
548 } else if(s_mp_cmp_d(b, d) >= 0) { | |
549 res = s_mp_sub_d(b, d); | |
550 } else { | |
551 SIGN(b) = MP_ZPOS; | |
552 | |
553 DIGIT(b, 0) = d - DIGIT(b, 0); | |
554 } | |
555 | |
556 return res; | |
557 | |
558 } /* end mp_add_d() */ | |
559 | |
560 /* }}} */ | |
561 | |
562 /* {{{ mp_sub_d(a, d, b) */ | |
563 | |
564 /* | |
565 mp_sub_d(a, d, b) | |
566 | |
567 Compute the difference b = a - d, for a single digit d. Respects the | |
568 sign of its subtrahend (single digits are unsigned anyway). | |
569 */ | |
570 | |
571 mp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b) | |
572 { | |
573 mp_err res; | |
574 | |
575 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
576 | |
577 if((res = mp_copy(a, b)) != MP_OKAY) | |
578 return res; | |
579 | |
580 if(SIGN(b) == MP_NEG) { | |
581 if((res = s_mp_add_d(b, d)) != MP_OKAY) | |
582 return res; | |
583 | |
584 } else if(s_mp_cmp_d(b, d) >= 0) { | |
585 if((res = s_mp_sub_d(b, d)) != MP_OKAY) | |
586 return res; | |
587 | |
588 } else { | |
589 mp_neg(b, b); | |
590 | |
591 DIGIT(b, 0) = d - DIGIT(b, 0); | |
592 SIGN(b) = MP_NEG; | |
593 } | |
594 | |
595 if(s_mp_cmp_d(b, 0) == 0) | |
596 SIGN(b) = MP_ZPOS; | |
597 | |
598 return MP_OKAY; | |
599 | |
600 } /* end mp_sub_d() */ | |
601 | |
602 /* }}} */ | |
603 | |
604 /* {{{ mp_mul_d(a, d, b) */ | |
605 | |
606 /* | |
607 mp_mul_d(a, d, b) | |
608 | |
609 Compute the product b = a * d, for a single digit d. Respects the sign | |
610 of its multiplicand (single digits are unsigned anyway) | |
611 */ | |
612 | |
613 mp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b) | |
614 { | |
615 mp_err res; | |
616 | |
617 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
618 | |
619 if(d == 0) { | |
620 mp_zero(b); | |
621 return MP_OKAY; | |
622 } | |
623 | |
624 if((res = mp_copy(a, b)) != MP_OKAY) | |
625 return res; | |
626 | |
627 res = s_mp_mul_d(b, d); | |
628 | |
629 return res; | |
630 | |
631 } /* end mp_mul_d() */ | |
632 | |
633 /* }}} */ | |
634 | |
635 /* {{{ mp_mul_2(a, c) */ | |
636 | |
637 mp_err mp_mul_2(mp_int *a, mp_int *c) | |
638 { | |
639 mp_err res; | |
640 | |
641 ARGCHK(a != NULL && c != NULL, MP_BADARG); | |
642 | |
643 if((res = mp_copy(a, c)) != MP_OKAY) | |
644 return res; | |
645 | |
646 return s_mp_mul_2(c); | |
647 | |
648 } /* end mp_mul_2() */ | |
649 | |
650 /* }}} */ | |
651 | |
652 /* {{{ mp_div_d(a, d, q, r) */ | |
653 | |
654 /* | |
655 mp_div_d(a, d, q, r) | |
656 | |
657 Compute the quotient q = a / d and remainder r = a mod d, for a | |
658 single digit d. Respects the sign of its divisor (single digits are | |
659 unsigned anyway). | |
660 */ | |
661 | |
662 mp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r) | |
663 { | |
664 mp_err res; | |
665 mp_digit rem; | |
666 int pow; | |
667 | |
668 ARGCHK(a != NULL, MP_BADARG); | |
669 | |
670 if(d == 0) | |
671 return MP_RANGE; | |
672 | |
673 /* Shortcut for powers of two ... */ | |
674 if((pow = s_mp_ispow2d(d)) >= 0) { | |
675 mp_digit mask; | |
676 | |
677 mask = (1 << pow) - 1; | |
678 rem = DIGIT(a, 0) & mask; | |
679 | |
680 if(q) { | |
681 mp_copy(a, q); | |
682 s_mp_div_2d(q, pow); | |
683 } | |
684 | |
685 if(r) | |
686 *r = rem; | |
687 | |
688 return MP_OKAY; | |
689 } | |
690 | |
691 /* | |
692 If the quotient is actually going to be returned, we'll try to | |
693 avoid hitting the memory allocator by copying the dividend into it | |
694 and doing the division there. This can't be any _worse_ than | |
695 always copying, and will sometimes be better (since it won't make | |
696 another copy) | |
697 | |
698 If it's not going to be returned, we need to allocate a temporary | |
699 to hold the quotient, which will just be discarded. | |
700 */ | |
701 if(q) { | |
702 if((res = mp_copy(a, q)) != MP_OKAY) | |
703 return res; | |
704 | |
705 res = s_mp_div_d(q, d, &rem); | |
706 if(s_mp_cmp_d(q, 0) == MP_EQ) | |
707 SIGN(q) = MP_ZPOS; | |
708 | |
709 } else { | |
710 mp_int qp; | |
711 | |
712 if((res = mp_init_copy(&qp, a)) != MP_OKAY) | |
713 return res; | |
714 | |
715 res = s_mp_div_d(&qp, d, &rem); | |
716 if(s_mp_cmp_d(&qp, 0) == 0) | |
717 SIGN(&qp) = MP_ZPOS; | |
718 | |
719 mp_clear(&qp); | |
720 } | |
721 | |
722 if(r) | |
723 *r = rem; | |
724 | |
725 return res; | |
726 | |
727 } /* end mp_div_d() */ | |
728 | |
729 /* }}} */ | |
730 | |
731 /* {{{ mp_div_2(a, c) */ | |
732 | |
733 /* | |
734 mp_div_2(a, c) | |
735 | |
736 Compute c = a / 2, disregarding the remainder. | |
737 */ | |
738 | |
739 mp_err mp_div_2(mp_int *a, mp_int *c) | |
740 { | |
741 mp_err res; | |
742 | |
743 ARGCHK(a != NULL && c != NULL, MP_BADARG); | |
744 | |
745 if((res = mp_copy(a, c)) != MP_OKAY) | |
746 return res; | |
747 | |
748 s_mp_div_2(c); | |
749 | |
750 return MP_OKAY; | |
751 | |
752 } /* end mp_div_2() */ | |
753 | |
754 /* }}} */ | |
755 | |
756 /* {{{ mp_expt_d(a, d, b) */ | |
757 | |
758 mp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c) | |
759 { | |
760 mp_int s, x; | |
761 mp_err res; | |
762 | |
763 ARGCHK(a != NULL && c != NULL, MP_BADARG); | |
764 | |
765 if((res = mp_init(&s)) != MP_OKAY) | |
766 return res; | |
767 if((res = mp_init_copy(&x, a)) != MP_OKAY) | |
768 goto X; | |
769 | |
770 DIGIT(&s, 0) = 1; | |
771 | |
772 while(d != 0) { | |
773 if(d & 1) { | |
774 if((res = s_mp_mul(&s, &x)) != MP_OKAY) | |
775 goto CLEANUP; | |
776 } | |
777 | |
778 d >>= 1; | |
779 | |
780 if((res = s_mp_sqr(&x)) != MP_OKAY) | |
781 goto CLEANUP; | |
782 } | |
783 | |
784 s_mp_exch(&s, c); | |
785 | |
786 CLEANUP: | |
787 mp_clear(&x); | |
788 X: | |
789 mp_clear(&s); | |
790 | |
791 return res; | |
792 | |
793 } /* end mp_expt_d() */ | |
794 | |
795 /* }}} */ | |
796 | |
797 /* }}} */ | |
798 | |
799 /*------------------------------------------------------------------------*/ | |
800 /* {{{ Full arithmetic */ | |
801 | |
802 /* {{{ mp_abs(a, b) */ | |
803 | |
804 /* | |
805 mp_abs(a, b) | |
806 | |
807 Compute b = |a|. 'a' and 'b' may be identical. | |
808 */ | |
809 | |
810 mp_err mp_abs(mp_int *a, mp_int *b) | |
811 { | |
812 mp_err res; | |
813 | |
814 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
815 | |
816 if((res = mp_copy(a, b)) != MP_OKAY) | |
817 return res; | |
818 | |
819 SIGN(b) = MP_ZPOS; | |
820 | |
821 return MP_OKAY; | |
822 | |
823 } /* end mp_abs() */ | |
824 | |
825 /* }}} */ | |
826 | |
827 /* {{{ mp_neg(a, b) */ | |
828 | |
829 /* | |
830 mp_neg(a, b) | |
831 | |
832 Compute b = -a. 'a' and 'b' may be identical. | |
833 */ | |
834 | |
835 mp_err mp_neg(mp_int *a, mp_int *b) | |
836 { | |
837 mp_err res; | |
838 | |
839 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
840 | |
841 if((res = mp_copy(a, b)) != MP_OKAY) | |
842 return res; | |
843 | |
844 if(s_mp_cmp_d(b, 0) == MP_EQ) | |
845 SIGN(b) = MP_ZPOS; | |
846 else | |
847 SIGN(b) = (SIGN(b) == MP_NEG) ? MP_ZPOS : MP_NEG; | |
848 | |
849 return MP_OKAY; | |
850 | |
851 } /* end mp_neg() */ | |
852 | |
853 /* }}} */ | |
854 | |
855 /* {{{ mp_add(a, b, c) */ | |
856 | |
857 /* | |
858 mp_add(a, b, c) | |
859 | |
860 Compute c = a + b. All parameters may be identical. | |
861 */ | |
862 | |
863 mp_err mp_add(mp_int *a, mp_int *b, mp_int *c) | |
864 { | |
865 mp_err res; | |
866 int cmp; | |
867 | |
868 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
869 | |
870 if(SIGN(a) == SIGN(b)) { /* same sign: add values, keep sign */ | |
871 | |
872 /* Commutativity of addition lets us do this in either order, | |
873 so we avoid having to use a temporary even if the result | |
874 is supposed to replace the output | |
875 */ | |
876 if(c == b) { | |
877 if((res = s_mp_add(c, a)) != MP_OKAY) | |
878 return res; | |
879 } else { | |
880 if(c != a && (res = mp_copy(a, c)) != MP_OKAY) | |
881 return res; | |
882 | |
883 if((res = s_mp_add(c, b)) != MP_OKAY) | |
884 return res; | |
885 } | |
886 | |
887 } else if((cmp = s_mp_cmp(a, b)) > 0) { /* different sign: a > b */ | |
888 | |
889 /* If the output is going to be clobbered, we will use a temporary | |
890 variable; otherwise, we'll do it without touching the memory | |
891 allocator at all, if possible | |
892 */ | |
893 if(c == b) { | |
894 mp_int tmp; | |
895 | |
896 if((res = mp_init_copy(&tmp, a)) != MP_OKAY) | |
897 return res; | |
898 if((res = s_mp_sub(&tmp, b)) != MP_OKAY) { | |
899 mp_clear(&tmp); | |
900 return res; | |
901 } | |
902 | |
903 s_mp_exch(&tmp, c); | |
904 mp_clear(&tmp); | |
905 | |
906 } else { | |
907 | |
908 if(c != a && (res = mp_copy(a, c)) != MP_OKAY) | |
909 return res; | |
910 if((res = s_mp_sub(c, b)) != MP_OKAY) | |
911 return res; | |
912 | |
913 } | |
914 | |
915 } else if(cmp == 0) { /* different sign, a == b */ | |
916 | |
917 mp_zero(c); | |
918 return MP_OKAY; | |
919 | |
920 } else { /* different sign: a < b */ | |
921 | |
922 /* See above... */ | |
923 if(c == a) { | |
924 mp_int tmp; | |
925 | |
926 if((res = mp_init_copy(&tmp, b)) != MP_OKAY) | |
927 return res; | |
928 if((res = s_mp_sub(&tmp, a)) != MP_OKAY) { | |
929 mp_clear(&tmp); | |
930 return res; | |
931 } | |
932 | |
933 s_mp_exch(&tmp, c); | |
934 mp_clear(&tmp); | |
935 | |
936 } else { | |
937 | |
938 if(c != b && (res = mp_copy(b, c)) != MP_OKAY) | |
939 return res; | |
940 if((res = s_mp_sub(c, a)) != MP_OKAY) | |
941 return res; | |
942 | |
943 } | |
944 } | |
945 | |
946 if(USED(c) == 1 && DIGIT(c, 0) == 0) | |
947 SIGN(c) = MP_ZPOS; | |
948 | |
949 return MP_OKAY; | |
950 | |
951 } /* end mp_add() */ | |
952 | |
953 /* }}} */ | |
954 | |
955 /* {{{ mp_sub(a, b, c) */ | |
956 | |
957 /* | |
958 mp_sub(a, b, c) | |
959 | |
960 Compute c = a - b. All parameters may be identical. | |
961 */ | |
962 | |
963 mp_err mp_sub(mp_int *a, mp_int *b, mp_int *c) | |
964 { | |
965 mp_err res; | |
966 int cmp; | |
967 | |
968 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
969 | |
970 if(SIGN(a) != SIGN(b)) { | |
971 if(c == a) { | |
972 if((res = s_mp_add(c, b)) != MP_OKAY) | |
973 return res; | |
974 } else { | |
975 if(c != b && ((res = mp_copy(b, c)) != MP_OKAY)) | |
976 return res; | |
977 if((res = s_mp_add(c, a)) != MP_OKAY) | |
978 return res; | |
979 SIGN(c) = SIGN(a); | |
980 } | |
981 | |
982 } else if((cmp = s_mp_cmp(a, b)) > 0) { /* Same sign, a > b */ | |
983 if(c == b) { | |
984 mp_int tmp; | |
985 | |
986 if((res = mp_init_copy(&tmp, a)) != MP_OKAY) | |
987 return res; | |
988 if((res = s_mp_sub(&tmp, b)) != MP_OKAY) { | |
989 mp_clear(&tmp); | |
990 return res; | |
991 } | |
992 s_mp_exch(&tmp, c); | |
993 mp_clear(&tmp); | |
994 | |
995 } else { | |
996 if(c != a && ((res = mp_copy(a, c)) != MP_OKAY)) | |
997 return res; | |
998 | |
999 if((res = s_mp_sub(c, b)) != MP_OKAY) | |
1000 return res; | |
1001 } | |
1002 | |
1003 } else if(cmp == 0) { /* Same sign, equal magnitude */ | |
1004 mp_zero(c); | |
1005 return MP_OKAY; | |
1006 | |
1007 } else { /* Same sign, b > a */ | |
1008 if(c == a) { | |
1009 mp_int tmp; | |
1010 | |
1011 if((res = mp_init_copy(&tmp, b)) != MP_OKAY) | |
1012 return res; | |
1013 | |
1014 if((res = s_mp_sub(&tmp, a)) != MP_OKAY) { | |
1015 mp_clear(&tmp); | |
1016 return res; | |
1017 } | |
1018 s_mp_exch(&tmp, c); | |
1019 mp_clear(&tmp); | |
1020 | |
1021 } else { | |
1022 if(c != b && ((res = mp_copy(b, c)) != MP_OKAY)) | |
1023 return res; | |
1024 | |
1025 if((res = s_mp_sub(c, a)) != MP_OKAY) | |
1026 return res; | |
1027 } | |
1028 | |
1029 SIGN(c) = !SIGN(b); | |
1030 } | |
1031 | |
1032 if(USED(c) == 1 && DIGIT(c, 0) == 0) | |
1033 SIGN(c) = MP_ZPOS; | |
1034 | |
1035 return MP_OKAY; | |
1036 | |
1037 } /* end mp_sub() */ | |
1038 | |
1039 /* }}} */ | |
1040 | |
1041 /* {{{ mp_mul(a, b, c) */ | |
1042 | |
1043 /* | |
1044 mp_mul(a, b, c) | |
1045 | |
1046 Compute c = a * b. All parameters may be identical. | |
1047 */ | |
1048 | |
1049 mp_err mp_mul(mp_int *a, mp_int *b, mp_int *c) | |
1050 { | |
1051 mp_err res; | |
1052 mp_sign sgn; | |
1053 | |
1054 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
1055 | |
1056 sgn = (SIGN(a) == SIGN(b)) ? MP_ZPOS : MP_NEG; | |
1057 | |
1058 if(c == b) { | |
1059 if((res = s_mp_mul(c, a)) != MP_OKAY) | |
1060 return res; | |
1061 | |
1062 } else { | |
1063 if((res = mp_copy(a, c)) != MP_OKAY) | |
1064 return res; | |
1065 | |
1066 if((res = s_mp_mul(c, b)) != MP_OKAY) | |
1067 return res; | |
1068 } | |
1069 | |
1070 if(sgn == MP_ZPOS || s_mp_cmp_d(c, 0) == MP_EQ) | |
1071 SIGN(c) = MP_ZPOS; | |
1072 else | |
1073 SIGN(c) = sgn; | |
1074 | |
1075 return MP_OKAY; | |
1076 | |
1077 } /* end mp_mul() */ | |
1078 | |
1079 /* }}} */ | |
1080 | |
1081 /* {{{ mp_mul_2d(a, d, c) */ | |
1082 | |
1083 /* | |
1084 mp_mul_2d(a, d, c) | |
1085 | |
1086 Compute c = a * 2^d. a may be the same as c. | |
1087 */ | |
1088 | |
1089 mp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c) | |
1090 { | |
1091 mp_err res; | |
1092 | |
1093 ARGCHK(a != NULL && c != NULL, MP_BADARG); | |
1094 | |
1095 if((res = mp_copy(a, c)) != MP_OKAY) | |
1096 return res; | |
1097 | |
1098 if(d == 0) | |
1099 return MP_OKAY; | |
1100 | |
1101 return s_mp_mul_2d(c, d); | |
1102 | |
1103 } /* end mp_mul() */ | |
1104 | |
1105 /* }}} */ | |
1106 | |
1107 /* {{{ mp_sqr(a, b) */ | |
1108 | |
1109 #if MP_SQUARE | |
1110 mp_err mp_sqr(mp_int *a, mp_int *b) | |
1111 { | |
1112 mp_err res; | |
1113 | |
1114 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
1115 | |
1116 if((res = mp_copy(a, b)) != MP_OKAY) | |
1117 return res; | |
1118 | |
1119 if((res = s_mp_sqr(b)) != MP_OKAY) | |
1120 return res; | |
1121 | |
1122 SIGN(b) = MP_ZPOS; | |
1123 | |
1124 return MP_OKAY; | |
1125 | |
1126 } /* end mp_sqr() */ | |
1127 #endif | |
1128 | |
1129 /* }}} */ | |
1130 | |
1131 /* {{{ mp_div(a, b, q, r) */ | |
1132 | |
1133 /* | |
1134 mp_div(a, b, q, r) | |
1135 | |
1136 Compute q = a / b and r = a mod b. Input parameters may be re-used | |
1137 as output parameters. If q or r is NULL, that portion of the | |
1138 computation will be discarded (although it will still be computed) | |
1139 | |
1140 Pay no attention to the hacker behind the curtain. | |
1141 */ | |
1142 | |
1143 mp_err mp_div(mp_int *a, mp_int *b, mp_int *q, mp_int *r) | |
1144 { | |
1145 mp_err res; | |
1146 mp_int qtmp, rtmp; | |
1147 int cmp; | |
1148 | |
1149 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
1150 | |
1151 if(mp_cmp_z(b) == MP_EQ) | |
1152 return MP_RANGE; | |
1153 | |
1154 /* If a <= b, we can compute the solution without division, and | |
1155 avoid any memory allocation | |
1156 */ | |
1157 if((cmp = s_mp_cmp(a, b)) < 0) { | |
1158 if(r) { | |
1159 if((res = mp_copy(a, r)) != MP_OKAY) | |
1160 return res; | |
1161 } | |
1162 | |
1163 if(q) | |
1164 mp_zero(q); | |
1165 | |
1166 return MP_OKAY; | |
1167 | |
1168 } else if(cmp == 0) { | |
1169 | |
1170 /* Set quotient to 1, with appropriate sign */ | |
1171 if(q) { | |
1172 int qneg = (SIGN(a) != SIGN(b)); | |
1173 | |
1174 mp_set(q, 1); | |
1175 if(qneg) | |
1176 SIGN(q) = MP_NEG; | |
1177 } | |
1178 | |
1179 if(r) | |
1180 mp_zero(r); | |
1181 | |
1182 return MP_OKAY; | |
1183 } | |
1184 | |
1185 /* If we get here, it means we actually have to do some division */ | |
1186 | |
1187 /* Set up some temporaries... */ | |
1188 if((res = mp_init_copy(&qtmp, a)) != MP_OKAY) | |
1189 return res; | |
1190 if((res = mp_init_copy(&rtmp, b)) != MP_OKAY) | |
1191 goto CLEANUP; | |
1192 | |
1193 if((res = s_mp_div(&qtmp, &rtmp)) != MP_OKAY) | |
1194 goto CLEANUP; | |
1195 | |
1196 /* Compute the signs for the output */ | |
1197 SIGN(&rtmp) = SIGN(a); /* Sr = Sa */ | |
1198 if(SIGN(a) == SIGN(b)) | |
1199 SIGN(&qtmp) = MP_ZPOS; /* Sq = MP_ZPOS if Sa = Sb */ | |
1200 else | |
1201 SIGN(&qtmp) = MP_NEG; /* Sq = MP_NEG if Sa != Sb */ | |
1202 | |
1203 if(s_mp_cmp_d(&qtmp, 0) == MP_EQ) | |
1204 SIGN(&qtmp) = MP_ZPOS; | |
1205 if(s_mp_cmp_d(&rtmp, 0) == MP_EQ) | |
1206 SIGN(&rtmp) = MP_ZPOS; | |
1207 | |
1208 /* Copy output, if it is needed */ | |
1209 if(q) | |
1210 s_mp_exch(&qtmp, q); | |
1211 | |
1212 if(r) | |
1213 s_mp_exch(&rtmp, r); | |
1214 | |
1215 CLEANUP: | |
1216 mp_clear(&rtmp); | |
1217 mp_clear(&qtmp); | |
1218 | |
1219 return res; | |
1220 | |
1221 } /* end mp_div() */ | |
1222 | |
1223 /* }}} */ | |
1224 | |
1225 /* {{{ mp_div_2d(a, d, q, r) */ | |
1226 | |
1227 mp_err mp_div_2d(mp_int *a, mp_digit d, mp_int *q, mp_int *r) | |
1228 { | |
1229 mp_err res; | |
1230 | |
1231 ARGCHK(a != NULL, MP_BADARG); | |
1232 | |
1233 if(q) { | |
1234 if((res = mp_copy(a, q)) != MP_OKAY) | |
1235 return res; | |
1236 | |
1237 s_mp_div_2d(q, d); | |
1238 } | |
1239 | |
1240 if(r) { | |
1241 if((res = mp_copy(a, r)) != MP_OKAY) | |
1242 return res; | |
1243 | |
1244 s_mp_mod_2d(r, d); | |
1245 } | |
1246 | |
1247 return MP_OKAY; | |
1248 | |
1249 } /* end mp_div_2d() */ | |
1250 | |
1251 /* }}} */ | |
1252 | |
1253 /* {{{ mp_expt(a, b, c) */ | |
1254 | |
1255 /* | |
1256 mp_expt(a, b, c) | |
1257 | |
1258 Compute c = a ** b, that is, raise a to the b power. Uses a | |
1259 standard iterative square-and-multiply technique. | |
1260 */ | |
1261 | |
1262 mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c) | |
1263 { | |
1264 mp_int s, x; | |
1265 mp_err res; | |
1266 mp_digit d; | |
1267 int dig, bit; | |
1268 | |
1269 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
1270 | |
1271 if(mp_cmp_z(b) < 0) | |
1272 return MP_RANGE; | |
1273 | |
1274 if((res = mp_init(&s)) != MP_OKAY) | |
1275 return res; | |
1276 | |
1277 mp_set(&s, 1); | |
1278 | |
1279 if((res = mp_init_copy(&x, a)) != MP_OKAY) | |
1280 goto X; | |
1281 | |
1282 /* Loop over low-order digits in ascending order */ | |
1283 for(dig = 0; dig < (USED(b) - 1); dig++) { | |
1284 d = DIGIT(b, dig); | |
1285 | |
1286 /* Loop over bits of each non-maximal digit */ | |
1287 for(bit = 0; bit < DIGIT_BIT; bit++) { | |
1288 if(d & 1) { | |
1289 if((res = s_mp_mul(&s, &x)) != MP_OKAY) | |
1290 goto CLEANUP; | |
1291 } | |
1292 | |
1293 d >>= 1; | |
1294 | |
1295 if((res = s_mp_sqr(&x)) != MP_OKAY) | |
1296 goto CLEANUP; | |
1297 } | |
1298 } | |
1299 | |
1300 /* Consider now the last digit... */ | |
1301 d = DIGIT(b, dig); | |
1302 | |
1303 while(d) { | |
1304 if(d & 1) { | |
1305 if((res = s_mp_mul(&s, &x)) != MP_OKAY) | |
1306 goto CLEANUP; | |
1307 } | |
1308 | |
1309 d >>= 1; | |
1310 | |
1311 if((res = s_mp_sqr(&x)) != MP_OKAY) | |
1312 goto CLEANUP; | |
1313 } | |
1314 | |
1315 if(mp_iseven(b)) | |
1316 SIGN(&s) = SIGN(a); | |
1317 | |
1318 res = mp_copy(&s, c); | |
1319 | |
1320 CLEANUP: | |
1321 mp_clear(&x); | |
1322 X: | |
1323 mp_clear(&s); | |
1324 | |
1325 return res; | |
1326 | |
1327 } /* end mp_expt() */ | |
1328 | |
1329 /* }}} */ | |
1330 | |
1331 /* {{{ mp_2expt(a, k) */ | |
1332 | |
1333 /* Compute a = 2^k */ | |
1334 | |
1335 mp_err mp_2expt(mp_int *a, mp_digit k) | |
1336 { | |
1337 ARGCHK(a != NULL, MP_BADARG); | |
1338 | |
1339 return s_mp_2expt(a, k); | |
1340 | |
1341 } /* end mp_2expt() */ | |
1342 | |
1343 /* }}} */ | |
1344 | |
1345 /* {{{ mp_mod(a, m, c) */ | |
1346 | |
1347 /* | |
1348 mp_mod(a, m, c) | |
1349 | |
1350 Compute c = a (mod m). Result will always be 0 <= c < m. | |
1351 */ | |
1352 | |
1353 mp_err mp_mod(mp_int *a, mp_int *m, mp_int *c) | |
1354 { | |
1355 mp_err res; | |
1356 int mag; | |
1357 | |
1358 ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); | |
1359 | |
1360 if(SIGN(m) == MP_NEG) | |
1361 return MP_RANGE; | |
1362 | |
1363 /* | |
1364 If |a| > m, we need to divide to get the remainder and take the | |
1365 absolute value. | |
1366 | |
1367 If |a| < m, we don't need to do any division, just copy and adjust | |
1368 the sign (if a is negative). | |
1369 | |
1370 If |a| == m, we can simply set the result to zero. | |
1371 | |
1372 This order is intended to minimize the average path length of the | |
1373 comparison chain on common workloads -- the most frequent cases are | |
1374 that |a| != m, so we do those first. | |
1375 */ | |
1376 if((mag = s_mp_cmp(a, m)) > 0) { | |
1377 if((res = mp_div(a, m, NULL, c)) != MP_OKAY) | |
1378 return res; | |
1379 | |
1380 if(SIGN(c) == MP_NEG) { | |
1381 if((res = mp_add(c, m, c)) != MP_OKAY) | |
1382 return res; | |
1383 } | |
1384 | |
1385 } else if(mag < 0) { | |
1386 if((res = mp_copy(a, c)) != MP_OKAY) | |
1387 return res; | |
1388 | |
1389 if(mp_cmp_z(a) < 0) { | |
1390 if((res = mp_add(c, m, c)) != MP_OKAY) | |
1391 return res; | |
1392 | |
1393 } | |
1394 | |
1395 } else { | |
1396 mp_zero(c); | |
1397 | |
1398 } | |
1399 | |
1400 return MP_OKAY; | |
1401 | |
1402 } /* end mp_mod() */ | |
1403 | |
1404 /* }}} */ | |
1405 | |
1406 /* {{{ mp_mod_d(a, d, c) */ | |
1407 | |
1408 /* | |
1409 mp_mod_d(a, d, c) | |
1410 | |
1411 Compute c = a (mod d). Result will always be 0 <= c < d | |
1412 */ | |
1413 mp_err mp_mod_d(mp_int *a, mp_digit d, mp_digit *c) | |
1414 { | |
1415 mp_err res; | |
1416 mp_digit rem; | |
1417 | |
1418 ARGCHK(a != NULL && c != NULL, MP_BADARG); | |
1419 | |
1420 if(s_mp_cmp_d(a, d) > 0) { | |
1421 if((res = mp_div_d(a, d, NULL, &rem)) != MP_OKAY) | |
1422 return res; | |
1423 | |
1424 } else { | |
1425 if(SIGN(a) == MP_NEG) | |
1426 rem = d - DIGIT(a, 0); | |
1427 else | |
1428 rem = DIGIT(a, 0); | |
1429 } | |
1430 | |
1431 if(c) | |
1432 *c = rem; | |
1433 | |
1434 return MP_OKAY; | |
1435 | |
1436 } /* end mp_mod_d() */ | |
1437 | |
1438 /* }}} */ | |
1439 | |
1440 /* {{{ mp_sqrt(a, b) */ | |
1441 | |
1442 /* | |
1443 mp_sqrt(a, b) | |
1444 | |
1445 Compute the integer square root of a, and store the result in b. | |
1446 Uses an integer-arithmetic version of Newton's iterative linear | |
1447 approximation technique to determine this value; the result has the | |
1448 following two properties: | |
1449 | |
1450 b^2 <= a | |
1451 (b+1)^2 >= a | |
1452 | |
1453 It is a range error to pass a negative value. | |
1454 */ | |
1455 mp_err mp_sqrt(mp_int *a, mp_int *b) | |
1456 { | |
1457 mp_int x, t; | |
1458 mp_err res; | |
1459 | |
1460 ARGCHK(a != NULL && b != NULL, MP_BADARG); | |
1461 | |
1462 /* Cannot take square root of a negative value */ | |
1463 if(SIGN(a) == MP_NEG) | |
1464 return MP_RANGE; | |
1465 | |
1466 /* Special cases for zero and one, trivial */ | |
1467 if(mp_cmp_d(a, 0) == MP_EQ || mp_cmp_d(a, 1) == MP_EQ) | |
1468 return mp_copy(a, b); | |
1469 | |
1470 /* Initialize the temporaries we'll use below */ | |
1471 if((res = mp_init_size(&t, USED(a))) != MP_OKAY) | |
1472 return res; | |
1473 | |
1474 /* Compute an initial guess for the iteration as a itself */ | |
1475 if((res = mp_init_copy(&x, a)) != MP_OKAY) | |
1476 goto X; | |
1477 | |
1478 s_mp_rshd(&x, (USED(&x)/2)+1); | |
1479 mp_add_d(&x, 1, &x); | |
1480 | |
1481 for(;;) { | |
1482 /* t = (x * x) - a */ | |
1483 mp_copy(&x, &t); /* can't fail, t is big enough for original x */ | |
1484 if((res = mp_sqr(&t, &t)) != MP_OKAY || | |
1485 (res = mp_sub(&t, a, &t)) != MP_OKAY) | |
1486 goto CLEANUP; | |
1487 | |
1488 /* t = t / 2x */ | |
1489 s_mp_mul_2(&x); | |
1490 if((res = mp_div(&t, &x, &t, NULL)) != MP_OKAY) | |
1491 goto CLEANUP; | |
1492 s_mp_div_2(&x); | |
1493 | |
1494 /* Terminate the loop, if the quotient is zero */ | |
1495 if(mp_cmp_z(&t) == MP_EQ) | |
1496 break; | |
1497 | |
1498 /* x = x - t */ | |
1499 if((res = mp_sub(&x, &t, &x)) != MP_OKAY) | |
1500 goto CLEANUP; | |
1501 | |
1502 } | |
1503 | |
1504 /* Copy result to output parameter */ | |
1505 mp_sub_d(&x, 1, &x); | |
1506 s_mp_exch(&x, b); | |
1507 | |
1508 CLEANUP: | |
1509 mp_clear(&x); | |
1510 X: | |
1511 mp_clear(&t); | |
1512 | |
1513 return res; | |
1514 | |
1515 } /* end mp_sqrt() */ | |
1516 | |
1517 /* }}} */ | |
1518 | |
1519 /* }}} */ | |
1520 | |
1521 /*------------------------------------------------------------------------*/ | |
1522 /* {{{ Modular arithmetic */ | |
1523 | |
1524 #if MP_MODARITH | |
1525 /* {{{ mp_addmod(a, b, m, c) */ | |
1526 | |
1527 /* | |
1528 mp_addmod(a, b, m, c) | |
1529 | |
1530 Compute c = (a + b) mod m | |
1531 */ | |
1532 | |
1533 mp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) | |
1534 { | |
1535 mp_err res; | |
1536 | |
1537 ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); | |
1538 | |
1539 if((res = mp_add(a, b, c)) != MP_OKAY) | |
1540 return res; | |
1541 if((res = mp_mod(c, m, c)) != MP_OKAY) | |
1542 return res; | |
1543 | |
1544 return MP_OKAY; | |
1545 | |
1546 } | |
1547 | |
1548 /* }}} */ | |
1549 | |
1550 /* {{{ mp_submod(a, b, m, c) */ | |
1551 | |
1552 /* | |
1553 mp_submod(a, b, m, c) | |
1554 | |
1555 Compute c = (a - b) mod m | |
1556 */ | |
1557 | |
1558 mp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) | |
1559 { | |
1560 mp_err res; | |
1561 | |
1562 ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); | |
1563 | |
1564 if((res = mp_sub(a, b, c)) != MP_OKAY) | |
1565 return res; | |
1566 if((res = mp_mod(c, m, c)) != MP_OKAY) | |
1567 return res; | |
1568 | |
1569 return MP_OKAY; | |
1570 | |
1571 } | |
1572 | |
1573 /* }}} */ | |
1574 | |
1575 /* {{{ mp_mulmod(a, b, m, c) */ | |
1576 | |
1577 /* | |
1578 mp_mulmod(a, b, m, c) | |
1579 | |
1580 Compute c = (a * b) mod m | |
1581 */ | |
1582 | |
1583 mp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) | |
1584 { | |
1585 mp_err res; | |
1586 | |
1587 ARGCHK(a != NULL && b != NULL && m != NULL && c != NULL, MP_BADARG); | |
1588 | |
1589 if((res = mp_mul(a, b, c)) != MP_OKAY) | |
1590 return res; | |
1591 if((res = mp_mod(c, m, c)) != MP_OKAY) | |
1592 return res; | |
1593 | |
1594 return MP_OKAY; | |
1595 | |
1596 } | |
1597 | |
1598 /* }}} */ | |
1599 | |
1600 /* {{{ mp_sqrmod(a, m, c) */ | |
1601 | |
1602 #if MP_SQUARE | |
1603 mp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c) | |
1604 { | |
1605 mp_err res; | |
1606 | |
1607 ARGCHK(a != NULL && m != NULL && c != NULL, MP_BADARG); | |
1608 | |
1609 if((res = mp_sqr(a, c)) != MP_OKAY) | |
1610 return res; | |
1611 if((res = mp_mod(c, m, c)) != MP_OKAY) | |
1612 return res; | |
1613 | |
1614 return MP_OKAY; | |
1615 | |
1616 } /* end mp_sqrmod() */ | |
1617 #endif | |
1618 | |
1619 /* }}} */ | |
1620 | |
1621 /* {{{ mp_exptmod(a, b, m, c) */ | |
1622 | |
1623 /* | |
1624 mp_exptmod(a, b, m, c) | |
1625 | |
1626 Compute c = (a ** b) mod m. Uses a standard square-and-multiply | |
1627 method with modular reductions at each step. (This is basically the | |
1628 same code as mp_expt(), except for the addition of the reductions) | |
1629 | |
1630 The modular reductions are done using Barrett's algorithm (see | |
1631 s_mp_reduce() below for details) | |
1632 */ | |
1633 | |
1634 mp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c) | |
1635 { | |
1636 mp_int s, x, mu; | |
1637 mp_err res; | |
1638 mp_digit d, *db = DIGITS(b); | |
1639 mp_size ub = USED(b); | |
1640 int dig, bit; | |
1641 | |
1642 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
1643 | |
1644 if(mp_cmp_z(b) < 0 || mp_cmp_z(m) <= 0) | |
1645 return MP_RANGE; | |
1646 | |
1647 if((res = mp_init(&s)) != MP_OKAY) | |
1648 return res; | |
1649 if((res = mp_init_copy(&x, a)) != MP_OKAY) | |
1650 goto X; | |
1651 if((res = mp_mod(&x, m, &x)) != MP_OKAY || | |
1652 (res = mp_init(&mu)) != MP_OKAY) | |
1653 goto MU; | |
1654 | |
1655 mp_set(&s, 1); | |
1656 | |
1657 /* mu = b^2k / m */ | |
1658 s_mp_add_d(&mu, 1); | |
1659 s_mp_lshd(&mu, 2 * USED(m)); | |
1660 if((res = mp_div(&mu, m, &mu, NULL)) != MP_OKAY) | |
1661 goto CLEANUP; | |
1662 | |
1663 /* Loop over digits of b in ascending order, except highest order */ | |
1664 for(dig = 0; dig < (ub - 1); dig++) { | |
1665 d = *db++; | |
1666 | |
1667 /* Loop over the bits of the lower-order digits */ | |
1668 for(bit = 0; bit < DIGIT_BIT; bit++) { | |
1669 if(d & 1) { | |
1670 if((res = s_mp_mul(&s, &x)) != MP_OKAY) | |
1671 goto CLEANUP; | |
1672 if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY) | |
1673 goto CLEANUP; | |
1674 } | |
1675 | |
1676 d >>= 1; | |
1677 | |
1678 if((res = s_mp_sqr(&x)) != MP_OKAY) | |
1679 goto CLEANUP; | |
1680 if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY) | |
1681 goto CLEANUP; | |
1682 } | |
1683 } | |
1684 | |
1685 /* Now do the last digit... */ | |
1686 d = *db; | |
1687 | |
1688 while(d) { | |
1689 if(d & 1) { | |
1690 if((res = s_mp_mul(&s, &x)) != MP_OKAY) | |
1691 goto CLEANUP; | |
1692 if((res = s_mp_reduce(&s, m, &mu)) != MP_OKAY) | |
1693 goto CLEANUP; | |
1694 } | |
1695 | |
1696 d >>= 1; | |
1697 | |
1698 if((res = s_mp_sqr(&x)) != MP_OKAY) | |
1699 goto CLEANUP; | |
1700 if((res = s_mp_reduce(&x, m, &mu)) != MP_OKAY) | |
1701 goto CLEANUP; | |
1702 } | |
1703 | |
1704 s_mp_exch(&s, c); | |
1705 | |
1706 CLEANUP: | |
1707 mp_clear(&mu); | |
1708 MU: | |
1709 mp_clear(&x); | |
1710 X: | |
1711 mp_clear(&s); | |
1712 | |
1713 return res; | |
1714 | |
1715 } /* end mp_exptmod() */ | |
1716 | |
1717 /* }}} */ | |
1718 | |
1719 /* {{{ mp_exptmod_d(a, d, m, c) */ | |
1720 | |
1721 mp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c) | |
1722 { | |
1723 mp_int s, x; | |
1724 mp_err res; | |
1725 | |
1726 ARGCHK(a != NULL && c != NULL, MP_BADARG); | |
1727 | |
1728 if((res = mp_init(&s)) != MP_OKAY) | |
1729 return res; | |
1730 if((res = mp_init_copy(&x, a)) != MP_OKAY) | |
1731 goto X; | |
1732 | |
1733 mp_set(&s, 1); | |
1734 | |
1735 while(d != 0) { | |
1736 if(d & 1) { | |
1737 if((res = s_mp_mul(&s, &x)) != MP_OKAY || | |
1738 (res = mp_mod(&s, m, &s)) != MP_OKAY) | |
1739 goto CLEANUP; | |
1740 } | |
1741 | |
1742 d /= 2; | |
1743 | |
1744 if((res = s_mp_sqr(&x)) != MP_OKAY || | |
1745 (res = mp_mod(&x, m, &x)) != MP_OKAY) | |
1746 goto CLEANUP; | |
1747 } | |
1748 | |
1749 s_mp_exch(&s, c); | |
1750 | |
1751 CLEANUP: | |
1752 mp_clear(&x); | |
1753 X: | |
1754 mp_clear(&s); | |
1755 | |
1756 return res; | |
1757 | |
1758 } /* end mp_exptmod_d() */ | |
1759 | |
1760 /* }}} */ | |
1761 #endif /* if MP_MODARITH */ | |
1762 | |
1763 /* }}} */ | |
1764 | |
1765 /*------------------------------------------------------------------------*/ | |
1766 /* {{{ Comparison functions */ | |
1767 | |
1768 /* {{{ mp_cmp_z(a) */ | |
1769 | |
1770 /* | |
1771 mp_cmp_z(a) | |
1772 | |
1773 Compare a <=> 0. Returns <0 if a<0, 0 if a=0, >0 if a>0. | |
1774 */ | |
1775 | |
1776 int mp_cmp_z(mp_int *a) | |
1777 { | |
1778 if(SIGN(a) == MP_NEG) | |
1779 return MP_LT; | |
1780 else if(USED(a) == 1 && DIGIT(a, 0) == 0) | |
1781 return MP_EQ; | |
1782 else | |
1783 return MP_GT; | |
1784 | |
1785 } /* end mp_cmp_z() */ | |
1786 | |
1787 /* }}} */ | |
1788 | |
1789 /* {{{ mp_cmp_d(a, d) */ | |
1790 | |
1791 /* | |
1792 mp_cmp_d(a, d) | |
1793 | |
1794 Compare a <=> d. Returns <0 if a<d, 0 if a=d, >0 if a>d | |
1795 */ | |
1796 | |
1797 int mp_cmp_d(mp_int *a, mp_digit d) | |
1798 { | |
1799 ARGCHK(a != NULL, MP_EQ); | |
1800 | |
1801 if(SIGN(a) == MP_NEG) | |
1802 return MP_LT; | |
1803 | |
1804 return s_mp_cmp_d(a, d); | |
1805 | |
1806 } /* end mp_cmp_d() */ | |
1807 | |
1808 /* }}} */ | |
1809 | |
1810 /* {{{ mp_cmp(a, b) */ | |
1811 | |
1812 int mp_cmp(mp_int *a, mp_int *b) | |
1813 { | |
1814 ARGCHK(a != NULL && b != NULL, MP_EQ); | |
1815 | |
1816 if(SIGN(a) == SIGN(b)) { | |
1817 int mag; | |
1818 | |
1819 if((mag = s_mp_cmp(a, b)) == MP_EQ) | |
1820 return MP_EQ; | |
1821 | |
1822 if(SIGN(a) == MP_ZPOS) | |
1823 return mag; | |
1824 else | |
1825 return -mag; | |
1826 | |
1827 } else if(SIGN(a) == MP_ZPOS) { | |
1828 return MP_GT; | |
1829 } else { | |
1830 return MP_LT; | |
1831 } | |
1832 | |
1833 } /* end mp_cmp() */ | |
1834 | |
1835 /* }}} */ | |
1836 | |
1837 /* {{{ mp_cmp_mag(a, b) */ | |
1838 | |
1839 /* | |
1840 mp_cmp_mag(a, b) | |
1841 | |
1842 Compares |a| <=> |b|, and returns an appropriate comparison result | |
1843 */ | |
1844 | |
1845 int mp_cmp_mag(mp_int *a, mp_int *b) | |
1846 { | |
1847 ARGCHK(a != NULL && b != NULL, MP_EQ); | |
1848 | |
1849 return s_mp_cmp(a, b); | |
1850 | |
1851 } /* end mp_cmp_mag() */ | |
1852 | |
1853 /* }}} */ | |
1854 | |
1855 /* {{{ mp_cmp_int(a, z) */ | |
1856 | |
1857 /* | |
1858 This just converts z to an mp_int, and uses the existing comparison | |
1859 routines. This is sort of inefficient, but it's not clear to me how | |
1860 frequently this wil get used anyway. For small positive constants, | |
1861 you can always use mp_cmp_d(), and for zero, there is mp_cmp_z(). | |
1862 */ | |
1863 int mp_cmp_int(mp_int *a, long z) | |
1864 { | |
1865 mp_int tmp; | |
1866 int out; | |
1867 | |
1868 ARGCHK(a != NULL, MP_EQ); | |
1869 | |
1870 mp_init(&tmp); mp_set_int(&tmp, z); | |
1871 out = mp_cmp(a, &tmp); | |
1872 mp_clear(&tmp); | |
1873 | |
1874 return out; | |
1875 | |
1876 } /* end mp_cmp_int() */ | |
1877 | |
1878 /* }}} */ | |
1879 | |
1880 /* {{{ mp_isodd(a) */ | |
1881 | |
1882 /* | |
1883 mp_isodd(a) | |
1884 | |
1885 Returns a true (non-zero) value if a is odd, false (zero) otherwise. | |
1886 */ | |
1887 int mp_isodd(mp_int *a) | |
1888 { | |
1889 ARGCHK(a != NULL, 0); | |
1890 | |
1891 return (DIGIT(a, 0) & 1); | |
1892 | |
1893 } /* end mp_isodd() */ | |
1894 | |
1895 /* }}} */ | |
1896 | |
1897 /* {{{ mp_iseven(a) */ | |
1898 | |
1899 int mp_iseven(mp_int *a) | |
1900 { | |
1901 return !mp_isodd(a); | |
1902 | |
1903 } /* end mp_iseven() */ | |
1904 | |
1905 /* }}} */ | |
1906 | |
1907 /* }}} */ | |
1908 | |
1909 /*------------------------------------------------------------------------*/ | |
1910 /* {{{ Number theoretic functions */ | |
1911 | |
1912 #if MP_NUMTH | |
1913 /* {{{ mp_gcd(a, b, c) */ | |
1914 | |
1915 /* | |
1916 Like the old mp_gcd() function, except computes the GCD using the | |
1917 binary algorithm due to Josef Stein in 1961 (via Knuth). | |
1918 */ | |
1919 mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c) | |
1920 { | |
1921 mp_err res; | |
1922 mp_int u, v, t; | |
1923 mp_size k = 0; | |
1924 | |
1925 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
1926 | |
1927 if(mp_cmp_z(a) == MP_EQ && mp_cmp_z(b) == MP_EQ) | |
1928 return MP_RANGE; | |
1929 if(mp_cmp_z(a) == MP_EQ) { | |
1930 return mp_copy(b, c); | |
1931 } else if(mp_cmp_z(b) == MP_EQ) { | |
1932 return mp_copy(a, c); | |
1933 } | |
1934 | |
1935 if((res = mp_init(&t)) != MP_OKAY) | |
1936 return res; | |
1937 if((res = mp_init_copy(&u, a)) != MP_OKAY) | |
1938 goto U; | |
1939 if((res = mp_init_copy(&v, b)) != MP_OKAY) | |
1940 goto V; | |
1941 | |
1942 SIGN(&u) = MP_ZPOS; | |
1943 SIGN(&v) = MP_ZPOS; | |
1944 | |
1945 /* Divide out common factors of 2 until at least 1 of a, b is even */ | |
1946 while(mp_iseven(&u) && mp_iseven(&v)) { | |
1947 s_mp_div_2(&u); | |
1948 s_mp_div_2(&v); | |
1949 ++k; | |
1950 } | |
1951 | |
1952 /* Initialize t */ | |
1953 if(mp_isodd(&u)) { | |
1954 if((res = mp_copy(&v, &t)) != MP_OKAY) | |
1955 goto CLEANUP; | |
1956 | |
1957 /* t = -v */ | |
1958 if(SIGN(&v) == MP_ZPOS) | |
1959 SIGN(&t) = MP_NEG; | |
1960 else | |
1961 SIGN(&t) = MP_ZPOS; | |
1962 | |
1963 } else { | |
1964 if((res = mp_copy(&u, &t)) != MP_OKAY) | |
1965 goto CLEANUP; | |
1966 | |
1967 } | |
1968 | |
1969 for(;;) { | |
1970 while(mp_iseven(&t)) { | |
1971 s_mp_div_2(&t); | |
1972 } | |
1973 | |
1974 if(mp_cmp_z(&t) == MP_GT) { | |
1975 if((res = mp_copy(&t, &u)) != MP_OKAY) | |
1976 goto CLEANUP; | |
1977 | |
1978 } else { | |
1979 if((res = mp_copy(&t, &v)) != MP_OKAY) | |
1980 goto CLEANUP; | |
1981 | |
1982 /* v = -t */ | |
1983 if(SIGN(&t) == MP_ZPOS) | |
1984 SIGN(&v) = MP_NEG; | |
1985 else | |
1986 SIGN(&v) = MP_ZPOS; | |
1987 } | |
1988 | |
1989 if((res = mp_sub(&u, &v, &t)) != MP_OKAY) | |
1990 goto CLEANUP; | |
1991 | |
1992 if(s_mp_cmp_d(&t, 0) == MP_EQ) | |
1993 break; | |
1994 } | |
1995 | |
1996 s_mp_2expt(&v, k); /* v = 2^k */ | |
1997 res = mp_mul(&u, &v, c); /* c = u * v */ | |
1998 | |
1999 CLEANUP: | |
2000 mp_clear(&v); | |
2001 V: | |
2002 mp_clear(&u); | |
2003 U: | |
2004 mp_clear(&t); | |
2005 | |
2006 return res; | |
2007 | |
2008 } /* end mp_bgcd() */ | |
2009 | |
2010 /* }}} */ | |
2011 | |
2012 /* {{{ mp_lcm(a, b, c) */ | |
2013 | |
2014 /* We compute the least common multiple using the rule: | |
2015 | |
2016 ab = [a, b](a, b) | |
2017 | |
2018 ... by computing the product, and dividing out the gcd. | |
2019 */ | |
2020 | |
2021 mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c) | |
2022 { | |
2023 mp_int gcd, prod; | |
2024 mp_err res; | |
2025 | |
2026 ARGCHK(a != NULL && b != NULL && c != NULL, MP_BADARG); | |
2027 | |
2028 /* Set up temporaries */ | |
2029 if((res = mp_init(&gcd)) != MP_OKAY) | |
2030 return res; | |
2031 if((res = mp_init(&prod)) != MP_OKAY) | |
2032 goto GCD; | |
2033 | |
2034 if((res = mp_mul(a, b, &prod)) != MP_OKAY) | |
2035 goto CLEANUP; | |
2036 if((res = mp_gcd(a, b, &gcd)) != MP_OKAY) | |
2037 goto CLEANUP; | |
2038 | |
2039 res = mp_div(&prod, &gcd, c, NULL); | |
2040 | |
2041 CLEANUP: | |
2042 mp_clear(&prod); | |
2043 GCD: | |
2044 mp_clear(&gcd); | |
2045 | |
2046 return res; | |
2047 | |
2048 } /* end mp_lcm() */ | |
2049 | |
2050 /* }}} */ | |
2051 | |
2052 /* {{{ mp_xgcd(a, b, g, x, y) */ | |
2053 | |
2054 /* | |
2055 mp_xgcd(a, b, g, x, y) | |
2056 | |
2057 Compute g = (a, b) and values x and y satisfying Bezout's identity | |
2058 (that is, ax + by = g). This uses the extended binary GCD algorithm | |
2059 based on the Stein algorithm used for mp_gcd() | |
2060 */ | |
2061 | |
2062 mp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y) | |
2063 { | |
2064 mp_int gx, xc, yc, u, v, A, B, C, D; | |
2065 mp_int *clean[9]; | |
2066 mp_err res; | |
2067 int last = -1; | |
2068 | |
2069 if(mp_cmp_z(b) == 0) | |
2070 return MP_RANGE; | |
2071 | |
2072 /* Initialize all these variables we need */ | |
2073 if((res = mp_init(&u)) != MP_OKAY) goto CLEANUP; | |
2074 clean[++last] = &u; | |
2075 if((res = mp_init(&v)) != MP_OKAY) goto CLEANUP; | |
2076 clean[++last] = &v; | |
2077 if((res = mp_init(&gx)) != MP_OKAY) goto CLEANUP; | |
2078 clean[++last] = &gx; | |
2079 if((res = mp_init(&A)) != MP_OKAY) goto CLEANUP; | |
2080 clean[++last] = &A; | |
2081 if((res = mp_init(&B)) != MP_OKAY) goto CLEANUP; | |
2082 clean[++last] = &B; | |
2083 if((res = mp_init(&C)) != MP_OKAY) goto CLEANUP; | |
2084 clean[++last] = &C; | |
2085 if((res = mp_init(&D)) != MP_OKAY) goto CLEANUP; | |
2086 clean[++last] = &D; | |
2087 if((res = mp_init_copy(&xc, a)) != MP_OKAY) goto CLEANUP; | |
2088 clean[++last] = &xc; | |
2089 mp_abs(&xc, &xc); | |
2090 if((res = mp_init_copy(&yc, b)) != MP_OKAY) goto CLEANUP; | |
2091 clean[++last] = &yc; | |
2092 mp_abs(&yc, &yc); | |
2093 | |
2094 mp_set(&gx, 1); | |
2095 | |
2096 /* Divide by two until at least one of them is even */ | |
2097 while(mp_iseven(&xc) && mp_iseven(&yc)) { | |
2098 s_mp_div_2(&xc); | |
2099 s_mp_div_2(&yc); | |
2100 if((res = s_mp_mul_2(&gx)) != MP_OKAY) | |
2101 goto CLEANUP; | |
2102 } | |
2103 | |
2104 mp_copy(&xc, &u); | |
2105 mp_copy(&yc, &v); | |
2106 mp_set(&A, 1); mp_set(&D, 1); | |
2107 | |
2108 /* Loop through binary GCD algorithm */ | |
2109 for(;;) { | |
2110 while(mp_iseven(&u)) { | |
2111 s_mp_div_2(&u); | |
2112 | |
2113 if(mp_iseven(&A) && mp_iseven(&B)) { | |
2114 s_mp_div_2(&A); s_mp_div_2(&B); | |
2115 } else { | |
2116 if((res = mp_add(&A, &yc, &A)) != MP_OKAY) goto CLEANUP; | |
2117 s_mp_div_2(&A); | |
2118 if((res = mp_sub(&B, &xc, &B)) != MP_OKAY) goto CLEANUP; | |
2119 s_mp_div_2(&B); | |
2120 } | |
2121 } | |
2122 | |
2123 while(mp_iseven(&v)) { | |
2124 s_mp_div_2(&v); | |
2125 | |
2126 if(mp_iseven(&C) && mp_iseven(&D)) { | |
2127 s_mp_div_2(&C); s_mp_div_2(&D); | |
2128 } else { | |
2129 if((res = mp_add(&C, &yc, &C)) != MP_OKAY) goto CLEANUP; | |
2130 s_mp_div_2(&C); | |
2131 if((res = mp_sub(&D, &xc, &D)) != MP_OKAY) goto CLEANUP; | |
2132 s_mp_div_2(&D); | |
2133 } | |
2134 } | |
2135 | |
2136 if(mp_cmp(&u, &v) >= 0) { | |
2137 if((res = mp_sub(&u, &v, &u)) != MP_OKAY) goto CLEANUP; | |
2138 if((res = mp_sub(&A, &C, &A)) != MP_OKAY) goto CLEANUP; | |
2139 if((res = mp_sub(&B, &D, &B)) != MP_OKAY) goto CLEANUP; | |
2140 | |
2141 } else { | |
2142 if((res = mp_sub(&v, &u, &v)) != MP_OKAY) goto CLEANUP; | |
2143 if((res = mp_sub(&C, &A, &C)) != MP_OKAY) goto CLEANUP; | |
2144 if((res = mp_sub(&D, &B, &D)) != MP_OKAY) goto CLEANUP; | |
2145 | |
2146 } | |
2147 | |
2148 /* If we're done, copy results to output */ | |
2149 if(mp_cmp_z(&u) == 0) { | |
2150 if(x) | |
2151 if((res = mp_copy(&C, x)) != MP_OKAY) goto CLEANUP; | |
2152 | |
2153 if(y) | |
2154 if((res = mp_copy(&D, y)) != MP_OKAY) goto CLEANUP; | |
2155 | |
2156 if(g) | |
2157 if((res = mp_mul(&gx, &v, g)) != MP_OKAY) goto CLEANUP; | |
2158 | |
2159 break; | |
2160 } | |
2161 } | |
2162 | |
2163 CLEANUP: | |
2164 while(last >= 0) | |
2165 mp_clear(clean[last--]); | |
2166 | |
2167 return res; | |
2168 | |
2169 } /* end mp_xgcd() */ | |
2170 | |
2171 /* }}} */ | |
2172 | |
2173 /* {{{ mp_invmod(a, m, c) */ | |
2174 | |
2175 /* | |
2176 mp_invmod(a, m, c) | |
2177 | |
2178 Compute c = a^-1 (mod m), if there is an inverse for a (mod m). | |
2179 This is equivalent to the question of whether (a, m) = 1. If not, | |
2180 MP_UNDEF is returned, and there is no inverse. | |
2181 */ | |
2182 | |
2183 mp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c) | |
2184 { | |
2185 mp_int g, x; | |
2186 mp_err res; | |
2187 | |
2188 ARGCHK(a && m && c, MP_BADARG); | |
2189 | |
2190 if(mp_cmp_z(a) == 0 || mp_cmp_z(m) == 0) | |
2191 return MP_RANGE; | |
2192 | |
2193 if((res = mp_init(&g)) != MP_OKAY) | |
2194 return res; | |
2195 if((res = mp_init(&x)) != MP_OKAY) | |
2196 goto X; | |
2197 | |
2198 if((res = mp_xgcd(a, m, &g, &x, NULL)) != MP_OKAY) | |
2199 goto CLEANUP; | |
2200 | |
2201 if(mp_cmp_d(&g, 1) != MP_EQ) { | |
2202 res = MP_UNDEF; | |
2203 goto CLEANUP; | |
2204 } | |
2205 | |
2206 res = mp_mod(&x, m, c); | |
2207 SIGN(c) = SIGN(a); | |
2208 | |
2209 CLEANUP: | |
2210 mp_clear(&x); | |
2211 X: | |
2212 mp_clear(&g); | |
2213 | |
2214 return res; | |
2215 | |
2216 } /* end mp_invmod() */ | |
2217 | |
2218 /* }}} */ | |
2219 #endif /* if MP_NUMTH */ | |
2220 | |
2221 /* }}} */ | |
2222 | |
2223 /*------------------------------------------------------------------------*/ | |
2224 /* {{{ mp_print(mp, ofp) */ | |
2225 | |
2226 #if MP_IOFUNC | |
2227 /* | |
2228 mp_print(mp, ofp) | |
2229 | |
2230 Print a textual representation of the given mp_int on the output | |
2231 stream 'ofp'. Output is generated using the internal radix. | |
2232 */ | |
2233 | |
2234 void mp_print(mp_int *mp, FILE *ofp) | |
2235 { | |
2236 int ix; | |
2237 | |
2238 if(mp == NULL || ofp == NULL) | |
2239 return; | |
2240 | |
2241 fputc((SIGN(mp) == MP_NEG) ? '-' : '+', ofp); | |
2242 | |
2243 for(ix = USED(mp) - 1; ix >= 0; ix--) { | |
2244 fprintf(ofp, DIGIT_FMT, DIGIT(mp, ix)); | |
2245 } | |
2246 | |
2247 } /* end mp_print() */ | |
2248 | |
2249 #endif /* if MP_IOFUNC */ | |
2250 | |
2251 /* }}} */ | |
2252 | |
2253 /*------------------------------------------------------------------------*/ | |
2254 /* {{{ More I/O Functions */ | |
2255 | |
2256 /* {{{ mp_read_signed_bin(mp, str, len) */ | |
2257 | |
2258 /* | |
2259 mp_read_signed_bin(mp, str, len) | |
2260 | |
2261 Read in a raw value (base 256) into the given mp_int | |
2262 */ | |
2263 | |
2264 mp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, int len) | |
2265 { | |
2266 mp_err res; | |
2267 | |
2268 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG); | |
2269 | |
2270 if((res = mp_read_unsigned_bin(mp, str + 1, len - 1)) == MP_OKAY) { | |
2271 /* Get sign from first byte */ | |
2272 if(str[0]) | |
2273 SIGN(mp) = MP_NEG; | |
2274 else | |
2275 SIGN(mp) = MP_ZPOS; | |
2276 } | |
2277 | |
2278 return res; | |
2279 | |
2280 } /* end mp_read_signed_bin() */ | |
2281 | |
2282 /* }}} */ | |
2283 | |
2284 /* {{{ mp_signed_bin_size(mp) */ | |
2285 | |
2286 int mp_signed_bin_size(mp_int *mp) | |
2287 { | |
2288 ARGCHK(mp != NULL, 0); | |
2289 | |
2290 return mp_unsigned_bin_size(mp) + 1; | |
2291 | |
2292 } /* end mp_signed_bin_size() */ | |
2293 | |
2294 /* }}} */ | |
2295 | |
2296 /* {{{ mp_to_signed_bin(mp, str) */ | |
2297 | |
2298 mp_err mp_to_signed_bin(mp_int *mp, unsigned char *str) | |
2299 { | |
2300 ARGCHK(mp != NULL && str != NULL, MP_BADARG); | |
2301 | |
2302 /* Caller responsible for allocating enough memory (use mp_raw_size(mp)) */ | |
2303 str[0] = (char)SIGN(mp); | |
2304 | |
2305 return mp_to_unsigned_bin(mp, str + 1); | |
2306 | |
2307 } /* end mp_to_signed_bin() */ | |
2308 | |
2309 /* }}} */ | |
2310 | |
2311 /* {{{ mp_read_unsigned_bin(mp, str, len) */ | |
2312 | |
2313 /* | |
2314 mp_read_unsigned_bin(mp, str, len) | |
2315 | |
2316 Read in an unsigned value (base 256) into the given mp_int | |
2317 */ | |
2318 | |
2319 mp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, int len) | |
2320 { | |
2321 int ix; | |
2322 mp_err res; | |
2323 | |
2324 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG); | |
2325 | |
2326 mp_zero(mp); | |
2327 | |
2328 for(ix = 0; ix < len; ix++) { | |
2329 if((res = s_mp_mul_2d(mp, CHAR_BIT)) != MP_OKAY) | |
2330 return res; | |
2331 | |
2332 if((res = mp_add_d(mp, str[ix], mp)) != MP_OKAY) | |
2333 return res; | |
2334 } | |
2335 | |
2336 return MP_OKAY; | |
2337 | |
2338 } /* end mp_read_unsigned_bin() */ | |
2339 | |
2340 /* }}} */ | |
2341 | |
2342 /* {{{ mp_unsigned_bin_size(mp) */ | |
2343 | |
2344 int mp_unsigned_bin_size(mp_int *mp) | |
2345 { | |
2346 mp_digit topdig; | |
2347 int count; | |
2348 | |
2349 ARGCHK(mp != NULL, 0); | |
2350 | |
2351 /* Special case for the value zero */ | |
2352 if(USED(mp) == 1 && DIGIT(mp, 0) == 0) | |
2353 return 1; | |
2354 | |
2355 count = (USED(mp) - 1) * sizeof(mp_digit); | |
2356 topdig = DIGIT(mp, USED(mp) - 1); | |
2357 | |
2358 while(topdig != 0) { | |
2359 ++count; | |
2360 topdig >>= CHAR_BIT; | |
2361 } | |
2362 | |
2363 return count; | |
2364 | |
2365 } /* end mp_unsigned_bin_size() */ | |
2366 | |
2367 /* }}} */ | |
2368 | |
2369 /* {{{ mp_to_unsigned_bin(mp, str) */ | |
2370 | |
2371 mp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str) | |
2372 { | |
2373 mp_digit *dp, *end, d; | |
2374 unsigned char *spos; | |
2375 | |
2376 ARGCHK(mp != NULL && str != NULL, MP_BADARG); | |
2377 | |
2378 dp = DIGITS(mp); | |
2379 end = dp + USED(mp) - 1; | |
2380 spos = str; | |
2381 | |
2382 /* Special case for zero, quick test */ | |
2383 if(dp == end && *dp == 0) { | |
2384 *str = '\0'; | |
2385 return MP_OKAY; | |
2386 } | |
2387 | |
2388 /* Generate digits in reverse order */ | |
2389 while(dp < end) { | |
2390 int ix; | |
2391 | |
2392 d = *dp; | |
2393 for(ix = 0; ix < sizeof(mp_digit); ++ix) { | |
2394 *spos = d & UCHAR_MAX; | |
2395 d >>= CHAR_BIT; | |
2396 ++spos; | |
2397 } | |
2398 | |
2399 ++dp; | |
2400 } | |
2401 | |
2402 /* Now handle last digit specially, high order zeroes are not written */ | |
2403 d = *end; | |
2404 while(d != 0) { | |
2405 *spos = d & UCHAR_MAX; | |
2406 d >>= CHAR_BIT; | |
2407 ++spos; | |
2408 } | |
2409 | |
2410 /* Reverse everything to get digits in the correct order */ | |
2411 while(--spos > str) { | |
2412 unsigned char t = *str; | |
2413 *str = *spos; | |
2414 *spos = t; | |
2415 | |
2416 ++str; | |
2417 } | |
2418 | |
2419 return MP_OKAY; | |
2420 | |
2421 } /* end mp_to_unsigned_bin() */ | |
2422 | |
2423 /* }}} */ | |
2424 | |
2425 /* {{{ mp_count_bits(mp) */ | |
2426 | |
2427 int mp_count_bits(mp_int *mp) | |
2428 { | |
2429 int len; | |
2430 mp_digit d; | |
2431 | |
2432 ARGCHK(mp != NULL, MP_BADARG); | |
2433 | |
2434 len = DIGIT_BIT * (USED(mp) - 1); | |
2435 d = DIGIT(mp, USED(mp) - 1); | |
2436 | |
2437 while(d != 0) { | |
2438 ++len; | |
2439 d >>= 1; | |
2440 } | |
2441 | |
2442 return len; | |
2443 | |
2444 } /* end mp_count_bits() */ | |
2445 | |
2446 /* }}} */ | |
2447 | |
2448 /* {{{ mp_read_radix(mp, str, radix) */ | |
2449 | |
2450 /* | |
2451 mp_read_radix(mp, str, radix) | |
2452 | |
2453 Read an integer from the given string, and set mp to the resulting | |
2454 value. The input is presumed to be in base 10. Leading non-digit | |
2455 characters are ignored, and the function reads until a non-digit | |
2456 character or the end of the string. | |
2457 */ | |
2458 | |
2459 mp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix) | |
2460 { | |
2461 int ix = 0, val = 0; | |
2462 mp_err res; | |
2463 mp_sign sig = MP_ZPOS; | |
2464 | |
2465 ARGCHK(mp != NULL && str != NULL && radix >= 2 && radix <= MAX_RADIX, | |
2466 MP_BADARG); | |
2467 | |
2468 mp_zero(mp); | |
2469 | |
2470 /* Skip leading non-digit characters until a digit or '-' or '+' */ | |
2471 while(str[ix] && | |
2472 (s_mp_tovalue(str[ix], radix) < 0) && | |
2473 str[ix] != '-' && | |
2474 str[ix] != '+') { | |
2475 ++ix; | |
2476 } | |
2477 | |
2478 if(str[ix] == '-') { | |
2479 sig = MP_NEG; | |
2480 ++ix; | |
2481 } else if(str[ix] == '+') { | |
2482 sig = MP_ZPOS; /* this is the default anyway... */ | |
2483 ++ix; | |
2484 } | |
2485 | |
2486 while((val = s_mp_tovalue(str[ix], radix)) >= 0) { | |
2487 if((res = s_mp_mul_d(mp, radix)) != MP_OKAY) | |
2488 return res; | |
2489 if((res = s_mp_add_d(mp, val)) != MP_OKAY) | |
2490 return res; | |
2491 ++ix; | |
2492 } | |
2493 | |
2494 if(s_mp_cmp_d(mp, 0) == MP_EQ) | |
2495 SIGN(mp) = MP_ZPOS; | |
2496 else | |
2497 SIGN(mp) = sig; | |
2498 | |
2499 return MP_OKAY; | |
2500 | |
2501 } /* end mp_read_radix() */ | |
2502 | |
2503 /* }}} */ | |
2504 | |
2505 /* {{{ mp_radix_size(mp, radix) */ | |
2506 | |
2507 int mp_radix_size(mp_int *mp, int radix) | |
2508 { | |
2509 int len; | |
2510 ARGCHK(mp != NULL, 0); | |
2511 | |
2512 len = s_mp_outlen(mp_count_bits(mp), radix) + 1; /* for NUL terminator */ | |
2513 | |
2514 if(mp_cmp_z(mp) < 0) | |
2515 ++len; /* for sign */ | |
2516 | |
2517 return len; | |
2518 | |
2519 } /* end mp_radix_size() */ | |
2520 | |
2521 /* }}} */ | |
2522 | |
2523 /* {{{ mp_value_radix_size(num, qty, radix) */ | |
2524 | |
2525 /* num = number of digits | |
2526 qty = number of bits per digit | |
2527 radix = target base | |
2528 | |
2529 Return the number of digits in the specified radix that would be | |
2530 needed to express 'num' digits of 'qty' bits each. | |
2531 */ | |
2532 int mp_value_radix_size(int num, int qty, int radix) | |
2533 { | |
2534 ARGCHK(num >= 0 && qty > 0 && radix >= 2 && radix <= MAX_RADIX, 0); | |
2535 | |
2536 return s_mp_outlen(num * qty, radix); | |
2537 | |
2538 } /* end mp_value_radix_size() */ | |
2539 | |
2540 /* }}} */ | |
2541 | |
2542 /* {{{ mp_toradix(mp, str, radix) */ | |
2543 | |
2544 mp_err mp_toradix(mp_int *mp, unsigned char *str, int radix) | |
2545 { | |
2546 int ix, pos = 0; | |
2547 | |
2548 ARGCHK(mp != NULL && str != NULL, MP_BADARG); | |
2549 ARGCHK(radix > 1 && radix <= MAX_RADIX, MP_RANGE); | |
2550 | |
2551 if(mp_cmp_z(mp) == MP_EQ) { | |
2552 str[0] = '0'; | |
2553 str[1] = '\0'; | |
2554 } else { | |
2555 mp_err res; | |
2556 mp_int tmp; | |
2557 mp_sign sgn; | |
2558 mp_digit rem, rdx = (mp_digit)radix; | |
2559 char ch; | |
2560 | |
2561 if((res = mp_init_copy(&tmp, mp)) != MP_OKAY) | |
2562 return res; | |
2563 | |
2564 /* Save sign for later, and take absolute value */ | |
2565 sgn = SIGN(&tmp); SIGN(&tmp) = MP_ZPOS; | |
2566 | |
2567 /* Generate output digits in reverse order */ | |
2568 while(mp_cmp_z(&tmp) != 0) { | |
2569 if((res = s_mp_div_d(&tmp, rdx, &rem)) != MP_OKAY) { | |
2570 mp_clear(&tmp); | |
2571 return res; | |
2572 } | |
2573 | |
2574 /* Generate digits, use capital letters */ | |
2575 ch = s_mp_todigit(rem, radix, 0); | |
2576 | |
2577 str[pos++] = ch; | |
2578 } | |
2579 | |
2580 /* Add - sign if original value was negative */ | |
2581 if(sgn == MP_NEG) | |
2582 str[pos++] = '-'; | |
2583 | |
2584 /* Add trailing NUL to end the string */ | |
2585 str[pos--] = '\0'; | |
2586 | |
2587 /* Reverse the digits and sign indicator */ | |
2588 ix = 0; | |
2589 while(ix < pos) { | |
2590 char tmp = str[ix]; | |
2591 | |
2592 str[ix] = str[pos]; | |
2593 str[pos] = tmp; | |
2594 ++ix; | |
2595 --pos; | |
2596 } | |
2597 | |
2598 mp_clear(&tmp); | |
2599 } | |
2600 | |
2601 return MP_OKAY; | |
2602 | |
2603 } /* end mp_toradix() */ | |
2604 | |
2605 /* }}} */ | |
2606 | |
2607 /* {{{ mp_char2value(ch, r) */ | |
2608 | |
2609 int mp_char2value(char ch, int r) | |
2610 { | |
2611 return s_mp_tovalue(ch, r); | |
2612 | |
2613 } /* end mp_tovalue() */ | |
2614 | |
2615 /* }}} */ | |
2616 | |
2617 /* }}} */ | |
2618 | |
2619 /* {{{ mp_strerror(ec) */ | |
2620 | |
2621 /* | |
2622 mp_strerror(ec) | |
2623 | |
2624 Return a string describing the meaning of error code 'ec'. The | |
2625 string returned is allocated in static memory, so the caller should | |
2626 not attempt to modify or free the memory associated with this | |
2627 string. | |
2628 */ | |
2629 const char *mp_strerror(mp_err ec) | |
2630 { | |
2631 int aec = (ec < 0) ? -ec : ec; | |
2632 | |
2633 /* Code values are negative, so the senses of these comparisons | |
2634 are accurate */ | |
2635 if(ec < MP_LAST_CODE || ec > MP_OKAY) { | |
2636 return mp_err_string[0]; /* unknown error code */ | |
2637 } else { | |
2638 return mp_err_string[aec + 1]; | |
2639 } | |
2640 | |
2641 } /* end mp_strerror() */ | |
2642 | |
2643 /* }}} */ | |
2644 | |
2645 /*========================================================================*/ | |
2646 /*------------------------------------------------------------------------*/ | |
2647 /* Static function definitions (internal use only) */ | |
2648 | |
2649 /* {{{ Memory management */ | |
2650 | |
2651 /* {{{ s_mp_grow(mp, min) */ | |
2652 | |
2653 /* Make sure there are at least 'min' digits allocated to mp */ | |
2654 mp_err s_mp_grow(mp_int *mp, mp_size min) | |
2655 { | |
2656 if(min > ALLOC(mp)) { | |
2657 mp_digit *tmp; | |
2658 | |
2659 /* Set min to next nearest default precision block size */ | |
2660 min = ((min + (s_mp_defprec - 1)) / s_mp_defprec) * s_mp_defprec; | |
2661 | |
2662 if((tmp = s_mp_alloc(min, sizeof(mp_digit))) == NULL) | |
2663 return MP_MEM; | |
2664 | |
2665 s_mp_copy(DIGITS(mp), tmp, USED(mp)); | |
2666 | |
2667 #if MP_CRYPTO | |
2668 s_mp_setz(DIGITS(mp), ALLOC(mp)); | |
2669 #endif | |
2670 s_mp_free(DIGITS(mp)); | |
2671 DIGITS(mp) = tmp; | |
2672 ALLOC(mp) = min; | |
2673 } | |
2674 | |
2675 return MP_OKAY; | |
2676 | |
2677 } /* end s_mp_grow() */ | |
2678 | |
2679 /* }}} */ | |
2680 | |
2681 /* {{{ s_mp_pad(mp, min) */ | |
2682 | |
2683 /* Make sure the used size of mp is at least 'min', growing if needed */ | |
2684 mp_err s_mp_pad(mp_int *mp, mp_size min) | |
2685 { | |
2686 if(min > USED(mp)) { | |
2687 mp_err res; | |
2688 | |
2689 /* Make sure there is room to increase precision */ | |
2690 if(min > ALLOC(mp) && (res = s_mp_grow(mp, min)) != MP_OKAY) | |
2691 return res; | |
2692 | |
2693 /* Increase precision; should already be 0-filled */ | |
2694 USED(mp) = min; | |
2695 } | |
2696 | |
2697 return MP_OKAY; | |
2698 | |
2699 } /* end s_mp_pad() */ | |
2700 | |
2701 /* }}} */ | |
2702 | |
2703 /* {{{ s_mp_setz(dp, count) */ | |
2704 | |
2705 #if MP_MACRO == 0 | |
2706 /* Set 'count' digits pointed to by dp to be zeroes */ | |
2707 void s_mp_setz(mp_digit *dp, mp_size count) | |
2708 { | |
2709 #if MP_MEMSET == 0 | |
2710 int ix; | |
2711 | |
2712 for(ix = 0; ix < count; ix++) | |
2713 dp[ix] = 0; | |
2714 #else | |
2715 memset(dp, 0, count * sizeof(mp_digit)); | |
2716 #endif | |
2717 | |
2718 } /* end s_mp_setz() */ | |
2719 #endif | |
2720 | |
2721 /* }}} */ | |
2722 | |
2723 /* {{{ s_mp_copy(sp, dp, count) */ | |
2724 | |
2725 #if MP_MACRO == 0 | |
2726 /* Copy 'count' digits from sp to dp */ | |
2727 void s_mp_copy(mp_digit *sp, mp_digit *dp, mp_size count) | |
2728 { | |
2729 #if MP_MEMCPY == 0 | |
2730 int ix; | |
2731 | |
2732 for(ix = 0; ix < count; ix++) | |
2733 dp[ix] = sp[ix]; | |
2734 #else | |
2735 memcpy(dp, sp, count * sizeof(mp_digit)); | |
2736 #endif | |
2737 | |
2738 } /* end s_mp_copy() */ | |
2739 #endif | |
2740 | |
2741 /* }}} */ | |
2742 | |
2743 /* {{{ s_mp_alloc(nb, ni) */ | |
2744 | |
2745 #if MP_MACRO == 0 | |
2746 /* Allocate ni records of nb bytes each, and return a pointer to that */ | |
2747 void *s_mp_alloc(size_t nb, size_t ni) | |
2748 { | |
2749 return calloc(nb, ni); | |
2750 | |
2751 } /* end s_mp_alloc() */ | |
2752 #endif | |
2753 | |
2754 /* }}} */ | |
2755 | |
2756 /* {{{ s_mp_free(ptr) */ | |
2757 | |
2758 #if MP_MACRO == 0 | |
2759 /* Free the memory pointed to by ptr */ | |
2760 void s_mp_free(void *ptr) | |
2761 { | |
2762 if(ptr) | |
2763 free(ptr); | |
2764 | |
2765 } /* end s_mp_free() */ | |
2766 #endif | |
2767 | |
2768 /* }}} */ | |
2769 | |
2770 /* {{{ s_mp_clamp(mp) */ | |
2771 | |
2772 /* Remove leading zeroes from the given value */ | |
2773 void s_mp_clamp(mp_int *mp) | |
2774 { | |
2775 mp_size du = USED(mp); | |
2776 mp_digit *zp = DIGITS(mp) + du - 1; | |
2777 | |
2778 while(du > 1 && !*zp--) | |
2779 --du; | |
2780 | |
2781 USED(mp) = du; | |
2782 | |
2783 } /* end s_mp_clamp() */ | |
2784 | |
2785 | |
2786 /* }}} */ | |
2787 | |
2788 /* {{{ s_mp_exch(a, b) */ | |
2789 | |
2790 /* Exchange the data for a and b; (b, a) = (a, b) */ | |
2791 void s_mp_exch(mp_int *a, mp_int *b) | |
2792 { | |
2793 mp_int tmp; | |
2794 | |
2795 tmp = *a; | |
2796 *a = *b; | |
2797 *b = tmp; | |
2798 | |
2799 } /* end s_mp_exch() */ | |
2800 | |
2801 /* }}} */ | |
2802 | |
2803 /* }}} */ | |
2804 | |
2805 /* {{{ Arithmetic helpers */ | |
2806 | |
2807 /* {{{ s_mp_lshd(mp, p) */ | |
2808 | |
2809 /* | |
2810 Shift mp leftward by p digits, growing if needed, and zero-filling | |
2811 the in-shifted digits at the right end. This is a convenient | |
2812 alternative to multiplication by powers of the radix | |
2813 */ | |
2814 | |
2815 mp_err s_mp_lshd(mp_int *mp, mp_size p) | |
2816 { | |
2817 mp_err res; | |
2818 mp_size pos; | |
2819 mp_digit *dp; | |
2820 int ix; | |
2821 | |
2822 if(p == 0) | |
2823 return MP_OKAY; | |
2824 | |
2825 if((res = s_mp_pad(mp, USED(mp) + p)) != MP_OKAY) | |
2826 return res; | |
2827 | |
2828 pos = USED(mp) - 1; | |
2829 dp = DIGITS(mp); | |
2830 | |
2831 /* Shift all the significant figures over as needed */ | |
2832 for(ix = pos - p; ix >= 0; ix--) | |
2833 dp[ix + p] = dp[ix]; | |
2834 | |
2835 /* Fill the bottom digits with zeroes */ | |
2836 for(ix = 0; ix < p; ix++) | |
2837 dp[ix] = 0; | |
2838 | |
2839 return MP_OKAY; | |
2840 | |
2841 } /* end s_mp_lshd() */ | |
2842 | |
2843 /* }}} */ | |
2844 | |
2845 /* {{{ s_mp_rshd(mp, p) */ | |
2846 | |
2847 /* | |
2848 Shift mp rightward by p digits. Maintains the invariant that | |
2849 digits above the precision are all zero. Digits shifted off the | |
2850 end are lost. Cannot fail. | |
2851 */ | |
2852 | |
2853 void s_mp_rshd(mp_int *mp, mp_size p) | |
2854 { | |
2855 mp_size ix; | |
2856 mp_digit *dp; | |
2857 | |
2858 if(p == 0) | |
2859 return; | |
2860 | |
2861 /* Shortcut when all digits are to be shifted off */ | |
2862 if(p >= USED(mp)) { | |
2863 s_mp_setz(DIGITS(mp), ALLOC(mp)); | |
2864 USED(mp) = 1; | |
2865 SIGN(mp) = MP_ZPOS; | |
2866 return; | |
2867 } | |
2868 | |
2869 /* Shift all the significant figures over as needed */ | |
2870 dp = DIGITS(mp); | |
2871 for(ix = p; ix < USED(mp); ix++) | |
2872 dp[ix - p] = dp[ix]; | |
2873 | |
2874 /* Fill the top digits with zeroes */ | |
2875 ix -= p; | |
2876 while(ix < USED(mp)) | |
2877 dp[ix++] = 0; | |
2878 | |
2879 /* Strip off any leading zeroes */ | |
2880 s_mp_clamp(mp); | |
2881 | |
2882 } /* end s_mp_rshd() */ | |
2883 | |
2884 /* }}} */ | |
2885 | |
2886 /* {{{ s_mp_div_2(mp) */ | |
2887 | |
2888 /* Divide by two -- take advantage of radix properties to do it fast */ | |
2889 void s_mp_div_2(mp_int *mp) | |
2890 { | |
2891 s_mp_div_2d(mp, 1); | |
2892 | |
2893 } /* end s_mp_div_2() */ | |
2894 | |
2895 /* }}} */ | |
2896 | |
2897 /* {{{ s_mp_mul_2(mp) */ | |
2898 | |
2899 mp_err s_mp_mul_2(mp_int *mp) | |
2900 { | |
2901 int ix; | |
2902 mp_digit kin = 0, kout, *dp = DIGITS(mp); | |
2903 mp_err res; | |
2904 | |
2905 /* Shift digits leftward by 1 bit */ | |
2906 for(ix = 0; ix < USED(mp); ix++) { | |
2907 kout = (dp[ix] >> (DIGIT_BIT - 1)) & 1; | |
2908 dp[ix] = (dp[ix] << 1) | kin; | |
2909 | |
2910 kin = kout; | |
2911 } | |
2912 | |
2913 /* Deal with rollover from last digit */ | |
2914 if(kin) { | |
2915 if(ix >= ALLOC(mp)) { | |
2916 if((res = s_mp_grow(mp, ALLOC(mp) + 1)) != MP_OKAY) | |
2917 return res; | |
2918 dp = DIGITS(mp); | |
2919 } | |
2920 | |
2921 dp[ix] = kin; | |
2922 USED(mp) += 1; | |
2923 } | |
2924 | |
2925 return MP_OKAY; | |
2926 | |
2927 } /* end s_mp_mul_2() */ | |
2928 | |
2929 /* }}} */ | |
2930 | |
2931 /* {{{ s_mp_mod_2d(mp, d) */ | |
2932 | |
2933 /* | |
2934 Remainder the integer by 2^d, where d is a number of bits. This | |
2935 amounts to a bitwise AND of the value, and does not require the full | |
2936 division code | |
2937 */ | |
2938 void s_mp_mod_2d(mp_int *mp, mp_digit d) | |
2939 { | |
2940 unsigned int ndig = (d / DIGIT_BIT), nbit = (d % DIGIT_BIT); | |
2941 unsigned int ix; | |
2942 mp_digit dmask, *dp = DIGITS(mp); | |
2943 | |
2944 if(ndig >= USED(mp)) | |
2945 return; | |
2946 | |
2947 /* Flush all the bits above 2^d in its digit */ | |
2948 dmask = (1 << nbit) - 1; | |
2949 dp[ndig] &= dmask; | |
2950 | |
2951 /* Flush all digits above the one with 2^d in it */ | |
2952 for(ix = ndig + 1; ix < USED(mp); ix++) | |
2953 dp[ix] = 0; | |
2954 | |
2955 s_mp_clamp(mp); | |
2956 | |
2957 } /* end s_mp_mod_2d() */ | |
2958 | |
2959 /* }}} */ | |
2960 | |
2961 /* {{{ s_mp_mul_2d(mp, d) */ | |
2962 | |
2963 /* | |
2964 Multiply by the integer 2^d, where d is a number of bits. This | |
2965 amounts to a bitwise shift of the value, and does not require the | |
2966 full multiplication code. | |
2967 */ | |
2968 mp_err s_mp_mul_2d(mp_int *mp, mp_digit d) | |
2969 { | |
2970 mp_err res; | |
2971 mp_digit save, next, mask, *dp; | |
2972 mp_size used; | |
2973 int ix; | |
2974 | |
2975 if((res = s_mp_lshd(mp, d / DIGIT_BIT)) != MP_OKAY) | |
2976 return res; | |
2977 | |
2978 dp = DIGITS(mp); used = USED(mp); | |
2979 d %= DIGIT_BIT; | |
2980 | |
2981 mask = (1 << d) - 1; | |
2982 | |
2983 /* If the shift requires another digit, make sure we've got one to | |
2984 work with */ | |
2985 if((dp[used - 1] >> (DIGIT_BIT - d)) & mask) { | |
2986 if((res = s_mp_grow(mp, used + 1)) != MP_OKAY) | |
2987 return res; | |
2988 dp = DIGITS(mp); | |
2989 } | |
2990 | |
2991 /* Do the shifting... */ | |
2992 save = 0; | |
2993 for(ix = 0; ix < used; ix++) { | |
2994 next = (dp[ix] >> (DIGIT_BIT - d)) & mask; | |
2995 dp[ix] = (dp[ix] << d) | save; | |
2996 save = next; | |
2997 } | |
2998 | |
2999 /* If, at this point, we have a nonzero carryout into the next | |
3000 digit, we'll increase the size by one digit, and store it... | |
3001 */ | |
3002 if(save) { | |
3003 dp[used] = save; | |
3004 USED(mp) += 1; | |
3005 } | |
3006 | |
3007 s_mp_clamp(mp); | |
3008 return MP_OKAY; | |
3009 | |
3010 } /* end s_mp_mul_2d() */ | |
3011 | |
3012 /* }}} */ | |
3013 | |
3014 /* {{{ s_mp_div_2d(mp, d) */ | |
3015 | |
3016 /* | |
3017 Divide the integer by 2^d, where d is a number of bits. This | |
3018 amounts to a bitwise shift of the value, and does not require the | |
3019 full division code (used in Barrett reduction, see below) | |
3020 */ | |
3021 void s_mp_div_2d(mp_int *mp, mp_digit d) | |
3022 { | |
3023 int ix; | |
3024 mp_digit save, next, mask, *dp = DIGITS(mp); | |
3025 | |
3026 s_mp_rshd(mp, d / DIGIT_BIT); | |
3027 d %= DIGIT_BIT; | |
3028 | |
3029 mask = (1 << d) - 1; | |
3030 | |
3031 save = 0; | |
3032 for(ix = USED(mp) - 1; ix >= 0; ix--) { | |
3033 next = dp[ix] & mask; | |
3034 dp[ix] = (dp[ix] >> d) | (save << (DIGIT_BIT - d)); | |
3035 save = next; | |
3036 } | |
3037 | |
3038 s_mp_clamp(mp); | |
3039 | |
3040 } /* end s_mp_div_2d() */ | |
3041 | |
3042 /* }}} */ | |
3043 | |
3044 /* {{{ s_mp_norm(a, b) */ | |
3045 | |
3046 /* | |
3047 s_mp_norm(a, b) | |
3048 | |
3049 Normalize a and b for division, where b is the divisor. In order | |
3050 that we might make good guesses for quotient digits, we want the | |
3051 leading digit of b to be at least half the radix, which we | |
3052 accomplish by multiplying a and b by a constant. This constant is | |
3053 returned (so that it can be divided back out of the remainder at the | |
3054 end of the division process). | |
3055 | |
3056 We multiply by the smallest power of 2 that gives us a leading digit | |
3057 at least half the radix. By choosing a power of 2, we simplify the | |
3058 multiplication and division steps to simple shifts. | |
3059 */ | |
3060 mp_digit s_mp_norm(mp_int *a, mp_int *b) | |
3061 { | |
3062 mp_digit t, d = 0; | |
3063 | |
3064 t = DIGIT(b, USED(b) - 1); | |
3065 while(t < (RADIX / 2)) { | |
3066 t <<= 1; | |
3067 ++d; | |
3068 } | |
3069 | |
3070 if(d != 0) { | |
3071 s_mp_mul_2d(a, d); | |
3072 s_mp_mul_2d(b, d); | |
3073 } | |
3074 | |
3075 return d; | |
3076 | |
3077 } /* end s_mp_norm() */ | |
3078 | |
3079 /* }}} */ | |
3080 | |
3081 /* }}} */ | |
3082 | |
3083 /* {{{ Primitive digit arithmetic */ | |
3084 | |
3085 /* {{{ s_mp_add_d(mp, d) */ | |
3086 | |
3087 /* Add d to |mp| in place */ | |
3088 mp_err s_mp_add_d(mp_int *mp, mp_digit d) /* unsigned digit addition */ | |
3089 { | |
3090 mp_word w, k = 0; | |
3091 mp_size ix = 1, used = USED(mp); | |
3092 mp_digit *dp = DIGITS(mp); | |
3093 | |
3094 w = dp[0] + d; | |
3095 dp[0] = ACCUM(w); | |
3096 k = CARRYOUT(w); | |
3097 | |
3098 while(ix < used && k) { | |
3099 w = dp[ix] + k; | |
3100 dp[ix] = ACCUM(w); | |
3101 k = CARRYOUT(w); | |
3102 ++ix; | |
3103 } | |
3104 | |
3105 if(k != 0) { | |
3106 mp_err res; | |
3107 | |
3108 if((res = s_mp_pad(mp, USED(mp) + 1)) != MP_OKAY) | |
3109 return res; | |
3110 | |
3111 DIGIT(mp, ix) = k; | |
3112 } | |
3113 | |
3114 return MP_OKAY; | |
3115 | |
3116 } /* end s_mp_add_d() */ | |
3117 | |
3118 /* }}} */ | |
3119 | |
3120 /* {{{ s_mp_sub_d(mp, d) */ | |
3121 | |
3122 /* Subtract d from |mp| in place, assumes |mp| > d */ | |
3123 mp_err s_mp_sub_d(mp_int *mp, mp_digit d) /* unsigned digit subtract */ | |
3124 { | |
3125 mp_word w, b = 0; | |
3126 mp_size ix = 1, used = USED(mp); | |
3127 mp_digit *dp = DIGITS(mp); | |
3128 | |
3129 /* Compute initial subtraction */ | |
3130 w = (RADIX + dp[0]) - d; | |
3131 b = CARRYOUT(w) ? 0 : 1; | |
3132 dp[0] = ACCUM(w); | |
3133 | |
3134 /* Propagate borrows leftward */ | |
3135 while(b && ix < used) { | |
3136 w = (RADIX + dp[ix]) - b; | |
3137 b = CARRYOUT(w) ? 0 : 1; | |
3138 dp[ix] = ACCUM(w); | |
3139 ++ix; | |
3140 } | |
3141 | |
3142 /* Remove leading zeroes */ | |
3143 s_mp_clamp(mp); | |
3144 | |
3145 /* If we have a borrow out, it's a violation of the input invariant */ | |
3146 if(b) | |
3147 return MP_RANGE; | |
3148 else | |
3149 return MP_OKAY; | |
3150 | |
3151 } /* end s_mp_sub_d() */ | |
3152 | |
3153 /* }}} */ | |
3154 | |
3155 /* {{{ s_mp_mul_d(a, d) */ | |
3156 | |
3157 /* Compute a = a * d, single digit multiplication */ | |
3158 mp_err s_mp_mul_d(mp_int *a, mp_digit d) | |
3159 { | |
3160 mp_word w, k = 0; | |
3161 mp_size ix, max; | |
3162 mp_err res; | |
3163 mp_digit *dp = DIGITS(a); | |
3164 | |
3165 /* | |
3166 Single-digit multiplication will increase the precision of the | |
3167 output by at most one digit. However, we can detect when this | |
3168 will happen -- if the high-order digit of a, times d, gives a | |
3169 two-digit result, then the precision of the result will increase; | |
3170 otherwise it won't. We use this fact to avoid calling s_mp_pad() | |
3171 unless absolutely necessary. | |
3172 */ | |
3173 max = USED(a); | |
3174 w = dp[max - 1] * d; | |
3175 if(CARRYOUT(w) != 0) { | |
3176 if((res = s_mp_pad(a, max + 1)) != MP_OKAY) | |
3177 return res; | |
3178 dp = DIGITS(a); | |
3179 } | |
3180 | |
3181 for(ix = 0; ix < max; ix++) { | |
3182 w = (dp[ix] * d) + k; | |
3183 dp[ix] = ACCUM(w); | |
3184 k = CARRYOUT(w); | |
3185 } | |
3186 | |
3187 /* If there is a precision increase, take care of it here; the above | |
3188 test guarantees we have enough storage to do this safely. | |
3189 */ | |
3190 if(k) { | |
3191 dp[max] = k; | |
3192 USED(a) = max + 1; | |
3193 } | |
3194 | |
3195 s_mp_clamp(a); | |
3196 | |
3197 return MP_OKAY; | |
3198 | |
3199 } /* end s_mp_mul_d() */ | |
3200 | |
3201 /* }}} */ | |
3202 | |
3203 /* {{{ s_mp_div_d(mp, d, r) */ | |
3204 | |
3205 /* | |
3206 s_mp_div_d(mp, d, r) | |
3207 | |
3208 Compute the quotient mp = mp / d and remainder r = mp mod d, for a | |
3209 single digit d. If r is null, the remainder will be discarded. | |
3210 */ | |
3211 | |
3212 mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r) | |
3213 { | |
3214 mp_word w = 0, t; | |
3215 mp_int quot; | |
3216 mp_err res; | |
3217 mp_digit *dp = DIGITS(mp), *qp; | |
3218 int ix; | |
3219 | |
3220 if(d == 0) | |
3221 return MP_RANGE; | |
3222 | |
3223 /* Make room for the quotient */ | |
3224 if((res = mp_init_size(", USED(mp))) != MP_OKAY) | |
3225 return res; | |
3226 | |
3227 USED(") = USED(mp); /* so clamping will work below */ | |
3228 qp = DIGITS("); | |
3229 | |
3230 /* Divide without subtraction */ | |
3231 for(ix = USED(mp) - 1; ix >= 0; ix--) { | |
3232 w = (w << DIGIT_BIT) | dp[ix]; | |
3233 | |
3234 if(w >= d) { | |
3235 t = w / d; | |
3236 w = w % d; | |
3237 } else { | |
3238 t = 0; | |
3239 } | |
3240 | |
3241 qp[ix] = t; | |
3242 } | |
3243 | |
3244 /* Deliver the remainder, if desired */ | |
3245 if(r) | |
3246 *r = w; | |
3247 | |
3248 s_mp_clamp("); | |
3249 mp_exch(", mp); | |
3250 mp_clear("); | |
3251 | |
3252 return MP_OKAY; | |
3253 | |
3254 } /* end s_mp_div_d() */ | |
3255 | |
3256 /* }}} */ | |
3257 | |
3258 /* }}} */ | |
3259 | |
3260 /* {{{ Primitive full arithmetic */ | |
3261 | |
3262 /* {{{ s_mp_add(a, b) */ | |
3263 | |
3264 /* Compute a = |a| + |b| */ | |
3265 mp_err s_mp_add(mp_int *a, mp_int *b) /* magnitude addition */ | |
3266 { | |
3267 mp_word w = 0; | |
3268 mp_digit *pa, *pb; | |
3269 mp_size ix, used = USED(b); | |
3270 mp_err res; | |
3271 | |
3272 /* Make sure a has enough precision for the output value */ | |
3273 if((used > USED(a)) && (res = s_mp_pad(a, used)) != MP_OKAY) | |
3274 return res; | |
3275 | |
3276 /* | |
3277 Add up all digits up to the precision of b. If b had initially | |
3278 the same precision as a, or greater, we took care of it by the | |
3279 padding step above, so there is no problem. If b had initially | |
3280 less precision, we'll have to make sure the carry out is duly | |
3281 propagated upward among the higher-order digits of the sum. | |
3282 */ | |
3283 pa = DIGITS(a); | |
3284 pb = DIGITS(b); | |
3285 for(ix = 0; ix < used; ++ix) { | |
3286 w += *pa + *pb++; | |
3287 *pa++ = ACCUM(w); | |
3288 w = CARRYOUT(w); | |
3289 } | |
3290 | |
3291 /* If we run out of 'b' digits before we're actually done, make | |
3292 sure the carries get propagated upward... | |
3293 */ | |
3294 used = USED(a); | |
3295 while(w && ix < used) { | |
3296 w += *pa; | |
3297 *pa++ = ACCUM(w); | |
3298 w = CARRYOUT(w); | |
3299 ++ix; | |
3300 } | |
3301 | |
3302 /* If there's an overall carry out, increase precision and include | |
3303 it. We could have done this initially, but why touch the memory | |
3304 allocator unless we're sure we have to? | |
3305 */ | |
3306 if(w) { | |
3307 if((res = s_mp_pad(a, used + 1)) != MP_OKAY) | |
3308 return res; | |
3309 | |
3310 DIGIT(a, ix) = w; /* pa may not be valid after s_mp_pad() call */ | |
3311 } | |
3312 | |
3313 return MP_OKAY; | |
3314 | |
3315 } /* end s_mp_add() */ | |
3316 | |
3317 /* }}} */ | |
3318 | |
3319 /* {{{ s_mp_sub(a, b) */ | |
3320 | |
3321 /* Compute a = |a| - |b|, assumes |a| >= |b| */ | |
3322 mp_err s_mp_sub(mp_int *a, mp_int *b) /* magnitude subtract */ | |
3323 { | |
3324 mp_word w = 0; | |
3325 mp_digit *pa, *pb; | |
3326 mp_size ix, used = USED(b); | |
3327 | |
3328 /* | |
3329 Subtract and propagate borrow. Up to the precision of b, this | |
3330 accounts for the digits of b; after that, we just make sure the | |
3331 carries get to the right place. This saves having to pad b out to | |
3332 the precision of a just to make the loops work right... | |
3333 */ | |
3334 pa = DIGITS(a); | |
3335 pb = DIGITS(b); | |
3336 | |
3337 for(ix = 0; ix < used; ++ix) { | |
3338 w = (RADIX + *pa) - w - *pb++; | |
3339 *pa++ = ACCUM(w); | |
3340 w = CARRYOUT(w) ? 0 : 1; | |
3341 } | |
3342 | |
3343 used = USED(a); | |
3344 while(ix < used) { | |
3345 w = RADIX + *pa - w; | |
3346 *pa++ = ACCUM(w); | |
3347 w = CARRYOUT(w) ? 0 : 1; | |
3348 ++ix; | |
3349 } | |
3350 | |
3351 /* Clobber any leading zeroes we created */ | |
3352 s_mp_clamp(a); | |
3353 | |
3354 /* | |
3355 If there was a borrow out, then |b| > |a| in violation | |
3356 of our input invariant. We've already done the work, | |
3357 but we'll at least complain about it... | |
3358 */ | |
3359 if(w) | |
3360 return MP_RANGE; | |
3361 else | |
3362 return MP_OKAY; | |
3363 | |
3364 } /* end s_mp_sub() */ | |
3365 | |
3366 /* }}} */ | |
3367 | |
3368 mp_err s_mp_reduce(mp_int *x, mp_int *m, mp_int *mu) | |
3369 { | |
3370 mp_int q; | |
3371 mp_err res; | |
3372 mp_size um = USED(m); | |
3373 | |
3374 if((res = mp_init_copy(&q, x)) != MP_OKAY) | |
3375 return res; | |
3376 | |
3377 s_mp_rshd(&q, um - 1); /* q1 = x / b^(k-1) */ | |
3378 s_mp_mul(&q, mu); /* q2 = q1 * mu */ | |
3379 s_mp_rshd(&q, um + 1); /* q3 = q2 / b^(k+1) */ | |
3380 | |
3381 /* x = x mod b^(k+1), quick (no division) */ | |
3382 s_mp_mod_2d(x, (mp_digit)(DIGIT_BIT * (um + 1))); | |
3383 | |
3384 /* q = q * m mod b^(k+1), quick (no division), uses the short multiplier */ | |
3385 #ifndef SHRT_MUL | |
3386 s_mp_mul(&q, m); | |
3387 s_mp_mod_2d(&q, (mp_digit)(DIGIT_BIT * (um + 1))); | |
3388 #else | |
3389 s_mp_mul_dig(&q, m, um + 1); | |
3390 #endif | |
3391 | |
3392 /* x = x - q */ | |
3393 if((res = mp_sub(x, &q, x)) != MP_OKAY) | |
3394 goto CLEANUP; | |
3395 | |
3396 /* If x < 0, add b^(k+1) to it */ | |
3397 if(mp_cmp_z(x) < 0) { | |
3398 mp_set(&q, 1); | |
3399 if((res = s_mp_lshd(&q, um + 1)) != MP_OKAY) | |
3400 goto CLEANUP; | |
3401 if((res = mp_add(x, &q, x)) != MP_OKAY) | |
3402 goto CLEANUP; | |
3403 } | |
3404 | |
3405 /* Back off if it's too big */ | |
3406 while(mp_cmp(x, m) >= 0) { | |
3407 if((res = s_mp_sub(x, m)) != MP_OKAY) | |
3408 break; | |
3409 } | |
3410 | |
3411 CLEANUP: | |
3412 mp_clear(&q); | |
3413 | |
3414 return res; | |
3415 | |
3416 } /* end s_mp_reduce() */ | |
3417 | |
3418 | |
3419 | |
3420 /* {{{ s_mp_mul(a, b) */ | |
3421 | |
3422 /* Compute a = |a| * |b| */ | |
3423 mp_err s_mp_mul(mp_int *a, mp_int *b) | |
3424 { | |
3425 mp_word w, k = 0; | |
3426 mp_int tmp; | |
3427 mp_err res; | |
3428 mp_size ix, jx, ua = USED(a), ub = USED(b); | |
3429 mp_digit *pa, *pb, *pt, *pbt; | |
3430 | |
3431 if((res = mp_init_size(&tmp, ua + ub)) != MP_OKAY) | |
3432 return res; | |
3433 | |
3434 /* This has the effect of left-padding with zeroes... */ | |
3435 USED(&tmp) = ua + ub; | |
3436 | |
3437 /* We're going to need the base value each iteration */ | |
3438 pbt = DIGITS(&tmp); | |
3439 | |
3440 /* Outer loop: Digits of b */ | |
3441 | |
3442 pb = DIGITS(b); | |
3443 for(ix = 0; ix < ub; ++ix, ++pb) { | |
3444 if(*pb == 0) | |
3445 continue; | |
3446 | |
3447 /* Inner product: Digits of a */ | |
3448 pa = DIGITS(a); | |
3449 for(jx = 0; jx < ua; ++jx, ++pa) { | |
3450 pt = pbt + ix + jx; | |
3451 w = *pb * *pa + k + *pt; | |
3452 *pt = ACCUM(w); | |
3453 k = CARRYOUT(w); | |
3454 } | |
3455 | |
3456 pbt[ix + jx] = k; | |
3457 k = 0; | |
3458 } | |
3459 | |
3460 s_mp_clamp(&tmp); | |
3461 s_mp_exch(&tmp, a); | |
3462 | |
3463 mp_clear(&tmp); | |
3464 | |
3465 return MP_OKAY; | |
3466 | |
3467 } /* end s_mp_mul() */ | |
3468 | |
3469 /* }}} */ | |
3470 | |
3471 /* {{{ s_mp_kmul(a, b, out, len) */ | |
3472 | |
3473 #if 0 | |
3474 void s_mp_kmul(mp_digit *a, mp_digit *b, mp_digit *out, mp_size len) | |
3475 { | |
3476 mp_word w, k = 0; | |
3477 mp_size ix, jx; | |
3478 mp_digit *pa, *pt; | |
3479 | |
3480 for(ix = 0; ix < len; ++ix, ++b) { | |
3481 if(*b == 0) | |
3482 continue; | |
3483 | |
3484 pa = a; | |
3485 for(jx = 0; jx < len; ++jx, ++pa) { | |
3486 pt = out + ix + jx; | |
3487 w = *b * *pa + k + *pt; | |
3488 *pt = ACCUM(w); | |
3489 k = CARRYOUT(w); | |
3490 } | |
3491 | |
3492 out[ix + jx] = k; | |
3493 k = 0; | |
3494 } | |
3495 | |
3496 } /* end s_mp_kmul() */ | |
3497 #endif | |
3498 | |
3499 /* }}} */ | |
3500 | |
3501 /* {{{ s_mp_sqr(a) */ | |
3502 | |
3503 /* | |
3504 Computes the square of a, in place. This can be done more | |
3505 efficiently than a general multiplication, because many of the | |
3506 computation steps are redundant when squaring. The inner product | |
3507 step is a bit more complicated, but we save a fair number of | |
3508 iterations of the multiplication loop. | |
3509 */ | |
3510 #if MP_SQUARE | |
3511 mp_err s_mp_sqr(mp_int *a) | |
3512 { | |
3513 mp_word w, k = 0; | |
3514 mp_int tmp; | |
3515 mp_err res; | |
3516 mp_size ix, jx, kx, used = USED(a); | |
3517 mp_digit *pa1, *pa2, *pt, *pbt; | |
3518 | |
3519 if((res = mp_init_size(&tmp, 2 * used)) != MP_OKAY) | |
3520 return res; | |
3521 | |
3522 /* Left-pad with zeroes */ | |
3523 USED(&tmp) = 2 * used; | |
3524 | |
3525 /* We need the base value each time through the loop */ | |
3526 pbt = DIGITS(&tmp); | |
3527 | |
3528 pa1 = DIGITS(a); | |
3529 for(ix = 0; ix < used; ++ix, ++pa1) { | |
3530 if(*pa1 == 0) | |
3531 continue; | |
3532 | |
3533 w = DIGIT(&tmp, ix + ix) + (*pa1 * *pa1); | |
3534 | |
3535 pbt[ix + ix] = ACCUM(w); | |
3536 k = CARRYOUT(w); | |
3537 | |
3538 /* | |
3539 The inner product is computed as: | |
3540 | |
3541 (C, S) = t[i,j] + 2 a[i] a[j] + C | |
3542 | |
3543 This can overflow what can be represented in an mp_word, and | |
3544 since C arithmetic does not provide any way to check for | |
3545 overflow, we have to check explicitly for overflow conditions | |
3546 before they happen. | |
3547 */ | |
3548 for(jx = ix + 1, pa2 = DIGITS(a) + jx; jx < used; ++jx, ++pa2) { | |
3549 mp_word u = 0, v; | |
3550 | |
3551 /* Store this in a temporary to avoid indirections later */ | |
3552 pt = pbt + ix + jx; | |
3553 | |
3554 /* Compute the multiplicative step */ | |
3555 w = *pa1 * *pa2; | |
3556 | |
3557 /* If w is more than half MP_WORD_MAX, the doubling will | |
3558 overflow, and we need to record a carry out into the next | |
3559 word */ | |
3560 u = (w >> (MP_WORD_BIT - 1)) & 1; | |
3561 | |
3562 /* Double what we've got, overflow will be ignored as defined | |
3563 for C arithmetic (we've already noted if it is to occur) | |
3564 */ | |
3565 w *= 2; | |
3566 | |
3567 /* Compute the additive step */ | |
3568 v = *pt + k; | |
3569 | |
3570 /* If we do not already have an overflow carry, check to see | |
3571 if the addition will cause one, and set the carry out if so | |
3572 */ | |
3573 u |= ((MP_WORD_MAX - v) < w); | |
3574 | |
3575 /* Add in the rest, again ignoring overflow */ | |
3576 w += v; | |
3577 | |
3578 /* Set the i,j digit of the output */ | |
3579 *pt = ACCUM(w); | |
3580 | |
3581 /* Save carry information for the next iteration of the loop. | |
3582 This is why k must be an mp_word, instead of an mp_digit */ | |
3583 k = CARRYOUT(w) | (u << DIGIT_BIT); | |
3584 | |
3585 } /* for(jx ...) */ | |
3586 | |
3587 /* Set the last digit in the cycle and reset the carry */ | |
3588 k = DIGIT(&tmp, ix + jx) + k; | |
3589 pbt[ix + jx] = ACCUM(k); | |
3590 k = CARRYOUT(k); | |
3591 | |
3592 /* If we are carrying out, propagate the carry to the next digit | |
3593 in the output. This may cascade, so we have to be somewhat | |
3594 circumspect -- but we will have enough precision in the output | |
3595 that we won't overflow | |
3596 */ | |
3597 kx = 1; | |
3598 while(k) { | |
3599 k = pbt[ix + jx + kx] + 1; | |
3600 pbt[ix + jx + kx] = ACCUM(k); | |
3601 k = CARRYOUT(k); | |
3602 ++kx; | |
3603 } | |
3604 } /* for(ix ...) */ | |
3605 | |
3606 s_mp_clamp(&tmp); | |
3607 s_mp_exch(&tmp, a); | |
3608 | |
3609 mp_clear(&tmp); | |
3610 | |
3611 return MP_OKAY; | |
3612 | |
3613 } /* end s_mp_sqr() */ | |
3614 #endif | |
3615 | |
3616 /* }}} */ | |
3617 | |
3618 /* {{{ s_mp_div(a, b) */ | |
3619 | |
3620 /* | |
3621 s_mp_div(a, b) | |
3622 | |
3623 Compute a = a / b and b = a mod b. Assumes b > a. | |
3624 */ | |
3625 | |
3626 mp_err s_mp_div(mp_int *a, mp_int *b) | |
3627 { | |
3628 mp_int quot, rem, t; | |
3629 mp_word q; | |
3630 mp_err res; | |
3631 mp_digit d; | |
3632 int ix; | |
3633 | |
3634 if(mp_cmp_z(b) == 0) | |
3635 return MP_RANGE; | |
3636 | |
3637 /* Shortcut if b is power of two */ | |
3638 if((ix = s_mp_ispow2(b)) >= 0) { | |
3639 mp_copy(a, b); /* need this for remainder */ | |
3640 s_mp_div_2d(a, (mp_digit)ix); | |
3641 s_mp_mod_2d(b, (mp_digit)ix); | |
3642 | |
3643 return MP_OKAY; | |
3644 } | |
3645 | |
3646 /* Allocate space to store the quotient */ | |
3647 if((res = mp_init_size(", USED(a))) != MP_OKAY) | |
3648 return res; | |
3649 | |
3650 /* A working temporary for division */ | |
3651 if((res = mp_init_size(&t, USED(a))) != MP_OKAY) | |
3652 goto T; | |
3653 | |
3654 /* Allocate space for the remainder */ | |
3655 if((res = mp_init_size(&rem, USED(a))) != MP_OKAY) | |
3656 goto REM; | |
3657 | |
3658 /* Normalize to optimize guessing */ | |
3659 d = s_mp_norm(a, b); | |
3660 | |
3661 /* Perform the division itself...woo! */ | |
3662 ix = USED(a) - 1; | |
3663 | |
3664 while(ix >= 0) { | |
3665 /* Find a partial substring of a which is at least b */ | |
3666 while(s_mp_cmp(&rem, b) < 0 && ix >= 0) { | |
3667 if((res = s_mp_lshd(&rem, 1)) != MP_OKAY) | |
3668 goto CLEANUP; | |
3669 | |
3670 if((res = s_mp_lshd(", 1)) != MP_OKAY) | |
3671 goto CLEANUP; | |
3672 | |
3673 DIGIT(&rem, 0) = DIGIT(a, ix); | |
3674 s_mp_clamp(&rem); | |
3675 --ix; | |
3676 } | |
3677 | |
3678 /* If we didn't find one, we're finished dividing */ | |
3679 if(s_mp_cmp(&rem, b) < 0) | |
3680 break; | |
3681 | |
3682 /* Compute a guess for the next quotient digit */ | |
3683 q = DIGIT(&rem, USED(&rem) - 1); | |
3684 if(q <= DIGIT(b, USED(b) - 1) && USED(&rem) > 1) | |
3685 q = (q << DIGIT_BIT) | DIGIT(&rem, USED(&rem) - 2); | |
3686 | |
3687 q /= DIGIT(b, USED(b) - 1); | |
3688 | |
3689 /* The guess can be as much as RADIX + 1 */ | |
3690 if(q >= RADIX) | |
3691 q = RADIX - 1; | |
3692 | |
3693 /* See what that multiplies out to */ | |
3694 mp_copy(b, &t); | |
3695 if((res = s_mp_mul_d(&t, q)) != MP_OKAY) | |
3696 goto CLEANUP; | |
3697 | |
3698 /* | |
3699 If it's too big, back it off. We should not have to do this | |
3700 more than once, or, in rare cases, twice. Knuth describes a | |
3701 method by which this could be reduced to a maximum of once, but | |
3702 I didn't implement that here. | |
3703 */ | |
3704 while(s_mp_cmp(&t, &rem) > 0) { | |
3705 --q; | |
3706 s_mp_sub(&t, b); | |
3707 } | |
3708 | |
3709 /* At this point, q should be the right next digit */ | |
3710 if((res = s_mp_sub(&rem, &t)) != MP_OKAY) | |
3711 goto CLEANUP; | |
3712 | |
3713 /* | |
3714 Include the digit in the quotient. We allocated enough memory | |
3715 for any quotient we could ever possibly get, so we should not | |
3716 have to check for failures here | |
3717 */ | |
3718 DIGIT(", 0) = q; | |
3719 } | |
3720 | |
3721 /* Denormalize remainder */ | |
3722 if(d != 0) | |
3723 s_mp_div_2d(&rem, d); | |
3724 | |
3725 s_mp_clamp("); | |
3726 s_mp_clamp(&rem); | |
3727 | |
3728 /* Copy quotient back to output */ | |
3729 s_mp_exch(", a); | |
3730 | |
3731 /* Copy remainder back to output */ | |
3732 s_mp_exch(&rem, b); | |
3733 | |
3734 CLEANUP: | |
3735 mp_clear(&rem); | |
3736 REM: | |
3737 mp_clear(&t); | |
3738 T: | |
3739 mp_clear("); | |
3740 | |
3741 return res; | |
3742 | |
3743 } /* end s_mp_div() */ | |
3744 | |
3745 /* }}} */ | |
3746 | |
3747 /* {{{ s_mp_2expt(a, k) */ | |
3748 | |
3749 mp_err s_mp_2expt(mp_int *a, mp_digit k) | |
3750 { | |
3751 mp_err res; | |
3752 mp_size dig, bit; | |
3753 | |
3754 dig = k / DIGIT_BIT; | |
3755 bit = k % DIGIT_BIT; | |
3756 | |
3757 mp_zero(a); | |
3758 if((res = s_mp_pad(a, dig + 1)) != MP_OKAY) | |
3759 return res; | |
3760 | |
3761 DIGIT(a, dig) |= (1 << bit); | |
3762 | |
3763 return MP_OKAY; | |
3764 | |
3765 } /* end s_mp_2expt() */ | |
3766 | |
3767 /* }}} */ | |
3768 | |
3769 | |
3770 /* }}} */ | |
3771 | |
3772 /* }}} */ | |
3773 | |
3774 /* {{{ Primitive comparisons */ | |
3775 | |
3776 /* {{{ s_mp_cmp(a, b) */ | |
3777 | |
3778 /* Compare |a| <=> |b|, return 0 if equal, <0 if a<b, >0 if a>b */ | |
3779 int s_mp_cmp(mp_int *a, mp_int *b) | |
3780 { | |
3781 mp_size ua = USED(a), ub = USED(b); | |
3782 | |
3783 if(ua > ub) | |
3784 return MP_GT; | |
3785 else if(ua < ub) | |
3786 return MP_LT; | |
3787 else { | |
3788 int ix = ua - 1; | |
3789 mp_digit *ap = DIGITS(a) + ix, *bp = DIGITS(b) + ix; | |
3790 | |
3791 while(ix >= 0) { | |
3792 if(*ap > *bp) | |
3793 return MP_GT; | |
3794 else if(*ap < *bp) | |
3795 return MP_LT; | |
3796 | |
3797 --ap; --bp; --ix; | |
3798 } | |
3799 | |
3800 return MP_EQ; | |
3801 } | |
3802 | |
3803 } /* end s_mp_cmp() */ | |
3804 | |
3805 /* }}} */ | |
3806 | |
3807 /* {{{ s_mp_cmp_d(a, d) */ | |
3808 | |
3809 /* Compare |a| <=> d, return 0 if equal, <0 if a<d, >0 if a>d */ | |
3810 int s_mp_cmp_d(mp_int *a, mp_digit d) | |
3811 { | |
3812 mp_size ua = USED(a); | |
3813 mp_digit *ap = DIGITS(a); | |
3814 | |
3815 if(ua > 1) | |
3816 return MP_GT; | |
3817 | |
3818 if(*ap < d) | |
3819 return MP_LT; | |
3820 else if(*ap > d) | |
3821 return MP_GT; | |
3822 else | |
3823 return MP_EQ; | |
3824 | |
3825 } /* end s_mp_cmp_d() */ | |
3826 | |
3827 /* }}} */ | |
3828 | |
3829 /* {{{ s_mp_ispow2(v) */ | |
3830 | |
3831 /* | |
3832 Returns -1 if the value is not a power of two; otherwise, it returns | |
3833 k such that v = 2^k, i.e. lg(v). | |
3834 */ | |
3835 int s_mp_ispow2(mp_int *v) | |
3836 { | |
3837 mp_digit d, *dp; | |
3838 mp_size uv = USED(v); | |
3839 int extra = 0, ix; | |
3840 | |
3841 d = DIGIT(v, uv - 1); /* most significant digit of v */ | |
3842 | |
3843 while(d && ((d & 1) == 0)) { | |
3844 d >>= 1; | |
3845 ++extra; | |
3846 } | |
3847 | |
3848 if(d == 1) { | |
3849 ix = uv - 2; | |
3850 dp = DIGITS(v) + ix; | |
3851 | |
3852 while(ix >= 0) { | |
3853 if(*dp) | |
3854 return -1; /* not a power of two */ | |
3855 | |
3856 --dp; --ix; | |
3857 } | |
3858 | |
3859 return ((uv - 1) * DIGIT_BIT) + extra; | |
3860 } | |
3861 | |
3862 return -1; | |
3863 | |
3864 } /* end s_mp_ispow2() */ | |
3865 | |
3866 /* }}} */ | |
3867 | |
3868 /* {{{ s_mp_ispow2d(d) */ | |
3869 | |
3870 int s_mp_ispow2d(mp_digit d) | |
3871 { | |
3872 int pow = 0; | |
3873 | |
3874 while((d & 1) == 0) { | |
3875 ++pow; d >>= 1; | |
3876 } | |
3877 | |
3878 if(d == 1) | |
3879 return pow; | |
3880 | |
3881 return -1; | |
3882 | |
3883 } /* end s_mp_ispow2d() */ | |
3884 | |
3885 /* }}} */ | |
3886 | |
3887 /* }}} */ | |
3888 | |
3889 /* {{{ Primitive I/O helpers */ | |
3890 | |
3891 /* {{{ s_mp_tovalue(ch, r) */ | |
3892 | |
3893 /* | |
3894 Convert the given character to its digit value, in the given radix. | |
3895 If the given character is not understood in the given radix, -1 is | |
3896 returned. Otherwise the digit's numeric value is returned. | |
3897 | |
3898 The results will be odd if you use a radix < 2 or > 62, you are | |
3899 expected to know what you're up to. | |
3900 */ | |
3901 int s_mp_tovalue(char ch, int r) | |
3902 { | |
3903 int val, xch; | |
3904 | |
3905 if(r > 36) | |
3906 xch = ch; | |
3907 else | |
3908 xch = toupper(ch); | |
3909 | |
3910 if(isdigit(xch)) | |
3911 val = xch - '0'; | |
3912 else if(isupper(xch)) | |
3913 val = xch - 'A' + 10; | |
3914 else if(islower(xch)) | |
3915 val = xch - 'a' + 36; | |
3916 else if(xch == '+') | |
3917 val = 62; | |
3918 else if(xch == '/') | |
3919 val = 63; | |
3920 else | |
3921 return -1; | |
3922 | |
3923 if(val < 0 || val >= r) | |
3924 return -1; | |
3925 | |
3926 return val; | |
3927 | |
3928 } /* end s_mp_tovalue() */ | |
3929 | |
3930 /* }}} */ | |
3931 | |
3932 /* {{{ s_mp_todigit(val, r, low) */ | |
3933 | |
3934 /* | |
3935 Convert val to a radix-r digit, if possible. If val is out of range | |
3936 for r, returns zero. Otherwise, returns an ASCII character denoting | |
3937 the value in the given radix. | |
3938 | |
3939 The results may be odd if you use a radix < 2 or > 64, you are | |
3940 expected to know what you're doing. | |
3941 */ | |
3942 | |
3943 char s_mp_todigit(int val, int r, int low) | |
3944 { | |
3945 char ch; | |
3946 | |
3947 if(val < 0 || val >= r) | |
3948 return 0; | |
3949 | |
3950 ch = s_dmap_1[val]; | |
3951 | |
3952 if(r <= 36 && low) | |
3953 ch = tolower(ch); | |
3954 | |
3955 return ch; | |
3956 | |
3957 } /* end s_mp_todigit() */ | |
3958 | |
3959 /* }}} */ | |
3960 | |
3961 /* {{{ s_mp_outlen(bits, radix) */ | |
3962 | |
3963 /* | |
3964 Return an estimate for how long a string is needed to hold a radix | |
3965 r representation of a number with 'bits' significant bits. | |
3966 | |
3967 Does not include space for a sign or a NUL terminator. | |
3968 */ | |
3969 int s_mp_outlen(int bits, int r) | |
3970 { | |
3971 return (int)((double)bits * LOG_V_2(r)); | |
3972 | |
3973 } /* end s_mp_outlen() */ | |
3974 | |
3975 /* }}} */ | |
3976 | |
3977 /* }}} */ | |
3978 | |
3979 /*------------------------------------------------------------------------*/ | |
3980 /* HERE THERE BE DRAGONS */ | |
3981 /* crc==4242132123, version==2, Sat Feb 02 06:43:52 2002 */ |