[openssl-commits] [openssl] master update

Matt Caswell matt at openssl.org
Thu Dec 29 13:39:03 UTC 2016


The branch master has been updated
       via  0a6793c942b525124990847b50ee18c7dc3359d4 (commit)
       via  3cf96e88b78df21bc2ac09a793d1c66ce7912760 (commit)
       via  0785274ca53bbc20774186df6081dc75258db9bb (commit)
       via  397f4f78760480f982adaeed98ccb10bda4d3fbb (commit)
       via  3b58c54f26b826abd55a513494ef892e7ad069ad (commit)
      from  67adf0a7c273a82901ce8705ae8d71ee2f1c959c (commit)


- Log -----------------------------------------------------------------
commit 0a6793c942b525124990847b50ee18c7dc3359d4
Author: Matt Caswell <matt at openssl.org>
Date:   Thu Dec 29 10:42:15 2016 +0000

    Fix CT test_sslmessages hangs
    
    The CT tests in test_sslmessages require EC to be available, therefore
    we must skip these if no-ec
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2153)

commit 3cf96e88b78df21bc2ac09a793d1c66ce7912760
Author: Matt Caswell <matt at openssl.org>
Date:   Wed Dec 28 15:32:39 2016 +0000

    Fix compilation with no-ec
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2153)

commit 0785274ca53bbc20774186df6081dc75258db9bb
Author: Matt Caswell <matt at openssl.org>
Date:   Wed Dec 28 17:30:51 2016 +0000

    Fix extension for various no- options
    
    Previously we were omitting the extension information from ext_defs if
    the association no- option was defined. This doesn't work because the
    indexes into the table are no longer valid.
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2153)

commit 397f4f78760480f982adaeed98ccb10bda4d3fbb
Author: Matt Caswell <matt at openssl.org>
Date:   Wed Dec 28 15:01:57 2016 +0000

    Add a test to check the EC point formats extension appears when we expect
    
    The previous commit fixed a bug where the EC point formats extensions did
    not appear in the ServerHello. This should have been caught by
    70-test_sslmessages but that test never tries an EC ciphersuite. This
    updates the test to do that.
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2153)

commit 3b58c54f26b826abd55a513494ef892e7ad069ad
Author: Matt Caswell <matt at openssl.org>
Date:   Wed Dec 28 12:10:28 2016 +0000

    Fix the EC point formats extension
    
    This should be sent in the ServerHello if a EC based ciphersuite is
    negotiated. The relevant flag to do this was missed off in the recent
    extensions refactor.
    
    Fixes GitHub Issue #2133
    
    Reviewed-by: Richard Levitte <levitte at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/2153)

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

Summary of changes:
 Configure                          |  3 ++-
 ssl/statem/extensions.c            | 16 +++++++++++++++-
 ssl/statem/extensions_clnt.c       |  4 ++++
 ssl/statem/extensions_srvr.c       |  6 ++++++
 test/recipes/70-test_sslmessages.t | 38 +++++++++++++++++++++++++++++++-------
 test/testlib/checkhandshake.pm     |  5 ++++-
 util/TLSProxy/Message.pm           |  4 ++++
 util/TLSProxy/Proxy.pm             | 11 +++++++++++
 util/TLSProxy/ServerHello.pm       |  1 +
 util/TLSProxy/ServerKeyExchange.pm |  6 +++---
 10 files changed, 81 insertions(+), 13 deletions(-)

diff --git a/Configure b/Configure
index 896d4d4..b2e2e47 100755
--- a/Configure
+++ b/Configure
@@ -507,7 +507,8 @@ my @disable_cascades = (
 
     "stdio"             => [ "apps", "capieng" ],
     "apps"              => [ "tests" ],
-    "comp"		=> [ "zlib" ],
+    "comp"              => [ "zlib" ],
+    "ec"                => [ "tls1_3" ],
     sub { !$disabled{"unit-test"} } => [ "heartbeats" ],
 
     sub { !$disabled{"msan"} } => [ "asm" ],
diff --git a/ssl/statem/extensions.c b/ssl/statem/extensions.c
index 760b150..2bb09c9 100644
--- a/ssl/statem/extensions.c
+++ b/ssl/statem/extensions.c
@@ -92,6 +92,7 @@ typedef struct extensions_definition_st {
  *
  * TODO(TLS1.3): Make sure we have a test to check the consistency of these
  */
+#define INVALID_EXTENSION { 0x10000, 0, NULL, NULL, NULL, NULL, NULL, NULL }
 static const EXTENSION_DEFINITION ext_defs[] = {
     {
         TLSEXT_TYPE_renegotiate,
@@ -116,11 +117,13 @@ static const EXTENSION_DEFINITION ext_defs[] = {
         EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
         init_srp, tls_parse_ctos_srp, NULL, NULL, tls_construct_ctos_srp, NULL
     },
+#else
+    INVALID_EXTENSION,
 #endif
 #ifndef OPENSSL_NO_EC
     {
         TLSEXT_TYPE_ec_point_formats,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
         NULL, tls_parse_ctos_ec_pt_formats, tls_parse_stoc_ec_pt_formats,
         tls_construct_stoc_ec_pt_formats, tls_construct_ctos_ec_pt_formats,
         final_ec_pt_formats
@@ -132,6 +135,9 @@ static const EXTENSION_DEFINITION ext_defs[] = {
         NULL /* TODO(TLS1.3): Need to add this */,
         tls_construct_ctos_supported_groups, NULL
     },
+#else
+    INVALID_EXTENSION,
+    INVALID_EXTENSION,
 #endif
     {
         TLSEXT_TYPE_session_ticket,
@@ -155,6 +161,8 @@ static const EXTENSION_DEFINITION ext_defs[] = {
         tls_parse_stoc_status_request, tls_construct_stoc_status_request,
         tls_construct_ctos_status_request, final_status_request
     },
+#else
+    INVALID_EXTENSION,
 #endif
 #ifndef OPENSSL_NO_NEXTPROTONEG
     {
@@ -163,6 +171,8 @@ static const EXTENSION_DEFINITION ext_defs[] = {
         init_npn, tls_parse_ctos_npn, tls_parse_stoc_npn,
         tls_construct_stoc_next_proto_neg, tls_construct_ctos_npn, NULL
     },
+#else
+    INVALID_EXTENSION,
 #endif
     {
         /*
@@ -183,6 +193,8 @@ static const EXTENSION_DEFINITION ext_defs[] = {
         init_srtp, tls_parse_ctos_use_srtp, tls_parse_stoc_use_srtp,
         tls_construct_stoc_use_srtp, tls_construct_ctos_use_srtp, NULL
     },
+#else
+    INVALID_EXTENSION,
 #endif
     {
         TLSEXT_TYPE_encrypt_then_mac,
@@ -203,6 +215,8 @@ static const EXTENSION_DEFINITION ext_defs[] = {
          */
         NULL, tls_parse_stoc_sct, NULL, tls_construct_ctos_sct,  NULL
     },
+#else
+    INVALID_EXTENSION,
 #endif
     {
         TLSEXT_TYPE_extended_master_secret,
diff --git a/ssl/statem/extensions_clnt.c b/ssl/statem/extensions_clnt.c
index 6d2ed23..f291e5f 100644
--- a/ssl/statem/extensions_clnt.c
+++ b/ssl/statem/extensions_clnt.c
@@ -480,6 +480,7 @@ int tls_construct_ctos_supported_versions(SSL *s, WPACKET *pkt, int *al)
 
 int tls_construct_ctos_key_share(SSL *s, WPACKET *pkt, int *al)
 {
+#ifndef OPENSSL_NO_TLS1_3
     size_t i, sharessent = 0, num_curves = 0;
     const unsigned char *pcurves = NULL;
 
@@ -559,6 +560,7 @@ int tls_construct_ctos_key_share(SSL *s, WPACKET *pkt, int *al)
         SSLerr(SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE, ERR_R_INTERNAL_ERROR);
         return 0;
     }
+#endif
 
     return 1;
 }
@@ -983,6 +985,7 @@ int tls_parse_stoc_ems(SSL *s, PACKET *pkt, int *al)
 
 int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, int *al)
 {
+#ifndef OPENSSL_NO_TLS1_3
     unsigned int group_id;
     PACKET encoded_pt;
     EVP_PKEY *ckey = s->s3->tmp.pkey, *skey = NULL;
@@ -1038,6 +1041,7 @@ int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, int *al)
         return 0;
     }
     EVP_PKEY_free(skey);
+#endif
 
     return 1;
 }
diff --git a/ssl/statem/extensions_srvr.c b/ssl/statem/extensions_srvr.c
index 9876212..74db91d 100644
--- a/ssl/statem/extensions_srvr.c
+++ b/ssl/statem/extensions_srvr.c
@@ -457,6 +457,7 @@ int tls_parse_ctos_etm(SSL *s, PACKET *pkt, int *al)
  * used. Returns 1 if the group is in the list (and allowed if |checkallow| is
  * 1) or 0 otherwise.
  */
+#ifndef OPENSSL_NO_TLS1_3
 static int check_in_list(SSL *s, unsigned int group_id,
                          const unsigned char *groups, size_t num_groups,
                          int checkallow)
@@ -479,6 +480,7 @@ static int check_in_list(SSL *s, unsigned int group_id,
     /* If i == num_groups then not in the list */
     return i < num_groups;
 }
+#endif
 
 /*
  * Process a key_share extension received in the ClientHello. |pkt| contains
@@ -487,6 +489,7 @@ static int check_in_list(SSL *s, unsigned int group_id,
  */
 int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, int *al)
 {
+#ifndef OPENSSL_NO_TLS1_3
     unsigned int group_id;
     PACKET key_share_list, encoded_pt;
     const unsigned char *clntcurves, *srvrcurves;
@@ -607,6 +610,7 @@ int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, int *al)
 
         found = 1;
     }
+#endif
 
     return 1;
 }
@@ -857,6 +861,7 @@ int tls_construct_stoc_ems(SSL *s, WPACKET *pkt, int *al)
 
 int tls_construct_stoc_key_share(SSL *s, WPACKET *pkt, int *al)
 {
+#ifndef OPENSSL_NO_TLS1_3
     unsigned char *encodedPoint;
     size_t encoded_pt_len = 0;
     EVP_PKEY *ckey = s->s3->peer_tmp, *skey = NULL;
@@ -905,6 +910,7 @@ int tls_construct_stoc_key_share(SSL *s, WPACKET *pkt, int *al)
         SSLerr(SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR);
         return 0;
     }
+#endif
 
     return 1;
 }
diff --git a/test/recipes/70-test_sslmessages.t b/test/recipes/70-test_sslmessages.t
index fb4ec61..48a2708 100755
--- a/test/recipes/70-test_sslmessages.t
+++ b/test/recipes/70-test_sslmessages.t
@@ -46,6 +46,9 @@ my $proxy = TLSProxy::Proxy->new(
     [TLSProxy::Message::MT_CERTIFICATE,
         checkhandshake::ALL_HANDSHAKES
         & ~checkhandshake::RESUME_HANDSHAKE],
+    (disabled("ec") ? () :
+                      [TLSProxy::Message::MT_SERVER_KEY_EXCHANGE,
+                          checkhandshake::EC_HANDSHAKE]),
     [TLSProxy::Message::MT_CERTIFICATE_STATUS,
         checkhandshake::OCSP_HANDSHAKE],
     #ServerKeyExchange handshakes not currently supported by TLSProxy
@@ -94,10 +97,14 @@ my $proxy = TLSProxy::Proxy->new(
         checkhandshake::SERVER_NAME_CLI_EXTENSION],
     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_STATUS_REQUEST,
         checkhandshake::STATUS_REQUEST_CLI_EXTENSION],
-    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_GROUPS,
-        checkhandshake::DEFAULT_EXTENSIONS],
-    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EC_POINT_FORMATS,
-        checkhandshake::DEFAULT_EXTENSIONS],
+    (disabled("ec") ? () :
+                      [TLSProxy::Message::MT_CLIENT_HELLO,
+                       TLSProxy::Message::EXT_SUPPORTED_GROUPS,
+                       checkhandshake::DEFAULT_EXTENSIONS]),
+    (disabled("ec") ? () :
+                      [TLSProxy::Message::MT_CLIENT_HELLO,
+                       TLSProxy::Message::EXT_EC_POINT_FORMATS,
+                       checkhandshake::DEFAULT_EXTENSIONS]),
     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SIG_ALGS,
         checkhandshake::DEFAULT_EXTENSIONS],
     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ALPN,
@@ -135,6 +142,8 @@ my $proxy = TLSProxy::Proxy->new(
         checkhandshake::SCT_SRV_EXTENSION],
     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_NPN,
         checkhandshake::NPN_SRV_EXTENSION],
+    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_EC_POINT_FORMATS,
+        checkhandshake::EC_POINT_FORMAT_SRV_EXTENSION],
     [0,0,0]
 );
 
@@ -143,7 +152,7 @@ my $proxy = TLSProxy::Proxy->new(
 $proxy->serverconnects(2);
 $proxy->clientflags("-no_tls1_3 -sess_out ".$session);
 $proxy->start() or plan skip_all => "Unable to start up Proxy for tests";
-plan tests => 20;
+plan tests => 21;
 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
                checkhandshake::DEFAULT_EXTENSIONS,
                "Default handshake test");
@@ -266,7 +275,8 @@ checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
                "ALPN handshake test");
 
 SKIP: {
-    skip "No CT support in this OpenSSL build", 1 if disabled("ct");
+    skip "No CT and/or EC support in this OpenSSL build", 1
+        if disabled("ct") || disabled("ec");
 
     #Test 14: SCT handshake (client request only)
     $proxy->clear();
@@ -295,7 +305,8 @@ checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
                "SCT handshake test (server)");
 
 SKIP: {
-    skip "No CT support in this OpenSSL build", 1 if disabled("ct");
+    skip "No CT and/or EC support in this OpenSSL build", 1
+        if disabled("ct") || disabled("ec");
 
     #Test 16: SCT handshake (client and server)
     #There is no built-in server side support for this so we are actually also
@@ -358,3 +369,16 @@ checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
                checkhandshake::DEFAULT_EXTENSIONS
                | checkhandshake::SRP_CLI_EXTENSION,
                "SRP extension test");
+
+#Test 21: EC handshake
+SKIP: {
+    skip "No EC support in this OpenSSL build", 1 if disabled("ec");
+    $proxy->clear();
+    $proxy->clientflags("-no_tls1_3");
+    $proxy->ciphers("ECDHE-RSA-AES128-SHA");
+    $proxy->start();
+    checkhandshake($proxy, checkhandshake::EC_HANDSHAKE,
+                   checkhandshake::DEFAULT_EXTENSIONS
+                   | checkhandshake::EC_POINT_FORMAT_SRV_EXTENSION,
+                   "EC handshake test");
+}
diff --git a/test/testlib/checkhandshake.pm b/test/testlib/checkhandshake.pm
index eb34fff..9529b94 100644
--- a/test/testlib/checkhandshake.pm
+++ b/test/testlib/checkhandshake.pm
@@ -23,8 +23,9 @@ use constant {
     CLIENT_AUTH_HANDSHAKE => 8,
     RENEG_HANDSHAKE => 16,
     NPN_HANDSHAKE => 32,
+    EC_HANDSHAKE => 64,
 
-    ALL_HANDSHAKES => 63
+    ALL_HANDSHAKES => 127
 };
 
 use constant {
@@ -43,6 +44,8 @@ use constant {
     NPN_CLI_EXTENSION => 0x00000800,
     NPN_SRV_EXTENSION => 0x00001000,
     SRP_CLI_EXTENSION => 0x00002000,
+    #Client side for ec point formats is a default extension
+    EC_POINT_FORMAT_SRV_EXTENSION => 0x00004000,
 };
 
 our @handmessages = ();
diff --git a/util/TLSProxy/Message.pm b/util/TLSProxy/Message.pm
index e5c42c8..7837787 100644
--- a/util/TLSProxy/Message.pm
+++ b/util/TLSProxy/Message.pm
@@ -83,6 +83,10 @@ use constant {
     EXT_DUPLICATE_EXTENSION => 0xfde8
 };
 
+use constant {
+    CIPHER_ADH_AES_128_SHA => 0x03000034
+};
+
 my $payload = "";
 my $messlen = -1;
 my $mt;
diff --git a/util/TLSProxy/Proxy.pm b/util/TLSProxy/Proxy.pm
index 6561589..84ca3a7 100644
--- a/util/TLSProxy/Proxy.pm
+++ b/util/TLSProxy/Proxy.pm
@@ -25,6 +25,7 @@ my $have_IPv6 = 0;
 my $IP_factory;
 
 my $is_tls13 = 0;
+my $ciphersuite = undef;
 
 sub new
 {
@@ -108,6 +109,7 @@ sub clearClient
     $self->{message_list} = [];
     $self->{clientflags} = "";
     $is_tls13 = 0;
+    $ciphersuite = undef;
 
     TLSProxy::Message->clear();
     TLSProxy::Record->clear();
@@ -535,4 +537,13 @@ sub reneg
     return $self->{reneg};
 }
 
+sub ciphersuite
+{
+    my $class = shift;
+    if (@_) {
+        $ciphersuite = shift;
+    }
+    return $ciphersuite;
+}
+
 1;
diff --git a/util/TLSProxy/ServerHello.pm b/util/TLSProxy/ServerHello.pm
index 5a038c9..1abdd05 100644
--- a/util/TLSProxy/ServerHello.pm
+++ b/util/TLSProxy/ServerHello.pm
@@ -103,6 +103,7 @@ sub parse
     $self->session_id_len($session_id_len);
     $self->session($session);
     $self->ciphersuite($ciphersuite);
+    TLSProxy::Proxy->ciphersuite($ciphersuite);
     $self->comp_meth($comp_meth);
     $self->extension_data(\%extensions);
 
diff --git a/util/TLSProxy/ServerKeyExchange.pm b/util/TLSProxy/ServerKeyExchange.pm
index 6e5b4cd..7640b3f 100644
--- a/util/TLSProxy/ServerKeyExchange.pm
+++ b/util/TLSProxy/ServerKeyExchange.pm
@@ -42,9 +42,9 @@ sub parse
 {
     my $self = shift;
 
-    #Minimal SKE parsing. Only supports DHE at the moment (if its not DHE
-    #the parsing data will be trash...which is ok as long as we don't try to
-    #use it)
+    #Minimal SKE parsing. Only supports one known DHE ciphersuite at the moment
+    return if (TLSProxy::Proxy->ciphersuite()
+               != TLSProxy::Message::CIPHER_ADH_AES_128_SHA);
 
     my $p_len = unpack('n', $self->data);
     my $ptr = 2;


More information about the openssl-commits mailing list