| # -*- mode: perl; -*- |
| |
| ## SSL test configurations |
| |
| package ssltests; |
| |
| use strict; |
| use warnings; |
| |
| use OpenSSL::Test; |
| use OpenSSL::Test::Utils qw(anydisabled disabled); |
| setup("no_test_here"); |
| |
| our $fips_mode; |
| |
| my @protocols; |
| my @is_disabled = (0); |
| |
| # We test version-flexible negotiation (undef) and each protocol version. |
| if ($fips_mode) { |
| @protocols = (undef, "TLSv1.2", "DTLSv1.2"); |
| push @is_disabled, anydisabled("tls1_2", "dtls1_2"); |
| } else { |
| @protocols = (undef, "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2", "DTLSv1", "DTLSv1.2"); |
| push @is_disabled, anydisabled("ssl3", "tls1", "tls1_1", "tls1_2", "dtls1", "dtls1_2"); |
| } |
| |
| our @tests = (); |
| |
| sub generate_tests() { |
| foreach (0..$#protocols) { |
| my $protocol = $protocols[$_]; |
| my $protocol_name = $protocol || "flex"; |
| my $caalert; |
| my $method; |
| my $sctpenabled = 0; |
| if (!$is_disabled[$_]) { |
| if ($protocol_name eq "SSLv3") { |
| $caalert = "BadCertificate"; |
| } else { |
| $caalert = "UnknownCA"; |
| } |
| if ($protocol_name =~ m/^DTLS/) { |
| $method = "DTLS"; |
| $sctpenabled = 1 if !disabled("sctp"); |
| } |
| my $clihash; |
| my $clisigtype; |
| my $clisigalgs; |
| # TODO(TLS1.3) add TLSv1.3 versions |
| if ($protocol_name eq "TLSv1.2") { |
| $clihash = "SHA256"; |
| $clisigtype = "RSA"; |
| $clisigalgs = "SHA256+RSA"; |
| } |
| for (my $sctp = 0; $sctp <= $sctpenabled; $sctp++) { |
| # Sanity-check simple handshake. |
| push @tests, { |
| name => "server-auth-${protocol_name}" |
| .($sctp ? "-sctp" : ""), |
| server => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol |
| }, |
| client => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol |
| }, |
| test => { |
| "ExpectedResult" => "Success", |
| "Method" => $method, |
| }, |
| }; |
| $tests[-1]{"test"}{"UseSCTP"} = "Yes" if $sctp; |
| |
| # Handshake with client cert requested but not required or received. |
| push @tests, { |
| name => "client-auth-${protocol_name}-request" |
| .($sctp ? "-sctp" : ""), |
| server => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "VerifyMode" => "Request" |
| }, |
| client => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol |
| }, |
| test => { |
| "ExpectedResult" => "Success", |
| "Method" => $method, |
| }, |
| }; |
| $tests[-1]{"test"}{"UseSCTP"} = "Yes" if $sctp; |
| |
| # Handshake with client cert required but not present. |
| push @tests, { |
| name => "client-auth-${protocol_name}-require-fail" |
| .($sctp ? "-sctp" : ""), |
| server => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "VerifyCAFile" => test_pem("root-cert.pem"), |
| "VerifyMode" => "Require", |
| }, |
| client => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol |
| }, |
| test => { |
| "ExpectedResult" => "ServerFail", |
| "ExpectedServerAlert" => |
| ($protocol_name eq "flex" |
| && !disabled("tls1_3") |
| && (!disabled("ec") || !disabled("dh"))) |
| ? "CertificateRequired" : "HandshakeFailure", |
| "Method" => $method, |
| }, |
| }; |
| $tests[-1]{"test"}{"UseSCTP"} = "Yes" if $sctp; |
| |
| # Successful handshake with client authentication. |
| push @tests, { |
| name => "client-auth-${protocol_name}-require" |
| .($sctp ? "-sctp" : ""), |
| server => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "ClientSignatureAlgorithms" => $clisigalgs, |
| "VerifyCAFile" => test_pem("root-cert.pem"), |
| "VerifyMode" => "Request", |
| }, |
| client => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "Certificate" => test_pem("ee-client-chain.pem"), |
| "PrivateKey" => test_pem("ee-key.pem"), |
| }, |
| test => { |
| "ExpectedResult" => "Success", |
| "ExpectedClientCertType" => "RSA", |
| "ExpectedClientSignType" => $clisigtype, |
| "ExpectedClientSignHash" => $clihash, |
| "ExpectedClientCANames" => "empty", |
| "Method" => $method, |
| }, |
| }; |
| $tests[-1]{"test"}{"UseSCTP"} = "Yes" if $sctp; |
| |
| # Successful handshake with client authentication non-empty names |
| push @tests, { |
| name => "client-auth-${protocol_name}-require-non-empty-names" |
| .($sctp ? "-sctp" : ""), |
| server => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "ClientSignatureAlgorithms" => $clisigalgs, |
| "ClientCAFile" => test_pem("root-cert.pem"), |
| "VerifyCAFile" => test_pem("root-cert.pem"), |
| "VerifyMode" => "Request", |
| }, |
| client => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "Certificate" => test_pem("ee-client-chain.pem"), |
| "PrivateKey" => test_pem("ee-key.pem"), |
| }, |
| test => { |
| "ExpectedResult" => "Success", |
| "ExpectedClientCertType" => "RSA", |
| "ExpectedClientSignType" => $clisigtype, |
| "ExpectedClientSignHash" => $clihash, |
| "ExpectedClientCANames" => test_pem("root-cert.pem"), |
| "Method" => $method, |
| }, |
| }; |
| $tests[-1]{"test"}{"UseSCTP"} = "Yes" if $sctp; |
| |
| # Handshake with client authentication but without the root certificate. |
| push @tests, { |
| name => "client-auth-${protocol_name}-noroot" |
| .($sctp ? "-sctp" : ""), |
| server => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "VerifyMode" => "Require", |
| }, |
| client => { |
| "CipherString" => "DEFAULT:\@SECLEVEL=0", |
| "MinProtocol" => $protocol, |
| "MaxProtocol" => $protocol, |
| "Certificate" => test_pem("ee-client-chain.pem"), |
| "PrivateKey" => test_pem("ee-key.pem"), |
| }, |
| test => { |
| "ExpectedResult" => "ServerFail", |
| "ExpectedServerAlert" => $caalert, |
| "Method" => $method, |
| }, |
| }; |
| $tests[-1]{"test"}{"UseSCTP"} = "Yes" if $sctp; |
| } |
| } |
| } |
| } |
| |
| generate_tests(); |