diff options
| author | jsing <> | 2023-02-13 04:25:37 +0000 |
|---|---|---|
| committer | jsing <> | 2023-02-13 04:25:37 +0000 |
| commit | 53aa84bf6a4cfaffa003a28a5651a7f30bd74400 (patch) | |
| tree | 3f4664b9d6259b538a970687b222189d9d59afb5 /src/lib/libcrypto/bn/bn_mul.c | |
| parent | 44502592f345cf60ebd8062da41e157768f12e94 (diff) | |
| download | openbsd-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.c | 6 |
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: |
