Update LibreSSL from version 2.4.3 => 2.4.4 vendor/LIBRESSL
authorJohn Marino <draco@marino.st>
Fri, 13 Jan 2017 22:00:47 +0000 (16:00 -0600)
committerJohn Marino <draco@marino.st>
Fri, 13 Jan 2017 23:10:58 +0000 (17:10 -0600)
crypto/libressl/VERSION
crypto/libressl/crypto/x509/x509_vfy.c
crypto/libressl/include/openssl/opensslv.h
crypto/libressl/ssl/s3_pkt.c
crypto/libressl/ssl/s3_srvr.c
crypto/libressl/ssl/t1_lib.c

index 2bddd26..765a22e 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: x509_vfy.c,v 1.48 2015/12/14 03:38:13 beck Exp $ */
+/* $OpenBSD: x509_vfy.c,v 1.49 2016/03/11 07:08:45 mmcc Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -1658,7 +1658,8 @@ X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)
 
        memset(&tm1, 0, sizeof(tm1));
 
-       if ((type = asn1_time_parse(ctm->data, ctm->length, &tm1, 0)) == -1)
+       type = asn1_time_parse(ctm->data, ctm->length, &tm1, ctm->type);
+       if (type == -1)
                goto out; /* invalid time */
 
        /* RFC 5280 section 4.1.2.5 */
index bbefbd7..8a92ba4 100644 (file)
@@ -1,10 +1,10 @@
-/* $OpenBSD: opensslv.h,v 1.36 2016/06/30 11:10:29 bcook Exp $ */
+/* $OpenBSD: opensslv.h,v 1.36.2.1 2016/09/22 05:06:06 bcook Exp $ */
 #ifndef HEADER_OPENSSLV_H
 #define HEADER_OPENSSLV_H
 
 /* These will change with each release of LibreSSL-portable */
-#define LIBRESSL_VERSION_NUMBER        0x2040300fL
-#define LIBRESSL_VERSION_TEXT  "LibreSSL 2.4.3"
+#define LIBRESSL_VERSION_NUMBER        0x2040400fL
+#define LIBRESSL_VERSION_TEXT  "LibreSSL 2.4.4"
 
 /* These will never change */
 #define OPENSSL_VERSION_NUMBER 0x20000000L
index c5f2924..ded461b 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: s3_pkt.c,v 1.57 2015/09/12 16:10:07 doug Exp $ */
+/* $OpenBSD: s3_pkt.c,v 1.58 2016/07/10 23:07:34 tedu Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -839,10 +839,11 @@ ssl3_write_pending(SSL *s, int type, const unsigned char *buf, unsigned int len)
 int
 ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
 {
-       int al, i, j, ret;
+       void (*cb)(const SSL *ssl, int type2, int val) = NULL;
+       int al, i, j, ret, rrcount = 0;
        unsigned int n;
        SSL3_RECORD *rr;
-       void (*cb)(const SSL *ssl, int type2, int val) = NULL;
+       BIO *bio;
 
        if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
                if (!ssl3_setup_read_buffer(s))
@@ -896,7 +897,27 @@ ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
                        return (-1);
                }
        }
+
 start:
+       /*
+        * Do not process more than three consecutive records, otherwise the
+        * peer can cause us to loop indefinitely. Instead, return with an
+        * SSL_ERROR_WANT_READ so the caller can choose when to handle further
+        * processing. In the future, the total number of non-handshake and
+        * non-application data records per connection should probably also be
+        * limited...
+        */
+       if (rrcount++ >= 3) {
+               if ((bio = SSL_get_rbio(s)) == NULL) {
+                       SSLerr(SSL_F_SSL3_READ_BYTES, ERR_R_INTERNAL_ERROR);
+                       return -1;
+               }
+               BIO_clear_retry_flags(bio);
+               BIO_set_retry_read(bio);
+               s->rwstate = SSL_READING;
+               return -1;
+       }
+
        s->rwstate = SSL_NOTHING;
 
        /*
@@ -1050,7 +1071,6 @@ start:
                                if (!(s->mode & SSL_MODE_AUTO_RETRY)) {
                                        if (s->s3->rbuf.left == 0) {
                                                /* no read-ahead left? */
-                                               BIO *bio;
                        /* In the case where we try to read application data,
                         * but we trigger an SSL handshake, we return -1 with
                         * the retry option set.  Otherwise renegotiation may
index 94974a6..e5d9767 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: s3_srvr.c,v 1.125 2016/03/11 07:08:45 mmcc Exp $ */
+/* $OpenBSD: s3_srvr.c,v 1.126 2016/05/30 13:42:54 beck Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -776,21 +776,26 @@ ssl3_get_client_hello(SSL *s)
        }
 
        /*
-        * If we require cookies and this ClientHello doesn't
+        * If we require cookies (DTLS) and this ClientHello doesn't
         * contain one, just return since we do not want to
         * allocate any memory yet. So check cookie length...
         */
        if (SSL_get_options(s) & SSL_OP_COOKIE_EXCHANGE) {
                unsigned int session_length, cookie_length;
 
+               if (p - d + SSL3_RANDOM_SIZE + 1 >= n)
+                       goto truncated;
                session_length = *(p + SSL3_RANDOM_SIZE);
-               cookie_length = *(p + SSL3_RANDOM_SIZE + session_length + 1);
+
+               if (p - d + SSL3_RANDOM_SIZE + session_length + 1 >= n)
+                       goto truncated;
+               cookie_length = p[SSL3_RANDOM_SIZE + session_length + 1];
 
                if (cookie_length == 0)
                        return (1);
        }
 
-       if (p + SSL3_RANDOM_SIZE + 1 - d > n)
+       if (p - d + SSL3_RANDOM_SIZE + 1 > n)
                goto truncated;
 
        /* load the client random */
@@ -799,7 +804,7 @@ ssl3_get_client_hello(SSL *s)
 
        /* get the session-id */
        j= *(p++);
-       if (p + j - d > n)
+       if (p - d + j > n)
                goto truncated;
 
        s->hit = 0;
@@ -839,7 +844,7 @@ ssl3_get_client_hello(SSL *s)
 
        if (SSL_IS_DTLS(s)) {
                /* cookie stuff */
-               if (p + 1 - d > n)
+               if (p - d + 1 > n)
                        goto truncated;
                cookie_len = *(p++);
 
@@ -856,7 +861,7 @@ ssl3_get_client_hello(SSL *s)
                        goto f_err;
                }
 
-               if (p + cookie_len - d > n)
+               if (p - d + cookie_len > n)
                        goto truncated;
 
                /* verify the cookie if appropriate option is set. */
@@ -888,7 +893,7 @@ ssl3_get_client_hello(SSL *s)
                p += cookie_len;
        }
 
-       if (p + 2 - d > n)
+       if (p - d + 2 > n)
                goto truncated;
        n2s(p, i);
        if ((i == 0) && (j != 0)) {
@@ -898,7 +903,7 @@ ssl3_get_client_hello(SSL *s)
                    SSL_R_NO_CIPHERS_SPECIFIED);
                goto f_err;
        }
-       if (p + i - d > n)
+       if (p - d + i > n)
                goto truncated;
        if (i > 0) {
                if ((ciphers = ssl_bytes_to_cipher_list(s, p, i)) == NULL)
@@ -931,10 +936,10 @@ ssl3_get_client_hello(SSL *s)
        }
 
        /* compression */
-       if (p + 1 - d > n)
+       if (p - d + 1 > n)
                goto truncated;
        i= *(p++);
-       if (p + i - d > n)
+       if (p - d + i > n)
                goto truncated;
        for (j = 0; j < i; j++) {
                if (p[j] == 0)
@@ -1655,7 +1660,7 @@ ssl3_get_client_key_exchange(SSL *s)
                        /* SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT); */
                }
 
-               if (p + 2 - d > n)      /* needed in the SSL3 case */
+               if (p - d + 2 > n)      /* needed in the SSL3 case */
                        goto truncated;
                if ((al == -1) && !((p[0] == (s->client_version >> 8)) &&
                    (p[1] == (s->client_version & 0xff)))) {
index c1e5f54..d8f5aac 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: t1_lib.c,v 1.87 2016/05/30 13:42:54 beck Exp $ */
+/* $OpenBSD: t1_lib.c,v 1.91 2016/10/02 21:05:44 guenther Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -2154,9 +2154,16 @@ tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
        HMAC_CTX hctx;
        EVP_CIPHER_CTX ctx;
        SSL_CTX *tctx = s->initial_ctx;
-       /* Need at least keyname + iv + some encrypted data */
-       if (eticklen < 48)
+
+       /*
+        * The API guarantees EVP_MAX_IV_LENGTH bytes of space for
+        * the iv to tlsext_ticket_key_cb().  Since the total space
+        * required for a session cookie is never less than this,
+        * this check isn't too strict.  The exact check comes later.
+        */
+       if (eticklen < 16 + EVP_MAX_IV_LENGTH)
                return 2;
+
        /* Initialize session ticket encryption and HMAC contexts */
        HMAC_CTX_init(&hctx);
        EVP_CIPHER_CTX_init(&ctx);
@@ -2165,10 +2172,12 @@ tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
                int rv = tctx->tlsext_ticket_key_cb(s, nctick, nctick + 16,
                    &ctx, &hctx, 0);
                if (rv < 0) {
+                       HMAC_CTX_cleanup(&hctx);
                        EVP_CIPHER_CTX_cleanup(&ctx);
                        return -1;
                }
                if (rv == 0) {
+                       HMAC_CTX_cleanup(&hctx);
                        EVP_CIPHER_CTX_cleanup(&ctx);
                        return 2;
                }
@@ -2183,33 +2192,51 @@ tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
                EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
                    tctx->tlsext_tick_aes_key, etick + 16);
        }
-       /* Attempt to process session ticket, first conduct sanity and
+
+       /*
+        * Attempt to process session ticket, first conduct sanity and
         * integrity checks on ticket.
         */
        mlen = HMAC_size(&hctx);
        if (mlen < 0) {
+               HMAC_CTX_cleanup(&hctx);
                EVP_CIPHER_CTX_cleanup(&ctx);
                return -1;
        }
+
+       /* Sanity check ticket length: must exceed keyname + IV + HMAC */
+       if (eticklen <= 16 + EVP_CIPHER_CTX_iv_length(&ctx) + mlen) {
+               HMAC_CTX_cleanup(&hctx);
+               EVP_CIPHER_CTX_cleanup(&ctx);
+               return 2;
+       }
        eticklen -= mlen;
+
        /* Check HMAC of encrypted ticket */
-       HMAC_Update(&hctx, etick, eticklen);
-       HMAC_Final(&hctx, tick_hmac, NULL);
+       if (HMAC_Update(&hctx, etick, eticklen) <= 0 ||
+           HMAC_Final(&hctx, tick_hmac, NULL) <= 0) {
+               HMAC_CTX_cleanup(&hctx);
+               EVP_CIPHER_CTX_cleanup(&ctx);
+               return -1;
+       }
+
        HMAC_CTX_cleanup(&hctx);
        if (timingsafe_memcmp(tick_hmac, etick + eticklen, mlen)) {
                EVP_CIPHER_CTX_cleanup(&ctx);
                return 2;
        }
+
        /* Attempt to decrypt session data */
        /* Move p after IV to start of encrypted ticket, update length */
        p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
        eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
        sdec = malloc(eticklen);
-       if (!sdec) {
+       if (sdec == NULL ||
+           EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen) <= 0) {
+               free(sdec);
                EVP_CIPHER_CTX_cleanup(&ctx);
                return -1;
        }
-       EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
        if (EVP_DecryptFinal_ex(&ctx, sdec + slen, &mlen) <= 0) {
                free(sdec);
                EVP_CIPHER_CTX_cleanup(&ctx);