diff options
author | Matt Caswell <matt@openssl.org> | 2017-12-05 10:14:35 +0000 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2017-12-14 15:06:37 +0000 |
commit | 597c51bc980ba6d7470dd8de747ac12a6c7a442b (patch) | |
tree | bfaa1fb62ac77032ed159170cf5df7ab7a31b717 /util | |
parent | db37d32cb89160328b0ba48e3808f601a7b3ebe8 (diff) | |
download | openssl-new-597c51bc980ba6d7470dd8de747ac12a6c7a442b.tar.gz |
Merge HRR into ServerHello
Reviewed-by: Ben Kaduk <kaduk@mit.edu>
(Merged from https://github.com/openssl/openssl/pull/4701)
Diffstat (limited to 'util')
-rw-r--r-- | util/perl/TLSProxy/HelloRetryRequest.pm | 150 | ||||
-rw-r--r-- | util/perl/TLSProxy/Message.pm | 11 | ||||
-rw-r--r-- | util/perl/TLSProxy/Proxy.pm | 1 | ||||
-rw-r--r-- | util/perl/checkhandshake.pm | 68 |
4 files changed, 57 insertions, 173 deletions
diff --git a/util/perl/TLSProxy/HelloRetryRequest.pm b/util/perl/TLSProxy/HelloRetryRequest.pm deleted file mode 100644 index c4125b7a16..0000000000 --- a/util/perl/TLSProxy/HelloRetryRequest.pm +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -use strict; - -package TLSProxy::HelloRetryRequest; - -use vars '@ISA'; -push @ISA, 'TLSProxy::Message'; - -sub new -{ - my $class = shift; - my ($server, - $data, - $records, - $startoffset, - $message_frag_lens) = @_; - - my $self = $class->SUPER::new( - $server, - TLSProxy::Message::MT_HELLO_RETRY_REQUEST, - $data, - $records, - $startoffset, - $message_frag_lens); - - $self->{extension_data} = ""; - - return $self; -} - -sub parse -{ - my $self = shift; - my $ptr = 2; - - TLSProxy::Proxy->is_tls13(1); - - my ($server_version) = unpack('n', $self->data); - # TODO(TLS1.3): Replace this reference to draft version before release - if ($server_version == TLSProxy::Record::VERS_TLS_1_3_DRAFT) { - $server_version = TLSProxy::Record::VERS_TLS_1_3; - } - - my $ciphersuite = unpack('n', substr($self->data, $ptr)); - $ptr += 2; - - my $extensions_len = unpack('n', substr($self->data, $ptr)); - if (!defined $extensions_len) { - $extensions_len = 0; - } - - $ptr += 2; - my $extension_data; - if ($extensions_len != 0) { - $extension_data = substr($self->data, $ptr); - - if (length($extension_data) != $extensions_len) { - die "Invalid extension length\n"; - } - } else { - if (length($self->data) != 2) { - die "Invalid extension length\n"; - } - $extension_data = ""; - } - my %extensions = (); - while (length($extension_data) >= 4) { - my ($type, $size) = unpack("nn", $extension_data); - my $extdata = substr($extension_data, 4, $size); - $extension_data = substr($extension_data, 4 + $size); - $extensions{$type} = $extdata; - } - - $self->server_version($server_version); - $self->ciphersuite($ciphersuite); - $self->extension_data(\%extensions); - - print " Server Version:".$server_version."\n"; - print " Ciphersuite:".$ciphersuite."\n"; - print " Extensions Len:".$extensions_len."\n"; -} - -#Reconstruct the on-the-wire message data following changes -sub set_message_contents -{ - my $self = shift; - my $data; - my $extensions = ""; - - foreach my $key (keys %{$self->extension_data}) { - my $extdata = ${$self->extension_data}{$key}; - $extensions .= pack("n", $key); - $extensions .= pack("n", length($extdata)); - $extensions .= $extdata; - if ($key == TLSProxy::Message::EXT_DUPLICATE_EXTENSION) { - $extensions .= pack("n", $key); - $extensions .= pack("n", length($extdata)); - $extensions .= $extdata; - } - } - - $data = pack('n', $self->server_version); - $data .= pack('n', $self->ciphersuite); - $data .= pack('n', length($extensions)); - $data .= $extensions; - $self->data($data); -} - -#Read/write accessors -sub server_version -{ - my $self = shift; - if (@_) { - $self->{server_version} = shift; - } - return $self->{server_version}; -} -sub ciphersuite -{ - my $self = shift; - if (@_) { - $self->{ciphersuite} = shift; - } - return $self->{ciphersuite}; -} -sub extension_data -{ - my $self = shift; - if (@_) { - $self->{extension_data} = shift; - } - return $self->{extension_data}; -} -sub set_extension -{ - my ($self, $ext_type, $ext_data) = @_; - $self->{extension_data}{$ext_type} = $ext_data; -} -sub delete_extension -{ - my ($self, $ext_type) = @_; - delete $self->{extension_data}{$ext_type}; -} -1; diff --git a/util/perl/TLSProxy/Message.pm b/util/perl/TLSProxy/Message.pm index 1c2bd2044b..5bb4050786 100644 --- a/util/perl/TLSProxy/Message.pm +++ b/util/perl/TLSProxy/Message.pm @@ -17,7 +17,6 @@ use constant { MT_CLIENT_HELLO => 1, MT_SERVER_HELLO => 2, MT_NEW_SESSION_TICKET => 4, - MT_HELLO_RETRY_REQUEST => 6, MT_ENCRYPTED_EXTENSIONS => 8, MT_CERTIFICATE => 11, MT_SERVER_KEY_EXCHANGE => 12, @@ -48,7 +47,6 @@ my %message_type = ( MT_CLIENT_HELLO, "ClientHello", MT_SERVER_HELLO, "ServerHello", MT_NEW_SESSION_TICKET, "NewSessionTicket", - MT_HELLO_RETRY_REQUEST, "HelloRetryRequest", MT_ENCRYPTED_EXTENSIONS, "EncryptedExtensions", MT_CERTIFICATE, "Certificate", MT_SERVER_KEY_EXCHANGE, "ServerKeyExchange", @@ -296,15 +294,6 @@ sub create_message [@message_frag_lens] ); $message->parse(); - } elsif ($mt == MT_HELLO_RETRY_REQUEST) { - $message = TLSProxy::HelloRetryRequest->new( - $server, - $data, - [@message_rec_list], - $startoffset, - [@message_frag_lens] - ); - $message->parse(); } elsif ($mt == MT_SERVER_HELLO) { $message = TLSProxy::ServerHello->new( $server, diff --git a/util/perl/TLSProxy/Proxy.pm b/util/perl/TLSProxy/Proxy.pm index 83a6494933..99b0dedd5b 100644 --- a/util/perl/TLSProxy/Proxy.pm +++ b/util/perl/TLSProxy/Proxy.pm @@ -16,7 +16,6 @@ use IO::Select; use TLSProxy::Record; use TLSProxy::Message; use TLSProxy::ClientHello; -use TLSProxy::HelloRetryRequest; use TLSProxy::ServerHello; use TLSProxy::EncryptedExtensions; use TLSProxy::Certificate; diff --git a/util/perl/checkhandshake.pm b/util/perl/checkhandshake.pm index 65c5135a1e..e1667d5705 100644 --- a/util/perl/checkhandshake.pm +++ b/util/perl/checkhandshake.pm @@ -69,10 +69,33 @@ sub checkhandshake($$$$) my $extcount; my $clienthelloseen = 0; + my $lastmt = 0; + my $numsh = 0; + if (TLSProxy::Proxy::is_tls13()) { + #How many ServerHellos are we expecting? + for ($numtests = 0; $handmessages[$loop][1] != 0; $loop++) { + next if (($handmessages[$loop][1] & $handtype) == 0); + $numsh++ if ($lastmt != TLSProxy::Message::MT_SERVER_HELLO + && $handmessages[$loop][0] == TLSProxy::Message::MT_SERVER_HELLO); + $lastmt = $handmessages[$loop][0]; + } + } + #First count the number of tests my $nextmess = 0; my $message = undef; my $chnum = 0; + my $shnum = 0; + if (!TLSProxy::Proxy::is_tls13()) { + # In non-TLSv1.3 we always treat reneg CH and SH like the first CH + # and SH + $chnum = 1; + $shnum = 1; + } + #If we're only expecting one ServerHello out of two then we skip the + #first ServerHello in the list completely + $shnum++ if ($numsh == 1 && TLSProxy::Proxy::is_tls13()); + $loop = 0; for ($numtests = 0; $handmessages[$loop][1] != 0; $loop++) { next if (($handmessages[$loop][1] & $handtype) == 0); if (scalar @{$proxy->message_list} > $nextmess) { @@ -84,10 +107,11 @@ sub checkhandshake($$$$) $numtests++; next if (!defined $message); - $chnum = 1 if $message->mt() != TLSProxy::Message::MT_CLIENT_HELLO - && TLSProxy::Proxy::is_tls13(); + if (TLSProxy::Proxy::is_tls13()) { + $chnum++ if $message->mt() == TLSProxy::Message::MT_CLIENT_HELLO; + $shnum++ if $message->mt() == TLSProxy::Message::MT_SERVER_HELLO; + } next if ($message->mt() != TLSProxy::Message::MT_CLIENT_HELLO - && $message->mt() != TLSProxy::Message::MT_HELLO_RETRY_REQUEST && $message->mt() != TLSProxy::Message::MT_SERVER_HELLO && $message->mt() != TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS @@ -96,14 +120,19 @@ sub checkhandshake($$$$) next if $message->mt() == TLSProxy::Message::MT_CERTIFICATE && !TLSProxy::Proxy::is_tls13(); - my $extchnum = 0; + my $extchnum = 1; + my $extshnum = 1; for (my $extloop = 0; $extensions[$extloop][2] != 0; $extloop++) { - $extchnum = 1 if $extensions[$extloop][0] != TLSProxy::Message::MT_CLIENT_HELLO + $extchnum = 2 if $extensions[$extloop][0] != TLSProxy::Message::MT_CLIENT_HELLO && TLSProxy::Proxy::is_tls13(); + $extshnum = 2 if $extensions[$extloop][0] != TLSProxy::Message::MT_SERVER_HELLO + && $extchnum == 2; next if $extensions[$extloop][0] == TLSProxy::Message::MT_CLIENT_HELLO && $extchnum != $chnum; + next if $extensions[$extloop][0] == TLSProxy::Message::MT_SERVER_HELLO + && $extshnum != $shnum; next if ($message->mt() != $extensions[$extloop][0]); $numtests++; } @@ -114,7 +143,18 @@ sub checkhandshake($$$$) $nextmess = 0; $message = undef; - $chnum = 0; + if (TLSProxy::Proxy::is_tls13()) { + $chnum = 0; + $shnum = 0; + } else { + # In non-TLSv1.3 we always treat reneg CH and SH like the first CH + # and SH + $chnum = 1; + $shnum = 1; + } + #If we're only expecting one ServerHello out of two then we skip the + #first ServerHello in the list completely + $shnum++ if ($numsh == 1 && TLSProxy::Proxy::is_tls13()); for ($loop = 0; $handmessages[$loop][1] != 0; $loop++) { next if (($handmessages[$loop][1] & $handtype) == 0); if (scalar @{$proxy->message_list} > $nextmess) { @@ -132,11 +172,12 @@ sub checkhandshake($$$$) "Message type check. Got ".$message->mt .", expected ".$handmessages[$loop][0]); } - $chnum = 1 if $message->mt() != TLSProxy::Message::MT_CLIENT_HELLO - && TLSProxy::Proxy::is_tls13(); + if (TLSProxy::Proxy::is_tls13()) { + $chnum++ if $message->mt() == TLSProxy::Message::MT_CLIENT_HELLO; + $shnum++ if $message->mt() == TLSProxy::Message::MT_SERVER_HELLO; + } next if ($message->mt() != TLSProxy::Message::MT_CLIENT_HELLO - && $message->mt() != TLSProxy::Message::MT_HELLO_RETRY_REQUEST && $message->mt() != TLSProxy::Message::MT_SERVER_HELLO && $message->mt() != TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS @@ -153,16 +194,21 @@ sub checkhandshake($$$$) } #Now check that we saw the extensions we expected my $msgexts = $message->extension_data(); - my $extchnum = 0; + my $extchnum = 1; + my $extshnum = 1; for (my $extloop = 0, $extcount = 0; $extensions[$extloop][2] != 0; $extloop++) { #In TLSv1.3 we can have two ClientHellos if there has been a #HelloRetryRequest, and they may have different extensions. Skip #if these are extensions for a different ClientHello - $extchnum = 1 if $extensions[$extloop][0] != TLSProxy::Message::MT_CLIENT_HELLO + $extchnum = 2 if $extensions[$extloop][0] != TLSProxy::Message::MT_CLIENT_HELLO && TLSProxy::Proxy::is_tls13(); + $extshnum = 2 if $extensions[$extloop][0] != TLSProxy::Message::MT_SERVER_HELLO + && $extchnum == 2; next if $extensions[$extloop][0] == TLSProxy::Message::MT_CLIENT_HELLO && $extchnum != $chnum; + next if $extensions[$extloop][0] == TLSProxy::Message::MT_SERVER_HELLO + && $extshnum != $shnum; next if ($message->mt() != $extensions[$extloop][0]); ok (($extensions[$extloop][2] & $exttype) == 0 || defined ($msgexts->{$extensions[$extloop][1]}), |