⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpi.c

📁 Dropbear is an SSH 2 server, designed to be usable in small memory environments. It supports:
💻 C
📖 第 1 页 / 共 5 页
字号:
 * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* clear one (frees)  */voidmp_clear (mp_int * a){  int i;  /* only do anything if a hasn't been freed previously */  if (a->dp != NULL) {    /* first zero the digits */    for (i = 0; i < a->used; i++) {        a->dp[i] = 0;    }    /* free ram */    XFREE(a->dp);    /* reset members to make debugging easier */    a->dp    = NULL;    a->alloc = a->used = 0;    a->sign  = MP_ZPOS;  }}#endif/* End: bn_mp_clear.c *//* Start: bn_mp_clear_multi.c */#include <tommath.h>#ifdef BN_MP_CLEAR_MULTI_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org */#include <stdarg.h>void mp_clear_multi(mp_int *mp, ...) {    mp_int* next_mp = mp;    va_list args;    va_start(args, mp);    while (next_mp != NULL) {        mp_clear(next_mp);        next_mp = va_arg(args, mp_int*);    }    va_end(args);}#endif/* End: bn_mp_clear_multi.c *//* Start: bn_mp_cmp.c */#include <tommath.h>#ifdef BN_MP_CMP_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* compare two ints (signed)*/intmp_cmp (mp_int * a, mp_int * b){  /* compare based on sign */  if (a->sign != b->sign) {     if (a->sign == MP_NEG) {        return MP_LT;     } else {        return MP_GT;     }  }    /* compare digits */  if (a->sign == MP_NEG) {     /* if negative compare opposite direction */     return mp_cmp_mag(b, a);  } else {     return mp_cmp_mag(a, b);  }}#endif/* End: bn_mp_cmp.c *//* Start: bn_mp_cmp_d.c */#include <tommath.h>#ifdef BN_MP_CMP_D_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* compare a digit */int mp_cmp_d(mp_int * a, mp_digit b){  /* compare based on sign */  if (a->sign == MP_NEG) {    return MP_LT;  }  /* compare based on magnitude */  if (a->used > 1) {    return MP_GT;  }  /* compare the only digit of a to b */  if (a->dp[0] > b) {    return MP_GT;  } else if (a->dp[0] < b) {    return MP_LT;  } else {    return MP_EQ;  }}#endif/* End: bn_mp_cmp_d.c *//* Start: bn_mp_cmp_mag.c */#include <tommath.h>#ifdef BN_MP_CMP_MAG_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* compare maginitude of two ints (unsigned) */int mp_cmp_mag (mp_int * a, mp_int * b){  int     n;  mp_digit *tmpa, *tmpb;  /* compare based on # of non-zero digits */  if (a->used > b->used) {    return MP_GT;  }    if (a->used < b->used) {    return MP_LT;  }  /* alias for a */  tmpa = a->dp + (a->used - 1);  /* alias for b */  tmpb = b->dp + (a->used - 1);  /* compare based on digits  */  for (n = 0; n < a->used; ++n, --tmpa, --tmpb) {    if (*tmpa > *tmpb) {      return MP_GT;    }    if (*tmpa < *tmpb) {      return MP_LT;    }  }  return MP_EQ;}#endif/* End: bn_mp_cmp_mag.c *//* Start: bn_mp_cnt_lsb.c */#include <tommath.h>#ifdef BN_MP_CNT_LSB_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org */static const int lnz[16] = {    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};/* Counts the number of lsbs which are zero before the first zero bit */int mp_cnt_lsb(mp_int *a){   int x;   mp_digit q, qq;   /* easy out */   if (mp_iszero(a) == 1) {      return 0;   }   /* scan lower digits until non-zero */   for (x = 0; x < a->used && a->dp[x] == 0; x++);   q = a->dp[x];   x *= DIGIT_BIT;   /* now scan this digit until a 1 is found */   if ((q & 1) == 0) {      do {         qq  = q & 15;         x  += lnz[qq];         q >>= 4;      } while (qq == 0);   }   return x;}#endif/* End: bn_mp_cnt_lsb.c *//* Start: bn_mp_copy.c */#include <tommath.h>#ifdef BN_MP_COPY_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* copy, b = a */intmp_copy (mp_int * a, mp_int * b){  int     res, n;  /* if dst == src do nothing */  if (a == b) {    return MP_OKAY;  }  /* grow dest */  if (b->alloc < a->used) {     if ((res = mp_grow (b, a->used)) != MP_OKAY) {        return res;     }  }  /* zero b and copy the parameters over */  {    register mp_digit *tmpa, *tmpb;    /* pointer aliases */    /* source */    tmpa = a->dp;    /* destination */    tmpb = b->dp;    /* copy all the digits */    for (n = 0; n < a->used; n++) {      *tmpb++ = *tmpa++;    }    /* clear high digits */    for (; n < b->used; n++) {      *tmpb++ = 0;    }  }  /* copy used count and sign */  b->used = a->used;  b->sign = a->sign;  return MP_OKAY;}#endif/* End: bn_mp_copy.c *//* Start: bn_mp_count_bits.c */#include <tommath.h>#ifdef BN_MP_COUNT_BITS_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org *//* returns the number of bits in an int */intmp_count_bits (mp_int * a){  int     r;  mp_digit q;  /* shortcut */  if (a->used == 0) {    return 0;  }  /* get number of digits and add that */  r = (a->used - 1) * DIGIT_BIT;    /* take the last digit and count the bits in it */  q = a->dp[a->used - 1];  while (q > ((mp_digit) 0)) {    ++r;    q >>= ((mp_digit) 1);  }  return r;}#endif/* End: bn_mp_count_bits.c *//* Start: bn_mp_div.c */#include <tommath.h>#ifdef BN_MP_DIV_C/* LibTomMath, multiple-precision integer library -- Tom St Denis * * LibTomMath is a library that provides multiple-precision * integer arithmetic as well as number theoretic functionality. * * The library was designed directly after the MPI library by * Michael Fromberger but has been written from scratch with * additional optimizations in place. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org */#ifdef BN_MP_DIV_SMALL/* slower bit-bang division... also smaller */int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d){   mp_int ta, tb, tq, q;   int    res, n, n2;  /* is divisor zero ? */  if (mp_iszero (b) == 1) {    return MP_VAL;  }  /* if a < b then q=0, r = a */  if (mp_cmp_mag (a, b) == MP_LT) {    if (d != NULL) {      res = mp_copy (a, d);    } else {      res = MP_OKAY;    }    if (c != NULL) {      mp_zero (c);    }    return res;  }	  /* init our temps */  if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL) != MP_OKAY)) {     return res;  }  mp_set(&tq, 1);  n = mp_count_bits(a) - mp_count_bits(b);  if (((res = mp_abs(a, &ta)) != MP_OKAY) ||      ((res = mp_abs(b, &tb)) != MP_OKAY) ||       ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) ||      ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) {      goto LBL_ERR;  }  while (n-- >= 0) {     if (mp_cmp(&tb, &ta) != MP_GT) {        if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) ||            ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) {           goto LBL_ERR;        }     }     if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) ||         ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) {           goto LBL_ERR;     }  }  /* now q == quotient and ta == remainder */  n  = a->sign;  n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG);  if (c != NULL) {     mp_exch(c, &q);     c->sign  = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2;  }  if (d != NULL) {     mp_exch(d, &ta);     d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n;  }LBL_ERR:   mp_clear_multi(&ta, &tb, &tq, &q, NULL);   return res;}#else/* integer signed division.  * c*b + d == a [e.g. a/b, c=quotient, d=remainder] * HAC pp.598 Algorithm 14.20 * * Note that the description in HAC is horribly  * incomplete.  For example, it doesn't consider  * the case where digits are removed from 'x' in  * the inner loop.  It also doesn't consider the  * case that y has fewer than three digits, etc.. * * The overall algorithm is as described as  * 14.20 from HAC but fixed to treat these cases.*/int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d){  mp_int  q, x, y, t1, t2;  int     res, n, t, i, norm, neg;  /* is divisor zero ? */  if (mp_iszero (b) == 1) {    return MP_VAL;  }  /* if a < b then q=0, r = a */  if (mp_cmp_mag (a, b) == MP_LT) {    if (d != NULL) {      res = mp_copy (a, d);    } else {      res = MP_OKAY;    }    if (c != NULL) {      mp_zero (c);    }    return res;  }  if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) {    return res;  }  q.used = a->used + 2;  if ((res = mp_init (&t1)) != MP_OKAY) {    goto LBL_Q;  }  if ((res = mp_init (&t2)) != MP_OKAY) {    goto LBL_T1;  }  if ((res = mp_init_copy (&x, a)) != MP_OKAY) {    goto LBL_T2;  }  if ((res = mp_init_copy (&y, b)) != MP_OKAY) {    goto LBL_X;  }  /* fix the sign */  neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;  x.sign = y.sign = MP_ZPOS;  /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */  norm = mp_count_bits(&y) % DIGIT_BIT;  if (norm < (int)(DIGIT_BIT-1)) {     norm = (DIGIT_BIT-1) - norm;     if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) {       goto LBL_Y;     }     if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) {       goto LBL_Y;     }  } else {     norm = 0;  }  /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -