diff options
author | Brian Smith <brian@briansmith.org> | 2016-03-05 02:42:47 +0300 |
---|---|---|
committer | David Benjamin <davidben@google.com> | 2016-04-18 23:42:15 +0300 |
commit | 2a92031bb4dceef47b8ee49a9184d7e572fb841b (patch) | |
tree | ab840b7be9fbd27eaba12e77432cb2631b910972 /crypto/rsa | |
parent | 9902262af6fa38acd9bf4e55f2a6d3389faba7e8 (diff) |
Clarify |RSA_verify_raw| error handling & cleanup.
Use the common pattern of returning early instead of |goto err;| when
there's no cleanup to do yet. Also, move the error checking of
|BN_CTX_get| failure closer to the the calls to |BN_CTX_get|. Avoid
calling |OPENSSL_cleanse| on public data. Clarify when/why |buf| is not
freed.
Change-Id: I9df833db7eb7041c5af9349c461297372b988f98
Reviewed-on: https://boringssl-review.googlesource.com/7464
Reviewed-by: David Benjamin <davidben@google.com>
Diffstat (limited to 'crypto/rsa')
-rw-r--r-- | crypto/rsa/rsa_impl.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/crypto/rsa/rsa_impl.c b/crypto/rsa/rsa_impl.c index fecb911f..35b26230 100644 --- a/crypto/rsa/rsa_impl.c +++ b/crypto/rsa/rsa_impl.c @@ -435,10 +435,7 @@ int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const unsigned rsa_size = RSA_size(rsa); BIGNUM *f, *result; - int ret = 0; int r = -1; - uint8_t *buf = NULL; - BN_CTX *ctx = NULL; if (max_out < rsa_size) { OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL); @@ -454,14 +451,22 @@ int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, return 0; } - ctx = BN_CTX_new(); + BN_CTX *ctx = BN_CTX_new(); if (ctx == NULL) { - goto err; + return 0; } + int ret = 0; + uint8_t *buf = NULL; + BN_CTX_start(ctx); f = BN_CTX_get(ctx); result = BN_CTX_get(ctx); + if (f == NULL || result == NULL) { + OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); + goto err; + } + if (padding == RSA_NO_PADDING) { buf = out; } else { @@ -472,10 +477,6 @@ int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, goto err; } } - if (!f || !result) { - OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE); - goto err; - } if (BN_bin2bn(in, in_len, f) == NULL) { goto err; @@ -516,12 +517,9 @@ int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, } err: - if (ctx != NULL) { - BN_CTX_end(ctx); - BN_CTX_free(ctx); - } - if (padding != RSA_NO_PADDING && buf != NULL) { - OPENSSL_cleanse(buf, rsa_size); + BN_CTX_end(ctx); + BN_CTX_free(ctx); + if (buf != out) { OPENSSL_free(buf); } return ret; |