Repository: randombit/botan
Pull request #2505 (2020-11-21 17:38:47)

Remove TLS support for DSA certificates/ciphersuites


Patch:
diff --git a/doc/deprecated.rst b/doc/deprecated.rst
index 30efbf266..0d16e5f9a 100644
--- a/doc/deprecated.rst
+++ b/doc/deprecated.rst
@@ -26,8 +26,6 @@ in a future major release:
 
 - Support for TLSv1.0/v1.1 and DTLS v1.0
 
-- All support for DSA ciphersuites/certificates
-
 - Support for point compression in TLS. This is supported in v1.2 but
   removed in v1.3. For simplicity it will be removed in v1.2 also.
 
diff --git a/src/lib/tls/tls_algos.cpp b/src/lib/tls/tls_algos.cpp
index 3d5ddacef..5c383807b 100644
--- a/src/lib/tls/tls_algos.cpp
+++ b/src/lib/tls/tls_algos.cpp
@@ -86,8 +86,6 @@ std::string auth_method_to_string(Auth_Method method)
       {
       case Auth_Method::RSA:
          return "RSA";
-      case Auth_Method::DSA:
-         return "DSA";
       case Auth_Method::ECDSA:
          return "ECDSA";
       case Auth_Method::IMPLICIT:
@@ -101,8 +99,6 @@ Auth_Method auth_method_from_string(const std::string& str)
    {
    if(str == "RSA")
       return Auth_Method::RSA;
-   if(str == "DSA")
-      return Auth_Method::DSA;
    if(str == "ECDSA")
       return Auth_Method::ECDSA;
    if(str == "IMPLICIT")
@@ -188,24 +184,20 @@ std::string hash_function_of_scheme(Signature_Scheme scheme)
    {
    switch(scheme)
       {
-      case Signature_Scheme::DSA_SHA1:
       case Signature_Scheme::ECDSA_SHA1:
       case Signature_Scheme::RSA_PKCS1_SHA1:
          return "SHA-1";
 
-      case Signature_Scheme::DSA_SHA256:
       case Signature_Scheme::ECDSA_SHA256:
       case Signature_Scheme::RSA_PKCS1_SHA256:
       case Signature_Scheme::RSA_PSS_SHA256:
          return "SHA-256";
 
-      case Signature_Scheme::DSA_SHA384:
       case Signature_Scheme::ECDSA_SHA384:
       case Signature_Scheme::RSA_PKCS1_SHA384:
       case Signature_Scheme::RSA_PSS_SHA384:
          return "SHA-384";
 
-      case Signature_Scheme::DSA_SHA512:
       case Signature_Scheme::ECDSA_SHA512:
       case Signature_Scheme::RSA_PKCS1_SHA512:
       case Signature_Scheme::RSA_PSS_SHA512:
@@ -243,13 +235,8 @@ const std::vector<Signature_Scheme>& all_signature_schemes()
       Signature_Scheme::ECDSA_SHA512,
       Signature_Scheme::ECDSA_SHA256,
 
-      Signature_Scheme::DSA_SHA384,
-      Signature_Scheme::DSA_SHA512,
-      Signature_Scheme::DSA_SHA256,
-
       Signature_Scheme::RSA_PKCS1_SHA1,
       Signature_Scheme::ECDSA_SHA1,
-      Signature_Scheme::DSA_SHA1,
    };
 
    return all_schemes;
@@ -267,11 +254,6 @@ bool signature_scheme_is_known(Signature_Scheme scheme)
       case Signature_Scheme::RSA_PSS_SHA384:
       case Signature_Scheme::RSA_PSS_SHA512:
 
-      case Signature_Scheme::DSA_SHA1:
-      case Signature_Scheme::DSA_SHA256:
-      case Signature_Scheme::DSA_SHA384:
-      case Signature_Scheme::DSA_SHA512:
-
       case Signature_Scheme::ECDSA_SHA1:
       case Signature_Scheme::ECDSA_SHA256:
       case Signature_Scheme::ECDSA_SHA384:
@@ -297,12 +279,6 @@ std::string signature_algorithm_of_scheme(Signature_Scheme scheme)
       case Signature_Scheme::RSA_PSS_SHA512:
          return "RSA";
 
-      case Signature_Scheme::DSA_SHA1:
-      case Signature_Scheme::DSA_SHA256:
-      case Signature_Scheme::DSA_SHA384:
-      case Signature_Scheme::DSA_SHA512:
-         return "DSA";
-
       case Signature_Scheme::ECDSA_SHA1:
       case Signature_Scheme::ECDSA_SHA256:
       case Signature_Scheme::ECDSA_SHA384:
@@ -335,15 +311,6 @@ std::string sig_scheme_to_string(Signature_Scheme scheme)
       case Signature_Scheme::RSA_PKCS1_SHA512:
          return "RSA_PKCS1_SHA512";
 
-      case Signature_Scheme::DSA_SHA1:
-         return "DSA_SHA1";
-      case Signature_Scheme::DSA_SHA256:
-         return "DSA_SHA256";
-      case Signature_Scheme::DSA_SHA384:
-         return "DSA_SHA384";
-      case Signature_Scheme::DSA_SHA512:
-         return "DSA_SHA512";
-
       case Signature_Scheme::ECDSA_SHA1:
          return "ECDSA_SHA1";
       case Signature_Scheme::ECDSA_SHA256:
@@ -385,16 +352,12 @@ std::string padding_string_for_scheme(Signature_Scheme scheme)
       case Signature_Scheme::RSA_PKCS1_SHA512:
          return "EMSA_PKCS1(SHA-512)";
 
-      case Signature_Scheme::DSA_SHA1:
       case Signature_Scheme::ECDSA_SHA1:
          return "EMSA1(SHA-1)";
-      case Signature_Scheme::DSA_SHA256:
       case Signature_Scheme::ECDSA_SHA256:
          return "EMSA1(SHA-256)";
-      case Signature_Scheme::DSA_SHA384:
       case Signature_Scheme::ECDSA_SHA384:
          return "EMSA1(SHA-384)";
-      case Signature_Scheme::DSA_SHA512:
       case Signature_Scheme::ECDSA_SHA512:
          return "EMSA1(SHA-512)";
 
diff --git a/src/lib/tls/tls_algos.h b/src/lib/tls/tls_algos.h
index 325bdf5a3..0d3a02304 100644
--- a/src/lib/tls/tls_algos.h
+++ b/src/lib/tls/tls_algos.h
@@ -69,7 +69,6 @@ enum class Nonce_Format {
 // TODO this should include hash etc as in TLS v1.3
 enum class Auth_Method {
    RSA,
-   DSA,
    ECDSA,
 
    // These are placed outside the encodable range
@@ -90,11 +89,6 @@ enum class Signature_Scheme : uint16_t {
    RSA_PKCS1_SHA384 = 0x0501,
    RSA_PKCS1_SHA512 = 0x0601,
 
-   DSA_SHA1   = 0x0202,
-   DSA_SHA256 = 0x0402,
-   DSA_SHA384 = 0x0502,
-   DSA_SHA512 = 0x0602,
-
    ECDSA_SHA1   = 0x0203,
    ECDSA_SHA256 = 0x0403,
    ECDSA_SHA384 = 0x0503,
diff --git a/src/lib/tls/tls_ciphersuite.cpp b/src/lib/tls/tls_ciphersuite.cpp
index e5db300bf..738be110b 100644
--- a/src/lib/tls/tls_ciphersuite.cpp
+++ b/src/lib/tls/tls_ciphersuite.cpp
@@ -224,13 +224,7 @@ bool Ciphersuite::is_usable() const
 #endif
       }
 
-   if(auth_method() == Auth_Method::DSA)
-      {
-#if !defined(BOTAN_HAS_DSA)
-      return false;
-#endif
-      }
-   else if(auth_method() == Auth_Method::ECDSA)
+   if(auth_method() == Auth_Method::ECDSA)
       {
 #if !defined(BOTAN_HAS_ECDSA)
       return false;
diff --git a/src/lib/tls/tls_handshake_state.cpp b/src/lib/tls/tls_handshake_state.cpp
index 9c9390a22..7c1264511 100644
--- a/src/lib/tls/tls_handshake_state.cpp
+++ b/src/lib/tls/tls_handshake_state.cpp
@@ -415,7 +415,6 @@ Handshake_State::choose_sig_format(const Private_Key& key,
          // Implicit SHA-1
          requested.push_back(Signature_Scheme::RSA_PKCS1_SHA1);
          requested.push_back(Signature_Scheme::ECDSA_SHA1);
-         requested.push_back(Signature_Scheme::DSA_SHA1);
          }
 
       for(Signature_Scheme scheme : allowed)
diff --git a/src/lib/tls/tls_policy.cpp b/src/lib/tls/tls_policy.cpp
index 8716fbb15..a63c73101 100644
--- a/src/lib/tls/tls_policy.cpp
+++ b/src/lib/tls/tls_policy.cpp
@@ -221,12 +221,6 @@ size_t Policy::minimum_rsa_bits() const
    return 2048;
    }
 
-size_t Policy::minimum_dsa_group_size() const
-   {
-   // FIPS 186-3
-   return 2048;
-   }
-
 void Policy::check_peer_key_acceptable(const Public_Key& public_key) const
    {
    const std::string algo_name = public_key.algo_name();
@@ -242,10 +236,6 @@ void Policy::check_peer_key_acceptable(const Public_Key& public_key) const
       {
       expected_keylength = minimum_dh_group_size();
       }
-   else if(algo_name == "DSA")
-      {
-      expected_keylength = minimum_dsa_group_size();
-      }
    else if(algo_name == "ECDH" || algo_name == "Curve25519")
       {
       expected_keylength = minimum_ecdh_group_size();
diff --git a/src/lib/tls/tls_policy.h b/src/lib/tls/tls_policy.h
index 4fbbd7545..c0f618e0f 100644
--- a/src/lib/tls/tls_policy.h
+++ b/src/lib/tls/tls_policy.h
@@ -195,11 +195,6 @@ class BOTAN_PUBLIC_API(2,0) Policy
       */
       virtual size_t minimum_rsa_bits() const;
 
-      /**
-      * Minimum DSA group size, default 2048 bits
-      */
-      virtual size_t minimum_dsa_group_size() const;
-
       /**
       * Throw an exception if you don't like the peer's key.
       * Default impl checks the key size against minimum_rsa_bits, minimum_ecdsa_group_size,
@@ -464,7 +459,6 @@ class BOTAN_PUBLIC_API(2,0) BSI_TR_02102_2 : public Policy
 
       size_t minimum_rsa_bits() const override { return 2000; }
       size_t minimum_dh_group_size() const override { return 2000; }
-      size_t minimum_dsa_group_size() const override { return 2000; }
 
       size_t minimum_ecdh_group_size() const override { return 250; }
       size_t minimum_ecdsa_group_size() const override { return 250; }
diff --git a/src/lib/tls/tls_server.cpp b/src/lib/tls/tls_server.cpp
index 62fdd2d90..3fd4565fd 100644
--- a/src/lib/tls/tls_server.cpp
+++ b/src/lib/tls/tls_server.cpp
@@ -224,7 +224,6 @@ uint16_t choose_ciphersuite(
                // If empty, then implicit SHA-1 (TLS v1.2 rules)
                client_sig_methods.push_back(Signature_Scheme::RSA_PKCS1_SHA1);
                client_sig_methods.push_back(Signature_Scheme::ECDSA_SHA1);
-               client_sig_methods.push_back(Signature_Scheme::DSA_SHA1);
                }
 
             bool we_support_some_hash_by_client = false;
diff --git a/src/lib/tls/tls_suite_info.cpp b/src/lib/tls/tls_suite_info.cpp
index 31105fbd3..4c49f72ad 100644
--- a/src/lib/tls/tls_suite_info.cpp
+++ b/src/lib/tls/tls_suite_info.cpp
@@ -3,7 +3,7 @@
 *
 * This file was automatically generated from the IANA assignments
 * (tls-parameters.txt sha256 6412d7a966151d409d463681e5427e706cd9066f13d34ca7a89f8cc2f7dff4b2)
-* by ./src/scripts/tls_suite_info.py on 2020-11-16
+* by ./src/scripts/tls_suite_info.py on 2020-11-17
 *
 * Botan is released under the Simplified BSD License (see license.txt)
 */
@@ -18,25 +18,18 @@ const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites()
    // Note that this list of ciphersuites is ordered by id!
    static const std::vector<Ciphersuite> g_ciphersuite_list = {
       Ciphersuite(0x000A, "RSA_WITH_3DES_EDE_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0013, "DHE_DSS_WITH_3DES_EDE_CBC_SHA", Auth_Method::DSA, Kex_Algo::DH, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0016, "DHE_RSA_WITH_3DES_EDE_CBC_SHA", Auth_Method::RSA, Kex_Algo::DH, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x002F, "RSA_WITH_AES_128_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0032, "DHE_DSS_WITH_AES_128_CBC_SHA", Auth_Method::DSA, Kex_Algo::DH, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0033, "DHE_RSA_WITH_AES_128_CBC_SHA", Auth_Method::RSA, Kex_Algo::DH, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0035, "RSA_WITH_AES_256_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0038, "DHE_DSS_WITH_AES_256_CBC_SHA", Auth_Method::DSA, Kex_Algo::DH, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0039, "DHE_RSA_WITH_AES_256_CBC_SHA", Auth_Method::RSA, Kex_Algo::DH, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x003C, "RSA_WITH_AES_128_CBC_SHA256", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "AES-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x003D, "RSA_WITH_AES_256_CBC_SHA256", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "AES-256", 32, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0040, "DHE_DSS_WITH_AES_128_CBC_SHA256", Auth_Method::DSA, Kex_Algo::DH, "AES-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0041, "RSA_WITH_CAMELLIA_128_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "Camellia-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0044, "DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", Auth_Method::DSA, Kex_Algo::DH, "Camellia-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0045, "DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", Auth_Method::RSA, Kex_Algo::DH, "Camellia-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0067, "DHE_RSA_WITH_AES_128_CBC_SHA256", Auth_Method::RSA, Kex_Algo::DH, "AES-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x006A, "DHE_DSS_WITH_AES_256_CBC_SHA256", Auth_Method::DSA, Kex_Algo::DH, "AES-256", 32, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x006B, "DHE_RSA_WITH_AES_256_CBC_SHA256", Auth_Method::RSA, Kex_Algo::DH, "AES-256", 32, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0084, "RSA_WITH_CAMELLIA_256_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "Camellia-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0087, "DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", Auth_Method::DSA, Kex_Algo::DH, "Camellia-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0088, "DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", Auth_Method::RSA, Kex_Algo::DH, "Camellia-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x008B, "PSK_WITH_3DES_EDE_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::PSK, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x008C, "PSK_WITH_AES_128_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::PSK, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
@@ -45,14 +38,11 @@ const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites()
       Ciphersuite(0x0090, "DHE_PSK_WITH_AES_128_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::DHE_PSK, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0091, "DHE_PSK_WITH_AES_256_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::DHE_PSK, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x0096, "RSA_WITH_SEED_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "SEED", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x0099, "DHE_DSS_WITH_SEED_CBC_SHA", Auth_Method::DSA, Kex_Algo::DH, "SEED", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x009A, "DHE_RSA_WITH_SEED_CBC_SHA", Auth_Method::RSA, Kex_Algo::DH, "SEED", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0x009C, "RSA_WITH_AES_128_GCM_SHA256", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "AES-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0x009D, "RSA_WITH_AES_256_GCM_SHA384", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "AES-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0x009E, "DHE_RSA_WITH_AES_128_GCM_SHA256", Auth_Method::RSA, Kex_Algo::DH, "AES-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0x009F, "DHE_RSA_WITH_AES_256_GCM_SHA384", Auth_Method::RSA, Kex_Algo::DH, "AES-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
-      Ciphersuite(0x00A2, "DHE_DSS_WITH_AES_128_GCM_SHA256", Auth_Method::DSA, Kex_Algo::DH, "AES-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
-      Ciphersuite(0x00A3, "DHE_DSS_WITH_AES_256_GCM_SHA384", Auth_Method::DSA, Kex_Algo::DH, "AES-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0x00A8, "PSK_WITH_AES_128_GCM_SHA256", Auth_Method::IMPLICIT, Kex_Algo::PSK, "AES-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0x00A9, "PSK_WITH_AES_256_GCM_SHA384", Auth_Method::IMPLICIT, Kex_Algo::PSK, "AES-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0x00AA, "DHE_PSK_WITH_AES_128_GCM_SHA256", Auth_Method::IMPLICIT, Kex_Algo::DHE_PSK, "AES-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
@@ -62,10 +52,8 @@ const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites()
       Ciphersuite(0x00B2, "DHE_PSK_WITH_AES_128_CBC_SHA256", Auth_Method::IMPLICIT, Kex_Algo::DHE_PSK, "AES-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x00B3, "DHE_PSK_WITH_AES_256_CBC_SHA384", Auth_Method::IMPLICIT, Kex_Algo::DHE_PSK, "AES-256", 32, "SHA-384", 48, KDF_Algo::SHA_384, Nonce_Format::CBC_MODE),
       Ciphersuite(0x00BA, "RSA_WITH_CAMELLIA_128_CBC_SHA256", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "Camellia-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x00BD, "DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256", Auth_Method::DSA, Kex_Algo::DH, "Camellia-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x00BE, "DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", Auth_Method::RSA, Kex_Algo::DH, "Camellia-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x00C0, "RSA_WITH_CAMELLIA_256_CBC_SHA256", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "Camellia-256", 32, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
-      Ciphersuite(0x00C3, "DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256", Auth_Method::DSA, Kex_Algo::DH, "Camellia-256", 32, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x00C4, "DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256", Auth_Method::RSA, Kex_Algo::DH, "Camellia-256", 32, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0x16B7, "CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256", Auth_Method::RSA, Kex_Algo::CECPQ1, "ChaCha20Poly1305", 32, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_XOR_12),
       Ciphersuite(0x16B8, "CECPQ1_ECDSA_WITH_CHACHA20_POLY1305_SHA256", Auth_Method::ECDSA, Kex_Algo::CECPQ1, "ChaCha20Poly1305", 32, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_XOR_12),
@@ -79,13 +67,10 @@ const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites()
       Ciphersuite(0xC014, "ECDHE_RSA_WITH_AES_256_CBC_SHA", Auth_Method::RSA, Kex_Algo::ECDH, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC01A, "SRP_SHA_WITH_3DES_EDE_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::SRP_SHA, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC01B, "SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA", Auth_Method::RSA, Kex_Algo::SRP_SHA, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0xC01C, "SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA", Auth_Method::DSA, Kex_Algo::SRP_SHA, "3DES", 24, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC01D, "SRP_SHA_WITH_AES_128_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::SRP_SHA, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC01E, "SRP_SHA_RSA_WITH_AES_128_CBC_SHA", Auth_Method::RSA, Kex_Algo::SRP_SHA, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0xC01F, "SRP_SHA_DSS_WITH_AES_128_CBC_SHA", Auth_Method::DSA, Kex_Algo::SRP_SHA, "AES-128", 16, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC020, "SRP_SHA_WITH_AES_256_CBC_SHA", Auth_Method::IMPLICIT, Kex_Algo::SRP_SHA, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC021, "SRP_SHA_RSA_WITH_AES_256_CBC_SHA", Auth_Method::RSA, Kex_Algo::SRP_SHA, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
-      Ciphersuite(0xC022, "SRP_SHA_DSS_WITH_AES_256_CBC_SHA", Auth_Method::DSA, Kex_Algo::SRP_SHA, "AES-256", 32, "SHA-1", 20, KDF_Algo::SHA_1, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC023, "ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", Auth_Method::ECDSA, Kex_Algo::ECDH, "AES-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC024, "ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", Auth_Method::ECDSA, Kex_Algo::ECDH, "AES-256", 32, "SHA-384", 48, KDF_Algo::SHA_384, Nonce_Format::CBC_MODE),
       Ciphersuite(0xC027, "ECDHE_RSA_WITH_AES_128_CBC_SHA256", Auth_Method::RSA, Kex_Algo::ECDH, "AES-128", 16, "SHA-256", 32, KDF_Algo::SHA_256, Nonce_Format::CBC_MODE),
@@ -103,8 +88,6 @@ const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites()
       Ciphersuite(0xC051, "RSA_WITH_ARIA_256_GCM_SHA384", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "ARIA-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC052, "DHE_RSA_WITH_ARIA_128_GCM_SHA256", Auth_Method::RSA, Kex_Algo::DH, "ARIA-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC053, "DHE_RSA_WITH_ARIA_256_GCM_SHA384", Auth_Method::RSA, Kex_Algo::DH, "ARIA-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
-      Ciphersuite(0xC056, "DHE_DSS_WITH_ARIA_128_GCM_SHA256", Auth_Method::DSA, Kex_Algo::DH, "ARIA-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
-      Ciphersuite(0xC057, "DHE_DSS_WITH_ARIA_256_GCM_SHA384", Auth_Method::DSA, Kex_Algo::DH, "ARIA-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC05C, "ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256", Auth_Method::ECDSA, Kex_Algo::ECDH, "ARIA-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC05D, "ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384", Auth_Method::ECDSA, Kex_Algo::ECDH, "ARIA-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC060, "ECDHE_RSA_WITH_ARIA_128_GCM_SHA256", Auth_Method::RSA, Kex_Algo::ECDH, "ARIA-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
@@ -121,8 +104,6 @@ const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites()
       Ciphersuite(0xC07B, "RSA_WITH_CAMELLIA_256_GCM_SHA384", Auth_Method::IMPLICIT, Kex_Algo::STATIC_RSA, "Camellia-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC07C, "DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256", Auth_Method::RSA, Kex_Algo::DH, "Camellia-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC07D, "DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384", Auth_Method::RSA, Kex_Algo::DH, "Camellia-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
-      Ciphersuite(0xC080, "DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256", Auth_Method::DSA, Kex_Algo::DH, "Camellia-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
-      Ciphersuite(0xC081, "DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384", Auth_Method::DSA, Kex_Algo::DH, "Camellia-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC086, "ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256", Auth_Method::ECDSA, Kex_Algo::ECDH, "Camellia-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC087, "ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384", Auth_Method::ECDSA, Kex_Algo::ECDH, "Camellia-256/GCM", 32, "AEAD", 0, KDF_Algo::SHA_384, Nonce_Format::AEAD_IMPLICIT_4),
       Ciphersuite(0xC08A, "ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256", Auth_Method::RSA, Kex_Algo::ECDH, "Camellia-128/GCM", 16, "AEAD", 0, KDF_Algo::SHA_256, Nonce_Format::AEAD_IMPLICIT_4),
diff --git a/src/scripts/tls_suite_info.py b/src/scripts/tls_suite_info.py
index 8b7b15e62..3e3c40307 100755
--- a/src/scripts/tls_suite_info.py
+++ b/src/scripts/tls_suite_info.py
@@ -194,7 +194,7 @@ def main(args = None):
     if args is None:
         args = sys.argv
 
-    weak_crypto = ['EXPORT', 'RC2', 'IDEA', 'RC4', '_DES_', 'WITH_NULL', 'GOST', '_anon_']
+    weak_crypto = ['EXPORT', 'RC2', 'IDEA', 'RC4', '_DES_', 'WITH_NULL', 'GOST', '_anon_', '_DSS_']
     static_dh = ['ECDH_ECDSA', 'ECDH_RSA', 'DH_DSS', 'DH_RSA'] # not supported
     protocol_goop = ['SCSV', 'KRB5']
     maybe_someday = ['RSA_PSK', 'ECCPWD']
@@ -212,7 +212,8 @@ def main(args = None):
     contents = ''
 
     for line in open_input(args):
-        line = line.decode('utf8')
+        if not isinstance(line, str):
+            line = line.decode('utf8')
         contents += line
         match = ciphersuite_re.match(line)
         if match:


Test patch:
diff --git a/src/tests/test_tls.cpp b/src/tests/test_tls.cpp
index 8e55bd928..454388d0a 100644
--- a/src/tests/test_tls.cpp
+++ b/src/tests/test_tls.cpp
@@ -442,7 +442,6 @@ class Test_TLS_Algo_Strings : public Test
 
          const std::vector<Botan::TLS::Auth_Method> auth_methods({
             Botan::TLS::Auth_Method::RSA,
-            Botan::TLS::Auth_Method::DSA,
             Botan::TLS::Auth_Method::ECDSA,
             Botan::TLS::Auth_Method::IMPLICIT,
             });
diff --git a/src/tests/unit_tls.cpp b/src/tests/unit_tls.cpp
index 4dd291d01..8ecd305e9 100644
--- a/src/tests/unit_tls.cpp
+++ b/src/tests/unit_tls.cpp
@@ -28,10 +28,6 @@
    #include <botan/x509_ca.h>
    #include <botan/x509self.h>
 
-   #if defined(BOTAN_HAS_DSA)
-      #include <botan/dsa.h>
-   #endif
-
    #if defined(BOTAN_HAS_SRP6)
       #include <botan/srp6.h>
    #endif
@@ -58,21 +54,13 @@ class Credentials_Manager_Test final : public Botan::Credentials_Manager
                                const Botan::X509_Certificate& ecdsa_cert,
                                Botan::Private_Key* ecdsa_key,
                                const Botan::X509_Certificate& ecdsa_ca,
-                               const Botan::X509_CRL& ecdsa_crl,
-                               const Botan::X509_Certificate* dsa_cert,
-                               Botan::Private_Key* dsa_key,
-                               const Botan::X509_Certificate* dsa_ca,
-                               Botan::X509_CRL* dsa_crl) :
+                               const Botan::X509_CRL& ecdsa_crl) :
          m_rsa_cert(rsa_cert),
          m_rsa_ca(rsa_ca),
          m_rsa_key(rsa_key),
          m_ecdsa_cert(ecdsa_cert),
          m_ecdsa_ca(ecdsa_ca),
-         m_ecdsa_key(ecdsa_key),
-         m_dsa_cert(dsa_cert),
-         m_dsa_ca(dsa_ca),
-         m_dsa_key(dsa_key),
-         m_dsa_crl(dsa_crl)
+         m_ecdsa_key(ecdsa_key)
          {
          std::unique_ptr<Botan::Certificate_Store_In_Memory> store(new Botan::Certificate_Store_In_Memory);
          store->add_certificate(m_rsa_ca);
@@ -80,15 +68,6 @@ class Credentials_Manager_Test final : public Botan::Credentials_Manager
          store->add_crl(rsa_crl);
          store->add_crl(ecdsa_crl);
 
-         if(m_dsa_ca != nullptr)
-            {
-            store->add_certificate(*m_dsa_ca);
-            }
-         if(m_dsa_crl != nullptr)
-            {
-            store->add_crl(*m_dsa_crl);
-            }
-
          m_stores.push_back(std::move(store));
          m_provides_client_certs = with_client_certs;
          }
@@ -111,6 +90,7 @@ class Credentials_Manager_Test final : public Botan::Credentials_Manager
          const std::string& type,
          const std::string& context) override
          {
+         BOTAN_UNUSED(context);
          std::vector<Botan::X509_Certificate> chain;
 
          if(m_acceptable_cas.empty())
@@ -132,20 +112,6 @@ class Credentials_Manager_Test final : public Botan::Credentials_Manager
                   chain.push_back(m_ecdsa_ca);
                   break;
                   }
-#if defined(BOTAN_HAS_DSA)
-               else if(key_type == "DSA")
-                  {
-                  if(m_dsa_cert == nullptr || m_dsa_ca == nullptr)
-                     {
-                     throw Test_Error("No DSA certificates set for " + type + "/" + context);
-                     }
-                  chain.push_back(*m_dsa_cert);
-                  chain.push_back(*m_dsa_ca);
-                  break;
-                  }
-#else
-               BOTAN_UNUSED(context);
-#endif
                }
             }
 
@@ -164,10 +130,6 @@ class Credentials_Manager_Test final : public Botan::Credentials_Manager
             {
             return m_ecdsa_key.get();
             }
-         if(crt == *m_dsa_cert)
-            {
-            return m_dsa_key.get();
-            }
          return nullptr;
          }
 
@@ -207,9 +169,6 @@ class Credentials_Manager_Test final : public Botan::Credentials_Manager
       Botan::X509_Certificate m_ecdsa_cert, m_ecdsa_ca;
       std::unique_ptr<Botan::Private_Key> m_ecdsa_key;
 
-      std::unique_ptr<const Botan::X509_Certificate> m_dsa_cert, m_dsa_ca;
-      std::unique_ptr<Botan::Private_Key> m_dsa_key;
-      std::unique_ptr<Botan::X509_CRL> m_dsa_crl;
       std::vector<std::unique_ptr<Botan::Certificate_Store>> m_stores;
       bool m_provides_client_certs;
       std::vector<Botan::X509_DN> m_acceptable_cas;
@@ -270,33 +229,10 @@ create_creds(Botan::RandomNumberGenerator& rng,
    std::unique_ptr<Botan::X509_Certificate> dsa_srv_cert;
    std::unique_ptr<Botan::X509_Certificate> dsa_ca_cert;
 
-#if defined(BOTAN_HAS_DSA)
-   const Botan::DL_Group dsa_params("dsa/jce/1024");
-
-   dsa_ca_key.reset(new Botan::DSA_PrivateKey(rng, dsa_params));
-   dsa_srv_key.reset(new Botan::DSA_PrivateKey(rng, dsa_params));
-
-   Botan::X509_Cert_Options dsa_ca_opts("DSA Test CA/VT");
-   dsa_ca_opts.CA_key(1);
-
-   dsa_ca_cert.reset(new Botan::X509_Certificate(
-                        Botan::X509::create_self_signed_cert(dsa_ca_opts, *dsa_ca_key, "SHA-256", rng)));
-
-   const Botan::PKCS10_Request dsa_req =
-      Botan::X509::create_cert_req(server_opts, *dsa_srv_key, "SHA-256", rng);
-
-   Botan::X509_CA dsa_ca(*dsa_ca_cert, *dsa_ca_key, "SHA-256", rng);
-   dsa_srv_cert.reset(new Botan::X509_Certificate(
-                         dsa_ca.sign_request(dsa_req, rng, start_time, end_time)));
-
-   dsa_crl.reset(new Botan::X509_CRL(dsa_ca.new_crl(rng)));
-#endif
-
    Credentials_Manager_Test* cmt = new Credentials_Manager_Test(
       with_client_certs,
       rsa_srv_cert, rsa_srv_key.release(), rsa_ca_cert, rsa_crl,
-      ecdsa_srv_cert, ecdsa_srv_key.release(), ecdsa_ca_cert, ecdsa_crl,
-      dsa_srv_cert.release(), dsa_srv_key.release(), dsa_ca_cert.release(), dsa_crl.release());
+      ecdsa_srv_cert, ecdsa_srv_key.release(), ecdsa_ca_cert, ecdsa_crl);
 
    return cmt;
    }
@@ -722,7 +658,7 @@ void TLS_Handshake_Test::go()
 
             std::vector<Botan::X509_DN> acceptable_CAs = test_creds.get_acceptable_cas();
 
-            m_results.test_gte("client got CA list", acceptable_CAs.size(), 2); // DSA is optional
+            m_results.test_eq("client got CA list", acceptable_CAs.size(), 2); // RSA + ECDSA
 
             for(const Botan::X509_DN& dn : acceptable_CAs)
                {
@@ -781,11 +717,6 @@ class Test_Policy final : public Botan::TLS::Text_Policy
          return 1024;
          }
 
-      size_t minimum_dsa_group_size() const override
-         {
-         return 1024;
-         }
-
       size_t minimum_signature_strength() const override
          {
          return 80;
@@ -977,17 +908,6 @@ class TLS_Unit_Tests final : public Test
 
          test_modern_versions("AES-128 DH", results, *client_ses, *server_ses, *creds, "DH", "AES-128", "SHA-256");
 
-#if defined(BOTAN_HAS_DSA)
-         if(Test::run_long_tests())
-            {
-            test_modern_versions("AES-128 DSA", results, *client_ses, *server_ses, *creds, "DH", "AES-128", "SHA-256",
-                                 { { "signature_methods", "DSA" } });
-
-            test_modern_versions("AES-128/GCM DSA", results, *client_ses, *server_ses, *creds, "DH", "AES-128/GCM", "AEAD",
-                                 { { "signature_methods", "DSA" } });
-            }
-#endif
-
 #if defined(BOTAN_HAS_SRP6)
          std::unique_ptr<Botan::Credentials_Manager> srp6_creds(create_srp6_creds(rng));
          test_all_versions("SRP6 AES", results, *client_ses, *server_ses, *srp6_creds, "SRP_SHA", "AES-128", "SHA-1", "false");
diff --git a/src/tests/unit_tls_policy.cpp b/src/tests/unit_tls_policy.cpp
index 99a971508..460e9f637 100644
--- a/src/tests/unit_tls_policy.cpp
+++ b/src/tests/unit_tls_policy.cpp
@@ -29,10 +29,6 @@
    #include <botan/dh.h>
 #endif
 
-#if defined(BOTAN_HAS_DSA)
-   #include <botan/dsa.h>
-#endif
-
 namespace Botan_Tests {
 
 namespace {
@@ -49,7 +45,6 @@ class TLS_Policy_Unit_Tests final : public Test
          results.push_back(test_peer_key_acceptable_ecdh());
          results.push_back(test_peer_key_acceptable_ecdsa());
          results.push_back(test_peer_key_acceptable_dh());
-         results.push_back(test_peer_key_acceptable_dsa());
 
          return results;
          }
@@ -154,33 +149,6 @@ class TLS_Policy_Unit_Tests final : public Test
          return result;
          }
 
-      Test::Result test_peer_key_acceptable_dsa()
-         {
-         Test::Result result("TLS Policy DSA key verification");
-#if defined(BOTAN_HAS_DSA)
-         const Botan::DL_Group grp_1024("modp/ietf/1024");
-         std::unique_ptr<Botan::Private_Key> dsa_1024(new Botan::DSA_PrivateKey(Test::rng(), grp_1024));
-
-         Botan::TLS::Policy policy;
-         try
-            {
-            policy.check_peer_key_acceptable(*dsa_1024);
-            result.test_failure("Incorrectly accepting short bit DSA keys");
-            }
-         catch(Botan::TLS::TLS_Exception&)
-            {
-            result.test_success("Correctly rejecting short bit DSA keys");
-            }
-
-         const Botan::DL_Group grp_2048("modp/ietf/2048");
-         std::unique_ptr<Botan::Private_Key> dsa_2048(new Botan::DSA_PrivateKey(Test::rng(), grp_2048));
-         policy.check_peer_key_acceptable(*dsa_2048);
-         result.test_success("Correctly accepting 2048 bit DSA keys");
-#endif
-         return result;
-         }
-
-
    };
 
 BOTAN_REGISTER_TEST("tls", "tls_policy", TLS_Policy_Unit_Tests);