Renamed from `rsa-decrypt', since the name was no longer appropriate.
[u/mdw/catacomb] / mpmont.c
index a5b5e66..e7b9bb7 100644 (file)
--- a/mpmont.c
+++ b/mpmont.c
@@ -1,6 +1,6 @@
 /* -*-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.
  *
@@ -102,7 +110,7 @@ void mpmont_create(mpmont *mm, mp *m)
 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 --- */
@@ -182,7 +190,7 @@ mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
 
   /* --- Check for serious Karatsuba reduction --- */
 
-  if (n > KARATSUBA_CUTOFF * 2) {
+  if (n > KARATSUBA_CUTOFF * 3) {
     mp al;
     mpw *vl;
     mp *u;
@@ -210,13 +218,12 @@ mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
 
     /* --- 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;
 
@@ -232,7 +239,6 @@ mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
 
   /* --- 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))
@@ -265,7 +271,7 @@ mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
 
 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 {
@@ -286,7 +292,7 @@ mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
 
     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;
@@ -348,7 +354,7 @@ mp *mpmont_expr(mpmont *mm, mp *d, mp *a, mp *e)
   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);