diff options
author | guenther <> | 2014-11-11 06:23:43 +0000 |
---|---|---|
committer | guenther <> | 2014-11-11 06:23:43 +0000 |
commit | 3a7fef712ff3b788a0da6afb3334dcb656b65b8b (patch) | |
tree | 1fce968bf2e236d305e4c29f40a302a0f0ba4856 | |
parent | 41965c3e751d43c1dda72f45741ae75ba089cd4e (diff) | |
download | openbsd-3a7fef712ff3b788a0da6afb3334dcb656b65b8b.tar.gz openbsd-3a7fef712ff3b788a0da6afb3334dcb656b65b8b.tar.bz2 openbsd-3a7fef712ff3b788a0da6afb3334dcb656b65b8b.zip |
Don't free garbage in ec_wNAF_mul() if wNAF could be allocated but
other allocations in the same block couldn't.
problem pointed out by David Ramos on the openssl-dev list
ok miod@ doug@
-rw-r--r-- | src/lib/libcrypto/ec/ec_mult.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ec/ec_mult.c | 16 |
2 files changed, 22 insertions, 10 deletions
diff --git a/src/lib/libcrypto/ec/ec_mult.c b/src/lib/libcrypto/ec/ec_mult.c index 4e49ce4f7b..3dc17bc409 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.14 2014/07/12 16:03:37 miod Exp $ */ | 1 | /* $OpenBSD: ec_mult.c,v 1.15 2014/11/11 06:23:43 guenther 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 | */ |
@@ -425,17 +425,23 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
425 | } | 425 | } |
426 | totalnum = num + numblocks; | 426 | totalnum = num + numblocks; |
427 | 427 | ||
428 | wsize = reallocarray(NULL, totalnum, sizeof wsize[0]); | ||
429 | wNAF_len = reallocarray(NULL, totalnum, sizeof wNAF_len[0]); | ||
430 | /* includes space for pivot */ | 428 | /* includes space for pivot */ |
431 | wNAF = reallocarray(NULL, (totalnum + 1), sizeof wNAF[0]); | 429 | wNAF = reallocarray(NULL, (totalnum + 1), sizeof wNAF[0]); |
430 | if (wNAF == NULL) { | ||
431 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); | ||
432 | goto err; | ||
433 | } | ||
434 | |||
435 | wNAF[0] = NULL; /* preliminary pivot */ | ||
436 | |||
437 | wsize = reallocarray(NULL, totalnum, sizeof wsize[0]); | ||
438 | wNAF_len = reallocarray(NULL, totalnum, sizeof wNAF_len[0]); | ||
432 | val_sub = reallocarray(NULL, totalnum, sizeof val_sub[0]); | 439 | val_sub = reallocarray(NULL, totalnum, sizeof val_sub[0]); |
433 | 440 | ||
434 | if (!wsize || !wNAF_len || !wNAF || !val_sub) { | 441 | if (wsize == NULL || wNAF_len == NULL || val_sub == NULL) { |
435 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); | 442 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); |
436 | goto err; | 443 | goto err; |
437 | } | 444 | } |
438 | wNAF[0] = NULL; /* preliminary pivot */ | ||
439 | 445 | ||
440 | /* num_val will be the total number of temporarily precomputed points */ | 446 | /* num_val will be the total number of temporarily precomputed points */ |
441 | num_val = 0; | 447 | num_val = 0; |
diff --git a/src/lib/libssl/src/crypto/ec/ec_mult.c b/src/lib/libssl/src/crypto/ec/ec_mult.c index 4e49ce4f7b..3dc17bc409 100644 --- a/src/lib/libssl/src/crypto/ec/ec_mult.c +++ b/src/lib/libssl/src/crypto/ec/ec_mult.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ec_mult.c,v 1.14 2014/07/12 16:03:37 miod Exp $ */ | 1 | /* $OpenBSD: ec_mult.c,v 1.15 2014/11/11 06:23:43 guenther 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 | */ |
@@ -425,17 +425,23 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar, | |||
425 | } | 425 | } |
426 | totalnum = num + numblocks; | 426 | totalnum = num + numblocks; |
427 | 427 | ||
428 | wsize = reallocarray(NULL, totalnum, sizeof wsize[0]); | ||
429 | wNAF_len = reallocarray(NULL, totalnum, sizeof wNAF_len[0]); | ||
430 | /* includes space for pivot */ | 428 | /* includes space for pivot */ |
431 | wNAF = reallocarray(NULL, (totalnum + 1), sizeof wNAF[0]); | 429 | wNAF = reallocarray(NULL, (totalnum + 1), sizeof wNAF[0]); |
430 | if (wNAF == NULL) { | ||
431 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); | ||
432 | goto err; | ||
433 | } | ||
434 | |||
435 | wNAF[0] = NULL; /* preliminary pivot */ | ||
436 | |||
437 | wsize = reallocarray(NULL, totalnum, sizeof wsize[0]); | ||
438 | wNAF_len = reallocarray(NULL, totalnum, sizeof wNAF_len[0]); | ||
432 | val_sub = reallocarray(NULL, totalnum, sizeof val_sub[0]); | 439 | val_sub = reallocarray(NULL, totalnum, sizeof val_sub[0]); |
433 | 440 | ||
434 | if (!wsize || !wNAF_len || !wNAF || !val_sub) { | 441 | if (wsize == NULL || wNAF_len == NULL || val_sub == NULL) { |
435 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); | 442 | ECerr(EC_F_EC_WNAF_MUL, ERR_R_MALLOC_FAILURE); |
436 | goto err; | 443 | goto err; |
437 | } | 444 | } |
438 | wNAF[0] = NULL; /* preliminary pivot */ | ||
439 | 445 | ||
440 | /* num_val will be the total number of temporarily precomputed points */ | 446 | /* num_val will be the total number of temporarily precomputed points */ |
441 | num_val = 0; | 447 | num_val = 0; |