Fix an information leak in the RSA padding check code.
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Mon, 31 Jul 2017 18:52:43 +0000 (20:52 +0200)
committerBernd Edlinger <bernd.edlinger@hotmail.de>
Mon, 31 Jul 2017 19:50:31 +0000 (21:50 +0200)
The memory blocks contain secret data and must be
cleared before returning to the system heap.

Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/4062)

(cherry picked from commit e670db0183079b5f6325ce2abd9d785e0f966890)

crypto/rsa/rsa_oaep.c
crypto/rsa/rsa_pk1.c

index 868104f1bfdcfd19f7513ed8d840e66149c957bd..4878d495fe056e1249f1564d3f5fc532a3b7a936 100644 (file)
@@ -122,7 +122,7 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
                                       int plen, const EVP_MD *md,
                                       const EVP_MD *mgf1md)
 {
-    int i, dblen, mlen = -1, one_index = 0, msg_index;
+    int i, dblen = 0, mlen = -1, one_index = 0, msg_index;
     unsigned int good, found_one_byte;
     const unsigned char *maskedseed, *maskeddb;
     /*
@@ -239,8 +239,8 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
     RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1,
            RSA_R_OAEP_DECODING_ERROR);
  cleanup:
-    OPENSSL_free(db);
-    OPENSSL_free(em);
+    OPENSSL_clear_free(db, dblen);
+    OPENSSL_clear_free(em, num);
     return mlen;
 }
 
index 5bc91c46d5bbf33674b9c4e4fbaf6b9682c5ab99..aeeb32c2dc0b617da2823bcba65cec01f24d3fc5 100644 (file)
@@ -235,7 +235,7 @@ int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
     memcpy(to, em + msg_index, mlen);
 
  err:
-    OPENSSL_free(em);
+    OPENSSL_clear_free(em, num);
     if (mlen == -1)
         RSAerr(RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2,
                RSA_R_PKCS_DECODING_ERROR);