summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-03-30 14:21:10 +0000
committertb <>2023-03-30 14:21:10 +0000
commit442c5fe3daa0d9f181641db965afd2bf416fb83f (patch)
tree249491021e280cbe0602487f4b991e83e5282f3b /src
parent96037c9aac6865829a4f6bfd58737e272909ed64 (diff)
downloadopenbsd-442c5fe3daa0d9f181641db965afd2bf416fb83f.tar.gz
openbsd-442c5fe3daa0d9f181641db965afd2bf416fb83f.tar.bz2
openbsd-442c5fe3daa0d9f181641db965afd2bf416fb83f.zip
Rework BN_exp() a bit
This mostly only cleans up the mess that it was - which doesn't stand out because of the horror that lurks in the rest of this file. It avoids copying the partial calculation out on error and does away with some other weirdness. with/ok jsing
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/bn/bn_exp.c55
1 files changed, 28 insertions, 27 deletions
diff --git a/src/lib/libcrypto/bn/bn_exp.c b/src/lib/libcrypto/bn/bn_exp.c
index 4e90d5d871..ff9933578c 100644
--- a/src/lib/libcrypto/bn/bn_exp.c
+++ b/src/lib/libcrypto/bn/bn_exp.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: bn_exp.c,v 1.44 2023/03/27 10:25:02 tb Exp $ */ 1/* $OpenBSD: bn_exp.c,v 1.45 2023/03/30 14:21:10 tb 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 *
@@ -120,57 +120,58 @@
120/* maximum precomputation table size for *variable* sliding windows */ 120/* maximum precomputation table size for *variable* sliding windows */
121#define TABLE_SIZE 32 121#define TABLE_SIZE 32
122 122
123/* this one works - simple but works */ 123/* Calculates r = a^p by successive squaring of a. Not constant time. */
124int 124int
125BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx) 125BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
126{ 126{
127 int i, bits, ret = 0; 127 BIGNUM *rr, *v;
128 BIGNUM *v, *rr; 128 int i;
129 int ret = 0;
129 130
130 if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) { 131 if (BN_get_flags(p, BN_FLG_CONSTTIME) != 0) {
131 /* BN_FLG_CONSTTIME only supported by BN_mod_exp_mont() */
132 BNerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 132 BNerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
133 return -1; 133 return -1;
134 } 134 }
135 135
136 BN_CTX_start(ctx); 136 BN_CTX_start(ctx);
137 if ((r == a) || (r == p)) 137
138 rr = BN_CTX_get(ctx); 138 if ((v = BN_CTX_get(ctx)) == NULL)
139 else
140 rr = r;
141 v = BN_CTX_get(ctx);
142 if (rr == NULL || v == NULL)
143 goto err; 139 goto err;
144 140
145 if (!bn_copy(v, a)) 141 rr = r;
142 if (r == a || r == p)
143 rr = BN_CTX_get(ctx);
144 if (rr == NULL)
146 goto err; 145 goto err;
147 bits = BN_num_bits(p);
148 146
147 if (!BN_one(rr))
148 goto err;
149 if (BN_is_odd(p)) { 149 if (BN_is_odd(p)) {
150 if (!bn_copy(rr, a)) 150 if (!bn_copy(rr, a))
151 goto err; 151 goto err;
152 } else {
153 if (!BN_one(rr))
154 goto err;
155 } 152 }
156 153
157 for (i = 1; i < bits; i++) { 154 if (!bn_copy(v, a))
155 goto err;
156
157 for (i = 1; i < BN_num_bits(p); i++) {
158 if (!BN_sqr(v, v, ctx)) 158 if (!BN_sqr(v, v, ctx))
159 goto err; 159 goto err;
160 if (BN_is_bit_set(p, i)) { 160 if (!BN_is_bit_set(p, i))
161 if (!BN_mul(rr, rr, v, ctx)) 161 continue;
162 goto err; 162 if (!BN_mul(rr, rr, v, ctx))
163 } 163 goto err;
164 } 164 }
165
166 if (!bn_copy(r, rr))
167 goto err;
168
165 ret = 1; 169 ret = 1;
166 170
167err: 171 err:
168 if (r != rr && rr != NULL) {
169 if (!bn_copy(r, rr))
170 ret = 0;
171 }
172 BN_CTX_end(ctx); 172 BN_CTX_end(ctx);
173 return (ret); 173
174 return ret;
174} 175}
175 176
176/* The old fallback, simple version :-) */ 177/* The old fallback, simple version :-) */