Some cleanups for crypto/bn
authorRich Salz <rsalz@akamai.com>
Wed, 22 Jul 2015 10:44:50 +0000 (06:44 -0400)
committerRich Salz <rsalz@openssl.org>
Wed, 22 Jul 2015 18:43:05 +0000 (14:43 -0400)
Create bn_free_d utility routine and use it.
Fix RT3950
Also a missing cleanse, from Loganaden Velvindron (loganaden@gmail.com),
who noticed it in a Cloudflare patch.

Reviewed-by: Richard Levitte <levitte@openssl.org>
crypto/bn/bn_add.c
crypto/bn/bn_lib.c
crypto/bn/bn_mont.c

index a446686c7475bb1069de413a97402d7ad1f64417..0bfc3cc637b17181c387922f99a5252e9adfc203 100644 (file)
@@ -222,7 +222,8 @@ int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
                 break;
         }
     }
-    memcpy(rp, ap, sizeof(*rp) * dif);
+    if (dif)
+        memcpy(rp, ap, sizeof(*rp) * dif);
 
     r->top = max;
     r->neg = 0;
index b5f827a36cf8af9daaddaaa8591b584d5c2759bb..f10f44a86fa65841e3409169c8a9a8a673880632 100644 (file)
@@ -223,6 +223,15 @@ int BN_num_bits(const BIGNUM *a)
     return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));
 }
 
+static void bn_free_d(BIGNUM *a)
+{
+    if (BN_get_flags(a,BN_FLG_SECURE))
+        OPENSSL_secure_free(a->d);
+    else
+        OPENSSL_free(a->d);
+}
+
+
 void BN_clear_free(BIGNUM *a)
 {
     int i;
@@ -232,15 +241,11 @@ void BN_clear_free(BIGNUM *a)
     bn_check_top(a);
     if (a->d != NULL) {
         OPENSSL_cleanse(a->d, a->dmax * sizeof(a->d[0]));
-        if (!(BN_get_flags(a, BN_FLG_STATIC_DATA))) {
-            if (BN_get_flags(a,BN_FLG_SECURE))
-                OPENSSL_secure_free(a->d);
-            else
-                OPENSSL_free(a->d);
-        }
+        if (!BN_get_flags(a, BN_FLG_STATIC_DATA))
+            bn_free_d(a);
     }
     i = BN_get_flags(a, BN_FLG_MALLOCED);
-    OPENSSL_cleanse(a, sizeof(BIGNUM));
+    OPENSSL_cleanse(a, sizeof(*a));
     if (i)
         OPENSSL_free(a);
 }
@@ -251,12 +256,7 @@ void BN_free(BIGNUM *a)
         return;
     bn_check_top(a);
     if (!BN_get_flags(a, BN_FLG_STATIC_DATA))
-    if ((a->d != NULL) && !(BN_get_flags(a, BN_FLG_STATIC_DATA))) {
-        if (BN_get_flags(a, BN_FLG_SECURE))
-            OPENSSL_secure_free(a->d);
-        else
-            OPENSSL_free(a->d);
-    }
+        bn_free_d(a);
     if (a->flags & BN_FLG_MALLOCED)
         OPENSSL_free(a);
     else {
@@ -399,10 +399,8 @@ BIGNUM *bn_expand2(BIGNUM *b, int words)
         if (!a)
             return NULL;
         if (b->d) {
-            if (BN_get_flags(b,BN_FLG_SECURE))
-                OPENSSL_secure_free(b->d);
-            else
-                OPENSSL_free(b->d);
+            OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0]));
+            bn_free_d(b);
         }
         b->d = a;
         b->dmax = words;
index c869101384f1196aa8af8659da2a08de111876f6..e3955fe47523c769fea8fdddf558af09d9727e3c 100644 (file)
@@ -196,7 +196,9 @@ static int BN_from_montgomery_word(BIGNUM *ret, BIGNUM *r, BN_MONT_CTX *mont)
     rp = r->d;
 
     /* clear the top words of T */
-    memset(&rp[r->top], 0, sizeof(*rp) * (max - r->top));
+    i = max - r->top;
+    if (i)
+        memset(&rp[r->top], 0, sizeof(*rp) * i);
 
     r->top = max;
     n0 = mont->n0[0];