/* -*-c-*-
*
- * $Id: mpmont.c,v 1.8 1999/12/22 15:55:00 mdw Exp $
+ * $Id: mpmont.c,v 1.9 2000/06/17 11:45:09 mdw Exp $
*
* Montgomery reduction
*
/*----- Revision history --------------------------------------------------*
*
* $Log: mpmont.c,v $
+ * Revision 1.9 2000/06/17 11:45:09 mdw
+ * Major memory management overhaul. Added arena support. Use the secure
+ * arena for secret integers. Replace and improve the MP management macros
+ * (e.g., replace MP_MODIFY by MP_DEST).
+ *
* Revision 1.8 1999/12/22 15:55:00 mdw
* Adjust Karatsuba parameters.
*
void mpmont_create(mpmont *mm, mp *m)
{
size_t n = MP_LEN(m);
- mp *r2 = mp_create(2 * n + 1);
+ mp *r2 = mp_new(2 * n + 1, 0);
mp r;
/* --- Validate the arguments --- */
/* --- Initial conditioning of the arguments --- */
- if (d == a)
- MP_MODIFY(d, 2 * n + 1);
- else {
- MP_MODIFY(d, 2 * n + 1);
- MPX_COPY(d->v, d->vl, a->v, a->vl);
- }
-
+ a = MP_COPY(a);
+ if (d)
+ MP_DROP(d);
+ d = a;
+ MP_DEST(d, 2 * n + 1, a->f);
+
dv = d->v; dvl = d->vl;
mv = mm->m->v; mvl = mm->m->vl;
/* --- Wrap everything up --- */
- d->f = a->f & MP_BURN;
memmove(d->v, d->v + n, MPWS(MP_LEN(d) - n));
d->vl -= n;
if (MP_CMP(d, >=, mm->m))
a = MP_COPY(a);
b = MP_COPY(b);
- MP_MODIFY(d, 2 * n + 1);
+ MP_DEST(d, 2 * n + 1, a->f | b->f | MP_UNDEF);
dv = d->v; dvl = d->vl;
MPX_ZERO(dv, dvl);
av = a->v; avl = a->vl;
mpscan sc;
mp *ar = mpmont_mul(mm, MP_NEW, a, mm->r2);
mp *x = MP_COPY(mm->r);
- mp *spare = MP_NEW;
+ mp *spare = (e->f & MP_BURN) ? MP_NEWSEC : MP_NEW;
mp_scan(&sc, e);