Path: blob/master/test/jdk/javax/net/ssl/TLSv12/SignatureAlgorithms.java
41152 views
/*1* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425//26// SunJSSE does not support dynamic system properties, no way to re-use27// system properties in samevm/agentvm mode.28//2930/*31* @test32* @bug 804932133* @summary Support SHA256WithDSA in JSSE34* @run main/othervm SignatureAlgorithms PKIX "SHA-224,SHA-256"35* TLS_DHE_DSS_WITH_AES_128_CBC_SHA36* @run main/othervm SignatureAlgorithms PKIX "SHA-1,SHA-224"37* TLS_DHE_DSS_WITH_AES_128_CBC_SHA38* @run main/othervm SignatureAlgorithms PKIX "SHA-1,SHA-256"39* TLS_DHE_DSS_WITH_AES_128_CBC_SHA40* @run main/othervm SignatureAlgorithms PKIX "SHA-224,SHA-256"41* TLS_DHE_DSS_WITH_AES_128_CBC_SHA25642* @run main/othervm SignatureAlgorithms PKIX "SHA-1,SHA-224"43* TLS_DHE_DSS_WITH_AES_128_CBC_SHA25644* @run main/othervm SignatureAlgorithms PKIX "SHA-1,SHA-256"45* TLS_DHE_DSS_WITH_AES_128_CBC_SHA25646*/4748import java.net.*;49import java.util.*;50import java.io.*;51import javax.net.ssl.*;52import java.security.Security;53import java.security.KeyStore;54import java.security.KeyFactory;55import java.security.cert.Certificate;56import java.security.cert.X509Certificate;57import java.security.cert.CertificateFactory;58import java.security.spec.*;59import java.security.interfaces.*;6061public class SignatureAlgorithms {6263/*64* =============================================================65* Set the various variables needed for the tests, then66* specify what tests to run on each side.67*/6869/*70* Should we run the client or server in a separate thread?71* Both sides can throw exceptions, but do you have a preference72* as to which side should be the main thread.73*/74static boolean separateServerThread = true;7576/*77* Where do we find the keystores?78*/79// Certificates and key (DSA) used in the test.80static String trustedCertStr =81"-----BEGIN CERTIFICATE-----\n" +82"MIIDYTCCAyGgAwIBAgIJAK8/gw6zg/DPMAkGByqGSM44BAMwOzELMAkGA1UEBhMC\n" +83"VVMxDTALBgNVBAoTBEphdmExHTAbBgNVBAsTFFN1bkpTU0UgVGVzdCBTZXJpdmNl\n" +84"MB4XDTE1MTIwMzEzNTIyNVoXDTM2MTExMjEzNTIyNVowOzELMAkGA1UEBhMCVVMx\n" +85"DTALBgNVBAoTBEphdmExHTAbBgNVBAsTFFN1bkpTU0UgVGVzdCBTZXJpdmNlMIIB\n" +86"uDCCASwGByqGSM44BAEwggEfAoGBAPH+b+GSMX6KS7jXDRevzc464DFG4X+uxu5V\n" +87"b3U4yhsU8A8cuH4gwin6L/IDkmZQ7N0zC0jRsiGVSMsFETTq10F39pH2eBfUv/hJ\n" +88"cLfBnIjBEtVqV/dExK88Hul2sZ4mQihQ4issPl7hsroS9EWYicnX0oNAqAB9PO5Y\n" +89"zKbfpL7TAhUA13WW48rln2UP/LaAgtnzKhqcNtMCgYEA3Rv0GirTbAaor8iURd82\n" +90"b5FlDTevOCTuq7ZIpfZVV30neS7cBYNet6m/3/4cfUlbbrqhbqIJ2I+I81drnN0Y\n" +91"lyN4KkuxEcB6OTwfWkIUj6rvPaCQrBH8Q213bDq3HHtYNaP8OoeQUyVXW+SEGADC\n" +92"J1+z8uqP3lIB6ltdgOiV/GQDgYUAAoGBAOXRppuJSGdt6AiZkb81P1DCUgIUlZFI\n" +93"J9GxWrjbbHDmGllMwPNhK6dU7LJKJJuYVPW+95rUGlSJEjRqSlHuyHkNb6e3e7qx\n" +94"tmx1/oIyq+oLult50hBS7uBvLLR0JbIKjBzzkudL8Rjze4G/Wq7KDM2T1JOP49tW\n" +95"eocCvaC8h8uQo4GtMIGqMB0GA1UdDgQWBBT17HcqLllsqnZzP+kElcGcBGmubjBr\n" +96"BgNVHSMEZDBigBT17HcqLllsqnZzP+kElcGcBGmubqE/pD0wOzELMAkGA1UEBhMC\n" +97"VVMxDTALBgNVBAoTBEphdmExHTAbBgNVBAsTFFN1bkpTU0UgVGVzdCBTZXJpdmNl\n" +98"ggkArz+DDrOD8M8wDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAQYwCQYHKoZI\n" +99"zjgEAwMvADAsAhQ6Y1I6LtIEBMqNo8o6GIe4LLEJuwIUbVQUKi8tvtWyRoxm8AFV\n" +100"0axJYUU=\n" +101"-----END CERTIFICATE-----";102103static String[] targetCertStr = {104// DSA-SHA1105"-----BEGIN CERTIFICATE-----\n" +106"MIIDKTCCAumgAwIBAgIJAOy5c0b+8stFMAkGByqGSM44BAMwOzELMAkGA1UEBhMC\n" +107"VVMxDTALBgNVBAoTBEphdmExHTAbBgNVBAsTFFN1bkpTU0UgVGVzdCBTZXJpdmNl\n" +108"MB4XDTE1MTIwMzEzNTIyNVoXDTM1MDgyMDEzNTIyNVowTzELMAkGA1UEBhMCVVMx\n" +109"DTALBgNVBAoMBEphdmExHTAbBgNVBAsMFFN1bkpTU0UgVGVzdCBTZXJpdmNlMRIw\n" +110"EAYDVQQDDAlsb2NhbGhvc3QwggG3MIIBLAYHKoZIzjgEATCCAR8CgYEA8f5v4ZIx\n" +111"fopLuNcNF6/NzjrgMUbhf67G7lVvdTjKGxTwDxy4fiDCKfov8gOSZlDs3TMLSNGy\n" +112"IZVIywURNOrXQXf2kfZ4F9S/+Elwt8GciMES1WpX90TErzwe6XaxniZCKFDiKyw+\n" +113"XuGyuhL0RZiJydfSg0CoAH087ljMpt+kvtMCFQDXdZbjyuWfZQ/8toCC2fMqGpw2\n" +114"0wKBgQDdG/QaKtNsBqivyJRF3zZvkWUNN684JO6rtkil9lVXfSd5LtwFg163qb/f\n" +115"/hx9SVtuuqFuognYj4jzV2uc3RiXI3gqS7ERwHo5PB9aQhSPqu89oJCsEfxDbXds\n" +116"Orcce1g1o/w6h5BTJVdb5IQYAMInX7Py6o/eUgHqW12A6JX8ZAOBhAACgYB+zYqn\n" +117"jJwG4GZpBIN/6qhzbp0flChsV+Trlu0SL0agAQzb6XdI/4JnO87Pgbxaxh3VNAj3\n" +118"3+Ghr1NLBuBfTKzJ4j9msWT3EpLupkMyNtXvBYM0iyMrll67lSjMdv++wLEw35Af\n" +119"/bzVcjGyA5Q0i0cuEzDmHTVfi0OydynbwSLxtKNjMGEwCwYDVR0PBAQDAgPoMB0G\n" +120"A1UdDgQWBBQXJI8AxM0qsYCbbkIMuI5zJ+nMEDAfBgNVHSMEGDAWgBT17HcqLlls\n" +121"qnZzP+kElcGcBGmubjASBgNVHREBAf8ECDAGhwR/AAABMAkGByqGSM44BAMDLwAw\n" +122"LAIUXgyJ0xll4FrZAKXi8bj7Kiz+SA4CFH9WCSZIBYA9lmJkiTgRS7iM/6IC\n" +123"-----END CERTIFICATE-----",124125// DSA-SHA224126"-----BEGIN CERTIFICATE-----\n" +127"MIIDLzCCAuugAwIBAgIJAOy5c0b+8stGMAsGCWCGSAFlAwQDATA7MQswCQYDVQQG\n" +128"EwJVUzENMAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2\n" +129"Y2UwHhcNMTUxMjAzMTU0NDM5WhcNMzUwODIwMTU0NDM5WjBPMQswCQYDVQQGEwJV\n" +130"UzENMAsGA1UECgwESmF2YTEdMBsGA1UECwwUU3VuSlNTRSBUZXN0IFNlcml2Y2Ux\n" +131"EjAQBgNVBAMMCWxvY2FsaG9zdDCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQDx/m/h\n" +132"kjF+iku41w0Xr83OOuAxRuF/rsbuVW91OMobFPAPHLh+IMIp+i/yA5JmUOzdMwtI\n" +133"0bIhlUjLBRE06tdBd/aR9ngX1L/4SXC3wZyIwRLValf3RMSvPB7pdrGeJkIoUOIr\n" +134"LD5e4bK6EvRFmInJ19KDQKgAfTzuWMym36S+0wIVANd1luPK5Z9lD/y2gILZ8yoa\n" +135"nDbTAoGBAN0b9Boq02wGqK/IlEXfNm+RZQ03rzgk7qu2SKX2VVd9J3ku3AWDXrep\n" +136"v9/+HH1JW266oW6iCdiPiPNXa5zdGJcjeCpLsRHAejk8H1pCFI+q7z2gkKwR/ENt\n" +137"d2w6txx7WDWj/DqHkFMlV1vkhBgAwidfs/Lqj95SAepbXYDolfxkA4GEAAKBgA81\n" +138"CJKEv+pwiqYgxtw/9rkQ9748WP3mKrEC06kjUG+94/Z9dQloNFFfj6LiO1bymc5l\n" +139"6QIR8XCi4Po3N80K3+WxhBGFhY+RkVWTh43JV8epb41aH2qiWErarBwBGEh8LyGT\n" +140"i30db+Nkz2gfvyz9H/9T0jmYgfLEOlMCusali1qHo2MwYTALBgNVHQ8EBAMCA+gw\n" +141"HQYDVR0OBBYEFBqSP0S4+X+zOCTEnlp2hbAjV/W5MB8GA1UdIwQYMBaAFPXsdyou\n" +142"WWyqdnM/6QSVwZwEaa5uMBIGA1UdEQEB/wQIMAaHBH8AAAEwCwYJYIZIAWUDBAMB\n" +143"AzEAMC4CFQChiRaOnAnsCSJFwdpK22jSxU/mhQIVALgLbj/G39+1Ej8UuSWnEQyU\n" +144"4DA+\n" +145"-----END CERTIFICATE-----",146147// DSA-SHA256148"-----BEGIN CERTIFICATE-----\n" +149"MIIDLTCCAuugAwIBAgIJAOy5c0b+8stHMAsGCWCGSAFlAwQDAjA7MQswCQYDVQQG\n" +150"EwJVUzENMAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2\n" +151"Y2UwHhcNMTUxMjAzMTU0NjUxWhcNMzUwODIwMTU0NjUxWjBPMQswCQYDVQQGEwJV\n" +152"UzENMAsGA1UECgwESmF2YTEdMBsGA1UECwwUU3VuSlNTRSBUZXN0IFNlcml2Y2Ux\n" +153"EjAQBgNVBAMMCWxvY2FsaG9zdDCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQDx/m/h\n" +154"kjF+iku41w0Xr83OOuAxRuF/rsbuVW91OMobFPAPHLh+IMIp+i/yA5JmUOzdMwtI\n" +155"0bIhlUjLBRE06tdBd/aR9ngX1L/4SXC3wZyIwRLValf3RMSvPB7pdrGeJkIoUOIr\n" +156"LD5e4bK6EvRFmInJ19KDQKgAfTzuWMym36S+0wIVANd1luPK5Z9lD/y2gILZ8yoa\n" +157"nDbTAoGBAN0b9Boq02wGqK/IlEXfNm+RZQ03rzgk7qu2SKX2VVd9J3ku3AWDXrep\n" +158"v9/+HH1JW266oW6iCdiPiPNXa5zdGJcjeCpLsRHAejk8H1pCFI+q7z2gkKwR/ENt\n" +159"d2w6txx7WDWj/DqHkFMlV1vkhBgAwidfs/Lqj95SAepbXYDolfxkA4GEAAKBgEF7\n" +160"2qiYxGrjX4KCOy0k5nK/RYlgLy4gYDChihQpiaa+fbA5JOBOxPWsh7rdtmJuDrEJ\n" +161"keacU223+DIhOKC49fa+EvhLNqo6U1oPn8n/yvBsvvnWkcynw5KfNzaLlaPmzugh\n" +162"v9xl/GhyZNAXc1QUcW3C+ceHVNrKnkfbTKZz5eRSo2MwYTALBgNVHQ8EBAMCA+gw\n" +163"HQYDVR0OBBYEFNMkPrt40oO9Dpy+bcbQdEvOlNlyMB8GA1UdIwQYMBaAFPXsdyou\n" +164"WWyqdnM/6QSVwZwEaa5uMBIGA1UdEQEB/wQIMAaHBH8AAAEwCwYJYIZIAWUDBAMC\n" +165"Ay8AMCwCFCvA2QiKSe/n+6GqSYQwgQ/zL5M9AhQfSiuWdMJKWpgPJKakvzhBUbMb\n" +166"vA==\n" +167"-----END CERTIFICATE-----"};168169// Private key in the format of PKCS#8, key size is 1024 bits.170static String[] targetPrivateKey = {171// For cert DSA-SHA1172"MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAPH+b+GSMX6KS7jXDRevzc464DFG\n" +173"4X+uxu5Vb3U4yhsU8A8cuH4gwin6L/IDkmZQ7N0zC0jRsiGVSMsFETTq10F39pH2\n" +174"eBfUv/hJcLfBnIjBEtVqV/dExK88Hul2sZ4mQihQ4issPl7hsroS9EWYicnX0oNA\n" +175"qAB9PO5YzKbfpL7TAhUA13WW48rln2UP/LaAgtnzKhqcNtMCgYEA3Rv0GirTbAao\n" +176"r8iURd82b5FlDTevOCTuq7ZIpfZVV30neS7cBYNet6m/3/4cfUlbbrqhbqIJ2I+I\n" +177"81drnN0YlyN4KkuxEcB6OTwfWkIUj6rvPaCQrBH8Q213bDq3HHtYNaP8OoeQUyVX\n" +178"W+SEGADCJ1+z8uqP3lIB6ltdgOiV/GQEFgIUOiB7J/lrFrNduQ8nDNTe8VspoAI=",179180// For cert DSA-SHA224181"MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAPH+b+GSMX6KS7jXDRevzc464DFG\n" +182"4X+uxu5Vb3U4yhsU8A8cuH4gwin6L/IDkmZQ7N0zC0jRsiGVSMsFETTq10F39pH2\n" +183"eBfUv/hJcLfBnIjBEtVqV/dExK88Hul2sZ4mQihQ4issPl7hsroS9EWYicnX0oNA\n" +184"qAB9PO5YzKbfpL7TAhUA13WW48rln2UP/LaAgtnzKhqcNtMCgYEA3Rv0GirTbAao\n" +185"r8iURd82b5FlDTevOCTuq7ZIpfZVV30neS7cBYNet6m/3/4cfUlbbrqhbqIJ2I+I\n" +186"81drnN0YlyN4KkuxEcB6OTwfWkIUj6rvPaCQrBH8Q213bDq3HHtYNaP8OoeQUyVX\n" +187"W+SEGADCJ1+z8uqP3lIB6ltdgOiV/GQEFgIUOj9F5mxWd9W1tiLSdsOAt8BUBzE=",188189// For cert DSA-SHA256190"MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAPH+b+GSMX6KS7jXDRevzc464DFG\n" +191"4X+uxu5Vb3U4yhsU8A8cuH4gwin6L/IDkmZQ7N0zC0jRsiGVSMsFETTq10F39pH2\n" +192"eBfUv/hJcLfBnIjBEtVqV/dExK88Hul2sZ4mQihQ4issPl7hsroS9EWYicnX0oNA\n" +193"qAB9PO5YzKbfpL7TAhUA13WW48rln2UP/LaAgtnzKhqcNtMCgYEA3Rv0GirTbAao\n" +194"r8iURd82b5FlDTevOCTuq7ZIpfZVV30neS7cBYNet6m/3/4cfUlbbrqhbqIJ2I+I\n" +195"81drnN0YlyN4KkuxEcB6OTwfWkIUj6rvPaCQrBH8Q213bDq3HHtYNaP8OoeQUyVX\n" +196"W+SEGADCJ1+z8uqP3lIB6ltdgOiV/GQEFgIUQ2WGgg+OO39Aujj0e4lM4pP4/9g="};197198199static char passphrase[] = "passphrase".toCharArray();200201/*202* Turn on SSL debugging?203*/204static boolean debug = false;205206/*207* Is the server ready to serve?208*/209volatile boolean serverReady = false;210211/*212* Define the server side of the test.213*214* If the server prematurely exits, serverReady will be set to true215* to avoid infinite hangs.216*/217void doServerSide() throws Exception {218219SSLContext context = generateSSLContext(220null, targetCertStr, targetPrivateKey);221SSLServerSocketFactory sslssf = context.getServerSocketFactory();222try (SSLServerSocket sslServerSocket =223(SSLServerSocket)sslssf.createServerSocket(serverPort)) {224225serverPort = sslServerSocket.getLocalPort();226227/*228* Signal Client, we're ready for his connect.229*/230serverReady = true;231232try (SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept()) {233sslSocket.setEnabledCipherSuites(234sslSocket.getSupportedCipherSuites());235InputStream sslIS = sslSocket.getInputStream();236OutputStream sslOS = sslSocket.getOutputStream();237238sslIS.read();239sslOS.write('A');240sslOS.flush();241242dumpSignatureAlgorithms(sslSocket);243}244}245}246247/*248* Define the client side of the test.249*250* If the server prematurely exits, serverReady will be set to true251* to avoid infinite hangs.252*/253void doClientSide() throws Exception {254255/*256* Wait for server to get started.257*/258while (!serverReady) {259Thread.sleep(50);260}261262SSLContext context = generateSSLContext(trustedCertStr, null, null);263SSLSocketFactory sslsf = context.getSocketFactory();264265try (SSLSocket sslSocket =266(SSLSocket)sslsf.createSocket("localhost", serverPort)) {267268// enable TLSv1.2 only269sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});270271// enable a block cipher272sslSocket.setEnabledCipherSuites(new String[] {cipherSuite});273274InputStream sslIS = sslSocket.getInputStream();275OutputStream sslOS = sslSocket.getOutputStream();276277sslOS.write('B');278sslOS.flush();279sslIS.read();280281dumpSignatureAlgorithms(sslSocket);282}283}284285static void dumpSignatureAlgorithms(SSLSocket sslSocket) throws Exception {286287boolean isClient = sslSocket.getUseClientMode();288String mode = "[" + (isClient ? "Client" : "Server") + "]";289ExtendedSSLSession session =290(ExtendedSSLSession)sslSocket.getSession();291String[] signAlgs = session.getLocalSupportedSignatureAlgorithms();292System.out.println(293mode + " local supported signature algorithms: " +294Arrays.asList(signAlgs));295296if (!isClient) {297signAlgs = session.getPeerSupportedSignatureAlgorithms();298System.out.println(299mode + " peer supported signature algorithms: " +300Arrays.asList(signAlgs));301} else {302Certificate[] serverCerts = session.getPeerCertificates();303304// server should always send the authentication cert.305String sigAlg = ((X509Certificate)serverCerts[0]).getSigAlgName();306System.out.println(307mode + " the signature algorithm of server certificate: " +308sigAlg);309if (sigAlg.contains("SHA1")) {310if (disabledAlgorithms.contains("SHA-1")) {311throw new Exception(312"Not the expected server certificate. " +313"SHA-1 should be disabled");314}315} else if (sigAlg.contains("SHA224")) {316if (disabledAlgorithms.contains("SHA-224")) {317throw new Exception(318"Not the expected server certificate. " +319"SHA-224 should be disabled");320}321} else { // SHA-256322if (disabledAlgorithms.contains("SHA-256")) {323throw new Exception(324"Not the expected server certificate. " +325"SHA-256 should be disabled");326}327}328}329}330331/*332* =============================================================333* The remainder is just support stuff334*/335private static String tmAlgorithm; // trust manager336private static String disabledAlgorithms; // disabled algorithms337private static String cipherSuite; // cipher suite338339private static void parseArguments(String[] args) {340tmAlgorithm = args[0];341disabledAlgorithms = args[1];342cipherSuite = args[2];343}344345private static SSLContext generateSSLContext(String trustedCertStr,346String[] keyCertStrs, String[] keySpecStrs) throws Exception {347348// generate certificate from cert string349CertificateFactory cf = CertificateFactory.getInstance("X.509");350351// create a key store352KeyStore ks = KeyStore.getInstance("JKS");353ks.load(null, null);354355// import the trused cert356Certificate trusedCert = null;357ByteArrayInputStream is = null;358if (trustedCertStr != null) {359is = new ByteArrayInputStream(trustedCertStr.getBytes());360trusedCert = cf.generateCertificate(is);361is.close();362363ks.setCertificateEntry("DSA Signer", trusedCert);364}365366if (keyCertStrs != null && keyCertStrs.length != 0) {367for (int i = 0; i < keyCertStrs.length; i++) {368String keyCertStr = keyCertStrs[i];369String keySpecStr = keySpecStrs[i];370371// generate the private key.372PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec(373Base64.getMimeDecoder().decode(keySpecStr));374KeyFactory kf = KeyFactory.getInstance("DSA");375DSAPrivateKey priKey =376(DSAPrivateKey)kf.generatePrivate(priKeySpec);377378// generate certificate chain379is = new ByteArrayInputStream(keyCertStr.getBytes());380Certificate keyCert = cf.generateCertificate(is);381is.close();382383Certificate[] chain = null;384if (trusedCert != null) {385chain = new Certificate[2];386chain[0] = keyCert;387chain[1] = trusedCert;388} else {389chain = new Certificate[1];390chain[0] = keyCert;391}392393// import the key entry.394ks.setKeyEntry("DSA Entry " + i, priKey, passphrase, chain);395}396}397398// create SSL context399TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmAlgorithm);400tmf.init(ks);401402SSLContext ctx = SSLContext.getInstance("TLS");403if (keyCertStrs != null && keyCertStrs.length != 0) {404KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509");405kmf.init(ks, passphrase);406407ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);408ks = null;409} else {410ctx.init(null, tmf.getTrustManagers(), null);411}412413return ctx;414}415416417// use any free port by default418volatile int serverPort = 0;419420volatile Exception serverException = null;421volatile Exception clientException = null;422423public static void main(String[] args) throws Exception {424/*425* debug option426*/427if (debug) {428System.setProperty("javax.net.debug", "all");429}430431/*432* Get the customized arguments.433*/434parseArguments(args);435436437/*438* Ignore testing on Windows if only SHA-224 is available.439*/440if ((Security.getProvider("SunMSCAPI") != null) &&441(disabledAlgorithms.contains("SHA-1")) &&442(disabledAlgorithms.contains("SHA-256"))) {443444System.out.println(445"Windows system does not support SHA-224 algorithms yet. " +446"Ignore the testing");447448return;449}450451/*452* Expose the target algorithms by diabling unexpected algorithms.453*/454Security.setProperty(455"jdk.certpath.disabledAlgorithms", disabledAlgorithms);456457/*458* Reset the security property to make sure that the algorithms459* and keys used in this test are not disabled by default.460*/461Security.setProperty( "jdk.tls.disabledAlgorithms", "");462463/*464* Start the tests.465*/466new SignatureAlgorithms();467}468469Thread clientThread = null;470Thread serverThread = null;471472/*473* Primary constructor, used to drive remainder of the test.474*475* Fork off the other side, then do your work.476*/477SignatureAlgorithms() throws Exception {478try {479if (separateServerThread) {480startServer(true);481startClient(false);482} else {483startClient(true);484startServer(false);485}486} catch (Exception e) {487// swallow for now. Show later488}489490/*491* Wait for other side to close down.492*/493if (separateServerThread) {494serverThread.join();495} else {496clientThread.join();497}498499/*500* When we get here, the test is pretty much over.501* Which side threw the error?502*/503Exception local;504Exception remote;505String whichRemote;506507if (separateServerThread) {508remote = serverException;509local = clientException;510whichRemote = "server";511} else {512remote = clientException;513local = serverException;514whichRemote = "client";515}516517/*518* If both failed, return the curthread's exception, but also519* print the remote side Exception520*/521if ((local != null) && (remote != null)) {522System.out.println(whichRemote + " also threw:");523remote.printStackTrace();524System.out.println();525throw local;526}527528if (remote != null) {529throw remote;530}531532if (local != null) {533throw local;534}535}536537void startServer(boolean newThread) throws Exception {538if (newThread) {539serverThread = new Thread() {540public void run() {541try {542doServerSide();543} catch (Exception e) {544/*545* Our server thread just died.546*547* Release the client, if not active already...548*/549System.err.println("Server died..." + e);550serverReady = true;551serverException = e;552}553}554};555serverThread.start();556} else {557try {558doServerSide();559} catch (Exception e) {560serverException = e;561} finally {562serverReady = true;563}564}565}566567void startClient(boolean newThread) throws Exception {568if (newThread) {569clientThread = new Thread() {570public void run() {571try {572doClientSide();573} catch (Exception e) {574/*575* Our client thread just died.576*/577System.err.println("Client died..." + e);578clientException = e;579}580}581};582clientThread.start();583} else {584try {585doClientSide();586} catch (Exception e) {587clientException = e;588}589}590}591}592593594