summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn/bn_mul.c
diff options
context:
space:
mode:
authorjsing <>2023-02-13 04:25:37 +0000
committerjsing <>2023-02-13 04:25:37 +0000
commit53aa84bf6a4cfaffa003a28a5651a7f30bd74400 (patch)
tree3f4664b9d6259b538a970687b222189d9d59afb5 /src/lib/libcrypto/bn/bn_mul.c
parent44502592f345cf60ebd8062da41e157768f12e94 (diff)
downloadopenbsd-53aa84bf6a4cfaffa003a28a5651a7f30bd74400.tar.gz
openbsd-53aa84bf6a4cfaffa003a28a5651a7f30bd74400.tar.bz2
openbsd-53aa84bf6a4cfaffa003a28a5651a7f30bd74400.zip
Avoid negative zero.
Whenever setting negative to one (or when it could potentially be one), always use BN_set_negative() since it checks for a zero valued bignum and will not permit negative to be set in this case. Since BN_is_zero() currently relies on top == 0, call BN_set_negative() after top has been set (or bn_correct_top() has been called). This fixes a long standing issue where -0 and +0 have been permitted, however multiple code paths (such as BN_cmp()) fail to treat these as equivalent. Prompted by Guido Vranken who is adding negative zero fuzzing to oss-fuzz. ok tb@
Diffstat (limited to 'src/lib/libcrypto/bn/bn_mul.c')
-rw-r--r--src/lib/libcrypto/bn/bn_mul.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/lib/libcrypto/bn/bn_mul.c b/src/lib/libcrypto/bn/bn_mul.c
index bd679108db..38c01dad18 100644
--- a/src/lib/libcrypto/bn/bn_mul.c
+++ b/src/lib/libcrypto/bn/bn_mul.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_mul.c,v 1.30 2023/01/23 12:17:57 jsing Exp $ */ 1/* $OpenBSD: bn_mul.c,v 1.31 2023/02/13 04:25:37 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1003,10 +1003,10 @@ BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
1003 } 1003 }
1004 1004
1005 rr->top = rn; 1005 rr->top = rn;
1006 rr->neg = a->neg ^ b->neg;
1007
1008 bn_correct_top(rr); 1006 bn_correct_top(rr);
1009 1007
1008 BN_set_negative(rr, a->neg ^ b->neg);
1009
1010 if (r != rr) 1010 if (r != rr)
1011 BN_copy(r, rr); 1011 BN_copy(r, rr);
1012 done: 1012 done: