package play.api.libs.ws.ssl
import javax.net.ssl.SSLContext
object Ciphers {
def recommendedCiphers: Seq[String] = foldVersion(
run16 = java16RecommendedCiphers,
runHigher = java17RecommendedCiphers)
lazy val java17RecommendedCiphers: Seq[String] = {
SSLContext.getDefault.getDefaultSSLParameters.getCipherSuites
}.filterNot(deprecatedCiphers.contains(_))
val java16RecommendedCiphers: Seq[String] = Seq(
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"SSL_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_EMPTY_RENEGOTIATION_INFO_SCSV"
)
val suiteBCiphers: Seq[String] = """
|TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
|TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
""".stripMargin.split("\n")
val suiteBTransitionalCiphers: Seq[String] = """TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
|TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
|TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
""".stripMargin.split("\n")
val recommendedSmithCiphers = Seq(
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"SSL_RSA_WITH_3DES_EDE_CBC_SHA"
)
val exportCiphers = """SSL_RSA_EXPORT_WITH_RC4_40_MD5
|SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
|SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
|SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
|TLS_KRB5_EXPORT_WITH_RC4_40_SHA
|TLS_KRB5_EXPORT_WITH_RC4_40_MD5
|TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
|TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
""".stripMargin.split("\n").toSet
val anonCiphers = """TLS_DH_anon_WITH_RC4_128_MD5
|TLS_DH_anon_WITH_AES_128_CBC_SHA
|TLS_DH_anon_EXPORT_WITH_RC4_40_MD5
|TLS_DH_anon_WITH_RC4_128_MD5
|TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA
|TLS_DH_anon_WITH_DES_CBC_SHA
|TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
|TLS_DH_anon_WITH_AES_128_CBC_SHA
|TLS_DH_anon_WITH_AES_256_CBC_SHA
|TLS_ECDH_anon_WITH_RC4_128_SHA
|TLS_ECDH_anon_WITH_AES_128_CBC_SHA
|TLS_ECDH_anon_WITH_AES_256_CBC_SHA
|TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
|TLS_ECDH_anon_WITH_NULL_SHA
|SSL_DH_anon_WITH_RC4_128_MD5
|SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
|SSL_DH_anon_WITH_DES_CBC_SHA
|SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
|SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA
""".stripMargin.split("\n").toSet
val nullCiphers = """SSL_RSA_WITH_NULL_MD5
|SSL_RSA_WITH_NULL_SHA
|TLS_ECDH_ECDSA_WITH_NULL_SHA
|TLS_ECDH_RSA_WITH_NULL_SHA
|TLS_ECDHE_ECDSA_WITH_NULL_SHA
|TLS_ECDHE_RSA_WITH_NULL_SHA
""".stripMargin.split("\n").toSet
val desCiphers = """SSL_RSA_WITH_DES_CBC_SHA
|SSL_DHE_RSA_WITH_DES_CBC_SHA
|SSL_DHE_DSS_WITH_DES_CBC_SHA
|TLS_KRB5_WITH_DES_CBC_SHA
""".stripMargin.split("\n").toSet
val md5Ciphers = """SSL_RSA_WITH_RC4_128_MD5
|SSL_RSA_WITH_NULL_MD5
|SSL_RSA_EXPORT_WITH_RC4_40_MD5
|SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
|SSL_DH_anon_WITH_RC4_128_MD5
|TLS_KRB5_WITH_DES_CBC_MD5
|TLS_KRB5_WITH_3DES_EDE_CBC_MD5
|TLS_KRB5_WITH_RC4_128_MD5
|TLS_KRB5_WITH_IDEA_CBC_MD5
|TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
|TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5
|TLS_KRB5_EXPORT_WITH_RC4_40_MD5
""".stripMargin.split("\n").toSet
val rc4Ciphers = """SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
|SSL_DH_anon_WITH_RC4_128_MD5
|SSL_RSA_EXPORT_WITH_RC4_40_MD5
|SSL_RSA_WITH_RC4_128_MD5
|SSL_RSA_WITH_RC4_128_SHA
|TLS_DHE_PSK_WITH_RC4_128_SHA
|TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
|TLS_ECDHE_PSK_WITH_RC4_128_SHA
|TLS_ECDHE_RSA_WITH_RC4_128_SHA
|TLS_ECDH_anon_WITH_RC4_128_SHA
|TLS_ECDH_ECDSA_WITH_RC4_128_SHA
|TLS_ECDH_RSA_WITH_RC4_128_SHA
|TLS_KRB5_EXPORT_WITH_RC4_40_MD5
|TLS_KRB5_EXPORT_WITH_RC4_40_SHA
|TLS_KRB5_WITH_RC4_128_MD5
|TLS_KRB5_WITH_RC4_128_SHA
|TLS_PSK_WITH_RC4_128_SHA
|TLS_RSA_PSK_WITH_RC4_128_SHA
""".stripMargin.split("\n").toSet
val sha1Ciphers = """SSL_RSA_WITH_RC4_128_SHA
|TLS_RSA_EXPORT_WITH_DES40_CBC_SHA
|TLS_ECDH_ECDSA_WITH_RC4_128_SHA
|TLS_ECDH_RSA_WITH_RC4_128_SHA
|TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
|TLS_ECDHE_RSA_WITH_RC4_128_SHA
|TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
|TLS_DHE_DSS_WITH_DES_CBC_SHA
|TLS_DHE_DSS_WITH_AES_256_CBC_SHA
|TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
|TLS_DHE_DSS_WITH_AES_128_CBC_SHA
|TLS_DHE_RSA_WITH_DES_CBC_SHA
|TLS_DHE_RSA_WITH_AES_128_CBC_SHA
|TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
|TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
|TLS_DH_anon_WITH_AES_256_CBC_SHA
""".stripMargin.split("\n").toSet
val deprecatedCiphers = desCiphers ++ nullCiphers ++ anonCiphers ++ exportCiphers ++ rc4Ciphers
}