Add OPENSSL_cleanse() to help cleanse memory and avoid certain compiler
authorRichard Levitte <levitte@openssl.org>
Wed, 27 Nov 2002 12:24:54 +0000 (12:24 +0000)
committerRichard Levitte <levitte@openssl.org>
Wed, 27 Nov 2002 12:24:54 +0000 (12:24 +0000)
and linker optimizations.
PR: 343

CHANGES
crypto/Makefile.ssl
crypto/crypto-lib.com
crypto/crypto.h
crypto/mem.c
util/libeay.num

diff --git a/CHANGES b/CHANGES
index e29a9a5efd2e2bf800764c8f096eb83a8fe942a4..3ce964fd80efa52b37baec358dfd04d9060d0bee 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,14 @@
 
  Changes between 0.9.6g and 0.9.6h  [xx XXX xxxx]
 
+  *) New function OPENSSL_cleanse(), which is used to cleanse a section of
+     memory from it's contents.  This is done with a counter that will
+     place alternating values in each byte.  This can be used to solve
+     two issues: 1) the removal of calls to memset() by highly optimizing
+     compilers, and 2) cleansing with other values than 0, since those can
+     be read through on certain media, for example a swap space on disk.
+     [Geoff Thorpe]
+
   *) Bugfix: client side session caching did not work with external caching,
      because the session->cipher setting was not restored when reloading
      from the external cache. This problem was masked, when
index f1da3aacfc866c0a1a6d7dbbba4b47cf9d060565..727d94970335d3983387d717877181e1da04b824 100644 (file)
@@ -34,8 +34,8 @@ SDIRS=        md2 md5 sha mdc2 hmac ripemd \
 GENERAL=Makefile README crypto-lib.com install.com
 
 LIB= $(TOP)/libcrypto.a
-LIBSRC=        cryptlib.c mem.c mem_dbg.c cversion.c ex_data.c tmdiff.c cpt_err.c ebcdic.c uid.c
-LIBOBJ= cryptlib.o mem.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdic.o uid.o
+LIBSRC=        cryptlib.c mem.c mem_clr.c mem_dbg.c cversion.c ex_data.c tmdiff.c cpt_err.c ebcdic.c uid.c
+LIBOBJ= cryptlib.o mem.o mem_clr.o mem_dbg.o cversion.o ex_data.o tmdiff.o cpt_err.o ebcdic.o uid.o
 
 SRC= $(LIBSRC)
 
@@ -185,6 +185,9 @@ mem.o: ../include/openssl/e_os2.h ../include/openssl/err.h
 mem.o: ../include/openssl/lhash.h ../include/openssl/opensslconf.h
 mem.o: ../include/openssl/opensslv.h ../include/openssl/safestack.h
 mem.o: ../include/openssl/stack.h ../include/openssl/symhacks.h cryptlib.h
+mem_clr.o: ../include/openssl/crypto.h ../include/openssl/opensslv.h
+mem_clr.o: ../include/openssl/safestack.h ../include/openssl/stack.h
+mem_clr.o: ../include/openssl/symhacks.h
 mem_dbg.o: ../include/openssl/bio.h ../include/openssl/buffer.h
 mem_dbg.o: ../include/openssl/crypto.h ../include/openssl/e_os.h
 mem_dbg.o: ../include/openssl/e_os2.h ../include/openssl/err.h
index 08dc4a67794ad52db03787e38e8a4ef216d9a2be..5742a159a0f96afce07b1582375b5d747b237a04 100644 (file)
@@ -174,7 +174,7 @@ $!
 $ APPS_DES = "DES/DES,CBC3_ENC"
 $ APPS_PKCS7 = "ENC/ENC;DEC/DEC;SIGN/SIGN;VERIFY/VERIFY,EXAMPLE"
 $
-$ LIB_ = "cryptlib,mem,mem_dbg,cversion,ex_data,tmdiff,cpt_err,ebcdic,uid"
+$ LIB_ = "cryptlib,mem,mem_clr,mem_dbg,cversion,ex_data,tmdiff,cpt_err,ebcdic,uid"
 $ LIB_MD2 = "md2_dgst,md2_one"
 $ LIB_MD4 = "md4_dgst,md4_one"
 $ LIB_MD5 = "md5_dgst,md5_one"
index 4fb17bb3568f6dd8f690b7400ae08f722bb1beb5..c539c435b529f4a07a8545c85e3c4ca0af9cb3d6 100644 (file)
@@ -345,6 +345,8 @@ void CRYPTO_free(void *);
 void *CRYPTO_realloc(void *addr,int num, const char *file, int line);
 void *CRYPTO_remalloc(void *addr,int num, const char *file, int line);
 
+void OPENSSL_cleanse(void *ptr, size_t len);
+
 void CRYPTO_set_mem_debug_options(long bits);
 long CRYPTO_get_mem_debug_options(void);
 
index 9df2a367e7e22ed230d3b6be8508e97b0994c529..b026fd38aa1390f1c339b11449a5fd00192fac83 100644 (file)
@@ -173,6 +173,7 @@ void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int),
 void *CRYPTO_malloc_locked(int num, const char *file, int line)
        {
        void *ret = NULL;
+       extern unsigned char cleanse_ctr;
 
        allow_customize = 0;
        if (malloc_debug_func != NULL)
@@ -187,6 +188,12 @@ void *CRYPTO_malloc_locked(int num, const char *file, int line)
        if (malloc_debug_func != NULL)
                malloc_debug_func(ret, num, file, line, 1);
 
+        /* Create a dependency on the value of 'cleanse_ctr' so our memory
+         * sanitisation function can't be optimised out. NB: We only do
+         * this for >2Kb so the overhead doesn't bother us. */
+        if(ret && (num > 2048))
+               ((unsigned char *)ret)[0] = cleanse_ctr;
+
        return ret;
        }
 
@@ -205,6 +212,7 @@ void CRYPTO_free_locked(void *str)
 void *CRYPTO_malloc(int num, const char *file, int line)
        {
        void *ret = NULL;
+       extern unsigned char cleanse_ctr;
 
        allow_customize = 0;
        if (malloc_debug_func != NULL)
@@ -219,6 +227,12 @@ void *CRYPTO_malloc(int num, const char *file, int line)
        if (malloc_debug_func != NULL)
                malloc_debug_func(ret, num, file, line, 1);
 
+        /* Create a dependency on the value of 'cleanse_ctr' so our memory
+         * sanitisation function can't be optimised out. NB: We only do
+         * this for >2Kb so the overhead doesn't bother us. */
+        if(ret && (num > 2048))
+                ((unsigned char *)ret)[0] = cleanse_ctr;
+
        return ret;
        }
 
index 369f14a09a40f7d6637d7aa4a378f7bd02f2b657..cfae8e59ddb8cc1770bee86294178e47e4d27a30 100755 (executable)
@@ -1934,3 +1934,4 @@ ENGINE_set_ctrl_function                2522      NOEXIST::FUNCTION:
 BN_pseudo_rand_range                    2523   EXIST::FUNCTION:
 X509_STORE_CTX_set_verify_cb            2524   EXIST::FUNCTION:
 ERR_load_COMP_strings                   2525   EXIST::FUNCTION:
+OPENSSL_cleanse                         3245   EXIST::FUNCTION: