Path: blob/master/test/jdk/sun/security/ssl/X509TrustManagerImpl/PKIXExtendedTM.java
41152 views
/*1* Copyright (c) 2010, 2016, 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.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223//24// SunJSSE does not support dynamic system properties, no way to re-use25// system properties in samevm/agentvm mode.26//2728/*29* @test30* @bug 6916074 817013131* @summary Add support for TLS 1.232* @run main/othervm PKIXExtendedTM 033* @run main/othervm PKIXExtendedTM 134* @run main/othervm PKIXExtendedTM 235* @run main/othervm PKIXExtendedTM 336*/3738import java.net.*;39import java.util.*;40import java.io.*;41import javax.net.ssl.*;42import java.security.Security;43import java.security.KeyStore;44import java.security.KeyFactory;45import java.security.cert.Certificate;46import java.security.cert.CertificateFactory;47import java.security.cert.CertPathValidatorException;48import java.security.spec.*;49import java.security.interfaces.*;50import java.math.BigInteger;515253/*54* Certificates and key used in the test.55*56* TLS server certificate:57* server private key:58* -----BEGIN RSA PRIVATE KEY-----59* Proc-Type: 4,ENCRYPTED60* DEK-Info: DES-EDE3-CBC,D9AE407F6D0E389A61*62* WPrA7TFol/cQCcp9oHnXWNpYlvRbbIcQj0m+RKT2Iuzfus+DHt3Zadf8nJpKfX2e63* h2rnhlzCN9M7djRDooZKDOPCsdBn51Au7HlZF3S3Opgo7D8XFM1a8t1Je4ke14oI64* nw6QKYsBblRziPnP2PZ0zvX24nOv7bbY8beynlJHGs00VWSFdoH2DS0aE1p6D+3n65* ptJuJ75dVfZFK4X7162APlNXevX8D6PEQpSiRw1rjjGGcnvQ4HdWk3BxDVDcCNJb66* Y1aGNRxsjTDvPi3R9Qx2M+W03QzEPx4SR3ZHVskeSJHaetM0TM/w/45Paq4GokXP67* ZeTnbEx1xmjkA7h+t4doLL4watx5F6yLsJzu8xB3lt/1EtmkYtLz1t7X4BetPAXz68* zS69X/VwhKfsOI3qXBWuL2oHPyhDmT1gcaUQwEPSV6ogHEEQEDXdiUS8heNK13KF69* TCQYFkETvV2BLxUhV1hypPzRQ6tUpJiAbD5KmoK2lD9slshG2QtvKQq0/bgkDY5J70* LhDHV2dtcZ3kDPkkZXpbcJQvoeH3d09C5sIsuTFo2zgNR6oETHUc5TzP6FY2YYRa71* QcK5HcmtsRRiXFm01ac+aMejJUIujjFt84SiKWT/73vC8AmY4tYcJBLjCg4XIxSH72* fdDFLL1YZENNO5ivlp8mdiHqcawx+36L7DrEZQ8RZt6cqST5t/+XTdM74s6k81GT73* pNsa82P2K2zmIUZ/DL2mKjW1vfRByw1NQFEBkN3vdyZxYfM/JyUzX4hbjXBEkh9Q74* QYrcwLKLjis2QzSvK04B3bvRzRb+4ocWiso8ZPAXAIxZFBWDpTMM2A==75* -----END RSA PRIVATE KEY-----76*77* -----BEGIN RSA PRIVATE KEY-----78* MIICXAIBAAKBgQClrFscN6LdmYktsnm4j9VIpecchBeNaZzGrG358h0fORna03Ie79* buxEzHCk3LoAMPagTz1UemFqzFfQCn+VKBg/mtmU8hvIJIh+/p0PPftXUwizIDPU80* PxdHFNHN6gjYDnVOr77M0uyvqXpJ38LZrLgkQJCmA1Yq0DAFQCxPq9l0iQIDAQAB81* AoGAbqcbg1E1mkR99uOJoNeQYKFOJyGiiXTMnXV1TseC4+PDfQBU7Dax35GcesBi82* CtapIpFKKS5D+ozY6b7ZT8ojxuQ/uHLPAvz0WDR3ds4iRF8tyu71Q1ZHcQsJa17y83* yO7UbkSSKn/Mp9Rb+/dKqftUGNXVFLqgHBOzN2s3We3bbbECQQDYBPKOg3hkaGHo84* OhpHKqtQ6EVkldihG/3i4WejRonelXN+HRh1KrB2HBx0M8D/qAzP1i3rNSlSHer485* 59YRTJnHAkEAxFX/sVYSn07BHv9Zhn6XXct/Cj43z/tKNbzlNbcxqQwQerw3IH5186* 8UH2YOA+GD3lXbKp+MytoFLWv8zg4YT/LwJAfqan75Z1R6lLffRS49bIiq8jwE1687* rTrUJ+kv8jKxMqc9B3vXkxpsS1M/+4E8bqgAmvpgAb8xcsvHsBd9ErdukQJBAKs288* j67W75BrPjBI34pQ1LEfp56IGWXOrq1kF8IbCjxv3+MYRT6Z6UJFkpRymNPNDjsC89* dgUYgITiGJHUGXuw3lMCQHEHqo9ZtXz92yFT+VhsNc29B8m/sqUJdtCcMd/jGpAF90* u6GHufjqIZBpQsk63wbwESAPZZ+kk1O1kS5GIRLX608=91* -----END RSA PRIVATE KEY-----92*93* Private-Key: (1024 bit)94* modulus:95* 00:a5:ac:5b:1c:37:a2:dd:99:89:2d:b2:79:b8:8f:96* d5:48:a5:e7:1c:84:17:8d:69:9c:c6:ac:6d:f9:f2:97* 1d:1f:39:19:da:d3:72:1e:6e:ec:44:cc:70:a4:dc:98* ba:00:30:f6:a0:4f:3d:54:7a:61:6a:cc:57:d0:0a:99* 7f:95:28:18:3f:9a:d9:94:f2:1b:c8:24:88:7e:fe:100* 9d:0f:3d:fb:57:53:08:b3:20:33:d4:3f:17:47:14:101* d1:cd:ea:08:d8:0e:75:4e:af:be:cc:d2:ec:af:a9:102* 7a:49:df:c2:d9:ac:b8:24:40:90:a6:03:56:2a:d0:103* 30:05:40:2c:4f:ab:d9:74:89104* publicExponent: 65537 (0x10001)105* privateExponent:106* 6e:a7:1b:83:51:35:9a:44:7d:f6:e3:89:a0:d7:90:107* 60:a1:4e:27:21:a2:89:74:cc:9d:75:75:4e:c7:82:108* e3:e3:c3:7d:00:54:ec:36:b1:df:91:9c:7a:c0:62:109* 0a:d6:a9:22:91:4a:29:2e:43:fa:8c:d8:e9:be:d9:110* 4f:ca:23:c6:e4:3f:b8:72:cf:02:fc:f4:58:34:77:111* 76:ce:22:44:5f:2d:ca:ee:f5:43:56:47:71:0b:09:112* 6b:5e:f2:c8:ee:d4:6e:44:92:2a:7f:cc:a7:d4:5b:113* fb:f7:4a:a9:fb:54:18:d5:d5:14:ba:a0:1c:13:b3:114* 37:6b:37:59:ed:db:6d:b1115* prime1:116* 00:d8:04:f2:8e:83:78:64:68:61:e8:3a:1a:47:2a:117* ab:50:e8:45:64:95:d8:a1:1b:fd:e2:e1:67:a3:46:118* 89:de:95:73:7e:1d:18:75:2a:b0:76:1c:1c:74:33:119* c0:ff:a8:0c:cf:d6:2d:eb:35:29:52:1d:ea:f8:e7:120* d6:11:4c:99:c7121* prime2:122* 00:c4:55:ff:b1:56:12:9f:4e:c1:1e:ff:59:86:7e:123* 97:5d:cb:7f:0a:3e:37:cf:fb:4a:35:bc:e5:35:b7:124* 31:a9:0c:10:7a:bc:37:20:7e:75:f1:41:f6:60:e0:125* 3e:18:3d:e5:5d:b2:a9:f8:cc:ad:a0:52:d6:bf:cc:126* e0:e1:84:ff:2f127* exponent1:128* 7e:a6:a7:ef:96:75:47:a9:4b:7d:f4:52:e3:d6:c8:129* 8a:af:23:c0:4d:7a:ad:3a:d4:27:e9:2f:f2:32:b1:130* 32:a7:3d:07:7b:d7:93:1a:6c:4b:53:3f:fb:81:3c:131* 6e:a8:00:9a:fa:60:01:bf:31:72:cb:c7:b0:17:7d:132* 12:b7:6e:91133* exponent2:134* 00:ab:36:8f:ae:d6:ef:90:6b:3e:30:48:df:8a:50:135* d4:b1:1f:a7:9e:88:19:65:ce:ae:ad:64:17:c2:1b:136* 0a:3c:6f:df:e3:18:45:3e:99:e9:42:45:92:94:72:137* 98:d3:cd:0e:3b:02:76:05:18:80:84:e2:18:91:d4:138* 19:7b:b0:de:53139* coefficient:140* 71:07:aa:8f:59:b5:7c:fd:db:21:53:f9:58:6c:35:141* cd:bd:07:c9:bf:b2:a5:09:76:d0:9c:31:df:e3:1a:142* 90:05:bb:a1:87:b9:f8:ea:21:90:69:42:c9:3a:df:143* 06:f0:11:20:0f:65:9f:a4:93:53:b5:91:2e:46:21:144* 12:d7:eb:4f145*146*147* server certificate:148* Data:149* Version: 3 (0x2)150* Serial Number: 8 (0x8)151* Signature Algorithm: md5WithRSAEncryption152* Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org153* Validity154* Not Before: Dec 8 03:43:04 2008 GMT155* Not After : Aug 25 03:43:04 2028 GMT156* Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org, OU=SSL-Server, CN=localhost157* Subject Public Key Info:158* Public Key Algorithm: rsaEncryption159* RSA Public Key: (1024 bit)160* Modulus (1024 bit):161* 00:a5:ac:5b:1c:37:a2:dd:99:89:2d:b2:79:b8:8f:162* d5:48:a5:e7:1c:84:17:8d:69:9c:c6:ac:6d:f9:f2:163* 1d:1f:39:19:da:d3:72:1e:6e:ec:44:cc:70:a4:dc:164* ba:00:30:f6:a0:4f:3d:54:7a:61:6a:cc:57:d0:0a:165* 7f:95:28:18:3f:9a:d9:94:f2:1b:c8:24:88:7e:fe:166* 9d:0f:3d:fb:57:53:08:b3:20:33:d4:3f:17:47:14:167* d1:cd:ea:08:d8:0e:75:4e:af:be:cc:d2:ec:af:a9:168* 7a:49:df:c2:d9:ac:b8:24:40:90:a6:03:56:2a:d0:169* 30:05:40:2c:4f:ab:d9:74:89170* Exponent: 65537 (0x10001)171* X509v3 extensions:172* X509v3 Basic Constraints:173* CA:FALSE174* X509v3 Key Usage:175* Digital Signature, Non Repudiation, Key Encipherment176* X509v3 Subject Key Identifier:177* ED:6E:DB:F4:B5:56:C8:FB:1A:06:61:3F:0F:08:BB:A6:04:D8:16:54178* X509v3 Authority Key Identifier:179* keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14180*181* X509v3 Subject Alternative Name: critical182* DNS:localhost183* Signature Algorithm: md5WithRSAEncryption0184*185* -----BEGIN CERTIFICATE-----186* MIICpDCCAg2gAwIBAgIBCDANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET187* MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK188* EwhTb21lLU9yZzAeFw0wODEyMDgwMzQzMDRaFw0yODA4MjUwMzQzMDRaMHIxCzAJ189* BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp190* dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtU2VydmVyMRIwEAYD191* VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKWsWxw3192* ot2ZiS2yebiP1Uil5xyEF41pnMasbfnyHR85GdrTch5u7ETMcKTcugAw9qBPPVR6193* YWrMV9AKf5UoGD+a2ZTyG8gkiH7+nQ89+1dTCLMgM9Q/F0cU0c3qCNgOdU6vvszS194* 7K+peknfwtmsuCRAkKYDVirQMAVALE+r2XSJAgMBAAGjczBxMAkGA1UdEwQCMAAw195* CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTtbtv0tVbI+xoGYT8PCLumBNgWVDAfBgNV196* HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDAXBgNVHREBAf8EDTALgglsb2Nh197* bGhvc3QwDQYJKoZIhvcNAQEEBQADgYEAoqVTciHtcvsUj+YaTct8tUh3aTCsKsac198* PHhfQ+ObjiXSgxsKYTX7ym/wk/wvlbUcbqLKxsu7qrcJitH+H9heV1hEHEu65Uoi199* nRugFruyOrwvAylV8Cm2af7ddilmYJ+sdJA6N2M3xJRxR0G2LFHEXDNEjYReyexn200* JqCpf5uZGOo=201* -----END CERTIFICATE-----202*203*204* TLS client certificate:205* client private key:206* ----BEGIN RSA PRIVATE KEY-----207* Proc-Type: 4,ENCRYPTED208* DEK-Info: DES-EDE3-CBC,FA2A435CD35A9390209*210* Z+Y2uaETbsUWIyJUyVu1UV2G4rgFYJyACZT6Tp1KjRtxflSh2kXkJ9MpuXMXA0V4211* Yy3fDzPqCL9NJmQAYRlAx/W/+j4F5EyMWDIx8fUxzONRZyoiwF7jLm+KscAfv6Pf212* q7ItWOdj3z7IYrwlB8YIGd3F2cDKT3S+lYRk7rKb/qT7itbuHnY4Ardh3yl+MZak213* jBp+ELUlRsUqSr1V0LoM+0rCCykarpyfhpxEcqsrl0v9Cyi5uhU50/oKv5zql3SH214* l2ImgDjp3batAs8+Bd4NF2aqi0a7Hy44JUHxRm4caZryU/i/D9N1MbuM6882HLat215* 5N0G+NaIUfywa8mjwq2D5aiit18HqKA6XeRRYeJ5Dvu9DCO4GeFSwcUFIBMI0L46216* 7s114+oDodg57pMgITi+04vmUxvqlN9aiyd7f5Fgd7PeHGeOdbMz1NaJLJaPI9++217* NakK8eK9iwT/Gdq0Uap5/CHW7vCT5PO+h3HY0STH0lWStXhdWnFO04zTdywsbSp+218* DLpHeFT66shfeUlxR0PsCbG9vPRt/QmGLeYQZITppWo/ylSq4j+pRIuXvuWHdBRN219* rTZ8QF4Y7AxQUXVz1j1++s6ZMHTzaK2i9HrhmDs1MbJl+QwWre3Xpv3LvTVz3k5U220* wX8kuY1m3STt71QCaRWENq5sRaMImLxZbxc/ivFl9RAzUqo4NCxLod/QgA4iLqtO221* ztnlpzwlC/F8HbQ1oqYWwnZAPhzU/cULtstl+Yrws2c2atO323LbPXZqbASySgig222* sNpFXQMObdfP6LN23bY+1SvtK7V4NUTNhpdIc6INQAQ=223* -----END RSA PRIVATE KEY-----224*225* -----BEGIN RSA PRIVATE KEY-----226* MIICWwIBAAKBgQC78EA2rCZUTvSjWgAvaSFvuXo6k+yi9uGOx2PYLxIwmS6w8o/4227* Jy0keCiE9wG/jUR53TvSVfPOPLJbIX3v/TNKsaP/xsibuQ98QTWX+ds6BWAFFa9Z228* F5KjEK0WHOQHU6+odqJWKpLT+SjgeM9eH0irXBnd4WdDunWN9YKsQ5JEGwIDAQAB229* AoGAEbdqNj0wN85hnWyEi/ObJU8UyKTdL9eaF72QGfcF/fLSxfd3vurihIeXOkGW230* tpn4lIxYcVGM9CognhqgJpl11jFTQzn1KqZ+NEJRKkCHA4hDabKJbSC9fXHvRwrf231* BsFpZqgiNxp3HseUTiwnaUVeyPgMt/jAj5nB5Sib+UyUxrECQQDnNQBiF2aifEg6232* zbJOOC7he5CHAdkFxSxWVFVHL6EfXfqdLVkUohMbgZv+XxyIeU2biOExSg49Kds3233* FOKgTau1AkEA0Bd1haj6QuCo8I0AXm2WO+MMTZMTvtHD/bGjKNM+fT4I8rKYnQRX234* 1acHdqS9Xx2rNJqZgkMmpESIdPR2fc4yjwJALFeM6EMmqvj8/VIf5UJ/Mz14fXwM235* PEARfckUxd9LnnFutCBTWlKvKXJVEZb6KO5ixPaegc57Jp3Vbh3yTN44lQJADD/1236* SSMDaIB1MYP7a5Oj7m6VQNPRq8AJe5vDcRnOae0G9dKRrVyeFxO4GsHj6/+BHp2j237* P8nYMn9eURQ7DXjf/QJAAQzMlWnKGSO8pyTDtnQx3hRMoUkOEhmNq4bQhLkYqtnY238* FcqpUQ2qMjW+NiNWk5HnTrMS3L9EdJobMUzaNZLy4w==239* -----END RSA PRIVATE KEY-----240*241* Private-Key: (1024 bit)242* modulus:243* 00:bb:f0:40:36:ac:26:54:4e:f4:a3:5a:00:2f:69:244* 21:6f:b9:7a:3a:93:ec:a2:f6:e1:8e:c7:63:d8:2f:245* 12:30:99:2e:b0:f2:8f:f8:27:2d:24:78:28:84:f7:246* 01:bf:8d:44:79:dd:3b:d2:55:f3:ce:3c:b2:5b:21:247* 7d:ef:fd:33:4a:b1:a3:ff:c6:c8:9b:b9:0f:7c:41:248* 35:97:f9:db:3a:05:60:05:15:af:59:17:92:a3:10:249* ad:16:1c:e4:07:53:af:a8:76:a2:56:2a:92:d3:f9:250* 28:e0:78:cf:5e:1f:48:ab:5c:19:dd:e1:67:43:ba:251* 75:8d:f5:82:ac:43:92:44:1b252* publicExponent: 65537 (0x10001)253* privateExponent:254* 11:b7:6a:36:3d:30:37:ce:61:9d:6c:84:8b:f3:9b:255* 25:4f:14:c8:a4:dd:2f:d7:9a:17:bd:90:19:f7:05:256* fd:f2:d2:c5:f7:77:be:ea:e2:84:87:97:3a:41:96:257* b6:99:f8:94:8c:58:71:51:8c:f4:2a:20:9e:1a:a0:258* 26:99:75:d6:31:53:43:39:f5:2a:a6:7e:34:42:51:259* 2a:40:87:03:88:43:69:b2:89:6d:20:bd:7d:71:ef:260* 47:0a:df:06:c1:69:66:a8:22:37:1a:77:1e:c7:94:261* 4e:2c:27:69:45:5e:c8:f8:0c:b7:f8:c0:8f:99:c1:262* e5:28:9b:f9:4c:94:c6:b1263* prime1:264* 00:e7:35:00:62:17:66:a2:7c:48:3a:cd:b2:4e:38:265* 2e:e1:7b:90:87:01:d9:05:c5:2c:56:54:55:47:2f:266* a1:1f:5d:fa:9d:2d:59:14:a2:13:1b:81:9b:fe:5f:267* 1c:88:79:4d:9b:88:e1:31:4a:0e:3d:29:db:37:14:268* e2:a0:4d:ab:b5269* prime2:270* 00:d0:17:75:85:a8:fa:42:e0:a8:f0:8d:00:5e:6d:271* 96:3b:e3:0c:4d:93:13:be:d1:c3:fd:b1:a3:28:d3:272* 3e:7d:3e:08:f2:b2:98:9d:04:57:d5:a7:07:76:a4:273* bd:5f:1d:ab:34:9a:99:82:43:26:a4:44:88:74:f4:274* 76:7d:ce:32:8f275* exponent1:276* 2c:57:8c:e8:43:26:aa:f8:fc:fd:52:1f:e5:42:7f:277* 33:3d:78:7d:7c:0c:3c:40:11:7d:c9:14:c5:df:4b:278* 9e:71:6e:b4:20:53:5a:52:af:29:72:55:11:96:fa:279* 28:ee:62:c4:f6:9e:81:ce:7b:26:9d:d5:6e:1d:f2:280* 4c:de:38:95281* exponent2:282* 0c:3f:f5:49:23:03:68:80:75:31:83:fb:6b:93:a3:283* ee:6e:95:40:d3:d1:ab:c0:09:7b:9b:c3:71:19:ce:284* 69:ed:06:f5:d2:91:ad:5c:9e:17:13:b8:1a:c1:e3:285* eb:ff:81:1e:9d:a3:3f:c9:d8:32:7f:5e:51:14:3b:286* 0d:78:df:fd287* coefficient:288* 01:0c:cc:95:69:ca:19:23:bc:a7:24:c3:b6:74:31:289* de:14:4c:a1:49:0e:12:19:8d:ab:86:d0:84:b9:18:290* aa:d9:d8:15:ca:a9:51:0d:aa:32:35:be:36:23:56:291* 93:91:e7:4e:b3:12:dc:bf:44:74:9a:1b:31:4c:da:292* 35:92:f2:e3293*294* client certificate:295* Data:296* Version: 3 (0x2)297* Serial Number: 9 (0x9)298* Signature Algorithm: md5WithRSAEncryption299* Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org300* Validity301* Not Before: Dec 8 03:43:24 2008 GMT302* Not After : Aug 25 03:43:24 2028 GMT303* Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org, OU=SSL-Client, CN=localhost304* Subject Public Key Info:305* Public Key Algorithm: rsaEncryption306* RSA Public Key: (1024 bit)307* Modulus (1024 bit):308* 00:bb:f0:40:36:ac:26:54:4e:f4:a3:5a:00:2f:69:309* 21:6f:b9:7a:3a:93:ec:a2:f6:e1:8e:c7:63:d8:2f:310* 12:30:99:2e:b0:f2:8f:f8:27:2d:24:78:28:84:f7:311* 01:bf:8d:44:79:dd:3b:d2:55:f3:ce:3c:b2:5b:21:312* 7d:ef:fd:33:4a:b1:a3:ff:c6:c8:9b:b9:0f:7c:41:313* 35:97:f9:db:3a:05:60:05:15:af:59:17:92:a3:10:314* ad:16:1c:e4:07:53:af:a8:76:a2:56:2a:92:d3:f9:315* 28:e0:78:cf:5e:1f:48:ab:5c:19:dd:e1:67:43:ba:316* 75:8d:f5:82:ac:43:92:44:1b317* Exponent: 65537 (0x10001)318* X509v3 extensions:319* X509v3 Basic Constraints:320* CA:FALSE321* X509v3 Key Usage:322* Digital Signature, Non Repudiation, Key Encipherment323* X509v3 Subject Key Identifier:324* CD:BB:C8:85:AA:91:BD:FD:1D:BE:CD:67:7C:FF:B3:E9:4C:A8:22:E6325* X509v3 Authority Key Identifier:326* keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14327*328* X509v3 Subject Alternative Name: critical329* DNS:localhost330* Signature Algorithm: md5WithRSAEncryption331*332* -----BEGIN CERTIFICATE-----333* MIICpDCCAg2gAwIBAgIBCTANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET334* MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK335* EwhTb21lLU9yZzAeFw0wODEyMDgwMzQzMjRaFw0yODA4MjUwMzQzMjRaMHIxCzAJ336* BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp337* dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtQ2xpZW50MRIwEAYD338* VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALvwQDas339* JlRO9KNaAC9pIW+5ejqT7KL24Y7HY9gvEjCZLrDyj/gnLSR4KIT3Ab+NRHndO9JV340* 8848slshfe/9M0qxo//GyJu5D3xBNZf52zoFYAUVr1kXkqMQrRYc5AdTr6h2olYq341* ktP5KOB4z14fSKtcGd3hZ0O6dY31gqxDkkQbAgMBAAGjczBxMAkGA1UdEwQCMAAw342* CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTNu8iFqpG9/R2+zWd8/7PpTKgi5jAfBgNV343* HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDAXBgNVHREBAf8EDTALgglsb2Nh344* bGhvc3QwDQYJKoZIhvcNAQEEBQADgYEAm25gJyqW1JznQ1EyOtTGswBVwfgBOf+F345* HJuBTcflYQLbTD/AETPQJGvZU9tdhuLtbG3OPhR7vSY8zeAbfM3dbH7QFr3r47Gj346* XEH7qM/MX+Z3ifVaC4MeJmrYQkYFSuKeyyKpdRVX4w4nnFHF6OsNASsYrMW6LpxN347* cl/epUcHL7E=348* -----END CERTIFICATE-----349*350*351*352* Trusted CA certificate:353* Certificate:354* Data:355* Version: 3 (0x2)356* Serial Number: 0 (0x0)357* Signature Algorithm: md5WithRSAEncryption358* Issuer: C=US, ST=Some-State, L=Some-City, O=Some-Org359* Validity360* Not Before: Dec 8 02:43:36 2008 GMT361* Not After : Aug 25 02:43:36 2028 GMT362* Subject: C=US, ST=Some-State, L=Some-City, O=Some-Org363* Subject Public Key Info:364* Public Key Algorithm: rsaEncryption365* RSA Public Key: (1024 bit)366* Modulus (1024 bit):367* 00:cb:c4:38:20:07:be:88:a7:93:b0:a1:43:51:2d:368* d7:8e:85:af:54:dd:ad:a2:7b:23:5b:cf:99:13:53:369* 99:45:7d:ee:6d:ba:2d:bf:e3:ad:6e:3d:9f:1a:f9:370* 03:97:e0:17:55:ae:11:26:57:de:01:29:8e:05:3f:371* 21:f7:e7:36:e8:2e:37:d7:48:ac:53:d6:60:0e:c7:372* 50:6d:f6:c5:85:f7:8b:a6:c5:91:35:72:3c:94:ee:373* f1:17:f0:71:e3:ec:1b:ce:ca:4e:40:42:b0:6d:ee:374* 6a:0e:d6:e5:ad:3c:0f:c9:ba:82:4f:78:f8:89:97:375* 89:2a:95:12:4c:d8:09:2a:e9376* Exponent: 65537 (0x10001)377* X509v3 extensions:378* X509v3 Subject Key Identifier:379* FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14380* X509v3 Authority Key Identifier:381* keyid:FA:B9:51:BF:4C:E7:D9:86:98:33:F9:E7:CB:1E:F1:33:49:F7:A8:14382* DirName:/C=US/ST=Some-State/L=Some-City/O=Some-Org383* serial:00384*385* X509v3 Basic Constraints:386* CA:TRUE387* Signature Algorithm: md5WithRSAEncryption388*389* -----BEGIN CERTIFICATE-----390* MIICrDCCAhWgAwIBAgIBADANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET391* MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK392* EwhTb21lLU9yZzAeFw0wODEyMDgwMjQzMzZaFw0yODA4MjUwMjQzMzZaMEkxCzAJ393* BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp394* dHkxETAPBgNVBAoTCFNvbWUtT3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB395* gQDLxDggB76Ip5OwoUNRLdeOha9U3a2ieyNbz5kTU5lFfe5tui2/461uPZ8a+QOX396* 4BdVrhEmV94BKY4FPyH35zboLjfXSKxT1mAOx1Bt9sWF94umxZE1cjyU7vEX8HHj397* 7BvOyk5AQrBt7moO1uWtPA/JuoJPePiJl4kqlRJM2Akq6QIDAQABo4GjMIGgMB0G398* A1UdDgQWBBT6uVG/TOfZhpgz+efLHvEzSfeoFDBxBgNVHSMEajBogBT6uVG/TOfZ399* hpgz+efLHvEzSfeoFKFNpEswSTELMAkGA1UEBhMCVVMxEzARBgNVBAgTClNvbWUt400* U3RhdGUxEjAQBgNVBAcTCVNvbWUtQ2l0eTERMA8GA1UEChMIU29tZS1PcmeCAQAw401* DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBcIm534U123Hz+rtyYO5uA402* ofd81G6FnTfEAV8Kw9fGyyEbQZclBv34A9JsFKeMvU4OFIaixD7nLZ/NZ+IWbhmZ403* LovmJXyCkOufea73pNiZ+f/4/ScZaIlM/PRycQSqbFNd4j9Wott+08qxHPLpsf3P404* 6Mvf0r1PNTY2hwTJLJmKtg==405* -----END CERTIFICATE---406*/407408409public class PKIXExtendedTM {410411/*412* =============================================================413* Set the various variables needed for the tests, then414* specify what tests to run on each side.415*/416417/*418* Should we run the client or server in a separate thread?419* Both sides can throw exceptions, but do you have a preference420* as to which side should be the main thread.421*/422static boolean separateServerThread = true;423424/*425* Where do we find the keystores?426*/427static String trusedCertStr =428"-----BEGIN CERTIFICATE-----\n" +429"MIICrDCCAhWgAwIBAgIBADANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" +430"MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" +431"EwhTb21lLU9yZzAeFw0wODEyMDgwMjQzMzZaFw0yODA4MjUwMjQzMzZaMEkxCzAJ\n" +432"BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" +433"dHkxETAPBgNVBAoTCFNvbWUtT3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n" +434"gQDLxDggB76Ip5OwoUNRLdeOha9U3a2ieyNbz5kTU5lFfe5tui2/461uPZ8a+QOX\n" +435"4BdVrhEmV94BKY4FPyH35zboLjfXSKxT1mAOx1Bt9sWF94umxZE1cjyU7vEX8HHj\n" +436"7BvOyk5AQrBt7moO1uWtPA/JuoJPePiJl4kqlRJM2Akq6QIDAQABo4GjMIGgMB0G\n" +437"A1UdDgQWBBT6uVG/TOfZhpgz+efLHvEzSfeoFDBxBgNVHSMEajBogBT6uVG/TOfZ\n" +438"hpgz+efLHvEzSfeoFKFNpEswSTELMAkGA1UEBhMCVVMxEzARBgNVBAgTClNvbWUt\n" +439"U3RhdGUxEjAQBgNVBAcTCVNvbWUtQ2l0eTERMA8GA1UEChMIU29tZS1PcmeCAQAw\n" +440"DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBcIm534U123Hz+rtyYO5uA\n" +441"ofd81G6FnTfEAV8Kw9fGyyEbQZclBv34A9JsFKeMvU4OFIaixD7nLZ/NZ+IWbhmZ\n" +442"LovmJXyCkOufea73pNiZ+f/4/ScZaIlM/PRycQSqbFNd4j9Wott+08qxHPLpsf3P\n" +443"6Mvf0r1PNTY2hwTJLJmKtg==\n" +444"-----END CERTIFICATE-----";445446static String serverCertStr =447"-----BEGIN CERTIFICATE-----\n" +448"MIICpDCCAg2gAwIBAgIBCDANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" +449"MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" +450"EwhTb21lLU9yZzAeFw0wODEyMDgwMzQzMDRaFw0yODA4MjUwMzQzMDRaMHIxCzAJ\n" +451"BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" +452"dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtU2VydmVyMRIwEAYD\n" +453"VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKWsWxw3\n" +454"ot2ZiS2yebiP1Uil5xyEF41pnMasbfnyHR85GdrTch5u7ETMcKTcugAw9qBPPVR6\n" +455"YWrMV9AKf5UoGD+a2ZTyG8gkiH7+nQ89+1dTCLMgM9Q/F0cU0c3qCNgOdU6vvszS\n" +456"7K+peknfwtmsuCRAkKYDVirQMAVALE+r2XSJAgMBAAGjczBxMAkGA1UdEwQCMAAw\n" +457"CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTtbtv0tVbI+xoGYT8PCLumBNgWVDAfBgNV\n" +458"HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDAXBgNVHREBAf8EDTALgglsb2Nh\n" +459"bGhvc3QwDQYJKoZIhvcNAQEEBQADgYEAoqVTciHtcvsUj+YaTct8tUh3aTCsKsac\n" +460"PHhfQ+ObjiXSgxsKYTX7ym/wk/wvlbUcbqLKxsu7qrcJitH+H9heV1hEHEu65Uoi\n" +461"nRugFruyOrwvAylV8Cm2af7ddilmYJ+sdJA6N2M3xJRxR0G2LFHEXDNEjYReyexn\n" +462"JqCpf5uZGOo=\n" +463"-----END CERTIFICATE-----";464465static String clientCertStr =466"-----BEGIN CERTIFICATE-----\n" +467"MIICpDCCAg2gAwIBAgIBCTANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzET\n" +468"MBEGA1UECBMKU29tZS1TdGF0ZTESMBAGA1UEBxMJU29tZS1DaXR5MREwDwYDVQQK\n" +469"EwhTb21lLU9yZzAeFw0wODEyMDgwMzQzMjRaFw0yODA4MjUwMzQzMjRaMHIxCzAJ\n" +470"BgNVBAYTAlVTMRMwEQYDVQQIEwpTb21lLVN0YXRlMRIwEAYDVQQHEwlTb21lLUNp\n" +471"dHkxETAPBgNVBAoTCFNvbWUtT3JnMRMwEQYDVQQLEwpTU0wtQ2xpZW50MRIwEAYD\n" +472"VQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALvwQDas\n" +473"JlRO9KNaAC9pIW+5ejqT7KL24Y7HY9gvEjCZLrDyj/gnLSR4KIT3Ab+NRHndO9JV\n" +474"8848slshfe/9M0qxo//GyJu5D3xBNZf52zoFYAUVr1kXkqMQrRYc5AdTr6h2olYq\n" +475"ktP5KOB4z14fSKtcGd3hZ0O6dY31gqxDkkQbAgMBAAGjczBxMAkGA1UdEwQCMAAw\n" +476"CwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTNu8iFqpG9/R2+zWd8/7PpTKgi5jAfBgNV\n" +477"HSMEGDAWgBT6uVG/TOfZhpgz+efLHvEzSfeoFDAXBgNVHREBAf8EDTALgglsb2Nh\n" +478"bGhvc3QwDQYJKoZIhvcNAQEEBQADgYEAm25gJyqW1JznQ1EyOtTGswBVwfgBOf+F\n" +479"HJuBTcflYQLbTD/AETPQJGvZU9tdhuLtbG3OPhR7vSY8zeAbfM3dbH7QFr3r47Gj\n" +480"XEH7qM/MX+Z3ifVaC4MeJmrYQkYFSuKeyyKpdRVX4w4nnFHF6OsNASsYrMW6LpxN\n" +481"cl/epUcHL7E=\n" +482"-----END CERTIFICATE-----";483484static byte serverPrivateExponent[] = {485(byte)0x6e, (byte)0xa7, (byte)0x1b, (byte)0x83,486(byte)0x51, (byte)0x35, (byte)0x9a, (byte)0x44,487(byte)0x7d, (byte)0xf6, (byte)0xe3, (byte)0x89,488(byte)0xa0, (byte)0xd7, (byte)0x90, (byte)0x60,489(byte)0xa1, (byte)0x4e, (byte)0x27, (byte)0x21,490(byte)0xa2, (byte)0x89, (byte)0x74, (byte)0xcc,491(byte)0x9d, (byte)0x75, (byte)0x75, (byte)0x4e,492(byte)0xc7, (byte)0x82, (byte)0xe3, (byte)0xe3,493(byte)0xc3, (byte)0x7d, (byte)0x00, (byte)0x54,494(byte)0xec, (byte)0x36, (byte)0xb1, (byte)0xdf,495(byte)0x91, (byte)0x9c, (byte)0x7a, (byte)0xc0,496(byte)0x62, (byte)0x0a, (byte)0xd6, (byte)0xa9,497(byte)0x22, (byte)0x91, (byte)0x4a, (byte)0x29,498(byte)0x2e, (byte)0x43, (byte)0xfa, (byte)0x8c,499(byte)0xd8, (byte)0xe9, (byte)0xbe, (byte)0xd9,500(byte)0x4f, (byte)0xca, (byte)0x23, (byte)0xc6,501(byte)0xe4, (byte)0x3f, (byte)0xb8, (byte)0x72,502(byte)0xcf, (byte)0x02, (byte)0xfc, (byte)0xf4,503(byte)0x58, (byte)0x34, (byte)0x77, (byte)0x76,504(byte)0xce, (byte)0x22, (byte)0x44, (byte)0x5f,505(byte)0x2d, (byte)0xca, (byte)0xee, (byte)0xf5,506(byte)0x43, (byte)0x56, (byte)0x47, (byte)0x71,507(byte)0x0b, (byte)0x09, (byte)0x6b, (byte)0x5e,508(byte)0xf2, (byte)0xc8, (byte)0xee, (byte)0xd4,509(byte)0x6e, (byte)0x44, (byte)0x92, (byte)0x2a,510(byte)0x7f, (byte)0xcc, (byte)0xa7, (byte)0xd4,511(byte)0x5b, (byte)0xfb, (byte)0xf7, (byte)0x4a,512(byte)0xa9, (byte)0xfb, (byte)0x54, (byte)0x18,513(byte)0xd5, (byte)0xd5, (byte)0x14, (byte)0xba,514(byte)0xa0, (byte)0x1c, (byte)0x13, (byte)0xb3,515(byte)0x37, (byte)0x6b, (byte)0x37, (byte)0x59,516(byte)0xed, (byte)0xdb, (byte)0x6d, (byte)0xb1517};518519static byte serverModulus[] = {520(byte)0x00,521(byte)0xa5, (byte)0xac, (byte)0x5b, (byte)0x1c,522(byte)0x37, (byte)0xa2, (byte)0xdd, (byte)0x99,523(byte)0x89, (byte)0x2d, (byte)0xb2, (byte)0x79,524(byte)0xb8, (byte)0x8f, (byte)0xd5, (byte)0x48,525(byte)0xa5, (byte)0xe7, (byte)0x1c, (byte)0x84,526(byte)0x17, (byte)0x8d, (byte)0x69, (byte)0x9c,527(byte)0xc6, (byte)0xac, (byte)0x6d, (byte)0xf9,528(byte)0xf2, (byte)0x1d, (byte)0x1f, (byte)0x39,529(byte)0x19, (byte)0xda, (byte)0xd3, (byte)0x72,530(byte)0x1e, (byte)0x6e, (byte)0xec, (byte)0x44,531(byte)0xcc, (byte)0x70, (byte)0xa4, (byte)0xdc,532(byte)0xba, (byte)0x00, (byte)0x30, (byte)0xf6,533(byte)0xa0, (byte)0x4f, (byte)0x3d, (byte)0x54,534(byte)0x7a, (byte)0x61, (byte)0x6a, (byte)0xcc,535(byte)0x57, (byte)0xd0, (byte)0x0a, (byte)0x7f,536(byte)0x95, (byte)0x28, (byte)0x18, (byte)0x3f,537(byte)0x9a, (byte)0xd9, (byte)0x94, (byte)0xf2,538(byte)0x1b, (byte)0xc8, (byte)0x24, (byte)0x88,539(byte)0x7e, (byte)0xfe, (byte)0x9d, (byte)0x0f,540(byte)0x3d, (byte)0xfb, (byte)0x57, (byte)0x53,541(byte)0x08, (byte)0xb3, (byte)0x20, (byte)0x33,542(byte)0xd4, (byte)0x3f, (byte)0x17, (byte)0x47,543(byte)0x14, (byte)0xd1, (byte)0xcd, (byte)0xea,544(byte)0x08, (byte)0xd8, (byte)0x0e, (byte)0x75,545(byte)0x4e, (byte)0xaf, (byte)0xbe, (byte)0xcc,546(byte)0xd2, (byte)0xec, (byte)0xaf, (byte)0xa9,547(byte)0x7a, (byte)0x49, (byte)0xdf, (byte)0xc2,548(byte)0xd9, (byte)0xac, (byte)0xb8, (byte)0x24,549(byte)0x40, (byte)0x90, (byte)0xa6, (byte)0x03,550(byte)0x56, (byte)0x2a, (byte)0xd0, (byte)0x30,551(byte)0x05, (byte)0x40, (byte)0x2c, (byte)0x4f,552(byte)0xab, (byte)0xd9, (byte)0x74, (byte)0x89553};554555static byte clientPrivateExponent[] = {556(byte)0x11, (byte)0xb7, (byte)0x6a, (byte)0x36,557(byte)0x3d, (byte)0x30, (byte)0x37, (byte)0xce,558(byte)0x61, (byte)0x9d, (byte)0x6c, (byte)0x84,559(byte)0x8b, (byte)0xf3, (byte)0x9b, (byte)0x25,560(byte)0x4f, (byte)0x14, (byte)0xc8, (byte)0xa4,561(byte)0xdd, (byte)0x2f, (byte)0xd7, (byte)0x9a,562(byte)0x17, (byte)0xbd, (byte)0x90, (byte)0x19,563(byte)0xf7, (byte)0x05, (byte)0xfd, (byte)0xf2,564(byte)0xd2, (byte)0xc5, (byte)0xf7, (byte)0x77,565(byte)0xbe, (byte)0xea, (byte)0xe2, (byte)0x84,566(byte)0x87, (byte)0x97, (byte)0x3a, (byte)0x41,567(byte)0x96, (byte)0xb6, (byte)0x99, (byte)0xf8,568(byte)0x94, (byte)0x8c, (byte)0x58, (byte)0x71,569(byte)0x51, (byte)0x8c, (byte)0xf4, (byte)0x2a,570(byte)0x20, (byte)0x9e, (byte)0x1a, (byte)0xa0,571(byte)0x26, (byte)0x99, (byte)0x75, (byte)0xd6,572(byte)0x31, (byte)0x53, (byte)0x43, (byte)0x39,573(byte)0xf5, (byte)0x2a, (byte)0xa6, (byte)0x7e,574(byte)0x34, (byte)0x42, (byte)0x51, (byte)0x2a,575(byte)0x40, (byte)0x87, (byte)0x03, (byte)0x88,576(byte)0x43, (byte)0x69, (byte)0xb2, (byte)0x89,577(byte)0x6d, (byte)0x20, (byte)0xbd, (byte)0x7d,578(byte)0x71, (byte)0xef, (byte)0x47, (byte)0x0a,579(byte)0xdf, (byte)0x06, (byte)0xc1, (byte)0x69,580(byte)0x66, (byte)0xa8, (byte)0x22, (byte)0x37,581(byte)0x1a, (byte)0x77, (byte)0x1e, (byte)0xc7,582(byte)0x94, (byte)0x4e, (byte)0x2c, (byte)0x27,583(byte)0x69, (byte)0x45, (byte)0x5e, (byte)0xc8,584(byte)0xf8, (byte)0x0c, (byte)0xb7, (byte)0xf8,585(byte)0xc0, (byte)0x8f, (byte)0x99, (byte)0xc1,586(byte)0xe5, (byte)0x28, (byte)0x9b, (byte)0xf9,587(byte)0x4c, (byte)0x94, (byte)0xc6, (byte)0xb1588};589590static byte clientModulus[] = {591(byte)0x00,592(byte)0xbb, (byte)0xf0, (byte)0x40, (byte)0x36,593(byte)0xac, (byte)0x26, (byte)0x54, (byte)0x4e,594(byte)0xf4, (byte)0xa3, (byte)0x5a, (byte)0x00,595(byte)0x2f, (byte)0x69, (byte)0x21, (byte)0x6f,596(byte)0xb9, (byte)0x7a, (byte)0x3a, (byte)0x93,597(byte)0xec, (byte)0xa2, (byte)0xf6, (byte)0xe1,598(byte)0x8e, (byte)0xc7, (byte)0x63, (byte)0xd8,599(byte)0x2f, (byte)0x12, (byte)0x30, (byte)0x99,600(byte)0x2e, (byte)0xb0, (byte)0xf2, (byte)0x8f,601(byte)0xf8, (byte)0x27, (byte)0x2d, (byte)0x24,602(byte)0x78, (byte)0x28, (byte)0x84, (byte)0xf7,603(byte)0x01, (byte)0xbf, (byte)0x8d, (byte)0x44,604(byte)0x79, (byte)0xdd, (byte)0x3b, (byte)0xd2,605(byte)0x55, (byte)0xf3, (byte)0xce, (byte)0x3c,606(byte)0xb2, (byte)0x5b, (byte)0x21, (byte)0x7d,607(byte)0xef, (byte)0xfd, (byte)0x33, (byte)0x4a,608(byte)0xb1, (byte)0xa3, (byte)0xff, (byte)0xc6,609(byte)0xc8, (byte)0x9b, (byte)0xb9, (byte)0x0f,610(byte)0x7c, (byte)0x41, (byte)0x35, (byte)0x97,611(byte)0xf9, (byte)0xdb, (byte)0x3a, (byte)0x05,612(byte)0x60, (byte)0x05, (byte)0x15, (byte)0xaf,613(byte)0x59, (byte)0x17, (byte)0x92, (byte)0xa3,614(byte)0x10, (byte)0xad, (byte)0x16, (byte)0x1c,615(byte)0xe4, (byte)0x07, (byte)0x53, (byte)0xaf,616(byte)0xa8, (byte)0x76, (byte)0xa2, (byte)0x56,617(byte)0x2a, (byte)0x92, (byte)0xd3, (byte)0xf9,618(byte)0x28, (byte)0xe0, (byte)0x78, (byte)0xcf,619(byte)0x5e, (byte)0x1f, (byte)0x48, (byte)0xab,620(byte)0x5c, (byte)0x19, (byte)0xdd, (byte)0xe1,621(byte)0x67, (byte)0x43, (byte)0xba, (byte)0x75,622(byte)0x8d, (byte)0xf5, (byte)0x82, (byte)0xac,623(byte)0x43, (byte)0x92, (byte)0x44, (byte)0x1b624};625626static char passphrase[] = "passphrase".toCharArray();627628/*629* Is the server ready to serve?630*/631volatile static boolean serverReady = false;632633/*634* Turn on SSL debugging?635*/636static boolean debug = false;637638/*639* Define the server side of the test.640*641* If the server prematurely exits, serverReady will be set to true642* to avoid infinite hangs.643*/644void doServerSide() throws Exception {645SSLContext context = getSSLContext(trusedCertStr, serverCertStr,646serverModulus, serverPrivateExponent, passphrase);647SSLServerSocketFactory sslssf = context.getServerSocketFactory();648649SSLServerSocket sslServerSocket =650(SSLServerSocket) sslssf.createServerSocket(serverPort);651serverPort = sslServerSocket.getLocalPort();652653// enable endpoint identification654// ignore, we may test the feature when known how to parse client655// hostname656//SSLParameters params = sslServerSocket.getSSLParameters();657//params.setEndpointIdentificationAlgorithm("HTTPS");658//sslServerSocket.setSSLParameters(params);659660/*661* Signal Client, we're ready for his connect.662*/663serverReady = true;664665SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();666sslSocket.setNeedClientAuth(true);667668InputStream sslIS = sslSocket.getInputStream();669OutputStream sslOS = sslSocket.getOutputStream();670671sslIS.read();672sslOS.write(85);673sslOS.flush();674675sslSocket.close();676677}678679/*680* Define the client side of the test.681*682* If the server prematurely exits, serverReady will be set to true683* to avoid infinite hangs.684*/685void doClientSide() throws Exception {686/*687* Wait for server to get started.688*/689while (!serverReady) {690Thread.sleep(50);691}692693SSLContext context = getSSLContext(trusedCertStr, clientCertStr,694clientModulus, clientPrivateExponent, passphrase);695696SSLSocketFactory sslsf = context.getSocketFactory();697SSLSocket sslSocket = (SSLSocket)698sslsf.createSocket("localhost", serverPort);699700// enable endpoint identification701SSLParameters params = sslSocket.getSSLParameters();702params.setEndpointIdentificationAlgorithm("HTTPS");703sslSocket.setSSLParameters(params);704705InputStream sslIS = sslSocket.getInputStream();706OutputStream sslOS = sslSocket.getOutputStream();707708sslOS.write(280);709sslOS.flush();710sslIS.read();711712sslSocket.close();713714}715716// get the ssl context717private static SSLContext getSSLContext(String trusedCertStr,718String keyCertStr, byte[] modulus,719byte[] privateExponent, char[] passphrase) throws Exception {720721// generate certificate from cert string722CertificateFactory cf = CertificateFactory.getInstance("X.509");723724ByteArrayInputStream is =725new ByteArrayInputStream(trusedCertStr.getBytes());726Certificate trusedCert = cf.generateCertificate(is);727is.close();728729// create a key store730KeyStore ks = KeyStore.getInstance("JKS");731ks.load(null, null);732733// import the trused cert734ks.setCertificateEntry("RSA Export Signer", trusedCert);735736if (keyCertStr != null) {737// generate the private key.738RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(739new BigInteger(modulus),740new BigInteger(privateExponent));741KeyFactory kf = KeyFactory.getInstance("RSA");742RSAPrivateKey priKey =743(RSAPrivateKey)kf.generatePrivate(priKeySpec);744745// generate certificate chain746is = new ByteArrayInputStream(keyCertStr.getBytes());747Certificate keyCert = cf.generateCertificate(is);748is.close();749750Certificate[] chain = new Certificate[2];751chain[0] = keyCert;752chain[1] = trusedCert;753754// import the key entry.755ks.setKeyEntry("Whatever", priKey, passphrase, chain);756}757758// create SSL context759TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");760tmf.init(ks);761762TrustManager tms[] = tmf.getTrustManagers();763if (tms == null || tms.length == 0) {764throw new Exception("unexpected trust manager implementation");765} else {766if (!(tms[0] instanceof X509ExtendedTrustManager)) {767throw new Exception("unexpected trust manager implementation: "768+ tms[0].getClass().getCanonicalName());769}770}771772773SSLContext ctx = SSLContext.getInstance("TLS");774775if (keyCertStr != null) {776KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");777kmf.init(ks, passphrase);778779ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);780} else {781ctx.init(null, tmf.getTrustManagers(), null);782}783784return ctx;785}786787/*788* =============================================================789* The remainder is just support stuff790*/791792// use any free port by default793volatile int serverPort = 0;794795volatile Exception serverException = null;796volatile Exception clientException = null;797798static class Test {799String tlsDisAlgs;800String certPathDisAlgs;801boolean fail;802Test(String tlsDisAlgs, String certPathDisAlgs, boolean fail) {803this.tlsDisAlgs = tlsDisAlgs;804this.certPathDisAlgs = certPathDisAlgs;805this.fail = fail;806}807}808809static Test[] tests = {810// MD5 is used in this test case, don't disable MD5 algorithm.811new Test(812"SSLv3, RC4, DH keySize < 768",813"MD2, RSA keySize < 1024",814false),815// Disable MD5 but only if cert chains back to public root CA, should816// pass because the MD5 cert in this test case is issued by test CA817new Test(818"SSLv3, RC4, DH keySize < 768",819"MD2, MD5 jdkCA, RSA keySize < 1024",820false),821// Disable MD5 alg via TLS property and expect failure822new Test(823"SSLv3, MD5, RC4, DH keySize < 768",824"MD2, RSA keySize < 1024",825true),826// Disable MD5 alg via certpath property and expect failure827new Test(828"SSLv3, RC4, DH keySize < 768",829"MD2, MD5, RSA keySize < 1024",830true),831};832833public static void main(String args[]) throws Exception {834if (args.length != 1) {835throw new Exception("Incorrect number of arguments");836}837Test test = tests[Integer.parseInt(args[0])];838Security.setProperty("jdk.tls.disabledAlgorithms", test.tlsDisAlgs);839Security.setProperty("jdk.certpath.disabledAlgorithms",840test.certPathDisAlgs);841842if (debug) {843System.setProperty("javax.net.debug", "all");844}845846/*847* Start the tests.848*/849try {850new PKIXExtendedTM();851if (test.fail) {852throw new Exception("Expected MD5 certificate to be blocked");853}854} catch (Exception e) {855if (test.fail) {856// find expected cause857boolean correctReason = false;858Throwable cause = e.getCause();859while (cause != null) {860if (cause instanceof CertPathValidatorException) {861CertPathValidatorException cpve =862(CertPathValidatorException)cause;863if (cpve.getReason() == CertPathValidatorException.BasicReason.ALGORITHM_CONSTRAINED) {864correctReason = true;865break;866}867}868cause = cause.getCause();869}870if (!correctReason) {871throw new Exception("Unexpected exception", e);872}873} else {874throw e;875}876}877}878879Thread clientThread = null;880Thread serverThread = null;881/*882* Primary constructor, used to drive remainder of the test.883*884* Fork off the other side, then do your work.885*/886PKIXExtendedTM() throws Exception {887if (separateServerThread) {888startServer(true);889startClient(false);890} else {891startClient(true);892startServer(false);893}894895/*896* Wait for other side to close down.897*/898if (separateServerThread) {899serverThread.join();900} else {901clientThread.join();902}903904/*905* When we get here, the test is pretty much over.906*907* If the main thread excepted, that propagates back908* immediately. If the other thread threw an exception, we909* should report back.910*/911if (serverException != null)912throw serverException;913if (clientException != null)914throw clientException;915}916917void startServer(boolean newThread) throws Exception {918if (newThread) {919serverThread = new Thread() {920public void run() {921try {922doServerSide();923} catch (Exception e) {924/*925* Our server thread just died.926*927* Release the client, if not active already...928*/929System.err.println("Server died...");930serverReady = true;931serverException = e;932}933}934};935serverThread.start();936} else {937doServerSide();938}939}940941void startClient(boolean newThread) throws Exception {942if (newThread) {943clientThread = new Thread() {944public void run() {945try {946doClientSide();947} catch (Exception e) {948/*949* Our client thread just died.950*/951System.err.println("Client died...");952clientException = e;953}954}955};956clientThread.start();957} else {958doClientSide();959}960}961962}963964965