The branch master has been updated
       via  a94d62ab23e95630c156d00342ee9c3cf2e59515 (commit)
       via  4547a71930a27fca9ae62c38962d6dc67ee0b4bf (commit)
       via  678d0dba6cdcae7dd742d4d0d65da101e9ada1d2 (commit)
       via  84c5ad23e13a95d962fe52a5aeb23c0c525f0166 (commit)
       via  3c18459235331e0562cfd2a9de5ab87040bf55f2 (commit)
       via  634da876e0d6d95a23c5d005b1ac4354a04310d2 (commit)
       via  cef71ebb5c757bafd15926dd6f6f2a2779b9d71a (commit)
      from  c9cddf05424c3292956123e7fa4c16cb80867b3f (commit)


- Log -----------------------------------------------------------------
commit a94d62ab23e95630c156d00342ee9c3cf2e59515
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 18:16:28 2021 +1000

    apps: use else if when checking for headers in the http server code
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

commit 4547a71930a27fca9ae62c38962d6dc67ee0b4bf
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 12:18:53 2021 +1000

    seal: make EVP_SealInit() library context aware
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

commit 678d0dba6cdcae7dd742d4d0d65da101e9ada1d2
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 09:45:33 2021 +1000

    hmac: fix coverity 1484888 negative integer to size_t conversion
    
    More theoretical than real but easy and cheap to check for.
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

commit 84c5ad23e13a95d962fe52a5aeb23c0c525f0166
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 09:42:42 2021 +1000

    keymgmt: fix coverity 1484886 unchecked return value
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

commit 3c18459235331e0562cfd2a9de5ab87040bf55f2
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 09:38:29 2021 +1000

    evp: fix coverity 1484885 negative integer to size_t conversion
    
    Theoretically, the IV length can come back negative which would explode.
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

commit 634da876e0d6d95a23c5d005b1ac4354a04310d2
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 09:33:10 2021 +1000

    provider: fix coverity 1484884: uninitialised lock use
    
    This actually fixes a more subtle problem that wasn't detected which could
    cause memory leaks.
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

commit cef71ebb5c757bafd15926dd6f6f2a2779b9d71a
Author: Pauli <pa...@openssl.org>
Date:   Mon May 17 09:26:48 2021 +1000

    apps: clean up the http server code
    
    Clean up some of the null checking in the http server code.
    
    This also "fixes" the false positive from coverity CID 1484883.
    
    Reviewed-by: Tomas Mraz <to...@openssl.org>
    Reviewed-by: Shane Lontis <shane.lon...@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/15300)

-----------------------------------------------------------------------

Summary of changes:
 apps/lib/http_server.c                       | 43 +++++++++++++---------------
 crypto/evp/p_seal.c                          | 22 ++++++++++----
 crypto/hmac/hmac.c                           |  5 +++-
 crypto/provider_core.c                       |  2 +-
 providers/implementations/keymgmt/ec_kmgmt.c |  7 +++--
 test/evp_extra_test.c                        | 18 +++++++++---
 6 files changed, 59 insertions(+), 38 deletions(-)

diff --git a/apps/lib/http_server.c b/apps/lib/http_server.c
index ae33632598..e7e84fa4c5 100644
--- a/apps/lib/http_server.c
+++ b/apps/lib/http_server.c
@@ -433,36 +433,33 @@ int http_server_get_asn1_req(const ASN1_ITEM *it, 
ASN1_VALUE **preq,
 
         key = inbuf;
         value = strchr(key, ':');
-        if (value != NULL) {
-            *(value++) = '\0';
-            while (*value == ' ')
-                value++;
-            line_end = strchr(value, '\r');
-            if (line_end == NULL)
-                line_end = strchr(value, '\n');
-            if (line_end != NULL)
-                *line_end = '\0';
-        } else {
+        if (value == NULL) {
             log_message(prog, LOG_WARNING,
                         "Error parsing HTTP header: missing ':'");
             (void)http_server_send_status(cbio, 400, "Bad Request");
             goto out;
         }
-        if (value != NULL && line_end != NULL) {
-            /* https://tools.ietf.org/html/rfc7230#section-6.3 Persistence */
-            if (found_keep_alive != NULL && strcasecmp(key, "Connection") == 
0) {
-                if (strcasecmp(value, "keep-alive") == 0)
-                    *found_keep_alive = 1;
-                if (strcasecmp(value, "close") == 0)
-                    *found_keep_alive = 0;
+        *(value++) = '\0';
+        while (*value == ' ')
+            value++;
+        line_end = strchr(value, '\r');
+        if (line_end == NULL) {
+            line_end = strchr(value, '\n');
+            if (line_end == NULL) {
+                log_message(prog, LOG_WARNING,
+                            "Error parsing HTTP header: missing end of line");
+                (void)http_server_send_status(cbio, 400, "Bad Request");
+                goto out;
             }
-        } else {
-            log_message(prog, LOG_WARNING,
-                        "Error parsing HTTP header: missing end of line");
-            (void)http_server_send_status(cbio, 400, "Bad Request");
-            goto out;
         }
-
+        *line_end = '\0';
+        /* https://tools.ietf.org/html/rfc7230#section-6.3 Persistence */
+        if (found_keep_alive != NULL && strcasecmp(key, "Connection") == 0) {
+            if (strcasecmp(value, "keep-alive") == 0)
+                *found_keep_alive = 1;
+            else if (strcasecmp(value, "close") == 0)
+                *found_keep_alive = 0;
+        }
     }
 
 # ifdef HTTP_DAEMON
diff --git a/crypto/evp/p_seal.c b/crypto/evp/p_seal.c
index 36900e0352..76d3278b8c 100644
--- a/crypto/evp/p_seal.c
+++ b/crypto/evp/p_seal.c
@@ -9,6 +9,7 @@
 
 #include <stdio.h>
 #include "internal/cryptlib.h"
+#include "internal/provider.h"
 #include <openssl/rand.h>
 #include <openssl/rsa.h>
 #include <openssl/evp.h>
@@ -20,7 +21,10 @@ int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
                  EVP_PKEY **pubk, int npubk)
 {
     unsigned char key[EVP_MAX_KEY_LENGTH];
-    int i;
+    const OSSL_PROVIDER *prov = EVP_CIPHER_provider(type);
+    OSSL_LIB_CTX *libctx = prov != NULL ? ossl_provider_libctx(prov) : NULL;
+    EVP_PKEY_CTX *pctx = NULL;
+    int i, len;
     int rv = 0;
 
     if (type) {
@@ -34,18 +38,22 @@ int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER 
*type,
     if (EVP_CIPHER_CTX_rand_key(ctx, key) <= 0)
         return 0;
 
-    if (EVP_CIPHER_CTX_iv_length(ctx)
-            && RAND_bytes(iv, EVP_CIPHER_CTX_iv_length(ctx)) <= 0)
+    len = EVP_CIPHER_CTX_iv_length(ctx);
+    if (len < 0 || RAND_priv_bytes_ex(libctx, iv, len) <= 0)
+        goto err;
+
+    len = EVP_CIPHER_CTX_key_length(ctx);
+    if (len < 0)
         goto err;
 
     if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
         goto err;
 
     for (i = 0; i < npubk; i++) {
-        size_t keylen = EVP_CIPHER_CTX_key_length(ctx);
-        EVP_PKEY_CTX *pctx = NULL;
+        size_t keylen = len;
 
-        if ((pctx = EVP_PKEY_CTX_new(pubk[i], NULL)) == NULL) {
+        pctx = EVP_PKEY_CTX_new_from_pkey(libctx, pubk[i], NULL);
+        if (pctx == NULL) {
             ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
             goto err;
         }
@@ -56,8 +64,10 @@ int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
         ekl[i] = (int)keylen;
         EVP_PKEY_CTX_free(pctx);
     }
+    pctx = NULL;
     rv = npubk;
 err:
+    EVP_PKEY_CTX_free(pctx);
     OPENSSL_cleanse(key, sizeof(key));
     return rv;
 }
diff --git a/crypto/hmac/hmac.c b/crypto/hmac/hmac.c
index 6d142f2cbb..f800cb8f89 100644
--- a/crypto/hmac/hmac.c
+++ b/crypto/hmac/hmac.c
@@ -221,10 +221,13 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void 
*key, int key_len,
                     unsigned char *md, unsigned int *md_len)
 {
     static unsigned char static_md[EVP_MAX_MD_SIZE];
+    int size = EVP_MD_size(evp_md);
 
+    if (size < 0)
+        return NULL;
     return EVP_Q_mac(NULL, "HMAC", NULL, EVP_MD_name(evp_md), NULL,
                      key, key_len, data, data_len,
-                     md == NULL ? static_md : md, EVP_MD_size(evp_md), md_len);
+                     md == NULL ? static_md : md, size, md_len);
 }
 
 void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags)
diff --git a/crypto/provider_core.c b/crypto/provider_core.c
index b384f74fd2..9d5248de0d 100644
--- a/crypto/provider_core.c
+++ b/crypto/provider_core.c
@@ -306,7 +306,6 @@ static OSSL_PROVIDER *provider_new(const char *name,
 #ifndef HAVE_ATOMICS
         || (prov->refcnt_lock = CRYPTO_THREAD_lock_new()) == NULL
 #endif
-        || !ossl_provider_up_ref(prov) /* +1 One reference to be returned */
         || (prov->opbits_lock = CRYPTO_THREAD_lock_new()) == NULL
         || (prov->flag_lock = CRYPTO_THREAD_lock_new()) == NULL
         || (prov->name = OPENSSL_strdup(name)) == NULL) {
@@ -315,6 +314,7 @@ static OSSL_PROVIDER *provider_new(const char *name,
         return NULL;
     }
 
+    prov->refcnt = 1; /* 1 One reference to be returned */
     prov->init_function = init_function;
 #ifndef FIPS_MODULE
     prov->flag_couldbechild = 1;
diff --git a/providers/implementations/keymgmt/ec_kmgmt.c 
b/providers/implementations/keymgmt/ec_kmgmt.c
index 2673619ef4..e901275ce2 100644
--- a/providers/implementations/keymgmt/ec_kmgmt.c
+++ b/providers/implementations/keymgmt/ec_kmgmt.c
@@ -255,9 +255,10 @@ int otherparams_to_params(const EC_KEY *ec, OSSL_PARAM_BLD 
*tmpl,
                                              name))
         return 0;
 
-    if ((EC_KEY_get_enc_flags(ec) & EC_PKEY_NO_PUBKEY) != 0)
-        ossl_param_build_set_int(tmpl, params,
-                                 OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC, 0);
+    if ((EC_KEY_get_enc_flags(ec) & EC_PKEY_NO_PUBKEY) != 0
+            && !ossl_param_build_set_int(tmpl, params,
+                                         OSSL_PKEY_PARAM_EC_INCLUDE_PUBLIC, 0))
+        return 0;
 
     ecdh_cofactor_mode =
         (EC_KEY_get_flags(ec) & EC_FLAG_COFACTOR_ECDH) ? 1 : 0;
diff --git a/test/evp_extra_test.c b/test/evp_extra_test.c
index 56522e4af9..10ab4bfc9e 100644
--- a/test/evp_extra_test.c
+++ b/test/evp_extra_test.c
@@ -818,7 +818,11 @@ static int test_EC_priv_only_legacy(void)
 # endif /* OPENSSL_NO_DEPRECATED_3_0 */
 #endif /* OPENSSL_NO_EC */
 
-static int test_EVP_Enveloped(void)
+/*
+ * n = 0 => test using legacy cipher
+ * n = 1 => test using fetched cipher
+ */
+static int test_EVP_Enveloped(int n)
 {
     int ret = 0;
     EVP_CIPHER_CTX *ctx = NULL;
@@ -828,12 +832,16 @@ static int test_EVP_Enveloped(void)
     static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
     int len, kek_len, ciphertext_len, plaintext_len;
     unsigned char ciphertext[32], plaintext[16];
-    const EVP_CIPHER *type = NULL;
+    EVP_CIPHER *type = NULL;
 
     if (nullprov != NULL)
         return TEST_skip("Test does not support a non-default library 
context");
 
-    type = EVP_aes_256_cbc();
+    if (n == 0)
+        type = (EVP_CIPHER *)EVP_aes_256_cbc();
+    else if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "AES-256-CBC",
+                                               testpropq)))
+        goto err;
 
     if (!TEST_ptr(keypair = load_example_rsa_key())
             || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_size(keypair)))
@@ -860,6 +868,8 @@ static int test_EVP_Enveloped(void)
 
     ret = 1;
 err:
+    if (n != 0)
+        EVP_CIPHER_free(type);
     OPENSSL_free(kek);
     EVP_PKEY_free(keypair);
     EVP_CIPHER_CTX_free(ctx);
@@ -2925,7 +2935,7 @@ int setup_tests(void)
     ADD_ALL_TESTS(test_EVP_DigestSignInit, 9);
     ADD_TEST(test_EVP_DigestVerifyInit);
     ADD_TEST(test_EVP_Digest);
-    ADD_TEST(test_EVP_Enveloped);
+    ADD_ALL_TESTS(test_EVP_Enveloped, 2);
     ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
     ADD_TEST(test_privatekey_to_pkcs8);
     ADD_TEST(test_EVP_PKCS82PKEY_wrong_tag);

Reply via email to