diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index d9d86e0f2..ff02aff9f 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -35,7 +35,7 @@ jobs: # windows-latest is not used due to intermittent network failures os: [ubuntu-latest, macos-latest] # All LTS versions plus the current version - java: [ 11, 17, 21 ] + java: [ 11, 17, 21, 25 ] include: - java: 8 os: ubuntu-latest diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/ssl/TestTlsCiphers.java b/httpcore5/src/test/java/org/apache/hc/core5/http/ssl/TestTlsCiphers.java index 082294bcd..f2c192910 100644 --- a/httpcore5/src/test/java/org/apache/hc/core5/http/ssl/TestTlsCiphers.java +++ b/httpcore5/src/test/java/org/apache/hc/core5/http/ssl/TestTlsCiphers.java @@ -29,70 +29,28 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; /** * Unit tests for {@link TlsCiphers}. */ class TestTlsCiphers { - @Test - void testStrongCipherSuites() { - final String[] strongCipherSuites = { - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - "TLS_RSA_WITH_AES_256_CBC_SHA256", - "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", - "TLS_RSA_WITH_AES_128_CBC_SHA", - "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_256_GCM_SHA384" - }; - for (final String cipherSuite : strongCipherSuites) { - Assertions.assertFalse(TlsCiphers.isWeak(cipherSuite)); - } - } - - @Test - void testWeakCiphersDisabledByDefault() { - final String[] weakCiphersSuites = { - "SSL_RSA_WITH_RC4_128_SHA", - "SSL_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_DH_anon_WITH_AES_128_CBC_SHA", - "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", - "SSL_RSA_WITH_NULL_SHA", - "SSL_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", - "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", - "TLS_DH_anon_WITH_AES_256_GCM_SHA384", - "TLS_ECDH_anon_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_NULL_SHA256", - "SSL_RSA_EXPORT_WITH_RC4_40_MD5", - "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", - "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", - "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5" - }; - for (final String cipherSuite : weakCiphersSuites) { - Assertions.assertTrue(TlsCiphers.isWeak(cipherSuite)); - } + static String[] testExcludeH2Blacklisted() { + final String[] mixCipherSuites = { + "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", + "TLS_RSA_WITH_AES_256_CBC_SHA256", + "AES_SHA_US", + "TLS_RSA_WITH_AES_128_CBC_SHA", + "NULL_SHA", + "TLS_RSA_WITH_AES_256_GCM_SHA384" + }; + return TlsCiphers.excludeH2Blacklisted(mixCipherSuites); } - @Test - void excludeH2Blacklisted () { - final String[] mixCipherSuites = { - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - "TLS_RSA_WITH_AES_256_CBC_SHA256", - "AES_SHA_US", - "TLS_RSA_WITH_AES_128_CBC_SHA", - "NULL_SHA", - "TLS_RSA_WITH_AES_256_GCM_SHA384" - }; - - final String[] strongCipherSuites = TlsCiphers.excludeH2Blacklisted(mixCipherSuites); - for (final String cipherSuite : strongCipherSuites) { - Assertions.assertFalse(TlsCiphers.isWeak(cipherSuite)); - } - } - - @Test - void excludeWeak () { + static String[] testExcludeWeak() { final String[] weakCiphersSuites = { "SSL_RSA_WITH_RC4_128_SHA", "SSL_RSA_WITH_3DES_EDE_CBC_SHA", @@ -116,16 +74,59 @@ void excludeWeak () { "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_GCM_SHA384" }; + return TlsCiphers.excludeWeak(weakCiphersSuites); + } + + @ParameterizedTest + @MethodSource + void testExcludeH2Blacklisted(final String strongCipherSuite) { + Assertions.assertFalse(TlsCiphers.isWeak(strongCipherSuite)); + } - final String[] strongCipherSuites = TlsCiphers.excludeWeak(weakCiphersSuites); - for (final String cipherSuite : strongCipherSuites) { - Assertions.assertFalse(TlsCiphers.isWeak(cipherSuite)); - } + @ParameterizedTest + @MethodSource + void testExcludeWeak(final String strongCipherSuite) { + Assertions.assertFalse(TlsCiphers.isWeak(strongCipherSuite)); } @Test - void excludeWeakNull() { + void testExcludeWeakNull() { Assertions.assertNull(TlsCiphers.excludeWeak((String[]) null)); } + @ParameterizedTest + @ValueSource(strings = { + "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", + "TLS_RSA_WITH_AES_256_CBC_SHA256", + "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", + "TLS_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", + "TLS_RSA_WITH_AES_256_GCM_SHA384" + }) + void testStrongCipherSuites(final String strongCipherSuite) { + Assertions.assertFalse(TlsCiphers.isWeak(strongCipherSuite)); + } + + @ParameterizedTest + @ValueSource(strings = { + "SSL_RSA_WITH_RC4_128_SHA", + "SSL_RSA_WITH_3DES_EDE_CBC_SHA", + "TLS_DH_anon_WITH_AES_128_CBC_SHA", + "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", + "SSL_RSA_WITH_NULL_SHA", + "SSL_RSA_WITH_3DES_EDE_CBC_SHA", + "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", + "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", + "TLS_DH_anon_WITH_AES_256_GCM_SHA384", + "TLS_ECDH_anon_WITH_AES_256_CBC_SHA", + "TLS_RSA_WITH_NULL_SHA256", + "SSL_RSA_EXPORT_WITH_RC4_40_MD5", + "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", + "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", + "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5" + }) + void testWeakCiphersDisabledByDefault(final String weakCiphersSuite) { + Assertions.assertTrue(TlsCiphers.isWeak(weakCiphersSuite)); + } + }