--- /dev/null 2010-05-15 13:10:57.324837880 +0800 +++ new/test/sun/security/validator/CertReplace.java 2010-05-21 17:18:51.000000000 +0800 @@ -0,0 +1,72 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test 6948803 + * @summary CertPath validation regression caused by SHA1 replacement root + * and MD2 disable feature + */ + +import java.io.FileInputStream; +import java.security.KeyStore; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import sun.security.validator.Validator; + +public class CertReplace { + + // These two files are generated using JDK 7 keytool: + // certreplace.certs includes 3 certs (user, int, ca) as + // a cert chain for user, where ca's signature is MD2withRSA, + // certreplace.jks includes ca's new-refreshed cert which + // signature is SHA256withRSA. + private final static String cacerts = + System.getProperty("test.src", "./") + "/certreplace.jks"; + private final static String certs = + System.getProperty("test.src", "./") + "/certreplace.certs"; + + public static void main(String[] args) throws Exception { + + KeyStore ks = KeyStore.getInstance("JKS"); + ks.load(new FileInputStream(cacerts), "changeit".toCharArray()); + Validator v = Validator.getInstance + (Validator.TYPE_PKIX, Validator.VAR_GENERIC, ks); + X509Certificate[] chain = createPath(); + System.out.println(Arrays.toString(v.validate(chain))); + + } + + public static X509Certificate[] createPath() throws Exception { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + List list = new ArrayList(); + for (Certificate c: cf.generateCertificates( + new FileInputStream(certs))) { + list.add((X509Certificate)c); + } + return (X509Certificate[]) list.toArray(new X509Certificate[0]); + } +}