Home | History | Annotate | Line # | Download | only in recipes
      1 #! /usr/bin/env perl
      2 # Copyright 2015-2019 The OpenSSL Project Authors. All Rights Reserved.
      3 #
      4 # Licensed under the OpenSSL license (the "License").  You may not use
      5 # this file except in compliance with the License.  You can obtain a copy
      6 # in the file LICENSE in the source distribution or at
      7 # https://www.openssl.org/source/license.html
      8 
      9 use strict;
     10 use OpenSSL::Test qw/:DEFAULT cmdstr srctop_file srctop_dir bldtop_dir/;
     11 use OpenSSL::Test::Utils;
     12 use File::Temp qw(tempfile);
     13 use TLSProxy::Proxy;
     14 use checkhandshake qw(checkhandshake @handmessages @extensions);
     15 
     16 my $test_name = "test_tls13messages";
     17 setup($test_name);
     18 
     19 plan skip_all => "TLSProxy isn't usable on $^O"
     20     if $^O =~ /^(VMS)$/;
     21 
     22 plan skip_all => "$test_name needs the dynamic engine feature enabled"
     23     if disabled("engine") || disabled("dynamic-engine");
     24 
     25 plan skip_all => "$test_name needs the sock feature enabled"
     26     if disabled("sock");
     27 
     28 plan skip_all => "$test_name needs TLSv1.3 enabled"
     29     if disabled("tls1_3");
     30 
     31 $ENV{OPENSSL_ia32cap} = '~0x200000200000000';
     32 $ENV{CTLOG_FILE} = srctop_file("test", "ct", "log_list.conf");
     33 
     34 
     35 @handmessages = (
     36     [TLSProxy::Message::MT_CLIENT_HELLO,
     37         checkhandshake::ALL_HANDSHAKES],
     38     [TLSProxy::Message::MT_SERVER_HELLO,
     39         checkhandshake::HRR_HANDSHAKE | checkhandshake::HRR_RESUME_HANDSHAKE],
     40     [TLSProxy::Message::MT_CLIENT_HELLO,
     41         checkhandshake::HRR_HANDSHAKE | checkhandshake::HRR_RESUME_HANDSHAKE],
     42     [TLSProxy::Message::MT_SERVER_HELLO,
     43         checkhandshake::ALL_HANDSHAKES],
     44     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS,
     45         checkhandshake::ALL_HANDSHAKES],
     46     [TLSProxy::Message::MT_CERTIFICATE_REQUEST,
     47         checkhandshake::CLIENT_AUTH_HANDSHAKE],
     48     [TLSProxy::Message::MT_CERTIFICATE,
     49         checkhandshake::ALL_HANDSHAKES & ~(checkhandshake::RESUME_HANDSHAKE | checkhandshake::HRR_RESUME_HANDSHAKE)],
     50     [TLSProxy::Message::MT_CERTIFICATE_VERIFY,
     51         checkhandshake::ALL_HANDSHAKES & ~(checkhandshake::RESUME_HANDSHAKE | checkhandshake::HRR_RESUME_HANDSHAKE)],
     52     [TLSProxy::Message::MT_FINISHED,
     53         checkhandshake::ALL_HANDSHAKES],
     54     [TLSProxy::Message::MT_CERTIFICATE,
     55         checkhandshake::CLIENT_AUTH_HANDSHAKE],
     56     [TLSProxy::Message::MT_CERTIFICATE_VERIFY,
     57         checkhandshake::CLIENT_AUTH_HANDSHAKE],
     58     [TLSProxy::Message::MT_FINISHED,
     59         checkhandshake::ALL_HANDSHAKES],
     60     [0, 0]
     61 );
     62 
     63 @extensions = (
     64     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SERVER_NAME,
     65         TLSProxy::Message::CLIENT,
     66         checkhandshake::SERVER_NAME_CLI_EXTENSION],
     67     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_STATUS_REQUEST,
     68         TLSProxy::Message::CLIENT,
     69         checkhandshake::STATUS_REQUEST_CLI_EXTENSION],
     70     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_GROUPS,
     71         TLSProxy::Message::CLIENT,
     72         checkhandshake::DEFAULT_EXTENSIONS],
     73     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EC_POINT_FORMATS,
     74         TLSProxy::Message::CLIENT,
     75         checkhandshake::DEFAULT_EXTENSIONS],
     76     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SIG_ALGS,
     77         TLSProxy::Message::CLIENT,
     78         checkhandshake::DEFAULT_EXTENSIONS],
     79     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ALPN,
     80         TLSProxy::Message::CLIENT,
     81         checkhandshake::ALPN_CLI_EXTENSION],
     82     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SCT,
     83         TLSProxy::Message::CLIENT,
     84         checkhandshake::SCT_CLI_EXTENSION],
     85     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ENCRYPT_THEN_MAC,
     86         TLSProxy::Message::CLIENT,
     87         checkhandshake::DEFAULT_EXTENSIONS],
     88     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET,
     89         TLSProxy::Message::CLIENT,
     90         checkhandshake::DEFAULT_EXTENSIONS],
     91     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SESSION_TICKET,
     92         TLSProxy::Message::CLIENT,
     93         checkhandshake::DEFAULT_EXTENSIONS],
     94     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_KEY_SHARE,
     95         TLSProxy::Message::CLIENT,
     96         checkhandshake::DEFAULT_EXTENSIONS],
     97     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_VERSIONS,
     98         TLSProxy::Message::CLIENT,
     99         checkhandshake::DEFAULT_EXTENSIONS],
    100     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_PSK_KEX_MODES,
    101         TLSProxy::Message::CLIENT,
    102         checkhandshake::DEFAULT_EXTENSIONS],
    103     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_PSK,
    104         TLSProxy::Message::CLIENT,
    105         checkhandshake::PSK_CLI_EXTENSION],
    106     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_POST_HANDSHAKE_AUTH,
    107         TLSProxy::Message::CLIENT,
    108         checkhandshake::POST_HANDSHAKE_AUTH_CLI_EXTENSION],
    109 
    110     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_SUPPORTED_VERSIONS,
    111         TLSProxy::Message::SERVER,
    112         checkhandshake::DEFAULT_EXTENSIONS],
    113     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_KEY_SHARE,
    114         TLSProxy::Message::SERVER,
    115         checkhandshake::KEY_SHARE_HRR_EXTENSION],
    116 
    117     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SERVER_NAME,
    118         TLSProxy::Message::CLIENT,
    119         checkhandshake::SERVER_NAME_CLI_EXTENSION],
    120     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_STATUS_REQUEST,
    121         TLSProxy::Message::CLIENT,
    122         checkhandshake::STATUS_REQUEST_CLI_EXTENSION],
    123     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_GROUPS,
    124         TLSProxy::Message::CLIENT,
    125         checkhandshake::DEFAULT_EXTENSIONS],
    126     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EC_POINT_FORMATS,
    127         TLSProxy::Message::CLIENT,
    128         checkhandshake::DEFAULT_EXTENSIONS],
    129     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SIG_ALGS,
    130         TLSProxy::Message::CLIENT,
    131         checkhandshake::DEFAULT_EXTENSIONS],
    132     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ALPN,
    133         TLSProxy::Message::CLIENT,
    134         checkhandshake::ALPN_CLI_EXTENSION],
    135     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SCT,
    136         TLSProxy::Message::CLIENT,
    137         checkhandshake::SCT_CLI_EXTENSION],
    138     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ENCRYPT_THEN_MAC,
    139         TLSProxy::Message::CLIENT,
    140         checkhandshake::DEFAULT_EXTENSIONS],
    141     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET,
    142         TLSProxy::Message::CLIENT,
    143         checkhandshake::DEFAULT_EXTENSIONS],
    144     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SESSION_TICKET,
    145         TLSProxy::Message::CLIENT,
    146         checkhandshake::DEFAULT_EXTENSIONS],
    147     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_KEY_SHARE,
    148         TLSProxy::Message::CLIENT,
    149         checkhandshake::DEFAULT_EXTENSIONS],
    150     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_VERSIONS,
    151         TLSProxy::Message::CLIENT,
    152         checkhandshake::DEFAULT_EXTENSIONS],
    153     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_PSK_KEX_MODES,
    154         TLSProxy::Message::CLIENT,
    155         checkhandshake::DEFAULT_EXTENSIONS],
    156     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_PSK,
    157         TLSProxy::Message::CLIENT,
    158         checkhandshake::PSK_CLI_EXTENSION],
    159     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_POST_HANDSHAKE_AUTH,
    160         TLSProxy::Message::CLIENT,
    161         checkhandshake::POST_HANDSHAKE_AUTH_CLI_EXTENSION],
    162 
    163     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_SUPPORTED_VERSIONS,
    164         TLSProxy::Message::SERVER,
    165         checkhandshake::DEFAULT_EXTENSIONS],
    166     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_KEY_SHARE,
    167         TLSProxy::Message::SERVER,
    168         checkhandshake::DEFAULT_EXTENSIONS],
    169     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_PSK,
    170         TLSProxy::Message::SERVER,
    171         checkhandshake::PSK_SRV_EXTENSION],
    172 
    173     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, TLSProxy::Message::EXT_SERVER_NAME,
    174         TLSProxy::Message::SERVER,
    175         checkhandshake::SERVER_NAME_SRV_EXTENSION],
    176     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, TLSProxy::Message::EXT_ALPN,
    177         TLSProxy::Message::SERVER,
    178         checkhandshake::ALPN_SRV_EXTENSION],
    179     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, TLSProxy::Message::EXT_SUPPORTED_GROUPS,
    180         TLSProxy::Message::SERVER,
    181         checkhandshake::SUPPORTED_GROUPS_SRV_EXTENSION],
    182 
    183     [TLSProxy::Message::MT_CERTIFICATE_REQUEST, TLSProxy::Message::EXT_SIG_ALGS,
    184         TLSProxy::Message::SERVER,
    185         checkhandshake::DEFAULT_EXTENSIONS],
    186 
    187     [TLSProxy::Message::MT_CERTIFICATE, TLSProxy::Message::EXT_STATUS_REQUEST,
    188         TLSProxy::Message::SERVER,
    189         checkhandshake::STATUS_REQUEST_SRV_EXTENSION],
    190     [TLSProxy::Message::MT_CERTIFICATE, TLSProxy::Message::EXT_SCT,
    191         TLSProxy::Message::SERVER,
    192         checkhandshake::SCT_SRV_EXTENSION],
    193 
    194     [0,0,0,0]
    195 );
    196 
    197 my $proxy = TLSProxy::Proxy->new(
    198     undef,
    199     cmdstr(app(["openssl"]), display => 1),
    200     srctop_file("apps", "server.pem"),
    201     (!$ENV{HARNESS_ACTIVE} || $ENV{HARNESS_VERBOSE})
    202 );
    203 
    204 #Test 1: Check we get all the right messages for a default handshake
    205 (undef, my $session) = tempfile();
    206 $proxy->serverconnects(2);
    207 $proxy->clientflags("-sess_out ".$session);
    208 $proxy->sessionfile($session);
    209 $proxy->start() or plan skip_all => "Unable to start up Proxy for tests";
    210 plan tests => 17;
    211 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    212                checkhandshake::DEFAULT_EXTENSIONS,
    213                "Default handshake test");
    214 
    215 #Test 2: Resumption handshake
    216 $proxy->clearClient();
    217 $proxy->clientflags("-sess_in ".$session);
    218 $proxy->clientstart();
    219 checkhandshake($proxy, checkhandshake::RESUME_HANDSHAKE,
    220                (checkhandshake::DEFAULT_EXTENSIONS
    221                 | checkhandshake::PSK_CLI_EXTENSION
    222                 | checkhandshake::PSK_SRV_EXTENSION),
    223                "Resumption handshake test");
    224 
    225 SKIP: {
    226     skip "No OCSP support in this OpenSSL build", 4
    227         if disabled("ct") || disabled("ec") || disabled("ocsp");
    228     #Test 3: A status_request handshake (client request only)
    229     $proxy->clear();
    230     $proxy->clientflags("-status");
    231     $proxy->start();
    232     checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    233                    checkhandshake::DEFAULT_EXTENSIONS
    234                    | checkhandshake::STATUS_REQUEST_CLI_EXTENSION,
    235                    "status_request handshake test (client)");
    236 
    237     #Test 4: A status_request handshake (server support only)
    238     $proxy->clear();
    239     $proxy->serverflags("-status_file "
    240                         .srctop_file("test", "recipes", "ocsp-response.der"));
    241     $proxy->start();
    242     checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    243                    checkhandshake::DEFAULT_EXTENSIONS,
    244                    "status_request handshake test (server)");
    245 
    246     #Test 5: A status_request handshake (client and server)
    247     $proxy->clear();
    248     $proxy->clientflags("-status");
    249     $proxy->serverflags("-status_file "
    250                         .srctop_file("test", "recipes", "ocsp-response.der"));
    251     $proxy->start();
    252     checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    253                    checkhandshake::DEFAULT_EXTENSIONS
    254                    | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
    255                    | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
    256                    "status_request handshake test");
    257 
    258     #Test 6: A status_request handshake (client and server) with client auth
    259     $proxy->clear();
    260     $proxy->clientflags("-status -enable_pha -cert "
    261                         .srctop_file("apps", "server.pem"));
    262     $proxy->serverflags("-Verify 5 -status_file "
    263                         .srctop_file("test", "recipes", "ocsp-response.der"));
    264     $proxy->start();
    265     checkhandshake($proxy, checkhandshake::CLIENT_AUTH_HANDSHAKE,
    266                    checkhandshake::DEFAULT_EXTENSIONS
    267                    | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
    268                    | checkhandshake::STATUS_REQUEST_SRV_EXTENSION
    269                    | checkhandshake::POST_HANDSHAKE_AUTH_CLI_EXTENSION,
    270                    "status_request handshake with client auth test");
    271 }
    272 
    273 #Test 7: A client auth handshake
    274 $proxy->clear();
    275 $proxy->clientflags("-enable_pha -cert ".srctop_file("apps", "server.pem"));
    276 $proxy->serverflags("-Verify 5");
    277 $proxy->start();
    278 checkhandshake($proxy, checkhandshake::CLIENT_AUTH_HANDSHAKE,
    279                checkhandshake::DEFAULT_EXTENSIONS |
    280                checkhandshake::POST_HANDSHAKE_AUTH_CLI_EXTENSION,
    281                "Client auth handshake test");
    282 
    283 #Test 8: Server name handshake (no client request)
    284 $proxy->clear();
    285 $proxy->clientflags("-noservername");
    286 $proxy->start();
    287 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    288                checkhandshake::DEFAULT_EXTENSIONS
    289                & ~checkhandshake::SERVER_NAME_CLI_EXTENSION,
    290                "Server name handshake test (client)");
    291 
    292 #Test 9: Server name handshake (server support only)
    293 $proxy->clear();
    294 $proxy->clientflags("-noservername");
    295 $proxy->serverflags("-servername testhost");
    296 $proxy->start();
    297 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    298                checkhandshake::DEFAULT_EXTENSIONS
    299                & ~checkhandshake::SERVER_NAME_CLI_EXTENSION,
    300                "Server name handshake test (server)");
    301 
    302 #Test 10: Server name handshake (client and server)
    303 $proxy->clear();
    304 $proxy->clientflags("-servername testhost");
    305 $proxy->serverflags("-servername testhost");
    306 $proxy->start();
    307 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    308                checkhandshake::DEFAULT_EXTENSIONS
    309                | checkhandshake::SERVER_NAME_SRV_EXTENSION,
    310                "Server name handshake test");
    311 
    312 #Test 11: ALPN handshake (client request only)
    313 $proxy->clear();
    314 $proxy->clientflags("-alpn test");
    315 $proxy->start();
    316 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    317                checkhandshake::DEFAULT_EXTENSIONS
    318                | checkhandshake::ALPN_CLI_EXTENSION,
    319                "ALPN handshake test (client)");
    320 
    321 #Test 12: ALPN handshake (server support only)
    322 $proxy->clear();
    323 $proxy->serverflags("-alpn test");
    324 $proxy->start();
    325 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    326                checkhandshake::DEFAULT_EXTENSIONS,
    327                "ALPN handshake test (server)");
    328 
    329 #Test 13: ALPN handshake (client and server)
    330 $proxy->clear();
    331 $proxy->clientflags("-alpn test");
    332 $proxy->serverflags("-alpn test");
    333 $proxy->start();
    334 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    335                checkhandshake::DEFAULT_EXTENSIONS
    336                | checkhandshake::ALPN_CLI_EXTENSION
    337                | checkhandshake::ALPN_SRV_EXTENSION,
    338                "ALPN handshake test");
    339 
    340 SKIP: {
    341     skip "No CT, EC or OCSP support in this OpenSSL build", 1
    342         if disabled("ct") || disabled("ec") || disabled("ocsp");
    343 
    344     #Test 14: SCT handshake (client request only)
    345     $proxy->clear();
    346     #Note: -ct also sends status_request
    347     $proxy->clientflags("-ct");
    348     $proxy->serverflags("-status_file "
    349                         .srctop_file("test", "recipes", "ocsp-response.der")
    350                         ." -serverinfo ".srctop_file("test", "serverinfo2.pem"));
    351     $proxy->start();
    352     checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    353                    checkhandshake::DEFAULT_EXTENSIONS
    354                    | checkhandshake::SCT_CLI_EXTENSION
    355                    | checkhandshake::SCT_SRV_EXTENSION
    356                    | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
    357                    | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
    358                    "SCT handshake test");
    359 }
    360 
    361 #Test 15: HRR Handshake
    362 $proxy->clear();
    363 $proxy->serverflags("-curves P-256");
    364 $proxy->start();
    365 checkhandshake($proxy, checkhandshake::HRR_HANDSHAKE,
    366                checkhandshake::DEFAULT_EXTENSIONS
    367                | checkhandshake::KEY_SHARE_HRR_EXTENSION,
    368                "HRR handshake test");
    369 
    370 #Test 16: Resumption handshake with HRR
    371 $proxy->clear();
    372 $proxy->clientflags("-sess_in ".$session);
    373 $proxy->serverflags("-curves P-256");
    374 $proxy->start();
    375 checkhandshake($proxy, checkhandshake::HRR_RESUME_HANDSHAKE,
    376                (checkhandshake::DEFAULT_EXTENSIONS
    377                 | checkhandshake::KEY_SHARE_HRR_EXTENSION
    378                 | checkhandshake::PSK_CLI_EXTENSION
    379                 | checkhandshake::PSK_SRV_EXTENSION),
    380                "Resumption handshake with HRR test");
    381 
    382 #Test 17: Acceptable but non preferred key_share
    383 $proxy->clear();
    384 $proxy->clientflags("-curves P-256");
    385 $proxy->start();
    386 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
    387                checkhandshake::DEFAULT_EXTENSIONS
    388                | checkhandshake::SUPPORTED_GROUPS_SRV_EXTENSION,
    389                "Acceptable but non preferred key_share");
    390 
    391 unlink $session;
    392