forcing sensitive memory to be all zeros when done with it

This commit is contained in:
Jacob Barthelmeh 2016-02-01 10:45:09 -07:00
parent b6017c59ba
commit d0f8132cdc
6 changed files with 63 additions and 8 deletions

View File

@ -209,8 +209,10 @@ static int QSH_FreeAll(WOLFSSL* ssl)
/* free elements in struct */
while (key) {
preKey = key;
if (key->pri.buffer)
if (key->pri.buffer) {
ForceZero(key->pri.buffer, key->pri.length);
XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
}
if (key->pub.buffer)
XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
key = (QSHKey*)key->next;
@ -225,8 +227,10 @@ static int QSH_FreeAll(WOLFSSL* ssl)
key = ssl->peerQSHKey;
while (key) {
preKey = key;
if (key->pri.buffer)
if (key->pri.buffer) {
ForceZero(key->pri.buffer, key->pri.length);
XFREE(key->pri.buffer, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
}
if (key->pub.buffer)
XFREE(key->pub.buffer, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
key = (QSHKey*)key->next;
@ -251,13 +255,19 @@ static int QSH_FreeAll(WOLFSSL* ssl)
/* free secret buffers */
if (secret->SerSi) {
if (secret->SerSi->buffer)
if (secret->SerSi->buffer) {
/* clear extra secret material that supplemented Master Secret*/
ForceZero(secret->SerSi->buffer, secret->SerSi->length);
XFREE(secret->SerSi->buffer, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
}
XFREE(secret->SerSi, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
}
if (secret->CliSi) {
if (secret->CliSi->buffer)
if (secret->CliSi->buffer) {
/* clear extra secret material that supplemented Master Secret*/
ForceZero(secret->CliSi->buffer, secret->CliSi->length);
XFREE(secret->CliSi->buffer, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
}
XFREE(secret->CliSi, ssl->heap, DYNAMIC_TYPE_TMP_ARRAY);
}
}
@ -2058,6 +2068,10 @@ void SSL_ResourceFree(WOLFSSL* ssl)
ForceZero(&(ssl->keys), sizeof(Keys));
#ifndef NO_DH
if (ssl->buffers.serverDH_Priv.buffer) {
ForceZero(ssl->buffers.serverDH_Priv.buffer,
ssl->buffers.serverDH_Priv.length);
}
XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_DH);
XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_DH);
/* parameters (p,g) may be owned by ctx */
@ -2071,8 +2085,13 @@ void SSL_ResourceFree(WOLFSSL* ssl)
XFREE(ssl->buffers.certificate.buffer, ssl->heap, DYNAMIC_TYPE_CERT);
if (ssl->buffers.weOwnCertChain)
XFREE(ssl->buffers.certChain.buffer, ssl->heap, DYNAMIC_TYPE_CERT);
if (ssl->buffers.weOwnKey)
if (ssl->buffers.weOwnKey) {
if (ssl->buffers.key.buffer) {
ForceZero(ssl->buffers.key.buffer, ssl->buffers.key.length);
}
XFREE(ssl->buffers.key.buffer, ssl->heap, DYNAMIC_TYPE_KEY);
ssl->buffers.key.buffer = NULL;
}
#endif
#ifndef NO_RSA
if (ssl->peerRsaKey) {
@ -2251,6 +2270,10 @@ void FreeHandshakeResources(WOLFSSL* ssl)
}
#endif
#ifndef NO_DH
if (ssl->buffers.serverDH_Priv.buffer) {
ForceZero(ssl->buffers.serverDH_Priv.buffer,
ssl->buffers.serverDH_Priv.length);
}
XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_DH);
ssl->buffers.serverDH_Priv.buffer = NULL;
XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_DH);
@ -2273,6 +2296,9 @@ void FreeHandshakeResources(WOLFSSL* ssl)
ssl->buffers.certChain.buffer = NULL;
}
if (ssl->buffers.weOwnKey) {
if (ssl->buffers.key.buffer) {
ForceZero(ssl->buffers.key.buffer, ssl->buffers.key.length);
}
XFREE(ssl->buffers.key.buffer, ssl->heap, DYNAMIC_TYPE_KEY);
ssl->buffers.key.buffer = NULL;
}

View File

@ -7454,6 +7454,9 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
if (ssl->buffers.weOwnKey) {
WOLFSSL_MSG("Unloading key");
if (ssl->buffers.key.buffer) {
ForceZero(ssl->buffers.key.buffer, ssl->buffers.key.length);
}
XFREE(ssl->buffers.key.buffer, ssl->heap, DYNAMIC_TYPE_KEY);
ssl->buffers.weOwnKey = 0;
ssl->buffers.key.length = 0;

View File

@ -354,10 +354,17 @@ static void test_wolfSSL_SetTmpDH_file(void)
WOLFSSL *ssl;
AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()));
#ifndef NO_RSA
AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, svrCert,
SSL_FILETYPE_PEM));
AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, svrKey,
SSL_FILETYPE_PEM));
#else
AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, eccCert,
SSL_FILETYPE_PEM));
AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, eccKey,
SSL_FILETYPE_PEM));
#endif
AssertNotNull(ssl = wolfSSL_new(ctx));
/* invalid ssl */

View File

@ -196,6 +196,9 @@ int wc_FreeRsaKey(RsaKey* key)
{
(void)key;
if (key == NULL)
return 0;
#ifdef HAVE_CAVIUM
if (key->magic == WOLFSSL_RSA_CAVIUM_MAGIC)
return FreeCaviumRsaKey(key);
@ -213,6 +216,17 @@ int wc_FreeRsaKey(RsaKey* key)
}
mp_clear(&key->e);
mp_clear(&key->n);
#else
/* still clear private key memory information when free'd */
if (key->type == RSA_PRIVATE) {
mp_clear(&key->u);
mp_clear(&key->dQ);
mp_clear(&key->u);
mp_clear(&key->dP);
mp_clear(&key->q);
mp_clear(&key->p);
mp_clear(&key->d);
}
#endif
return 0;

View File

@ -36,6 +36,11 @@
/* in case user set USE_FAST_MATH there */
#include <wolfssl/wolfcrypt/settings.h>
#ifdef NO_INLINE
#include <wolfssl/wolfcrypt/misc.h>
#else
#include <wolfcrypt/src/misc.c>
#endif
#ifdef USE_FAST_MATH
@ -2031,7 +2036,7 @@ void fp_zero(fp_int *a)
{
a->used = 0;
a->sign = FP_ZPOS;
XMEMSET(a->dp, 0, a->size * sizeof(fp_digit));
ForceZero(a->dp, a->size * sizeof(fp_digit));
}
#endif

View File

@ -40,7 +40,7 @@
#include <limits.h>
#endif
#include <wolfssl/wolfcrypt/random.h>
#include <wolfssl/wolfcrypt/random.h>
#ifdef __cplusplus
extern "C" {
@ -369,7 +369,7 @@ typedef struct {
void fp_init(fp_int *a);
void fp_zero(fp_int *a);
#else
#define fp_init(a) (void)XMEMSET((a), 0, sizeof(fp_int))
#define fp_init(a) (void)ForceZero((a), sizeof(fp_int))
#define fp_zero(a) fp_init(a)
#endif