Fix bounds on workspace for Karatsuba operations.
[u/mdw/catacomb] / mp-arith.c
index d31309b..23137e2 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: mp-arith.c,v 1.11 2002/10/06 22:52:50 mdw Exp $
+ * $Id: mp-arith.c,v 1.12 2002/10/09 00:36:03 mdw Exp $
  *
  * Basic arithmetic on multiprecision integers
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: mp-arith.c,v $
+ * Revision 1.12  2002/10/09 00:36:03  mdw
+ * Fix bounds on workspace for Karatsuba operations.
+ *
  * Revision 1.11  2002/10/06 22:52:50  mdw
  * Pile of changes for supporting two's complement properly.
  *
@@ -421,12 +424,11 @@ mp *mp_mul(mp *d, mp *a, mp *b)
     MP_DEST(d, MP_LEN(a) + MP_LEN(b), a->f | b->f | MP_UNDEF);
     mpx_umul(d->v, d->vl, a->v, a->vl, b->v, b->vl);
   } else {
-    size_t m = 2 * MAX(MP_LEN(a), MP_LEN(b)) + 2;
+    size_t m = MAX(MP_LEN(a), MP_LEN(b));
     mpw *s;
-    MP_DEST(d, m, a->f | b->f | MP_UNDEF);
-    m += MPK_SLOP;
-    s = mpalloc(d->a, m);
-    mpx_kmul(d->v, d->vl, a->v, a->vl, b->v, b->vl, s, s + m);
+    MP_DEST(d, 3 * m, a->f | b->f | MP_UNDEF);
+    s = mpalloc(d->a, 5 * m);
+    mpx_kmul(d->v, d->vl, a->v, a->vl, b->v, b->vl, s, s + 5 * m);
     mpfree(d->a, s);
   }
 
@@ -450,15 +452,16 @@ mp *mp_sqr(mp *d, mp *a)
   size_t m = MP_LEN(a);
 
   a = MP_COPY(a);
-  MP_DEST(d, 2 * m + 2, a->f | MP_UNDEF);
   if (m > MPK_THRESH) {
     mpw *s;
-    m = 2 * (m + 1) + MPK_SLOP;
-    s = mpalloc(d->a, m);
-    mpx_ksqr(d->v, d->vl, a->v, a->vl, s, s + m);
+    MP_DEST(d, 3 * m, a->f | MP_UNDEF);
+    s = mpalloc(d->a, 5 * m);
+    mpx_ksqr(d->v, d->vl, a->v, a->vl, s, s + 5 * m);
     mpfree(d->a, s);
-  } else 
+  } else {
+    MP_DEST(d, 2 * m + 2, a->f | MP_UNDEF);
     mpx_usqr(d->v, d->vl, a->v, a->vl);
+  }
   d->f = a->f & MP_BURN;
   MP_SHRINK(d);
   MP_DROP(a);