diff options
author | tb <> | 2024-11-22 00:52:39 +0000 |
---|---|---|
committer | tb <> | 2024-11-22 00:52:39 +0000 |
commit | f92aaf708c114aa21014cf16e0e1788a766660ac (patch) | |
tree | e983798b6425eeebe1844ed01cc0d31d9bdb9a53 | |
parent | 042cd1d37e41c4ec9a755da7534860a7b0cb140e (diff) | |
download | openbsd-f92aaf708c114aa21014cf16e0e1788a766660ac.tar.gz openbsd-f92aaf708c114aa21014cf16e0e1788a766660ac.tar.bz2 openbsd-f92aaf708c114aa21014cf16e0e1788a766660ac.zip |
Move wNAF[], wNAF_len[], wsize[] to the stack
Again, we know their sizes (always 2), so we can avoid allocating and
freeing them. Also remove the extra "pivot" element. It's not needed.
ok djm
-rw-r--r-- | src/lib/libcrypto/ec/ec_mult.c | 38 |
1 files changed, 6 insertions, 32 deletions
diff --git a/src/lib/libcrypto/ec/ec_mult.c b/src/lib/libcrypto/ec/ec_mult.c index 598694d80a..756abf1a3d 100644 --- a/src/lib/libcrypto/ec/ec_mult.c +++ b/src/lib/libcrypto/ec/ec_mult.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_mult.c,v 1.39 2024/11/22 00:15:38 tb Exp $ */ | 1 | /* $OpenBSD: ec_mult.c,v 1.40 2024/11/22 00:52:39 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. | 3 | * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -227,6 +227,9 @@ int | |||
227 | ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, | 227 | ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, |
228 | const EC_POINT *point, const BIGNUM *n, BN_CTX *ctx) | 228 | const EC_POINT *point, const BIGNUM *n, BN_CTX *ctx) |
229 | { | 229 | { |
230 | signed char *wNAF[2] = { 0 }; | ||
231 | size_t wNAF_len[2] = { 0 }; | ||
232 | size_t wsize[2] = { 0 }; | ||
230 | const EC_POINT *generator = NULL; | 233 | const EC_POINT *generator = NULL; |
231 | EC_POINT *tmp = NULL; | 234 | EC_POINT *tmp = NULL; |
232 | EC_POINT **row[2] = { 0 }; | 235 | EC_POINT **row[2] = { 0 }; |
@@ -234,9 +237,6 @@ ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, | |||
234 | size_t i, j; | 237 | size_t i, j; |
235 | int k; | 238 | int k; |
236 | int r_is_inverted = 0; | 239 | int r_is_inverted = 0; |
237 | size_t *wsize = NULL; /* individual window sizes */ | ||
238 | signed char **wNAF = NULL; /* individual wNAFs */ | ||
239 | size_t *wNAF_len = NULL; | ||
240 | size_t max_len = 0; | 240 | size_t max_len = 0; |
241 | size_t num_val; | 241 | size_t num_val; |
242 | EC_POINT **val = NULL; /* precomputation */ | 242 | EC_POINT **val = NULL; /* precomputation */ |
@@ -259,23 +259,6 @@ ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, | |||
259 | 259 | ||
260 | totalnum = 2; | 260 | totalnum = 2; |
261 | 261 | ||
262 | /* includes space for pivot */ | ||
263 | wNAF = reallocarray(NULL, (totalnum + 1), sizeof wNAF[0]); | ||
264 | if (wNAF == NULL) { | ||
265 | ECerror(ERR_R_MALLOC_FAILURE); | ||
266 | goto err; | ||
267 | } | ||
268 | |||
269 | wNAF[0] = NULL; /* preliminary pivot */ | ||
270 | |||
271 | wsize = reallocarray(NULL, totalnum, sizeof wsize[0]); | ||
272 | wNAF_len = reallocarray(NULL, totalnum, sizeof wNAF_len[0]); | ||
273 | |||
274 | if (wsize == NULL || wNAF_len == NULL) { | ||
275 | ECerror(ERR_R_MALLOC_FAILURE); | ||
276 | goto err; | ||
277 | } | ||
278 | |||
279 | /* num_val will be the total number of temporarily precomputed points */ | 262 | /* num_val will be the total number of temporarily precomputed points */ |
280 | num_val = 0; | 263 | num_val = 0; |
281 | 264 | ||
@@ -285,7 +268,6 @@ ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, | |||
285 | bits = i < 1 ? BN_num_bits(n) : BN_num_bits(m); | 268 | bits = i < 1 ? BN_num_bits(n) : BN_num_bits(m); |
286 | wsize[i] = EC_window_bits_for_scalar_size(bits); | 269 | wsize[i] = EC_window_bits_for_scalar_size(bits); |
287 | num_val += (size_t) 1 << (wsize[i] - 1); | 270 | num_val += (size_t) 1 << (wsize[i] - 1); |
288 | wNAF[i + 1] = NULL; /* make sure we always have a pivot */ | ||
289 | wNAF[i] = compute_wNAF(i < 1 ? n : m, wsize[i], &wNAF_len[i]); | 271 | wNAF[i] = compute_wNAF(i < 1 ? n : m, wsize[i], &wNAF_len[i]); |
290 | if (wNAF[i] == NULL) | 272 | if (wNAF[i] == NULL) |
291 | goto err; | 273 | goto err; |
@@ -403,16 +385,8 @@ ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, | |||
403 | 385 | ||
404 | err: | 386 | err: |
405 | EC_POINT_free(tmp); | 387 | EC_POINT_free(tmp); |
406 | free(wsize); | 388 | free(wNAF[0]); |
407 | free(wNAF_len); | 389 | free(wNAF[1]); |
408 | if (wNAF != NULL) { | ||
409 | signed char **w; | ||
410 | |||
411 | for (w = wNAF; *w != NULL; w++) | ||
412 | free(*w); | ||
413 | |||
414 | free(wNAF); | ||
415 | } | ||
416 | if (val != NULL) { | 390 | if (val != NULL) { |
417 | for (v = val; *v != NULL; v++) | 391 | for (v = val; *v != NULL; v++) |
418 | EC_POINT_free(*v); | 392 | EC_POINT_free(*v); |