summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2022-12-17 15:56:25 +0000
committerjsing <>2022-12-17 15:56:25 +0000
commita9f292ba0c26c0212f3cee4f53591dbdec7ee05c (patch)
treedebf6c87cb5650b9a030d3c9de7f062c9bce2cd7
parent1dd1001dfe28a3e1f6775d022a3d5be252da4459 (diff)
downloadopenbsd-a9f292ba0c26c0212f3cee4f53591dbdec7ee05c.tar.gz
openbsd-a9f292ba0c26c0212f3cee4f53591dbdec7ee05c.tar.bz2
openbsd-a9f292ba0c26c0212f3cee4f53591dbdec7ee05c.zip
Provide BN_zero()/BN_one() as functions and make BN_zero() always succeed.
BN_zero() is currently implemented using BN_set_word(), which means it can fail, however almost nothing ever checks the return value. A long time ago OpenSSL changed BN_zero() to always succeed and return void, however kept BN_zero as a macro that calls a new BN_zero_ex() function, so that it can be switched back to the "can fail" version. Take a simpler approach - change BN_zero()/BN_one() to functions and make BN_zero() always succeed. This will be exposed in the next bump, at which point we can hopefully also remove the BN_zero_ex() function. ok tb@
-rw-r--r--src/lib/libcrypto/bn/bn.h7
-rw-r--r--src/lib/libcrypto/bn/bn_isqrt.c5
-rw-r--r--src/lib/libcrypto/bn/bn_lib.c17
3 files changed, 22 insertions, 7 deletions
diff --git a/src/lib/libcrypto/bn/bn.h b/src/lib/libcrypto/bn/bn.h
index bef0a878e2..ba6c25ba0a 100644
--- a/src/lib/libcrypto/bn/bn.h
+++ b/src/lib/libcrypto/bn/bn.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn.h,v 1.56 2022/11/30 01:47:19 jsing Exp $ */ 1/* $OpenBSD: bn.h,v 1.57 2022/12/17 15:56:25 jsing Exp $ */
2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -329,6 +329,10 @@ int BN_is_one(const BIGNUM *a);
329int BN_is_word(const BIGNUM *a, const BN_ULONG w); 329int BN_is_word(const BIGNUM *a, const BN_ULONG w);
330int BN_is_odd(const BIGNUM *a); 330int BN_is_odd(const BIGNUM *a);
331 331
332#if defined(LIBRESSL_INTERNAL) || defined(LIBRESSL_NEXT_API)
333void BN_zero(BIGNUM *a);
334int BN_one(BIGNUM *a);
335#else
332#define BN_one(a) BN_set_word((a), 1) 336#define BN_one(a) BN_set_word((a), 1)
333 337
334void BN_zero_ex(BIGNUM *a); 338void BN_zero_ex(BIGNUM *a);
@@ -338,6 +342,7 @@ void BN_zero_ex(BIGNUM *a);
338#else 342#else
339#define BN_zero(a) (BN_set_word((a),0)) 343#define BN_zero(a) (BN_set_word((a),0))
340#endif 344#endif
345#endif
341 346
342const BIGNUM *BN_value_one(void); 347const BIGNUM *BN_value_one(void);
343char * BN_options(void); 348char * BN_options(void);
diff --git a/src/lib/libcrypto/bn/bn_isqrt.c b/src/lib/libcrypto/bn/bn_isqrt.c
index 81f90b10be..ec77e1b078 100644
--- a/src/lib/libcrypto/bn/bn_isqrt.c
+++ b/src/lib/libcrypto/bn/bn_isqrt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_isqrt.c,v 1.5 2022/12/01 21:59:54 tb Exp $ */ 1/* $OpenBSD: bn_isqrt.c,v 1.6 2022/12/17 15:56:25 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2022 Theo Buehler <tb@openbsd.org> 3 * Copyright (c) 2022 Theo Buehler <tb@openbsd.org>
4 * 4 *
@@ -74,8 +74,7 @@ bn_isqrt(BIGNUM *out_sqrt, int *out_perfect, const BIGNUM *n, BN_CTX *in_ctx)
74 74
75 if (BN_is_zero(n)) { 75 if (BN_is_zero(n)) {
76 perfect = 1; 76 perfect = 1;
77 if (!BN_zero(a)) 77 BN_zero(a);
78 goto err;
79 goto done; 78 goto done;
80 } 79 }
81 80
diff --git a/src/lib/libcrypto/bn/bn_lib.c b/src/lib/libcrypto/bn/bn_lib.c
index 851c337ef0..c47f2fa024 100644
--- a/src/lib/libcrypto/bn/bn_lib.c
+++ b/src/lib/libcrypto/bn/bn_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_lib.c,v 1.66 2022/11/30 03:08:39 jsing Exp $ */ 1/* $OpenBSD: bn_lib.c,v 1.67 2022/12/17 15:56:25 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 *
@@ -998,11 +998,22 @@ BN_swap_ct(BN_ULONG condition, BIGNUM *a, BIGNUM *b, size_t nwords)
998} 998}
999 999
1000void 1000void
1001BN_zero_ex(BIGNUM *a) 1001BN_zero(BIGNUM *a)
1002{ 1002{
1003 a->neg = 0; 1003 a->neg = 0;
1004 a->top = 0; 1004 a->top = 0;
1005 /* XXX: a->flags &= ~BN_FIXED_TOP */ 1005}
1006
1007void
1008BN_zero_ex(BIGNUM *a)
1009{
1010 BN_zero(a);
1011}
1012
1013int
1014BN_one(BIGNUM *a)
1015{
1016 return BN_set_word(a, 1);
1006} 1017}
1007 1018
1008int 1019int