projects
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revert the size_t modifications from HEAD that had led to more
[openssl.git]
/
crypto
/
bn
/
bn_mul.c
diff --git
a/crypto/bn/bn_mul.c
b/crypto/bn/bn_mul.c
index fd598b8b3d61fd1212890bcc583a1a98f3f2ce8f..b848c8cc60f4d69ab60468c3090385318930a40a 100644
(file)
--- a/
crypto/bn/bn_mul.c
+++ b/
crypto/bn/bn_mul.c
@@
-66,7
+66,7
@@
#include "cryptlib.h"
#include "bn_lcl.h"
#include "cryptlib.h"
#include "bn_lcl.h"
-#if defined(OPENSSL_NO_ASM) || !
(defined(__i386) || defined(__i386__))/* Assembler implementation exists only for x86 */
+#if defined(OPENSSL_NO_ASM) || !
defined(OPENSSL_BN_ASM_PART_WORDS)
/* Here follows specialised variants of bn_add_words() and
bn_sub_words(). They have the property performing operations on
arrays of different sizes. The sizes of those arrays is expressed through
/* Here follows specialised variants of bn_add_words() and
bn_sub_words(). They have the property performing operations on
arrays of different sizes. The sizes of those arrays is expressed through
@@
-389,6
+389,7
@@
BN_ULONG bn_add_part_words(BN_ULONG *r,
* a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
* a[1]*b[1]
*/
* 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)
{
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
@@
void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
BN_ULONG ln,lo,*p;
# ifdef BN_COUNT
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
# endif
# ifdef BN_MUL_COMBA
# if 0
@@
-545,16
+546,17
@@
void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
/* n+tn is the word length
* t needs to be n*4 is size, as does r */
/* 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)
{
int i,j,n2=n*2;
void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
int tna, int tnb, BN_ULONG *t)
{
int i,j,n2=n*2;
-
unsigned
int c1,c2,neg,zero;
+ int c1,c2,neg,zero;
BN_ULONG ln,lo,*p;
# ifdef BN_COUNT
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)
{
# endif
if (n < 8)
{
@@
-655,14
+657,17
@@
void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
for (;;)
{
i/=2;
for (;;)
{
i/=2;
- if (i < tna && i < tnb)
+ /* these simplified conditions work
+ * exclusively because difference
+ * between tna and tnb is 1 or 0 */
+ if (i < tna || i < tnb)
{
bn_mul_part_recursive(&(r[n2]),
&(a[n]),&(b[n]),
i,tna-i,tnb-i,p);
break;
}
{
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_recursive(&(r[n2]),
&(a[n]),&(b[n]),
{
bn_mul_recursive(&(r[n2]),
&(a[n]),&(b[n]),
@@
-706,7
+711,7
@@
void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
/* The overflow will stop before we over write
* words we should not overwrite */
/* The overflow will stop before we over write
* words we should not overwrite */
- if (ln < c1)
+ if (ln <
(BN_ULONG)
c1)
{
do {
p++;
{
do {
p++;
@@
-964,7
+969,7
@@
int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
if ((al == 0) || (bl == 0))
{
if ((al == 0) || (bl == 0))
{
-
if (!BN_zero(r)) goto err
;
+
BN_zero(r)
;
return(1);
}
top=al+bl;
return(1);
}
top=al+bl;
@@
-1090,10
+1095,11
@@
int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
#if defined(BN_MUL_COMBA) || defined(BN_RECURSION)
end:
#endif
#if defined(BN_MUL_COMBA) || defined(BN_RECURSION)
end:
#endif
- bn_
fix
_top(rr);
+ bn_
correct
_top(rr);
if (r != rr) BN_copy(r,rr);
ret=1;
err:
if (r != rr) BN_copy(r,rr);
ret=1;
err:
+ bn_check_top(r);
BN_CTX_end(ctx);
return(ret);
}
BN_CTX_end(ctx);
return(ret);
}