package org.bouncycastle.tls.test;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.bouncycastle.tls.ProtocolVersion;
public class DTLSTestSuite extends TestSuite
{
// Make the access to constants less verbose
static abstract class C extends TlsTestConfig {}
public DTLSTestSuite()
{
super("DTLS");
}
public static Test suite()
{
DTLSTestSuite testSuite = new DTLSTestSuite();
addFallbackTests(testSuite);
addVersionTests(testSuite, ProtocolVersion.DTLSv10);
addVersionTests(testSuite, ProtocolVersion.DTLSv12);
return testSuite;
}
private static void addFallbackTests(TestSuite testSuite)
{
{
TlsTestConfig c = createDTLSTestConfig(ProtocolVersion.DTLSv12);
c.clientFallback = true;
addTestCase(testSuite, c, "FallbackGood");
}
/*
* NOTE: Temporarily disabled automatic test runs because of problems getting a clean exit
* of the DTLS server after a fatal alert. As of writing, manual runs show the correct
* alerts being raised
*/
// {
// TlsTestConfig c = createDTLSTestConfig(ProtocolVersion.DTLSv12);
// c.clientOfferVersion = ProtocolVersion.DTLSv10;
// c.clientFallback = true;
// c.expectServerFatalAlert(AlertDescription.inappropriate_fallback);
//
// addTestCase(testSuite, c, "FallbackBad");
// }
{
TlsTestConfig c = createDTLSTestConfig(ProtocolVersion.DTLSv12);
c.clientOfferVersion = ProtocolVersion.DTLSv10;
addTestCase(testSuite, c, "FallbackNone");
}
}
private static void addVersionTests(TestSuite testSuite, ProtocolVersion version)
{
String prefix = version.toString().replaceAll("[ \\.]", "") + "_";
/*
* NOTE: Temporarily disabled automatic test runs because of problems getting a clean exit
* of the DTLS server after a fatal alert. As of writing, manual runs show the correct
* alerts being raised
*/
// /*
// * Server only declares support for SHA1/RSA, client selects MD5/RSA. Since the client is
// * NOT actually tracking MD5 over the handshake, we expect fatal alert from the client.
// */
// if (TlsUtils.isTLSv12(version))
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientAuth = C.CLIENT_AUTH_VALID;
// c.clientAuthSigAlg = new SignatureAndHashAlgorithm(HashAlgorithm.md5, SignatureAlgorithm.rsa);
// c.serverCertReqSigAlgs = TlsUtils.getDefaultRSASignatureAlgorithms();
// c.expectClientFatalAlert(AlertDescription.internal_error);
//
// addTestCase(testSuite, c, prefix + "BadCertificateVerifyHashAlg");
// }
//
// /*
// * Server only declares support for SHA1/ECDSA, client selects SHA1/RSA. Since the client is
// * actually tracking SHA1 over the handshake, we expect fatal alert to come from the server
// * when it verifies the selected algorithm against the CertificateRequest supported
// * algorithms.
// */
// if (TlsUtils.isTLSv12(version))
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientAuth = C.CLIENT_AUTH_VALID;
// c.clientAuthSigAlg = new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.rsa);
// c.serverCertReqSigAlgs = TlsUtils.getDefaultECDSASignatureAlgorithms();
// c.expectServerFatalAlert(AlertDescription.illegal_parameter);
//
// addTestCase(testSuite, c, prefix + "BadCertificateVerifySigAlg");
// }
//
// /*
// * Server only declares support for SHA1/ECDSA, client signs with SHA1/RSA, but sends
// * SHA1/ECDSA in the CertificateVerify. Since the client is actually tracking SHA1 over the
// * handshake, and the claimed algorithm is in the CertificateRequest supported algorithms,
// * we expect fatal alert to come from the server when it finds the claimed algorithm
// * doesn't match the client certificate.
// */
// if (TlsUtils.isTLSv12(version))
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientAuth = C.CLIENT_AUTH_VALID;
// c.clientAuthSigAlg = new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.rsa);
// c.clientAuthSigAlgClaimed = new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.ecdsa);
// c.serverCertReqSigAlgs = TlsUtils.getDefaultECDSASignatureAlgorithms();
// c.expectServerFatalAlert(AlertDescription.decrypt_error);
//
// addTestCase(testSuite, c, prefix + "BadCertificateVerifySigAlgMismatch");
// }
//
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientAuth = C.CLIENT_AUTH_INVALID_VERIFY;
// c.expectServerFatalAlert(AlertDescription.decrypt_error);
//
// addTestCase(testSuite, c, prefix + "BadCertificateVerifySignature");
// }
//
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientAuth = C.CLIENT_AUTH_INVALID_CERT;
// c.expectServerFatalAlert(AlertDescription.bad_certificate);
//
// addTestCase(testSuite, c, prefix + "BadClientCertificate");
// }
//
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientAuth = C.CLIENT_AUTH_NONE;
// c.serverCertReq = C.SERVER_CERT_REQ_MANDATORY;
// c.expectServerFatalAlert(AlertDescription.handshake_failure);
//
// addTestCase(testSuite, c, prefix + "BadMandatoryCertReqDeclined");
// }
//
// /*
// * Server selects MD5/RSA for ServerKeyExchange signature, which is not in the default
// * supported signature algorithms that the client sent. We expect fatal alert from the
// * client when it verifies the selected algorithm against the supported algorithms.
// */
// if (TlsUtils.isTLSv12(version))
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.serverAuthSigAlg = new SignatureAndHashAlgorithm(HashAlgorithm.md5, SignatureAlgorithm.rsa);
// c.expectClientFatalAlert(AlertDescription.illegal_parameter);
//
// addTestCase(testSuite, c, prefix + "BadServerKeyExchangeSigAlg");
// }
//
// /*
// * Server selects MD5/RSA for ServerKeyExchange signature, which is not the default {sha1,rsa}
// * implied by the absent signature_algorithms extension. We expect fatal alert from the
// * client when it verifies the selected algorithm against the implicit default.
// */
// if (TlsUtils.isTLSv12(version))
// {
// TlsTestConfig c = createDTLSTestConfig(version);
// c.clientSendSignatureAlgorithms = false;
// c.serverAuthSigAlg = new SignatureAndHashAlgorithm(HashAlgorithm.md5, SignatureAlgorithm.rsa);
// c.expectClientFatalAlert(AlertDescription.illegal_parameter);
//
// addTestCase(testSuite, c, prefix + "BadServerKeyExchangeSigAlg2");
// }
{
TlsTestConfig c = createDTLSTestConfig(version);
addTestCase(testSuite, c, prefix + "GoodDefault");
}
{
TlsTestConfig c = createDTLSTestConfig(version);
c.serverCertReq = C.SERVER_CERT_REQ_NONE;
addTestCase(testSuite, c, prefix + "GoodNoCertReq");
}
{
TlsTestConfig c = createDTLSTestConfig(version);
c.clientAuth = C.CLIENT_AUTH_NONE;
addTestCase(testSuite, c, prefix + "GoodOptionalCertReqDeclined");
}
}
private static void addTestCase(TestSuite testSuite, TlsTestConfig config, String name)
{
testSuite.addTest(new DTLSTestCase(config, name));
}
private static TlsTestConfig createDTLSTestConfig(ProtocolVersion version)
{
TlsTestConfig c = new TlsTestConfig();
c.clientMinimumVersion = ProtocolVersion.DTLSv10;
c.clientOfferVersion = ProtocolVersion.DTLSv12;
c.serverMaximumVersion = version;
c.serverMinimumVersion = ProtocolVersion.DTLSv10;
return c;
}
}