Fallback to normal multiply if n2 == 8 and dna or dnb is not zero
authorDr. Stephen Henson <steve@openssl.org>
Fri, 10 May 2002 22:18:13 +0000 (22:18 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 10 May 2002 22:18:13 +0000 (22:18 +0000)
in bn_mul_recursive.

This is (hopefully) what was triggering bignum errors on 64 bit
platforms and causing the BN_mod_mul test to fail.

CHANGES
crypto/bn/bn_mul.c

diff --git a/CHANGES b/CHANGES
index ed2bcead6cc689903fd455d7e8b19edc7e4c7571..6721f046e32a5098c257fbc66544f679eec1bc7c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
  
  Changes between 0.9.6d and 0.9.7  [XX xxx 2002]
 
+  *) Check the values of dna and dnb in bn_mul_recursive before calling
+     bn_mul_comba (a non zero value means the a or b arrays do not contain
+     n2 elements) and fallback to bn_mul_normal if either is not zero.
+     [Steve Henson]
+
   *) Fix escaping of non-ASCII characters when using the -subj option
      of the "openssl req" command line tool. (Robert Joop <joop@fokus.gmd.de>)
      [Lutz Jaenicke]
index 41ea925b8d9f4c3ddb08ab3f560dc81c6cc51188..7bffc9c16a515d87eb1fa79d84205753972e3b5e 100644 (file)
@@ -408,16 +408,22 @@ void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
                return;
                }
 #  endif
-       if (n2 == 8)
+       /* Only call bn_mul_comba 8 if n2 == 8 and the
+        * two arrays are complete [steve]
+        */
+       if (n2 == 8 && dna == 0 && dnb == 0)
                {
                bn_mul_comba8(r,a,b);
                return; 
                }
 # endif /* BN_MUL_COMBA */
+       /* Else do normal multiply */
        if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL)
                {
-               /* This should not happen */
-               bn_mul_normal(r,a,n2,b,n2);
+               bn_mul_normal(r,a,n2+dna,b,n2+dnb);
+               if ((dna + dnb) < 0)
+                       memset(&r[2*n2 + dna + dnb], 0,
+                               sizeof(BN_ULONG) * -(dna + dnb));
                return;
                }
        /* r=(a[0]-a[1])*(b[1]-b[0]) */