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

📄 mpi.c

📁 常用的64位密码加密算法
💻 C
📖 第 1 页 / 共 5 页
字号:
  if (a->used > b->used) {    if ((res = mp_init_copy (&t, a)) != MP_OKAY) {      return res;    }    px = b->used;    x = b;  } else {    if ((res = mp_init_copy (&t, b)) != MP_OKAY) {      return res;    }    px = a->used;    x = a;  }  for (ix = 0; ix < px; ix++) {    t.dp[ix] &= x->dp[ix];  }  /* zero digits above the last from the smallest mp_int */  for (; ix < t.used; ix++) {    t.dp[ix] = 0;  }  mp_clamp (&t);  mp_exch (c, &t);  mp_clear (&t);  return MP_OKAY;}/* End: bn_mp_and.c *//* Start: bn_mp_clamp.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 <ltc_tommath.h>/* trim unused digits  * * This is used to ensure that leading zero digits are * trimed and the leading "used" digit will be non-zero * Typically very fast.  Also fixes the sign if there * are no more leading digits */voidmp_clamp (mp_int * a){  /* decrease used while the most significant digit is   * zero.   */  while (a->used > 0 && a->dp[a->used - 1] == 0) {    --(a->used);  }  /* reset the sign flag if used == 0 */  if (a->used == 0) {    a->sign = MP_ZPOS;  }}/* End: bn_mp_clamp.c *//* Start: bn_mp_clear.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 <ltc_tommath.h>/* clear one (frees)  */voidmp_clear (mp_int * a){  /* only do anything if a hasn't been freed previously */  if (a->dp != NULL) {    /* first zero the digits */    memset (a->dp, 0, sizeof (mp_digit) * a->used);    /* free ram */    XFREE(a->dp);    /* reset members to make debugging easier */    a->dp    = NULL;    a->alloc = a->used = 0;    a->sign  = MP_ZPOS;  }}/* End: bn_mp_clear.c *//* Start: 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 <ltc_tommath.h>#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);}/* End: bn_mp_clear_multi.c *//* Start: 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 */#include <ltc_tommath.h>/* 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);  }}/* End: bn_mp_cmp.c *//* Start: 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 */#include <ltc_tommath.h>/* 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;  }}/* End: bn_mp_cmp_d.c *//* Start: 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 */#include <ltc_tommath.h>/* 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;}/* End: bn_mp_cmp_mag.c *//* Start: 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 */#include <ltc_tommath.h>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;}/* End: bn_mp_cnt_lsb.c *//* Start: 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 */#include <ltc_tommath.h>/* 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;}/* End: bn_mp_copy.c *//* Start: 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 */#include <ltc_tommath.h>/* 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;}/* End: bn_mp_count_bits.c *//* Start: 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 */#include <ltc_tommath.h>/* 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 __Q;  }  if ((res = mp_init (&t2)) != MP_OKAY) {    goto __T1;  }  if ((res = mp_init_copy (&x, a)) != MP_OKAY) {    goto __T2;  }  if ((res = mp_init_copy (&y, b)) != MP_OKAY) {    goto __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 __Y;     }     if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) {

⌨️ 快捷键说明

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