inspired by a cloudflare diff, cleanse old memory when expanding a bignum.
authortedu <tedu@openbsd.org>
Mon, 5 May 2014 18:38:42 +0000 (18:38 +0000)
committertedu <tedu@openbsd.org>
Mon, 5 May 2014 18:38:42 +0000 (18:38 +0000)
however, instead of trying to audit all the places where a secret bignum
is used, apply the big hammer and clear all bignums when freed.
ok deraadt miod

lib/libcrypto/bn/bn_lib.c
lib/libssl/src/crypto/bn/bn_lib.c

index 9787a31..a8022f6 100644 (file)
@@ -226,22 +226,11 @@ void BN_clear_free(BIGNUM *a)
                free(a);
        }
 
-void BN_free(BIGNUM *a)
-       {
-       if (a == NULL) return;
-       bn_check_top(a);
-       if ((a->d != NULL) && !(BN_get_flags(a,BN_FLG_STATIC_DATA)))
-               free(a->d);
-       if (a->flags & BN_FLG_MALLOCED)
-               free(a);
-       else
-               {
-#ifndef OPENSSL_NO_DEPRECATED
-               a->flags|=BN_FLG_FREE;
-#endif
-               a->d = NULL;
-               }
-       }
+void
+BN_free(BIGNUM *a)
+{
+       BN_clear_free(a);
+}
 
 void BN_init(BIGNUM *a)
        {
@@ -400,7 +389,10 @@ BIGNUM *bn_expand2(BIGNUM *b, int words)
                {
                BN_ULONG *a = bn_expand_internal(b, words);
                if(!a) return NULL;
-               if(b->d) free(b->d);
+               if(b->d) {
+                       OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0]));
+                       free(b->d);
+               }
                b->d=a;
                b->dmax=words;
                }
index 9787a31..a8022f6 100644 (file)
@@ -226,22 +226,11 @@ void BN_clear_free(BIGNUM *a)
                free(a);
        }
 
-void BN_free(BIGNUM *a)
-       {
-       if (a == NULL) return;
-       bn_check_top(a);
-       if ((a->d != NULL) && !(BN_get_flags(a,BN_FLG_STATIC_DATA)))
-               free(a->d);
-       if (a->flags & BN_FLG_MALLOCED)
-               free(a);
-       else
-               {
-#ifndef OPENSSL_NO_DEPRECATED
-               a->flags|=BN_FLG_FREE;
-#endif
-               a->d = NULL;
-               }
-       }
+void
+BN_free(BIGNUM *a)
+{
+       BN_clear_free(a);
+}
 
 void BN_init(BIGNUM *a)
        {
@@ -400,7 +389,10 @@ BIGNUM *bn_expand2(BIGNUM *b, int words)
                {
                BN_ULONG *a = bn_expand_internal(b, words);
                if(!a) return NULL;
-               if(b->d) free(b->d);
+               if(b->d) {
+                       OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0]));
+                       free(b->d);
+               }
                b->d=a;
                b->dmax=words;
                }