Lines Matching refs:mp

123 /* {{{ mp_init(mp, kmflag) */
126 mp_init(mp, kmflag)
132 mp_err mp_init(mp_int *mp, int kmflag)
134 return mp_init_size(mp, s_mp_defprec, kmflag);
140 /* {{{ mp_init_size(mp, prec, kmflag) */
143 mp_init_size(mp, prec, kmflag)
150 mp_err mp_init_size(mp_int *mp, mp_size prec, int kmflag)
152 ARGCHK(mp != NULL && prec > 0, MP_BADARG);
155 if((DIGITS(mp) = s_mp_alloc(prec, sizeof(mp_digit), kmflag)) == NULL)
158 SIGN(mp) = ZPOS;
159 USED(mp) = 1;
160 ALLOC(mp) = prec;
161 FLAG(mp) = kmflag;
169 /* {{{ mp_init_copy(mp, from) */
172 mp_init_copy(mp, from)
174 Initialize mp as an exact copy of from. Returns MP_OKAY if
179 mp_err mp_init_copy(mp_int *mp, const mp_int *from)
181 ARGCHK(mp != NULL && from != NULL, MP_BADARG);
183 if(mp == from)
186 if((DIGITS(mp) = s_mp_alloc(ALLOC(from), sizeof(mp_digit), FLAG(from))) == NULL)
189 s_mp_copy(DIGITS(from), DIGITS(mp), USED(from));
190 USED(mp) = USED(from);
191 ALLOC(mp) = ALLOC(from);
192 SIGN(mp) = SIGN(from);
193 FLAG(mp) = FLAG(from);
287 /* {{{ mp_clear(mp) */
290 mp_clear(mp)
297 void mp_clear(mp_int *mp)
299 if(mp == NULL)
302 if(DIGITS(mp) != NULL) {
304 s_mp_setz(DIGITS(mp), ALLOC(mp));
306 s_mp_free(DIGITS(mp), ALLOC(mp));
307 DIGITS(mp) = NULL;
310 USED(mp) = 0;
311 ALLOC(mp) = 0;
317 /* {{{ mp_zero(mp) */
320 mp_zero(mp)
322 Set mp to zero. Does not change the allocated size of the structure,
325 void mp_zero(mp_int *mp)
327 if(mp == NULL)
330 s_mp_setz(DIGITS(mp), ALLOC(mp));
331 USED(mp) = 1;
332 SIGN(mp) = ZPOS;
338 /* {{{ mp_set(mp, d) */
340 void mp_set(mp_int *mp, mp_digit d)
342 if(mp == NULL)
345 mp_zero(mp);
346 DIGIT(mp, 0) = d;
352 /* {{{ mp_set_int(mp, z) */
354 mp_err mp_set_int(mp_int *mp, long z)
360 ARGCHK(mp != NULL, MP_BADARG);
362 mp_zero(mp);
367 DIGIT(mp,0) = v;
370 if ((res = s_mp_mul_d(mp, (UCHAR_MAX + 1))) != MP_OKAY)
373 res = s_mp_add_d(mp, (mp_digit)((v >> (ix * CHAR_BIT)) & UCHAR_MAX));
379 SIGN(mp) = NEG;
387 /* {{{ mp_set_ulong(mp, z) */
389 mp_err mp_set_ulong(mp_int *mp, unsigned long z)
394 ARGCHK(mp != NULL, MP_BADARG);
396 mp_zero(mp);
401 DIGIT(mp,0) = z;
404 if ((res = s_mp_mul_d(mp, (UCHAR_MAX + 1))) != MP_OKAY)
407 res = s_mp_add_d(mp, (mp_digit)((z >> (ix * CHAR_BIT)) & UCHAR_MAX));
2042 mp_size mp_trailing_zeros(const mp_int *mp)
2048 if (!mp || !MP_DIGITS(mp) || !mp_cmp_z(mp))
2051 for (ix = 0; !(d = MP_DIGIT(mp,ix)) && (ix < MP_USED(mp)); ++ix)
2457 /* {{{ mp_print(mp, ofp) */
2461 mp_print(mp, ofp)
2467 void mp_print(mp_int *mp, FILE *ofp)
2471 if(mp == NULL || ofp == NULL)
2474 fputc((SIGN(mp) == NEG) ? '-' : '+', ofp);
2476 for(ix = USED(mp) - 1; ix >= 0; ix--) {
2477 fprintf(ofp, DIGIT_FMT, DIGIT(mp, ix));
2489 /* {{{ mp_read_raw(mp, str, len) */
2492 mp_read_raw(mp, str, len)
2497 mp_err mp_read_raw(mp_int *mp, char *str, int len)
2503 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG);
2505 mp_zero(mp);
2509 SIGN(mp) = NEG;
2511 SIGN(mp) = ZPOS;
2515 if((res = mp_mul_d(mp, 256, mp)) != MP_OKAY)
2517 if((res = mp_add_d(mp, ustr[ix], mp)) != MP_OKAY)
2527 /* {{{ mp_raw_size(mp) */
2529 int mp_raw_size(mp_int *mp)
2531 ARGCHK(mp != NULL, 0);
2533 return (USED(mp) * sizeof(mp_digit)) + 1;
2539 /* {{{ mp_toraw(mp, str) */
2541 mp_err mp_toraw(mp_int *mp, char *str)
2545 ARGCHK(mp != NULL && str != NULL, MP_BADARG);
2547 str[0] = (char)SIGN(mp);
2550 for(ix = USED(mp) - 1; ix >= 0; ix--) {
2551 mp_digit d = DIGIT(mp, ix);
2565 /* {{{ mp_read_radix(mp, str, radix) */
2568 mp_read_radix(mp, str, radix)
2570 Read an integer from the given string, and set mp to the resulting
2576 mp_err mp_read_radix(mp_int *mp, const char *str, int radix)
2582 ARGCHK(mp != NULL && str != NULL && radix >= 2 && radix <= MAX_RADIX,
2585 mp_zero(mp);
2604 if((res = s_mp_mul_d(mp, radix)) != MP_OKAY)
2606 if((res = s_mp_add_d(mp, val)) != MP_OKAY)
2611 if(s_mp_cmp_d(mp, 0) == MP_EQ)
2612 SIGN(mp) = ZPOS;
2614 SIGN(mp) = sig;
2661 /* {{{ mp_radix_size(mp, radix) */
2663 int mp_radix_size(mp_int *mp, int radix)
2667 if(!mp || radix < 2 || radix > MAX_RADIX)
2670 bits = USED(mp) * DIGIT_BIT - 1;
2678 /* {{{ mp_toradix(mp, str, radix) */
2680 mp_err mp_toradix(mp_int *mp, char *str, int radix)
2684 ARGCHK(mp != NULL && str != NULL, MP_BADARG);
2687 if(mp_cmp_z(mp) == MP_EQ) {
2697 if((res = mp_init_copy(&tmp, mp)) != MP_OKAY)
2787 /* {{{ s_mp_grow(mp, min) */
2789 /* Make sure there are at least 'min' digits allocated to mp */
2790 mp_err s_mp_grow(mp_int *mp, mp_size min)
2792 if(min > ALLOC(mp)) {
2798 if((tmp = s_mp_alloc(min, sizeof(mp_digit), FLAG(mp))) == NULL)
2801 s_mp_copy(DIGITS(mp), tmp, USED(mp));
2804 s_mp_setz(DIGITS(mp), ALLOC(mp));
2806 s_mp_free(DIGITS(mp), ALLOC(mp));
2807 DIGITS(mp) = tmp;
2808 ALLOC(mp) = min;
2817 /* {{{ s_mp_pad(mp, min) */
2819 /* Make sure the used size of mp is at least 'min', growing if needed */
2820 mp_err s_mp_pad(mp_int *mp, mp_size min)
2822 if(min > USED(mp)) {
2826 if (min > ALLOC(mp)) {
2827 if ((res = s_mp_grow(mp, min)) != MP_OKAY)
2830 s_mp_setz(DIGITS(mp) + USED(mp), min - USED(mp));
2834 USED(mp) = min;
2920 /* {{{ s_mp_clamp(mp) */
2924 void s_mp_clamp(mp_int *mp)
2926 mp_size used = MP_USED(mp);
2927 while (used > 1 && DIGIT(mp, used - 1) == 0)
2929 MP_USED(mp) = used;
2954 /* {{{ s_mp_lshd(mp, p) */
2957 Shift mp leftward by p digits, growing if needed, and zero-filling
2960 The value of USED(mp) must already have been set to the value for
2964 mp_err s_mp_lshd(mp_int *mp, mp_size p)
2973 if (MP_USED(mp) == 1 && MP_DIGIT(mp, 0) == 0)
2976 if((res = s_mp_pad(mp, USED(mp) + p)) != MP_OKAY)
2979 pos = USED(mp) - 1;
2983 DIGIT(mp, ix + p) = DIGIT(mp, ix);
2987 DIGIT(mp, ix) = 0;
2995 /* {{{ s_mp_mul_2d(mp, d) */
3001 mp_err s_mp_mul_2d(mp_int *mp, mp_digit d)
3007 ARGCHK(mp != NULL, MP_BADARG);
3013 mask &= MP_DIGIT(mp, MP_USED(mp) - 1);
3015 if (MP_OKAY != (res = s_mp_pad(mp, MP_USED(mp) + dshift + (mask != 0) )))
3018 if (dshift && MP_OKAY != (res = s_mp_lshd(mp, dshift)))
3022 mp_digit *pa = MP_DIGITS(mp);
3023 mp_digit *alim = pa + MP_USED(mp);
3033 s_mp_clamp(mp);
3037 /* {{{ s_mp_rshd(mp, p) */
3040 Shift mp rightward by p digits. Maintains the invariant that
3045 void s_mp_rshd(mp_int *mp, mp_size p)
3054 if(p >= USED(mp)) {
3055 s_mp_setz(DIGITS(mp), ALLOC(mp));
3056 USED(mp) = 1;
3057 SIGN(mp) = ZPOS;
3062 dst = MP_DIGITS(mp);
3064 for (ix = USED(mp) - p; ix > 0; ix--)
3067 MP_USED(mp) -= p;
3074 s_mp_clamp(mp);
3081 /* {{{ s_mp_div_2(mp) */
3084 void s_mp_div_2(mp_int *mp)
3086 s_mp_div_2d(mp, 1);
3092 /* {{{ s_mp_mul_2(mp) */
3094 mp_err s_mp_mul_2(mp_int *mp)
3101 used = MP_USED(mp);
3102 pd = MP_DIGITS(mp);
3111 if (ix >= ALLOC(mp)) {
3113 if((res = s_mp_grow(mp, ALLOC(mp) + 1)) != MP_OKAY)
3117 DIGIT(mp, ix) = kin;
3118 USED(mp) += 1;
3127 /* {{{ s_mp_mod_2d(mp, d) */
3134 void s_mp_mod_2d(mp_int *mp, mp_digit d)
3140 if(ndig >= USED(mp))
3145 DIGIT(mp, ndig) &= dmask;
3148 for(ix = ndig + 1; ix < USED(mp); ix++)
3149 DIGIT(mp, ix) = 0;
3151 s_mp_clamp(mp);
3157 /* {{{ s_mp_div_2d(mp, d) */
3164 void s_mp_div_2d(mp_int *mp, mp_digit d)
3169 s_mp_rshd(mp, d / DIGIT_BIT);
3174 for(ix = USED(mp) - 1; ix >= 0; ix--) {
3175 next = DIGIT(mp, ix) & mask;
3176 DIGIT(mp, ix) = (DIGIT(mp, ix) >> d) | (save << (DIGIT_BIT - d));
3180 s_mp_clamp(mp);
3231 /* {{{ s_mp_add_d(mp, d) */
3233 /* Add d to |mp| in place */
3234 mp_err s_mp_add_d(mp_int *mp, mp_digit d) /* unsigned digit addition */
3240 w = (mp_word)DIGIT(mp, 0) + d;
3241 DIGIT(mp, 0) = ACCUM(w);
3244 while(ix < USED(mp) && k) {
3245 w = (mp_word)DIGIT(mp, ix) + k;
3246 DIGIT(mp, ix) = ACCUM(w);
3254 if((res = s_mp_pad(mp, USED(mp) + 1)) != MP_OKAY)
3257 DIGIT(mp, ix) = (mp_digit)k;
3262 mp_digit * pmp = MP_DIGITS(mp);
3265 int used = (int)MP_USED(mp);
3276 /* mp is growing */
3277 used = MP_USED(mp);
3278 MP_CHECKOK( s_mp_pad(mp, used + 1) );
3279 MP_DIGIT(mp, used) = carry;
3288 /* {{{ s_mp_sub_d(mp, d) */
3290 /* Subtract d from |mp| in place, assumes |mp| > d */
3291 mp_err s_mp_sub_d(mp_int *mp, mp_digit d) /* unsigned digit subtract */
3298 w = (RADIX + (mp_word)DIGIT(mp, 0)) - d;
3300 DIGIT(mp, 0) = ACCUM(w);
3303 while(b && ix < USED(mp)) {
3304 w = (RADIX + (mp_word)DIGIT(mp, ix)) - b;
3306 DIGIT(mp, ix) = ACCUM(w);
3311 s_mp_clamp(mp);
3319 mp_digit *pmp = MP_DIGITS(mp);
3321 mp_size used = MP_USED(mp);
3331 s_mp_clamp(mp);
3371 /* {{{ s_mp_div_d(mp, d, r) */
3374 s_mp_div_d(mp, d, r)
3376 Compute the quotient mp = mp / d and remainder r = mp mod d, for a
3380 mp_err s_mp_div_d(mp_int *mp, mp_digit d, mp_digit *r)
3400 if (MP_USED(mp) == 1) {
3401 mp_digit n = MP_DIGIT(mp,0);
3406 MP_DIGIT(mp,0) = q;
3415 MP_CHECKOK( mp_init_size(&quot, USED(mp), FLAG(mp)) );
3418 for(ix = USED(mp) - 1; ix >= 0; ix--) {
3419 w = (w << DIGIT_BIT) | DIGIT(mp, ix);
3438 MP_CHECKOK( mp_init_copy(&rem, mp) );
3477 mp_exch(&quot, mp);
4679 /* {{{ mp_read_unsigned_octets(mp, str, len) */
4680 /* mp_read_unsigned_octets(mp, str, len)
4686 mp_read_unsigned_octets(mp_int *mp, const unsigned char *str, mp_size len)
4692 ARGCHK(mp != NULL && str != NULL && len > 0, MP_BADARG);
4694 mp_zero(mp);
4701 MP_DIGIT(mp, 0) = d;
4709 if (MP_EQ == mp_cmp_z(mp)) {
4713 if((res = s_mp_lshd(mp, 1)) != MP_OKAY)
4716 MP_DIGIT(mp, 0) = d;
4722 /* {{{ mp_unsigned_octet_size(mp) */
4724 mp_unsigned_octet_size(const mp_int *mp)
4730 ARGCHK(mp != NULL, MP_BADARG);
4731 ARGCHK(MP_ZPOS == SIGN(mp), MP_BADARG);
4733 bytes = (USED(mp) * sizeof(mp_digit));
4737 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4738 d = DIGIT(mp, ix);
4757 /* {{{ mp_to_unsigned_octets(mp, str) */
4760 mp_to_unsigned_octets(const mp_int *mp, unsigned char *str, mp_size maxlen)
4765 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4767 bytes = mp_unsigned_octet_size(mp);
4771 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4772 mp_digit d = DIGIT(mp, ix);
4789 /* {{{ mp_to_signed_octets(mp, str) */
4792 mp_to_signed_octets(const mp_int *mp, unsigned char *str, mp_size maxlen)
4797 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4799 bytes = mp_unsigned_octet_size(mp);
4803 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4804 mp_digit d = DIGIT(mp, ix);
4829 /* {{{ mp_to_fixlen_octets(mp, str) */
4832 mp_to_fixlen_octets(const mp_int *mp, unsigned char *str, mp_size length)
4837 ARGCHK(mp != NULL && str != NULL && !SIGN(mp), MP_BADARG);
4839 bytes = mp_unsigned_octet_size(mp);
4848 for(ix = USED(mp) - 1; ix >= 0; ix--) {
4849 mp_digit d = DIGIT(mp, ix);