Rewrote the transform function
[libgcrypt.git] / mpi / mpi-pow.c
index 4351456..2a0a4ef 100644 (file)
@@ -1,15 +1,15 @@
 /* mpi-pow.c  -  MPI functions
- *     Copyright (c) 1997 by Werner Koch (dd9jn)
+ *     Copyright (C) 1998 Free Software Foundation, Inc.
  *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
  *
- * This file is part of G10.
+ * This file is part of GNUPG.
  *
- * G10 is free software; you can redistribute it and/or modify
+ * GNUPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  *
- * G10 is distributed in the hope that it will be useful,
+ * GNUPG is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
@@ -51,6 +51,8 @@ mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
     mpi_ptr_t mp_marker=NULL, bp_marker=NULL, ep_marker=NULL;
     mpi_ptr_t xp_marker=NULL;
     int assign_rp=0;
+    mpi_ptr_t tspace = NULL;
+    mpi_size_t tsize=0;   /* to avoid compiler warning, fixme: check */
 
     esize = exp->nlimbs;
     msize = mod->nlimbs;
@@ -179,7 +181,23 @@ mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
                mpi_ptr_t tp;
                mpi_size_t xsize;
 
-               mpihelp_mul_n(xp, rp, rp, rsize);
+               /*mpihelp_mul_n(xp, rp, rp, rsize);*/
+               if( rsize < KARATSUBA_THRESHOLD )
+                   mpih_sqr_n_basecase( xp, rp, rsize );
+               else {
+                   if( !tspace ) {
+                       tsize = 2 * rsize;
+                       tspace = mpi_alloc_limb_space( tsize, 0 );
+                   }
+                   else if( tsize < (2*rsize) ) {
+                       mpi_free_limb_space( tspace );
+                       tsize = 2 * rsize;
+                       tspace = mpi_alloc_limb_space( tsize, 0 );
+
+                   }
+                   mpih_sqr_n( xp, rp, rsize, tspace );
+               }
+
                xsize = 2 * rsize;
                if( xsize > msize ) {
                    mpihelp_divrem(xp + msize, 0, xp, xsize, mp, msize);
@@ -258,5 +276,6 @@ mpi_powm( MPI res, MPI base, MPI exp, MPI mod)
     if( bp_marker ) mpi_free_limb_space( bp_marker );
     if( ep_marker ) mpi_free_limb_space( ep_marker );
     if( xp_marker ) mpi_free_limb_space( xp_marker );
+    if( tspace )    mpi_free_limb_space( tspace );
 }