]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CryptoPkg/Library/OpensslLib/EDKII_openssl-1.0.2f.patch
CryptoPkg/OpensslLib: Switch to upstream fix for OpenSSL RT#3955
[mirror_edk2.git] / CryptoPkg / Library / OpensslLib / EDKII_openssl-1.0.2f.patch
index ec54de5725e23725da2f67361f987c0354341253..8d5f4a810778a590974ddbab7781603cc5c0a4c7 100644 (file)
@@ -201,6 +201,63 @@ index abc6dc3..3a672e9 100644
  \r
  # define M_ASN1_New(arg,func) \\r
          if (((arg)=func()) == NULL) return(NULL)\r
+diff --git a/crypto/bn/bn_prime.c b/crypto/bn/bn_prime.c\r
+index 1d25687..e933ead 100644\r
+--- a/crypto/bn/bn_prime.c\r
++++ b/crypto/bn/bn_prime.c\r
+@@ -131,7 +131,7 @@\r
+ static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,\r
+                    const BIGNUM *a1_odd, int k, BN_CTX *ctx,\r
+                    BN_MONT_CTX *mont);\r
+-static int probable_prime(BIGNUM *rnd, int bits);\r
++static int probable_prime(BIGNUM *rnd, int bits, prime_t *mods);\r
+ static int probable_prime_dh(BIGNUM *rnd, int bits,\r
+                              const BIGNUM *add, const BIGNUM *rem,\r
+                              BN_CTX *ctx);\r
+@@ -166,9 +166,13 @@ int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe,\r
+     BIGNUM *t;\r
+     int found = 0;\r
+     int i, j, c1 = 0;\r
+-    BN_CTX *ctx;\r
++    BN_CTX *ctx = NULL;\r
++    prime_t *mods = NULL;\r
+     int checks = BN_prime_checks_for_size(bits);\r
\r
++    mods = OPENSSL_malloc(sizeof(*mods) * NUMPRIMES);\r
++    if (mods == NULL)\r
++          goto err;\r
+     ctx = BN_CTX_new();\r
+     if (ctx == NULL)\r
+         goto err;\r
+@@ -179,7 +183,7 @@ int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe,\r
+  loop:\r
+     /* make a random number and set the top and bottom bits */\r
+     if (add == NULL) {\r
+-        if (!probable_prime(ret, bits))\r
++        if (!probable_prime(ret, bits, mods))\r
+             goto err;\r
+     } else {\r
+         if (safe) {\r
+@@ -230,6 +234,7 @@ int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe,\r
+     /* we have a prime :-) */\r
+     found = 1;\r
+  err:\r
++    OPENSSL_free(mods);\r
+     if (ctx != NULL) {\r
+         BN_CTX_end(ctx);\r
+         BN_CTX_free(ctx);\r
+@@ -375,10 +380,9 @@ static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,\r
+     return 1;\r
+ }\r
\r
+-static int probable_prime(BIGNUM *rnd, int bits)\r
++static int probable_prime(BIGNUM *rnd, int bits, prime_t *mods)\r
+ {\r
+     int i;\r
+-    prime_t mods[NUMPRIMES];\r
+     BN_ULONG delta, maxdelta;\r
\r
+  again:\r
 diff --git a/crypto/conf/conf.h b/crypto/conf/conf.h\r
 index 8d926d5..41cf38e 100644\r
 --- a/crypto/conf/conf.h\r
@@ -752,20 +809,29 @@ index 5747c73..fe465cc 100644
   * These functions write a private key in PKCS#8 format: it is a "drop in"\r
   * replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'\r
 diff --git a/crypto/pkcs7/pk7_smime.c b/crypto/pkcs7/pk7_smime.c\r
-index c4d3724..fd531c9 100644\r
+index c4d3724..0bc3d43 100644\r
 --- a/crypto/pkcs7/pk7_smime.c\r
 +++ b/crypto/pkcs7/pk7_smime.c\r
-@@ -254,7 +254,8 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
+@@ -64,6 +64,9 @@\r
+ #include <openssl/x509.h>\r
+ #include <openssl/x509v3.h>\r
\r
++\r
++#define BUFFERSIZE 4096\r
++\r
+ static int pkcs7_copy_existing_digest(PKCS7 *p7, PKCS7_SIGNER_INFO *si);\r
\r
+ PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs,\r
+@@ -254,7 +257,7 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
      STACK_OF(PKCS7_SIGNER_INFO) *sinfos;\r
      PKCS7_SIGNER_INFO *si;\r
      X509_STORE_CTX cert_ctx;\r
 -    char buf[4096];\r
 +    char *buf = NULL;\r
-+    int bufsiz;\r
      int i, j = 0, k, ret = 0;\r
      BIO *p7bio = NULL;\r
      BIO *tmpin = NULL, *tmpout = NULL;\r
-@@ -274,12 +275,29 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
+@@ -274,12 +277,29 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
          PKCS7err(PKCS7_F_PKCS7_VERIFY, PKCS7_R_NO_CONTENT);\r
          return 0;\r
      }\r
@@ -795,32 +861,84 @@ index c4d3724..fd531c9 100644
  \r
      sinfos = PKCS7_get_signer_info(p7);\r
  \r
-@@ -355,9 +373,14 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
-     } else\r
+@@ -356,8 +376,12 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
          tmpout = out;\r
  \r
-+    bufsiz = 4096;\r
-+    buf = OPENSSL_malloc(bufsiz);\r
-+    if (buf == NULL) {\r
+     /* We now have to 'read' from p7bio to calculate digests etc. */\r
++    if ((buf = OPENSSL_malloc(BUFFERSIZE)) == NULL) {\r
++        PKCS7err(PKCS7_F_PKCS7_VERIFY, ERR_R_MALLOC_FAILURE);\r
 +        goto err;\r
 +    }\r
-     /* We now have to 'read' from p7bio to calculate digests etc. */\r
      for (;;) {\r
 -        i = BIO_read(p7bio, buf, sizeof(buf));\r
-+        i = BIO_read(p7bio, buf, bufsiz);\r
++        i = BIO_read(p7bio, buf, BUFFERSIZE);\r
          if (i <= 0)\r
              break;\r
          if (tmpout)\r
-@@ -394,6 +417,9 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
-     }\r
-     BIO_free_all(p7bio);\r
-     sk_X509_free(signers);\r
-+    if (buf != NULL) {\r
-+        OPENSSL_free(buf);\r
+@@ -388,6 +412,7 @@ int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,\r
+     ret = 1;\r
\r
+  err:\r
++    OPENSSL_free(buf);\r
+     if (tmpin == indata) {\r
+         if (indata)\r
+             BIO_pop(p7bio);\r
+@@ -506,7 +531,7 @@ int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags)\r
+ {\r
+     BIO *tmpmem;\r
+     int ret, i;\r
+-    char buf[4096];\r
++    char *buf = NULL;\r
\r
+     if (!p7) {\r
+         PKCS7err(PKCS7_F_PKCS7_DECRYPT, PKCS7_R_INVALID_NULL_POINTER);\r
+@@ -550,24 +575,29 @@ int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags)\r
+         }\r
+         BIO_free_all(bread);\r
+         return ret;\r
+-    } else {\r
+-        for (;;) {\r
+-            i = BIO_read(tmpmem, buf, sizeof(buf));\r
+-            if (i <= 0) {\r
+-                ret = 1;\r
+-                if (BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) {\r
+-                    if (!BIO_get_cipher_status(tmpmem))\r
+-                        ret = 0;\r
+-                }\r
+-\r
+-                break;\r
+-            }\r
+-            if (BIO_write(data, buf, i) != i) {\r
+-                ret = 0;\r
+-                break;\r
 +    }\r
-     return ret;\r
++    if ((buf = OPENSSL_malloc(BUFFERSIZE)) == NULL) {\r
++        PKCS7err(PKCS7_F_PKCS7_DECRYPT, ERR_R_MALLOC_FAILURE);\r
++        goto err;\r
++    }\r
++    for (;;) {\r
++        i = BIO_read(tmpmem, buf, BUFFERSIZE);\r
++        if (i <= 0) {\r
++            ret = 1;\r
++            if (BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) {\r
++                if (!BIO_get_cipher_status(tmpmem))\r
++                    ret = 0;\r
+             }\r
++\r
++            break;\r
++        }\r
++        if (BIO_write(data, buf, i) != i) {\r
++            ret = 0;\r
++            break;\r
+         }\r
+-        BIO_free_all(tmpmem);\r
+-        return ret;\r
+     }\r
++err:\r
++    OPENSSL_free(buf);\r
++    BIO_free_all(tmpmem);\r
++    return ret;\r
  }\r
\r
 diff --git a/crypto/rand/rand_unix.c b/crypto/rand/rand_unix.c\r
 index 266111e..f60fac6 100644\r
 --- a/crypto/rand/rand_unix.c\r