RSA, DSA, DH: Allow some given input to be NULL on already initialised keys
[openssl.git] / crypto / mem_clr.c
index add1f780207b7a75f56264c8851bc1ac1af788e2..3389919d5fd4fb06ce500d380d5dc572a9906d50 100644 (file)
@@ -1,6 +1,6 @@
-/* crypto/mem_clr.c -*- mode:C; c-file-style: "eay" -*- */
-/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
- * project 2002.
+/*
+ * Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL project
+ * 2002.
  */
 /* ====================================================================
  * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
@@ -10,7 +10,7 @@
  * are met:
  *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
+ *    notice, this list of conditions and the following disclaimer.
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
 #include <string.h>
 #include <openssl/crypto.h>
 
-unsigned char cleanse_ctr = 0;
+/*
+ * Pointer to memset is volatile so that compiler must de-reference
+ * the pointer and can't assume that it points to any function in
+ * particular (such as memset, which it then might further "optimize")
+ */
+typedef void *(*memset_t)(void *,int,size_t);
+
+static volatile memset_t memset_func = memset;
 
 void OPENSSL_cleanse(void *ptr, size_t len)
-       {
-       unsigned char *p = ptr;
-       size_t loop = len, ctr = cleanse_ctr;
-       while(loop--)
-               {
-               *(p++) = (unsigned char)ctr;
-               ctr += (17 + ((size_t)p & 0xF));
-               }
-       p=memchr(ptr, (unsigned char)ctr, len);
-       if(p)
-               ctr += (63 + (size_t)p);
-       cleanse_ctr = (unsigned char)ctr;
-       }
+{
+    memset_func(ptr, 0, len);
+}