/* -*-c-*-
*
- * $Id: mpmont.c,v 1.7 1999/12/11 01:51:14 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.
+ *
* Revision 1.7 1999/12/11 01:51:14 mdw
* Use a Karatsuba-based reduction for large moduli.
*
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 --- */
/* --- Check for serious Karatsuba reduction --- */
- if (n > KARATSUBA_CUTOFF * 2) {
+ if (n > KARATSUBA_CUTOFF * 3) {
mp al;
mpw *vl;
mp *u;
/* --- 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))
mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
{
- if (mm->n > KARATSUBA_CUTOFF * 2) {
+ if (mm->n > KARATSUBA_CUTOFF * 3) {
d = mp_mul(d, a, b);
d = mpmont_reduce(mm, d, d);
} else {
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);