mpi.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:96k
源码类别:

CA认证

开发平台:

WINDOWS

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