Home | History | Annotate | Line # | Download | only in test
      1 SSL tests
      2 =========
      3 
      4 SSL testcases are configured in the `ssl-tests` directory.
      5 
      6 Each `ssl_*.cnf.in` file contains a number of test configurations. These files
      7 are used to generate testcases in the OpenSSL CONF format.
      8 
      9 The precise test output can be dependent on the library configuration. The test
     10 harness generates the output files on the fly.
     11 
     12 However, for verification, we also include checked-in configuration outputs
     13 corresponding to the default configuration. These testcases live in
     14 `test/ssl-tests/*.cnf` files.
     15 
     16 For more details, see `ssl-tests/01-simple.cnf.in` for an example.
     17 
     18 Configuring the test
     19 --------------------
     20 
     21 First, give your test a name. The names do not have to be unique.
     22 
     23 An example test input looks like this:
     24 
     25     {
     26         name => "test-default",
     27         server => { "CipherString" => "DEFAULT" },
     28         client => { "CipherString" => "DEFAULT" },
     29         test   => { "ExpectedResult" => "Success" },
     30     }
     31 
     32 The test section supports the following options
     33 
     34 ### Test mode
     35 
     36 * Method - the method to test. One of DTLS or TLS.
     37 
     38 * HandshakeMode - which handshake flavour to test:
     39   - Simple - plain handshake (default)
     40   - Resume - test resumption
     41   - RenegotiateServer - test server initiated renegotiation
     42   - RenegotiateClient - test client initiated renegotiation
     43 
     44 When HandshakeMode is Resume or Renegotiate, the original handshake is expected
     45 to succeed. All configured test expectations are verified against the second
     46 handshake.
     47 
     48 * ApplicationData - amount of application data bytes to send (integer, defaults
     49   to 256 bytes). Applies to both client and server. Application data is sent in
     50   64kB chunks (but limited by MaxFragmentSize and available parallelization, see
     51   below).
     52 
     53 * MaxFragmentSize - maximum send fragment size (integer, defaults to 512 in
     54   tests - see `SSL_CTX_set_max_send_fragment` for documentation). Applies to
     55   both client and server. Lowering the fragment size will split handshake and
     56   application data up between more `SSL_write` calls, thus allowing to exercise
     57   different code paths. In particular, if the buffer size (64kB) is at least
     58   four times as large as the maximum fragment, interleaved multi-buffer crypto
     59   implementations may be used on some platforms.
     60 
     61 ### Test expectations
     62 
     63 * ExpectedResult - expected handshake outcome. One of
     64   - Success - handshake success
     65   - ServerFail - serverside handshake failure
     66   - ClientFail - clientside handshake failure
     67   - InternalError - some other error
     68 
     69 * ExpectedClientAlert, ExpectedServerAlert - expected alert. See
     70   `test/helpers/ssl_test_ctx.c` for known values. Note: the expected alert is currently
     71   matched against the _last_ received alert (i.e., a fatal alert or a
     72   `close_notify`). Warning alert expectations are not yet supported. (A warning
     73   alert will not be correctly matched, if followed by a `close_notify` or
     74   another alert.)
     75 
     76 * ExpectedProtocol - expected negotiated protocol. One of
     77   SSLv3, TLSv1, TLSv1.1, TLSv1.2.
     78 
     79 * SessionTicketExpected - whether or not a session ticket is expected
     80   - Ignore - do not check for a session ticket (default)
     81   - Yes - a session ticket is expected
     82   - No - a session ticket is not expected
     83 
     84 * SessionIdExpected - whether or not a session id is expected
     85   - Ignore - do not check for a session id (default)
     86   - Yes - a session id is expected
     87   - No - a session id is not expected
     88 
     89 * ResumptionExpected - whether or not resumption is expected (Resume mode only)
     90   - Yes - resumed handshake
     91   - No - full handshake (default)
     92 
     93 * ExpectedNPNProtocol, ExpectedALPNProtocol - NPN and ALPN expectations.
     94 
     95 * ExpectedTmpKeyType - the expected algorithm or curve of server temp key
     96 
     97 * ExpectedServerCertType, ExpectedClientCertType - the expected algorithm or
     98   curve of server or client certificate
     99 
    100 * ExpectedServerSignHash, ExpectedClientSignHash - the expected
    101   signing hash used by server or client certificate
    102 
    103 * ExpectedServerSignType, ExpectedClientSignType - the expected
    104   signature type used by server or client when signing messages
    105 
    106 * ExpectedClientCANames - for client auth list of CA names the server must
    107   send. If this is "empty" the list is expected to be empty otherwise it
    108   is a file of certificates whose subject names form the list.
    109 
    110 * ExpectedServerCANames - list of CA names the client must send, TLS 1.3 only.
    111   If this is "empty" the list is expected to be empty otherwise it is a file
    112   of certificates whose subject names form the list.
    113 
    114 Configuring the client and server
    115 ---------------------------------
    116 
    117 The client and server configurations can be any valid `SSL_CTX`
    118 configurations. For details, see the manpages for `SSL_CONF_cmd`.
    119 
    120 Give your configurations as a dictionary of CONF commands, e.g.
    121 
    122     server => {
    123         "CipherString" => "DEFAULT",
    124         "MinProtocol" => "TLSv1",
    125     }
    126 
    127 The following sections may optionally be defined:
    128 
    129 * server2 - this section configures a secondary context that is selected via the
    130   ServerName test option. This context is used whenever a ServerNameCallback is
    131   specified. If the server2 section is not present, then the configuration
    132   matches server.
    133 * resume_server - this section configures the client to resume its session
    134   against a different server. This context is used whenever HandshakeMode is
    135   Resume. If the resume_server section is not present, then the configuration
    136   matches server.
    137 * resume_client - this section configures the client to resume its session with
    138   a different configuration. In practice this may occur when, for example,
    139   upgraded clients reuse sessions persisted on disk.  This context is used
    140   whenever HandshakeMode is Resume. If the resume_client section is not present,
    141   then the configuration matches client.
    142 
    143 ### Configuring callbacks and additional options
    144 
    145 Additional handshake settings can be configured in the `extra` section of each
    146 client and server:
    147 
    148     client => {
    149         "CipherString" => "DEFAULT",
    150         extra => {
    151             "ServerName" => "server2",
    152         }
    153     }
    154 
    155 #### Supported client-side options
    156 
    157 * ClientVerifyCallback - the client's custom certificate verify callback.
    158   Used to test callback behaviour. One of
    159   - None - no custom callback (default)
    160   - AcceptAll - accepts all certificates.
    161   - RejectAll - rejects all certificates.
    162 
    163 * ServerName - the server the client should attempt to connect to. One of
    164   - None - do not use SNI (default)
    165   - server1 - the initial context
    166   - server2 - the secondary context
    167   - invalid - an unknown context
    168 
    169 * CTValidation - Certificate Transparency validation strategy. One of
    170   - None - no validation (default)
    171   - Permissive - SSL_CT_VALIDATION_PERMISSIVE
    172   - Strict - SSL_CT_VALIDATION_STRICT
    173 
    174 #### Supported server-side options
    175 
    176 * ServerNameCallback - the SNI switching callback to use
    177   - None - no callback (default)
    178   - IgnoreMismatch - continue the handshake on SNI mismatch
    179   - RejectMismatch - abort the handshake on SNI mismatch
    180 
    181 * BrokenSessionTicket - a special test case where the session ticket callback
    182   does not initialize crypto.
    183   - No (default)
    184   - Yes
    185 
    186 #### Mutually supported options
    187 
    188 * NPNProtocols, ALPNProtocols - NPN and ALPN settings. Server and client
    189   protocols can be specified as a comma-separated list, and a callback with the
    190   recommended behaviour will be installed automatically.
    191 
    192 * SRPUser, SRPPassword - SRP settings. For client, this is the SRP user to
    193   connect as; for server, this is a known SRP user.
    194 
    195 ### Default server and client configurations
    196 
    197 The default server certificate and CA files are added to the configurations
    198 automatically. Server certificate verification is requested by default.
    199 
    200 You can override these options by redefining them:
    201 
    202     client => {
    203         "VerifyCAFile" => "/path/to/custom/file"
    204     }
    205 
    206 or by deleting them
    207 
    208     client => {
    209         "VerifyCAFile" => undef
    210     }
    211 
    212 Adding a test to the test harness
    213 ---------------------------------
    214 
    215 1. Add a new test configuration to `test/ssl-tests`, following the examples of
    216    existing `*.cnf.in` files (for example, `01-simple.cnf.in`).
    217 
    218 2. Generate the generated `*.cnf` test input file. You can do so by running
    219    `generate_ssl_tests.pl`:
    220 
    221     $ ./config
    222     $ cd test
    223     $ TOP=.. perl -I ../util/perl/ generate_ssl_tests.pl \
    224       ssl-tests/my.cnf.in default > ssl-tests/my.cnf
    225 
    226 where `my.cnf.in` is your test input file and `default` is the provider to use.
    227 For all the pre-generated test files you should use the default provider.
    228 
    229 For example, to generate the test cases in `ssl-tests/01-simple.cnf.in`, do
    230 
    231     $ TOP=.. perl -I ../util/perl/ generate_ssl_tests.pl \
    232       ssl-tests/01-simple.cnf.in default > ssl-tests/01-simple.cnf
    233 
    234 Alternatively (hackish but simple), you can comment out
    235 
    236     unlink glob $tmp_file;
    237 
    238 in `test/recipes/80-test_ssl_new.t` and run
    239 
    240     $ make TESTS=test_ssl_new test
    241 
    242 This will save the generated output in a `*.tmp` file in the build directory.
    243 
    244 3. Update the number of tests planned in `test/recipes/80-test_ssl_new.t`. If
    245    the test suite has any skip conditions, update those too (see
    246    `test/recipes/80-test_ssl_new.t` for details).
    247 
    248 Running the tests with the test harness
    249 ---------------------------------------
    250 
    251     HARNESS_VERBOSE=yes make TESTS=test_ssl_new test
    252 
    253 Running a test manually
    254 -----------------------
    255 
    256 These steps are only needed during development. End users should run `make test`
    257 or follow the instructions above to run the SSL test suite.
    258 
    259 To run an SSL test manually from the command line, the `TEST_CERTS_DIR`
    260 environment variable to point to the location of the certs. E.g., from the root
    261 OpenSSL directory, do
    262 
    263     $ CTLOG_FILE=test/ct/log_list.cnf TEST_CERTS_DIR=test/certs test/ssl_test \
    264       test/ssl-tests/01-simple.cnf default
    265 
    266 or for shared builds
    267 
    268     $ CTLOG_FILE=test/ct/log_list.cnf  TEST_CERTS_DIR=test/certs \
    269       util/wrap.pl test/ssl_test test/ssl-tests/01-simple.cnf default
    270 
    271 In the above examples, `default` is the provider to use.
    272 
    273 Note that the test expectations sometimes depend on the Configure settings. For
    274 example, the negotiated protocol depends on the set of available (enabled)
    275 protocols: a build with `enable-ssl3` has different test expectations than a
    276 build with `no-ssl3`.
    277 
    278 The Perl test harness automatically generates expected outputs, so users who
    279 just run `make test` do not need any extra steps.
    280 
    281 However, when running a test manually, keep in mind that the repository version
    282 of the generated `test/ssl-tests/*.cnf` correspond to expected outputs in with
    283 the default Configure options. To run `ssl_test` manually from the command line
    284 in a build with a different configuration, you may need to generate the right
    285 `*.cnf` file from the `*.cnf.in` input first.
    286