Lines Matching refs:mp

127 /* {{{ mp_init(mp, kmflag) */
130 mp_init(mp, kmflag)
136 mp_err mp_init(mp_int *mp, int kmflag)
138 return mp_init_size(mp, s_mp_defprec, kmflag);
144 /* {{{ mp_init_size(mp, prec, kmflag) */
147 mp_init_size(mp, prec, kmflag)
154 mp_err mp_init_size(mp_int *mp, mp_size prec, int kmflag)
156 ARGCHK(mp != NULL && prec > 0, MP_BADARG);
159 if((DIGITS(mp) = s_mp_alloc(prec, sizeof(mp_digit), kmflag)) == NULL)
162 SIGN(mp) = ZPOS;
163 USED(mp) = 1;
164 ALLOC(mp) = prec;
165 FLAG(mp) = kmflag;
173 /* {{{ mp_init_copy(mp, from) */
176 mp_init_copy(mp, from)
178 Initialize mp as an exact copy of from. Returns MP_OKAY if
183 mp_err mp_init_copy(mp_int *mp, const mp_int *from)
185 ARGCHK(mp != NULL && from != NULL, MP_BADARG);
187 if(mp == from)
190 if((DIGITS(mp) = s_mp_alloc(ALLOC(from), sizeof(mp_digit), FLAG(from))) == NULL)
193 s_mp_copy(DIGITS(from), DIGITS(mp), USED(from));
194 USED(mp) = USED(from);
195 ALLOC(mp) = ALLOC(from);
196 SIGN(mp) = SIGN(from);
197 FLAG(mp) = FLAG(from);
291 /* {{{ mp_clear(mp) */
294 mp_clear(mp)
301 void mp_clear(mp_int *mp)
303 if(mp == NULL)
306 if(DIGITS(mp) != NULL) {
308 s_mp_setz(DIGITS(mp), ALLOC(mp));
310 s_mp_free(DIGITS(mp), ALLOC(mp));
311 DIGITS(mp) = NULL;
314 USED(mp) = 0;
315 ALLOC(mp) = 0;
321 /* {{{ mp_zero(mp) */
324 mp_zero(mp)
326 Set mp to zero. Does not change the allocated size of the structure,
329 void mp_zero(mp_int *mp)
331 if(mp == NULL)
334 s_mp_setz(DIGITS(mp), ALLOC(mp));
335 USED(mp) = 1;
336 SIGN(mp) = ZPOS;
342 /* {{{ mp_set(mp, d) */
344 void mp_set(mp_int *mp, mp_digit d)
346 if(mp == NULL)
349 mp_zero(mp);
350 DIGIT(mp, 0) = d;
356 /* {{{ mp_set_int(mp, z) */
358 mp_err mp_set_int(mp_int *mp, long z)
364 ARGCHK(mp != NULL, MP_BADARG);
366 mp_zero(mp);
371 DIGIT(mp,0) = v;
374 if ((res = s_mp_mul_d(mp, (UCHAR_MAX + 1))) != MP_OKAY)
377 res = s_mp_add_d(mp, (mp_digit)((v >> (ix * CHAR_BIT)) & UCHAR_MAX));
383 SIGN(mp) = NEG;
391 /* {{{ mp_set_ulong(mp, z) */
393 mp_err mp_set_ulong(mp_int *mp, unsigned long z)
398 ARGCHK(mp != NULL, MP_BADARG);
400 mp_zero(mp);
405 DIGIT(mp,0) = z;
408 if ((res = s_mp_mul_d(mp, (UCHAR_MAX + 1))) != MP_OKAY)
411 res = s_mp_add_d(mp, (mp_digit)((z >> (ix * CHAR_BIT)) & UCHAR_MAX));
2214 mp_size mp_trailing_zeros(const mp_int *mp)
2220 if (!mp || !MP_DIGITS(mp) || !mp_cmp_z(mp))
2223 for (ix = 0; !(d = MP_DIGIT(mp,ix)) && (ix < MP_USED(mp)); ++ix)
2629 /* {{{ mp_print(mp, ofp) */
2633 mp_print(mp, ofp)
2639 void mp_print(mp_int *mp, FILE *ofp)
2643 if(mp == NULL || ofp == NULL)
2646 fputc((SIGN(mp) == NEG) ? '-' : '+', ofp);
2648 for(ix = USED(mp) - 1; ix >= 0; ix--) {
2649 fprintf(ofp, DIGIT_FMT, DIGIT(mp, ix));
2661 /* {{{ mp_read_raw(mp, str, len) */
2664 mp_read_raw(mp, str, len)
2669 mp_err mp_read_raw(mp_int *mp, char *str, int len)
2675 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG);
2677 mp_zero(mp);
2681 SIGN(mp) = NEG;
2683 SIGN(mp) = ZPOS;
2687 if((res = mp_mul_d(mp, 256, mp)) != MP_OKAY)
2689 if((res = mp_add_d(mp, ustr[ix], mp)) != MP_OKAY)
2699 /* {{{ mp_raw_size(mp) */
2701 int mp_raw_size(mp_int *mp)
2703 ARGCHK(mp != NULL, 0);
2705 return (USED(mp) * sizeof(mp_digit)) + 1;
2711 /* {{{ mp_toraw(mp, str) */
2713 mp_err mp_toraw(mp_int *mp, char *str)
2717 ARGCHK(mp != NULL && str != NULL, MP_BADARG);
2719 str[0] = (char)SIGN(mp);
2722 for(ix = USED(mp) - 1; ix >= 0; ix--) {
2723 mp_digit d = DIGIT(mp, ix);
2737 /* {{{ mp_read_radix(mp, str, radix) */
2740 mp_read_radix(mp, str, radix)
2742 Read an integer from the given string, and set mp to the resulting
2748 mp_err mp_read_radix(mp_int *mp, const char *str, int radix)
2754 ARGCHK(mp != NULL && str != NULL && radix >= 2 && radix <= MAX_RADIX,
2757 mp_zero(mp);
2776 if((res = s_mp_mul_d(mp, radix)) != MP_OKAY)
2778 if((res = s_mp_add_d(mp, val)) != MP_OKAY)
2783 if(s_mp_cmp_d(mp, 0) == MP_EQ)
2784 SIGN(mp) = ZPOS;
2786 SIGN(mp) = sig;
2833 /* {{{ mp_radix_size(mp, radix) */
2835 int mp_radix_size(mp_int *mp, int radix)
2839 if(!mp || radix < 2 || radix > MAX_RADIX)
2842 bits = USED(mp) * DIGIT_BIT - 1;
2850 /* {{{ mp_toradix(mp, str, radix) */
2852 mp_err mp_toradix(mp_int *mp, char *str, int radix)
2856 ARGCHK(mp != NULL && str != NULL, MP_BADARG);
2859 if(mp_cmp_z(mp) == MP_EQ) {
2869 if((res = mp_init_copy(&tmp, mp)) != MP_OKAY)
2959 /* {{{ s_mp_grow(mp, min) */
2961 /* Make sure there are at least 'min' digits allocated to mp */
2962 mp_err s_mp_grow(mp_int *mp, mp_size min)
2964 if(min > ALLOC(mp)) {
2970 if((tmp = s_mp_alloc(min, sizeof(mp_digit), FLAG(mp))) == NULL)
2973 s_mp_copy(DIGITS(mp), tmp, USED(mp));
2976 s_mp_setz(DIGITS(mp), ALLOC(mp));
2978 s_mp_free(DIGITS(mp), ALLOC(mp));
2979 DIGITS(mp) = tmp;
2980 ALLOC(mp) = min;
2989 /* {{{ s_mp_pad(mp, min) */
2991 /* Make sure the used size of mp is at least 'min', growing if needed */
2992 mp_err s_mp_pad(mp_int *mp, mp_size min)
2994 if(min > USED(mp)) {
2998 if (min > ALLOC(mp)) {
2999 if ((res = s_mp_grow(mp, min)) != MP_OKAY)
3002 s_mp_setz(DIGITS(mp) + USED(mp), min - USED(mp));
3006 USED(mp) = min;
3092 /* {{{ s_mp_clamp(mp) */
3096 void s_mp_clamp(mp_int *mp)
3098 mp_size used = MP_USED(mp);
3099 while (used > 1 && DIGIT(mp, used - 1) == 0)
3101 MP_USED(mp) = used;
3126 /* {{{ s_mp_lshd(mp, p) */
3129 Shift mp leftward by p digits, growing if needed, and zero-filling
3132 The value of USED(mp) must already have been set to the value for
3136 mp_err s_mp_lshd(mp_int *mp, mp_size p)
3145 if (MP_USED(mp) == 1 && MP_DIGIT(mp, 0) == 0)
3148 if((res = s_mp_pad(mp, USED(mp) + p)) != MP_OKAY)
3151 pos = USED(mp) - 1;
3155 DIGIT(mp, ix + p) = DIGIT(mp, ix);
3159 DIGIT(mp, ix) = 0;
3167 /* {{{ s_mp_mul_2d(mp, d) */
3173 mp_err s_mp_mul_2d(mp_int *mp, mp_digit d)
3179 ARGCHK(mp != NULL, MP_BADARG);
3185 mask &= MP_DIGIT(mp, MP_USED(mp) - 1);
3187 if (MP_OKAY != (res = s_mp_pad(mp, MP_USED(mp) + dshift + (mask != 0) )))
3190 if (dshift && MP_OKAY != (res = s_mp_lshd(mp, dshift)))
3194 mp_digit *pa = MP_DIGITS(mp);
3195 mp_digit *alim = pa + MP_USED(mp);
3205 s_mp_clamp(mp);
3209 /* {{{ s_mp_rshd(mp, p) */
3212 Shift mp rightward by p digits. Maintains the invariant that
3217 void s_mp_rshd(mp_int *mp, mp_size p)
3226 if(p >= USED(mp)) {
3227 s_mp_setz(DIGITS(mp), ALLOC(mp));
3228 USED(mp) = 1;
3229 SIGN(mp) = ZPOS;
3234 dst = MP_DIGITS(mp);
3236 for (ix = USED(mp) - p; ix > 0; ix--)
3239 MP_USED(mp) -= p;
3246 s_mp_clamp(mp);
3253 /* {{{ s_mp_div_2(mp) */
3256 void s_mp_div_2(mp_int *mp)
3258 s_mp_div_2d(mp, 1);
3264 /* {{{ s_mp_mul_2(mp) */
3266 mp_err s_mp_mul_2(mp_int *mp)
3273 used = MP_USED(mp);
3274 pd = MP_DIGITS(mp);
3283 if (ix >= ALLOC(mp)) {
3285 if((res = s_mp_grow(mp, ALLOC(mp) + 1)) != MP_OKAY)
3289 DIGIT(mp, ix) = kin;
3290 USED(mp) += 1;
3299 /* {{{ s_mp_mod_2d(mp, d) */
3306 void s_mp_mod_2d(mp_int *mp, mp_digit d)
3312 if(ndig >= USED(mp))
3317 DIGIT(mp, ndig) &= dmask;
3320 for(ix = ndig + 1; ix < USED(mp); ix++)
3321 DIGIT(mp, ix) = 0;
3323 s_mp_clamp(mp);
3329 /* {{{ s_mp_div_2d(mp, d) */
3336 void s_mp_div_2d(mp_int *mp, mp_digit d)
3341 s_mp_rshd(mp, d / DIGIT_BIT);
3346 for(ix = USED(mp) - 1; ix >= 0; ix--) {
3347 next = DIGIT(mp, ix) & mask;
3348 DIGIT(mp, ix) = (DIGIT(mp, ix) >> d) | (save << (DIGIT_BIT - d));
3352 s_mp_clamp(mp);
3403 /* {{{ s_mp_add_d(mp, d) */
3405 /* Add d to |mp| in place */
3406 mp_err s_mp_add_d(mp_int *mp, mp_digit d) /* unsigned digit addition */
3412 w = (mp_word)DIGIT(mp, 0) + d;
3413 DIGIT(mp, 0) = ACCUM(w);
3416 while(ix < USED(mp) && k) {
3417 w = (mp_word)DIGIT(mp, ix) + k;
3418 DIGIT(mp, ix) = ACCUM(w);
3426 if((res = s_mp_pad(mp, USED(mp) + 1)) != MP_OKAY)
3429 DIGIT(mp, ix) = (mp_digit)k;
3434 mp_digit * pmp = MP_DIGITS(mp);
3437 int used = (int)MP_USED(mp);
3448 /* mp is growing */
3449 used = MP_USED(mp);
3450 MP_CHECKOK( s_mp_pad(mp, used + 1) );
3451 MP_DIGIT(mp, used) = carry;
3460 /* {{{ s_mp_sub_d(mp, d) */
3462 /* Subtract d from |mp| in place, assumes |mp| > d */
3463 mp_err s_mp_sub_d(mp_int *mp, mp_digit d) /* unsigned digit subtract */
3470 w = (RADIX + (mp_word)DIGIT(mp, 0)) - d;
3472 DIGIT(mp, 0) = ACCUM(w);
3475 while(b && ix < USED(mp)) {
3476 w = (RADIX + (mp_word)DIGIT(mp, ix)) - b;
3478 DIGIT(mp, ix) = ACCUM(w);
3483 s_mp_clamp(mp);
3491 mp_digit *pmp = MP_DIGITS(mp);
3493 mp_size used = MP_USED(mp);
3503 s_mp_clamp(mp);
3543 /* {{{ s_mp_div_d(mp, d, r) */
3546 s_mp_div_d(mp, d, r)
3548 Compute the quotient mp = mp / d and remainder r = mp mod d, for a
3552 mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r)
3572 if (MP_USED(mp) == 1) {
3573 mp_digit n = MP_DIGIT(mp,0);
3578 MP_DIGIT(mp,0) = q;
3587 MP_CHECKOK( mp_init_size(&quot, USED(mp), FLAG(mp)) );
3590 for(ix = USED(mp) - 1; ix >= 0; ix--) {
3591 w = (w << DIGIT_BIT) | DIGIT(mp, ix);
3610 MP_CHECKOK( mp_init_copy(&rem, mp) );
3649 mp_exch(&quot, mp);
4851 /* {{{ mp_read_unsigned_octets(mp, str, len) */
4852 /* mp_read_unsigned_octets(mp, str, len)
4858 mp_read_unsigned_octets(mp_int *mp, const unsigned char *str, mp_size len)
4864 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG);
4866 mp_zero(mp);
4873 MP_DIGIT(mp, 0) = d;
4881 if (MP_EQ == mp_cmp_z(mp)) {
4885 if((res = s_mp_lshd(mp, 1)) != MP_OKAY)
4888 MP_DIGIT(mp, 0) = d;
4894 /* {{{ mp_unsigned_octet_size(mp) */
4896 mp_unsigned_octet_size(const mp_int *mp)
4902 ARGCHK(mp != NULL, MP_BADARG);
4903 ARGCHK(MP_ZPOS == SIGN(mp), MP_BADARG);
4905 bytes = (USED(mp) * sizeof(mp_digit));
4909 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4910 d = DIGIT(mp, ix);
4929 /* {{{ mp_to_unsigned_octets(mp, str) */
4932 mp_to_unsigned_octets(const mp_int *mp, unsigned char *str, mp_size maxlen)
4937 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4939 bytes = mp_unsigned_octet_size(mp);
4943 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4944 mp_digit d = DIGIT(mp, ix);
4961 /* {{{ mp_to_signed_octets(mp, str) */
4964 mp_to_signed_octets(const mp_int *mp, unsigned char *str, mp_size maxlen)
4969 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4971 bytes = mp_unsigned_octet_size(mp);
4975 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4976 mp_digit d = DIGIT(mp, ix);
5001 /* {{{ mp_to_fixlen_octets(mp, str) */
5004 mp_to_fixlen_octets(const mp_int *mp, unsigned char *str, mp_size length)
5009 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
5011 bytes = mp_unsigned_octet_size(mp);
5020 for(ix = USED(mp) - 1; ix >= 0; ix--) {
5021 mp_digit d = DIGIT(mp, ix);