projects
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix a bug which caused BN_div to produce the
[openssl.git]
/
crypto
/
bn
/
bn_div.c
diff --git
a/crypto/bn/bn_div.c
b/crypto/bn/bn_div.c
index 602276d1fa84816381991689046551e19e4dc066..bbd09940089cf38cabc3f014f04682c083413dca 100644
(file)
--- a/
crypto/bn/bn_div.c
+++ b/
crypto/bn/bn_div.c
@@
-127,7
+127,8
@@
int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
#else
#else
-#if !defined(NO_ASM) && !defined(NO_INLINE_ASM) && !defined(PEDANTIC) && !defined(BN_DIV3W)
+#if !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM) \
+ && !defined(PEDANTIC) && !defined(BN_DIV3W)
# if defined(__GNUC__) && __GNUC__>=2
# if defined(__i386)
/*
# if defined(__GNUC__) && __GNUC__>=2
# if defined(__i386)
/*
@@
-151,7
+152,7
@@
int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
# define REMAINDER_IS_ALREADY_CALCULATED
# endif /* __<cpu> */
# endif /* __GNUC__ */
# define REMAINDER_IS_ALREADY_CALCULATED
# endif /* __<cpu> */
# endif /* __GNUC__ */
-#endif /* NO_ASM */
+#endif /*
OPENSSL_
NO_ASM */
/* BN_div computes dv := num / divisor, rounding towards zero, and sets up
/* BN_div computes dv := num / divisor, rounding towards zero, and sets up
@@
-248,7
+249,7
@@
int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,
for (i=0; i<loop-1; i++)
{
BN_ULONG q,l0;
for (i=0; i<loop-1; i++)
{
BN_ULONG q,l0;
-#if defined(BN_DIV3W) && !defined(NO_ASM)
+#if defined(BN_DIV3W) && !defined(
OPENSSL_
NO_ASM)
q=bn_div_3_words(wnump,d1,d0);
#else
BN_ULONG n0,n1,rem=0;
q=bn_div_3_words(wnump,d1,d0);
#else
BN_ULONG n0,n1,rem=0;
@@
-341,9
+342,13
@@
int BN_div(BIGNUM *dv, BIGNUM *rm, const BIGNUM *num, const BIGNUM *divisor,
}
if (rm != NULL)
{
}
if (rm != NULL)
{
+ /* Keep a copy of the neg flag in num because if rm==num
+ * BN_rshift() will overwrite it.
+ */
+ int neg = num->neg;
BN_rshift(rm,snum,norm_shift);
if (!BN_is_zero(rm))
BN_rshift(rm,snum,norm_shift);
if (!BN_is_zero(rm))
- rm->neg = n
um->n
eg;
+ rm->neg = neg;
}
BN_CTX_end(ctx);
return(1);
}
BN_CTX_end(ctx);
return(1);