Support disabling any or all TLS or DTLS versions
[openssl.git] / Configure
index c309485b24cb215f75b0de88dc9ccca1af130bd5..30e90b71e2e2423089f6d20cab346ba588eebf77 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -14,7 +14,7 @@ use File::Spec::Functions;
 
 # see INSTALL for instructions.
 
-my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] [--config=FILE] os/compiler[:flags]\n";
+my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] [--config=FILE] os/compiler[:flags]\n";
 
 # Options:
 #
@@ -50,6 +50,7 @@ my $usage="Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimenta
 # no-asm        do not use assembler
 # no-dso        do not compile in any native shared-library methods. This
 #               will ensure that all methods just return NULL.
+# no-egd        do not compile support for the entropy-gathering daemon APIs
 # [no-]zlib     [don't] compile support for zlib compression.
 # zlib-dynamic Like "zlib", but the zlib library is expected to be a shared
 #              library and will be loaded in run-time by the OpenSSL library.
@@ -819,6 +820,10 @@ my $default_ranlib;
 my $perl;
 my $fips=0;
 
+# Known TLS and DTLS protocols
+my @tls = qw(ssl3 tls1 tls1_1 tls1_2);
+my @dtls = qw(dtls1 dtls1_2);
+
 # Explicitelly known options that are possible to disable.  They can
 # be regexps, and will be used like this: /^no-${option}$/
 # For developers: keep it sorted alphabetically
@@ -846,6 +851,8 @@ my @disablables = (
     "dynamic[-_]engine",
     "ec",
     "ec2m",
+    "ecdh",
+    "ecdsa",
     "ec_nistp_64_gcc_128",
     "engine",
     "err",                     # Really???
@@ -886,25 +893,28 @@ my @disablables = (
     "srtp",
     "sse2",
     "ssl",
-    "ssl3",
-    "ssl3-method",
     "ssl-trace",
     "static-engine",
     "stdio",
     "store",
     "threads",
     "tls",
-    "tls1",
     "unit-test",
     "whirlpool",
     "zlib",
     "zlib-dynamic",
     );
+foreach my $proto ((@tls, @dtls))
+       {
+       push(@disablables, $proto);
+       push(@disablables, "$proto-method");
+       }
 
 # All of the following is disabled by default (RC5 was enabled before 0.9.8):
 
 my %disabled = ( # "what"         => "comment" [or special keyword "experimental"]
                 "ec_nistp_64_gcc_128" => "default",
+                "egd"            => "default",
                 "jpake"          => "experimental",
                 "md2"            => "default",
                 "rc5"            => "default",
@@ -998,19 +1008,35 @@ PROCESS_ARGS:
                        {
                        if (!($disabled{$1} eq "experimental"))
                                {
-                               if ($1 eq "ssl")
+                               foreach my $proto ((@tls, @dtls))
                                        {
-                                       $disabled{"ssl3"} = "option(ssl)";
+                                       if ($1 eq "$proto-method")
+                                               {
+                                               $disabled{"$proto"} = "option($proto-method)";
+                                               last;
+                                               }
                                        }
-                               elsif ($1 eq "tls")
+                               if ($1 eq "dtls")
                                        {
-                                       $disabled{"tls1"} = "option(tls)"
+                                        foreach my $proto (@dtls)
+                                               {
+                                               $disabled{$proto} = "option(dtls)";
+                                               }
                                        }
-                               elsif ($1 eq "ssl3-method")
+                               elsif ($1 eq "ssl")
                                        {
-                                       $disabled{"ssl3-method"} = "option(ssl)";
+                                       # Last one of its kind
                                        $disabled{"ssl3"} = "option(ssl)";
                                        }
+                               elsif ($1 eq "tls")
+                                       {
+                                        # XXX: Tests will fail if all SSL/TLS
+                                        # protocols are disabled.
+                                        foreach my $proto (@tls)
+                                               {
+                                               $disabled{$proto} = "option(tls)";
+                                               }
+                                       }
                                else
                                        {
                                        $disabled{$1} = "option";
@@ -1214,19 +1240,89 @@ if (defined($disabled{"ec"}))
        $disabled{"ecdh"} = "forced";
        }
 
-# SSL 3.0 and TLS requires MD5 and SHA and either RSA or DSA+DH
+# SSL 3.0 requires MD5 and SHA and either RSA or DSA+DH
 if (defined($disabled{"md5"}) || defined($disabled{"sha"})
     || (defined($disabled{"rsa"})
-        && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))))
+       && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))))
        {
        $disabled{"ssl3"} = "forced";
+       $disabled{"ssl"} = "forced";
+       }
+
+# (D)TLS 1.0 and TLS 1.1 require MD5 and SHA and either RSA or DSA+DH
+# or ECDSA + ECDH.  (XXX: We don't support PSK-only builds).
+#
+if (defined($disabled{"md5"}) || defined($disabled{"sha"})
+    || (defined($disabled{"rsa"})
+       && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))
+       && (defined($disabled{"ecdsa"}) || defined($disabled{"ecdh"}))))
+       {
        $disabled{"tls1"} = "forced";
+       $disabled{"dtls1"} = "forced";
+       $disabled{"tls1_1"} = "forced";
+       }
+
+# (D)TLS 1.2 requires either RSA or DSA+DH or ECDSA + ECDH
+# So if all are missing, we can't do either TLS or DTLS.
+# (XXX: We don't support PSK-only builds).
+#
+if (defined($disabled{"rsa"})
+    && (defined($disabled{"dsa"}) || defined($disabled{"dh"}))
+    && (defined($disabled{"ecdsa"}) || defined($disabled{"ecdh"})))
+       {
+       $disabled{"tls"} = "forced";
+       $disabled{"dtls"} = "forced";
+       foreach my $proto ((@tls, @dtls))
+               {
+               $disabled{"$proto"} = "forced";
+               }
+       }
+
+
+# Avoid protocol support holes.  Also disable all versions below N, if version
+# N is disabled while N+1 is enabled.
+#
+my $prev_disabled = 1;
+my $force_disable = 0;
+foreach my $proto (reverse(@tls))
+       {
+       if ($force_disable)
+               {
+               $disabled{$proto} = 1;
+               }
+       elsif (! defined($disabled{$proto}))
+               {
+               $prev_disabled = 0;
+               }
+       elsif (! $prev_disabled)
+               {
+               $force_disable = 1;
+               }
+       }
+my $prev_disabled = 1;
+my $force_disable = 0;
+foreach my $proto (reverse(@dtls))
+       {
+       if ($force_disable)
+               {
+               $disabled{$proto} = 1;
+               }
+       elsif (! defined($disabled{$proto}))
+               {
+               $prev_disabled = 0;
+               }
+       elsif (! $prev_disabled)
+               {
+               $force_disable = 1;
+               }
        }
 
 if (defined($disabled{"dgram"}))
        {
-        $disabled{"dtls"} = "forced";
-        }
+       $disabled{"dtls"} = "forced";
+       $disabled{"dtls1"} = "forced";
+       $disabled{"dtls1_2"} = "forced";
+       }
 
 if (defined($disabled{"ec"}) || defined($disabled{"dsa"})
     || defined($disabled{"dh"}) || defined($disabled{"stdio"}))
@@ -1268,7 +1364,6 @@ print "Configuring for $target\n";
 my ($d, $t) = $target =~ m/^(debug-)?(.*)$/;
 if ($d) {
     $build_prefix = "debug_";
-    $target = $t;
 
     # If we do not find debug-foo in the table, the target is set to foo,
     # but only if the foo target has a noon-empty debug_cflags or debug_lflags