Import OpenSSL-1.0.1b.
authorPeter Avalos <pavalos@dragonflybsd.org>
Fri, 27 Apr 2012 19:35:59 +0000 (12:35 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Fri, 27 Apr 2012 19:35:59 +0000 (12:35 -0700)
      o Make FIPS capable OpenSSL ciphers work in non-FIPS mode.
      o Fix SSL_OP_NO_TLSv1_1 clash with SSL_OP_ALL in OpenSSL 1.0.0

crypto/openssl/CHANGES
crypto/openssl/FAQ
crypto/openssl/NEWS
crypto/openssl/README
crypto/openssl/crypto/buffer/buffer.c
crypto/openssl/crypto/evp/e_rc4_hmac_md5.c
crypto/openssl/crypto/evp/evp_enc.c
crypto/openssl/crypto/o_fips.c
crypto/openssl/crypto/opensslv.h
crypto/openssl/ssl/s23_clnt.c
crypto/openssl/ssl/ssl.h

index 1e96080..4a7ac46 100644 (file)
@@ -2,6 +2,29 @@
  OpenSSL CHANGES
  _______________
 
+ Changes between 1.0.1a and 1.0.1b [26 Apr 2012]
+
+  *) OpenSSL 1.0.0 sets SSL_OP_ALL to 0x80000FFFL and OpenSSL 1.0.1 and
+     1.0.1a set SSL_OP_NO_TLSv1_1 to 0x00000400L which would unfortunately
+     mean any application compiled against OpenSSL 1.0.0 headers setting
+     SSL_OP_ALL would also set SSL_OP_NO_TLSv1_1, unintentionally disablng
+     TLS 1.1 also. Fix this by changing the value of SSL_OP_NO_TLSv1_1 to
+     0x10000000L Any application which was previously compiled against
+     OpenSSL 1.0.1 or 1.0.1a headers and which cares about SSL_OP_NO_TLSv1_1
+     will need to be recompiled as a result. Letting be results in
+     inability to disable specifically TLS 1.1 and in client context,
+     in unlike event, limit maximum offered version to TLS 1.0 [see below].
+     [Steve Henson]
+
+  *) In order to ensure interoperabilty SSL_OP_NO_protocolX does not
+     disable just protocol X, but all protocols above X *if* there are
+     protocols *below* X still enabled. In more practical terms it means
+     that if application wants to disable TLS1.0 in favor of TLS1.1 and
+     above, it's not sufficient to pass SSL_OP_NO_TLSv1, one has to pass
+     SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. This applies to
+     client side.
+     [Andy Polyakov]
+
  Changes between 1.0.1 and 1.0.1a [19 Apr 2012]
 
   *) Check for potentially exploitable overflows in asn1_d2i_read_bio
@@ -28,6 +51,7 @@
         Most broken servers should now work.
      3. If all else fails setting OPENSSL_NO_TLS1_2_CLIENT will disable
        TLS 1.2 client support entirely.
+     [Steve Henson]
 
   *) Fix SEGV in Vector Permutation AES module observed in OpenSSH.
      [Andy Polyakov]
index 0ba347e..bd6eafa 100644 (file)
@@ -10,6 +10,7 @@ OpenSSL  -  Frequently Asked Questions
 * Why aren't tools like 'autoconf' and 'libtool' used?
 * What is an 'engine' version?
 * How do I check the authenticity of the OpenSSL distribution?
+* How does the versioning scheme work?
 
 [LEGAL] Legal questions
 
@@ -82,7 +83,7 @@ OpenSSL  -  Frequently Asked Questions
 * Which is the current version of OpenSSL?
 
 The current version is available from <URL: http://www.openssl.org>.
-OpenSSL 1.0.1a was released on Apr 19th, 2012.
+OpenSSL 1.0.1b was released on Apr 26th, 2012.
 
 In addition to the current stable release, you can also access daily
 snapshots of the OpenSSL development version at <URL:
@@ -108,7 +109,9 @@ In addition, you can read the most current versions at
 <URL: http://www.openssl.org/docs/>. Note that the online documents refer
 to the very latest development versions of OpenSSL and may include features
 not present in released versions. If in doubt refer to the documentation
-that came with the version of OpenSSL you are using.
+that came with the version of OpenSSL you are using. The pod format
+documentation is included in each OpenSSL distribution under the docs
+directory.
 
 For information on parts of libcrypto that are not yet documented, you
 might want to read Ariel Glenn's documentation on SSLeay 0.9, OpenSSL's
@@ -173,6 +176,19 @@ just do:
 
    pgp TARBALL.asc
 
+* How does the versioning scheme work?
+
+After the release of OpenSSL 1.0.0 the versioning scheme changed. Letter 
+releases (e.g. 1.0.1a) can only contain bug and security fixes and no
+new features. Minor releases change the last number (e.g. 1.0.2) and 
+can contain new features that retain binary compatibility. Changes to
+the middle number are considered major releases and neither source nor
+binary compatibility is guaranteed.
+
+Therefore the answer to the common question "when will feature X be
+backported to OpenSSL 1.0.0/0.9.8?" is "never" but it could appear
+in the next minor release.
+
 [LEGAL] =======================================================================
 
 * Do I need patent licenses to use OpenSSL?
@@ -284,7 +300,7 @@ current directory in this case, but this has changed with 0.9.6a.)
 Check out the CA.pl(1) manual page. This provides a simple wrapper round
 the 'req', 'verify', 'ca' and 'pkcs12' utilities. For finer control check
 out the manual pages for the individual utilities and the certificate
-extensions documentation (currently in doc/openssl.txt).
+extensions documentation (in ca(1), req(1), x509v3_config(5) )
 
 
 * Why can't I create certificate requests?
index 8bcb98a..6917bc0 100644 (file)
@@ -5,6 +5,12 @@
   This file gives a brief overview of the major changes between each OpenSSL
   release. For more details please read the CHANGES file.
 
+  Major changes between OpenSSL 1.0.1a and OpenSSL 1.0.1b:
+
+      o Fix compilation error on non-x86 platforms.
+      o Make FIPS capable OpenSSL ciphers work in non-FIPS mode.
+      o Fix SSL_OP_NO_TLSv1_1 clash with SSL_OP_ALL in OpenSSL 1.0.0
+
   Major changes between OpenSSL 1.0.1 and OpenSSL 1.0.1a:
 
       o Fix for ASN1 overflow bug CVE-2012-2110
index 3ab22da..7306943 100644 (file)
@@ -1,5 +1,5 @@
 
- OpenSSL 1.0.1a 19 Apr 2012
+ OpenSSL 1.0.1b 26 Apr 2012
 
  Copyright (c) 1998-2011 The OpenSSL Project
  Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
index 52e65df..d7aa79a 100644 (file)
@@ -156,7 +156,7 @@ int BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
        /* This limit is sufficient to ensure (len+3)/3*4 < 2**31 */
        if (len > LIMIT_BEFORE_EXPANSION)
                {
-               BUFerr(BUF_F_BUF_MEM_GROW,ERR_R_MALLOC_FAILURE);
+               BUFerr(BUF_F_BUF_MEM_GROW_CLEAN,ERR_R_MALLOC_FAILURE);
                return 0;
                }
        n=(len+3)/3*4;
index 3f32b25..5656319 100644 (file)
@@ -103,7 +103,8 @@ static int rc4_hmac_md5_init_key(EVP_CIPHER_CTX *ctx,
 #if    !defined(OPENSSL_NO_ASM) &&     ( \
        defined(__x86_64)       || defined(__x86_64__)  || \
        defined(_M_AMD64)       || defined(_M_X64)      || \
-       defined(__INTEL__)              )
+       defined(__INTEL__)              ) && \
+       !(defined(__APPLE__) && defined(__MACH__))
 #define        STITCHED_CALL
 #endif
 
@@ -121,6 +122,7 @@ static int rc4_hmac_md5_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
                md5_off = MD5_CBLOCK-key->md.num,
                blocks;
        unsigned int l;
+       extern unsigned int OPENSSL_ia32cap_P[];
 #endif
        size_t  plen = key->payload_length;
 
@@ -132,7 +134,8 @@ static int rc4_hmac_md5_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
                /* cipher has to "fall behind" */
                if (rc4_off>md5_off) md5_off+=MD5_CBLOCK;
 
-               if (plen>md5_off && (blocks=(plen-md5_off)/MD5_CBLOCK)) {
+               if (plen>md5_off && (blocks=(plen-md5_off)/MD5_CBLOCK) &&
+                   (OPENSSL_ia32cap_P[0]&(1<<20))==0) {
                        MD5_Update(&key->md,in,md5_off);
                        RC4(&key->ks,rc4_off,in,out);
 
@@ -172,7 +175,8 @@ static int rc4_hmac_md5_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
                if (md5_off>rc4_off)    rc4_off += 2*MD5_CBLOCK;
                else                    rc4_off += MD5_CBLOCK;
 
-               if (len>rc4_off && (blocks=(len-rc4_off)/MD5_CBLOCK)) {
+               if (len>rc4_off && (blocks=(len-rc4_off)/MD5_CBLOCK) &&
+                   (OPENSSL_ia32cap_P[0]&(1<<20))==0) {
                        RC4(&key->ks,rc4_off,in,out);
                        MD5_Update(&key->md,out,md5_off);
 
@@ -289,8 +293,6 @@ static EVP_CIPHER r4_hmac_md5_cipher=
 
 const EVP_CIPHER *EVP_rc4_hmac_md5(void)
        {
-       extern unsigned int OPENSSL_ia32cap_P[];
-       /* RC4_CHAR flag ------------vvvvv */
-       return(OPENSSL_ia32cap_P[0]&(1<<20) ? NULL : &r4_hmac_md5_cipher);
+       return(&r4_hmac_md5_cipher);
        }
 #endif
index 8835d9a..0c54f05 100644 (file)
@@ -172,7 +172,7 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *imp
 #ifdef OPENSSL_FIPS
                if (FIPS_mode())
                        return FIPS_cipherinit(ctx, cipher, key, iv, enc);
-#else
+#endif
                ctx->cipher=cipher;
                if (ctx->cipher->ctx_size)
                        {
@@ -197,7 +197,6 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *imp
                                return 0;
                                }
                        }
-#endif
                }
        else if(!ctx->cipher)
                {
@@ -210,7 +209,7 @@ skip_to_init:
 #ifdef OPENSSL_FIPS
        if (FIPS_mode())
                return FIPS_cipherinit(ctx, cipher, key, iv, enc);
-#else
+#endif
        /* we assume block size is a power of 2 in *cryptUpdate */
        OPENSSL_assert(ctx->cipher->block_size == 1
            || ctx->cipher->block_size == 8
@@ -257,7 +256,6 @@ skip_to_init:
        ctx->final_used=0;
        ctx->block_mask=ctx->cipher->block_size-1;
        return 1;
-#endif
        }
 
 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
index 6a82395..f6d1b21 100644 (file)
@@ -64,6 +64,7 @@
 
 int FIPS_mode(void)
        {
+       OPENSSL_init();
 #ifdef OPENSSL_FIPS
        return FIPS_module_mode();
 #else
index 20e889e..9e86557 100644 (file)
  * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
  *  major minor fix final patch/beta)
  */
-#define OPENSSL_VERSION_NUMBER 0x1000101fL
+#define OPENSSL_VERSION_NUMBER 0x1000102fL
 #ifdef OPENSSL_FIPS
-#define OPENSSL_VERSION_TEXT   "OpenSSL 1.0.1a-fips 19 Apr 2012"
+#define OPENSSL_VERSION_TEXT   "OpenSSL 1.0.1b-fips 26 Apr 2012"
 #else
-#define OPENSSL_VERSION_TEXT   "OpenSSL 1.0.1a 19 Apr 2012"
+#define OPENSSL_VERSION_TEXT   "OpenSSL 1.0.1b 26 Apr 2012"
 #endif
 #define OPENSSL_VERSION_PTEXT  " part of " OPENSSL_VERSION_TEXT
 
index 0f2e19e..47673e7 100644 (file)
@@ -282,34 +282,51 @@ static int ssl23_client_hello(SSL *s)
        SSL_COMP *comp;
 #endif
        int ret;
+       unsigned long mask, options = s->options;
 
-       ssl2_compat = (s->options & SSL_OP_NO_SSLv2) ? 0 : 1;
+       ssl2_compat = (options & SSL_OP_NO_SSLv2) ? 0 : 1;
 
        if (ssl2_compat && ssl23_no_ssl2_ciphers(s))
                ssl2_compat = 0;
-#ifndef OPENSSL_NO_TLS1_2_CLIENT
-       if (!(s->options & SSL_OP_NO_TLSv1_2))
-               {
-               version = TLS1_2_VERSION;
-               }
-       else
+
+       /*
+        * SSL_OP_NO_X disables all protocols above X *if* there are
+        * some protocols below X enabled. This is required in order
+        * to maintain "version capability" vector contiguous. So
+        * that if application wants to disable TLS1.0 in favour of
+        * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the
+        * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2.
+        */
+       mask =  SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1
+#if !defined(OPENSSL_NO_SSL3)
+               |SSL_OP_NO_SSLv3
 #endif
-       if (!(s->options & SSL_OP_NO_TLSv1_1))
-               {
+#if !defined(OPENSSL_NO_SSL2)
+               |(ssl2_compat?SSL_OP_NO_SSLv2:0)
+#endif
+               ;
+#if !defined(OPENSSL_NO_TLS1_2_CLIENT)
+       version = TLS1_2_VERSION;
+
+       if ((options & SSL_OP_NO_TLSv1_2) && (options & mask) != mask)
                version = TLS1_1_VERSION;
-               }
-       else if (!(s->options & SSL_OP_NO_TLSv1))
-               {
+#else
+       version = TLS1_1_VERSION;
+#endif
+       mask &= ~SSL_OP_NO_TLSv1_1;
+       if ((options & SSL_OP_NO_TLSv1_1) && (options & mask) != mask)
                version = TLS1_VERSION;
-               }
-       else if (!(s->options & SSL_OP_NO_SSLv3))
-               {
+       mask &= ~SSL_OP_NO_TLSv1;
+#if !defined(OPENSSL_NO_SSL3)
+       if ((options & SSL_OP_NO_TLSv1) && (options & mask) != mask)
                version = SSL3_VERSION;
-               }
-       else if (!(s->options & SSL_OP_NO_SSLv2))
-               {
+       mask &= ~SSL_OP_NO_SSLv3;
+#endif
+#if !defined(OPENSSL_NO_SSL2)
+       if ((options & SSL_OP_NO_SSLv3) && (options & mask) != mask)
                version = SSL2_VERSION;
-               }
+#endif
+
 #ifndef OPENSSL_NO_TLSEXT
        if (version != SSL2_VERSION)
                {
index ab72473..8b0c2a2 100644 (file)
@@ -556,7 +556,6 @@ struct ssl_session_st
 #define SSL_OP_SSLEAY_080_CLIENT_DH_BUG                        0x00000080L
 #define SSL_OP_TLS_D5_BUG                              0x00000100L
 #define SSL_OP_TLS_BLOCK_PADDING_BUG                   0x00000200L
-#define SSL_OP_NO_TLSv1_1                              0x00000400L
 
 /* Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added
  * in OpenSSL 0.9.6d.  Usually (depending on the application protocol)
@@ -604,6 +603,7 @@ struct ssl_session_st
 #define SSL_OP_NO_SSLv3                                        0x02000000L
 #define SSL_OP_NO_TLSv1                                        0x04000000L
 #define SSL_OP_NO_TLSv1_2                              0x08000000L
+#define SSL_OP_NO_TLSv1_1                              0x10000000L
 
 /* These next two were never actually used for anything since SSLeay
  * zap so we have some more flags.