提交 3ce2fdab 编写于 作者: M Matt Caswell

Convert memset calls to OPENSSL_cleanse

Ensure things really do get cleared when we intend them to.

Addresses an OCAP Audit issue.
Reviewed-by: NAndy Polyakov <appro@openssl.org>
上级 6f4ae777
...@@ -445,7 +445,7 @@ void BN_clear(BIGNUM *a) ...@@ -445,7 +445,7 @@ void BN_clear(BIGNUM *a)
{ {
bn_check_top(a); bn_check_top(a);
if (a->d != NULL) if (a->d != NULL)
memset(a->d, 0, sizeof(*a->d) * a->dmax); OPENSSL_cleanse(a->d, sizeof(*a->d) * a->dmax);
a->top = 0; a->top = 0;
a->neg = 0; a->neg = 0;
} }
......
...@@ -46,7 +46,6 @@ void BUF_MEM_free(BUF_MEM *a) ...@@ -46,7 +46,6 @@ void BUF_MEM_free(BUF_MEM *a)
return; return;
if (a->data != NULL) { if (a->data != NULL) {
memset(a->data, 0, (unsigned int)a->max);
if (a->flags & BUF_MEM_FLAG_SECURE) if (a->flags & BUF_MEM_FLAG_SECURE)
OPENSSL_secure_free(a->data); OPENSSL_secure_free(a->data);
else else
......
...@@ -36,7 +36,7 @@ int EVP_MD_CTX_reset(EVP_MD_CTX *ctx) ...@@ -36,7 +36,7 @@ int EVP_MD_CTX_reset(EVP_MD_CTX *ctx)
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
ENGINE_finish(ctx->engine); ENGINE_finish(ctx->engine);
#endif #endif
memset(ctx, 0, sizeof(*ctx)); OPENSSL_cleanse(ctx, sizeof(*ctx));
return 1; return 1;
} }
...@@ -170,7 +170,7 @@ int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size) ...@@ -170,7 +170,7 @@ int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
ctx->digest->cleanup(ctx); ctx->digest->cleanup(ctx);
EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED); EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
} }
memset(ctx->md_data, 0, ctx->digest->ctx_size); OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
return ret; return ret;
} }
......
...@@ -65,6 +65,8 @@ ...@@ -65,6 +65,8 @@
* <appro@fy.chalmers.se> * <appro@fy.chalmers.se>
*/ */
#include <openssl/crypto.h>
#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN) #if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN)
# error "DATA_ORDER must be defined!" # error "DATA_ORDER must be defined!"
#endif #endif
...@@ -276,6 +278,12 @@ int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) ...@@ -276,6 +278,12 @@ int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len)
data += n; data += n;
len -= n; len -= n;
c->num = 0; c->num = 0;
/*
* We use memset rather than OPENSSL_cleanse() here deliberately.
* Using OPENSSL_cleanse() here could be a performance issue. It
* will get properly cleansed on finalisation so this isn't a
* security problem.
*/
memset(p, 0, HASH_CBLOCK); /* keep it zeroed */ memset(p, 0, HASH_CBLOCK); /* keep it zeroed */
} else { } else {
memcpy(p + n, data, len); memcpy(p + n, data, len);
...@@ -331,7 +339,7 @@ int HASH_FINAL(unsigned char *md, HASH_CTX *c) ...@@ -331,7 +339,7 @@ int HASH_FINAL(unsigned char *md, HASH_CTX *c)
p -= HASH_CBLOCK; p -= HASH_CBLOCK;
HASH_BLOCK_DATA_ORDER(c, p, 1); HASH_BLOCK_DATA_ORDER(c, p, 1);
c->num = 0; c->num = 0;
memset(p, 0, HASH_CBLOCK); OPENSSL_cleanse(p, HASH_CBLOCK);
#ifndef HASH_MAKE_STRING #ifndef HASH_MAKE_STRING
# error "HASH_MAKE_STRING must be defined!" # error "HASH_MAKE_STRING must be defined!"
......
...@@ -168,6 +168,6 @@ int MD2_Final(unsigned char *md, MD2_CTX *c) ...@@ -168,6 +168,6 @@ int MD2_Final(unsigned char *md, MD2_CTX *c)
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
md[i] = (UCHAR) (p1[i] & 0xff); md[i] = (UCHAR) (p1[i] & 0xff);
memset(&c, 0, sizeof(c)); OPENSSL_cleanse(c, sizeof(*c));
return 1; return 1;
} }
...@@ -148,7 +148,7 @@ void *CRYPTO_clear_realloc(void *str, size_t old_len, size_t num, ...@@ -148,7 +148,7 @@ void *CRYPTO_clear_realloc(void *str, size_t old_len, size_t num,
/* Can't shrink the buffer since memcpy below copies |old_len| bytes. */ /* Can't shrink the buffer since memcpy below copies |old_len| bytes. */
if (num < old_len) { if (num < old_len) {
memset((char*)str + num, 0, old_len - num); OPENSSL_cleanse((char*)str + num, old_len - num);
return str; return str;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <openssl/crypto.h>
#include "internal/poly1305.h" #include "internal/poly1305.h"
...@@ -545,7 +546,7 @@ void Poly1305_Final(POLY1305 *ctx, unsigned char mac[16]) ...@@ -545,7 +546,7 @@ void Poly1305_Final(POLY1305 *ctx, unsigned char mac[16])
poly1305_emit(ctx->opaque, mac, ctx->nonce); poly1305_emit(ctx->opaque, mac, ctx->nonce);
/* zero out the state */ /* zero out the state */
memset(ctx, 0, sizeof(*ctx)); OPENSSL_cleanse(ctx, sizeof(*ctx));
} }
#ifdef SELFTEST #ifdef SELFTEST
......
...@@ -134,7 +134,7 @@ int RAND_poll(void) ...@@ -134,7 +134,7 @@ int RAND_poll(void)
rnd >>= 8; rnd >>= 8;
} }
RAND_add(buf, sizeof(buf), ENTROPY_NEEDED); RAND_add(buf, sizeof(buf), ENTROPY_NEEDED);
memset(buf, 0, sizeof(buf)); OPENSSL_cleanse(buf, sizeof(buf));
return 1; return 1;
} }
......
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
* input. This is done for performance. * input. This is done for performance.
*/ */
#include <openssl/crypto.h>
#include "wp_locl.h" #include "wp_locl.h"
#include <string.h> #include <string.h>
...@@ -245,7 +246,7 @@ int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c) ...@@ -245,7 +246,7 @@ int WHIRLPOOL_Final(unsigned char *md, WHIRLPOOL_CTX *c)
if (md) { if (md) {
memcpy(md, c->H.c, WHIRLPOOL_DIGEST_LENGTH); memcpy(md, c->H.c, WHIRLPOOL_DIGEST_LENGTH);
memset(c, 0, sizeof(*c)); OPENSSL_cleanse(c, sizeof(*c));
return (1); return (1);
} }
return (0); return (0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册