Mostly working, but not complete, port of openssl
[fedora-mingw.git] / openssl / openssl-0.9.8g-bn-mul-bug.patch
diff --git a/openssl/openssl-0.9.8g-bn-mul-bug.patch b/openssl/openssl-0.9.8g-bn-mul-bug.patch
new file mode 100644 (file)
index 0000000..dd3598d
--- /dev/null
@@ -0,0 +1,64 @@
+openssl/crypto/bn/bn_mul.c     1.36.2.1 -> 1.36.2.2
+
+--- openssl/crypto/bn/bn_mul.c 2007/07/08 18:54:30 1.36.2.1
++++ openssl/crypto/bn/bn_mul.c 2007/11/03 20:09:29 1.36.2.2
+@@ -389,6 +389,7 @@
+  * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
+  * a[1]*b[1]
+  */
++/* dnX may not be positive, but n2/2+dnX has to be */
+ void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
+       int dna, int dnb, BN_ULONG *t)
+       {
+@@ -398,7 +399,7 @@
+       BN_ULONG ln,lo,*p;
+ # ifdef BN_COUNT
+-      fprintf(stderr," bn_mul_recursive %d * %d\n",n2,n2);
++      fprintf(stderr," bn_mul_recursive %d%+d * %d%+d\n",n2,dna,n2,dnb);
+ # endif
+ # ifdef BN_MUL_COMBA
+ #  if 0
+@@ -545,6 +546,7 @@
+ /* n+tn is the word length
+  * t needs to be n*4 is size, as does r */
++/* tnX may not be negative but less than n */
+ void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
+            int tna, int tnb, BN_ULONG *t)
+       {
+@@ -553,8 +555,8 @@
+       BN_ULONG ln,lo,*p;
+ # ifdef BN_COUNT
+-      fprintf(stderr," bn_mul_part_recursive (%d+%d) * (%d+%d)\n",
+-              tna, n, tnb, n);
++      fprintf(stderr," bn_mul_part_recursive (%d%+d) * (%d%+d)\n",
++              n, tna, n, tnb);
+ # endif
+       if (n < 8)
+               {
+@@ -655,16 +657,19 @@
+                               for (;;)
+                                       {
+                                       i/=2;
+-                                      if (i <= tna && tna == tnb)
++                                      /* these simplified conditions work
++                                       * exclusively because difference
++                                       * between tna and tnb is 1 or 0 */
++                                      if (i < tna || i < tnb)
+                                               {
+-                                              bn_mul_recursive(&(r[n2]),
++                                              bn_mul_part_recursive(&(r[n2]),
+                                                       &(a[n]),&(b[n]),
+                                                       i,tna-i,tnb-i,p);
+                                               break;
+                                               }
+-                                      else if (i < tna || i < tnb)
++                                      else if (i == tna || i == tnb)
+                                               {
+-                                              bn_mul_part_recursive(&(r[n2]),
++                                              bn_mul_recursive(&(r[n2]),
+                                                       &(a[n]),&(b[n]),
+                                                       i,tna-i,tnb-i,p);
+                                               break;