0N/A/*
2362N/A * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
0N/A * published by the Free Software Foundation.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A/*
0N/A * @test
0N/A * @bug 5091374 5100603
0N/A * @summary make sure the JKS case sensitivity works correctly
0N/A * @author Andreas Sterbenz
0N/A */
0N/A
0N/Aimport java.io.*;
0N/Aimport java.util.*;
0N/A
0N/Aimport java.security.*;
0N/Aimport java.security.cert.*;
0N/Aimport java.security.cert.Certificate;
0N/A
0N/Apublic class CaseSensitiveAliases {
0N/A
0N/A // some arbitrary certs
0N/A
0N/A private final static String S1 =
0N/A"-----BEGIN CERTIFICATE-----\n" +
0N/A"MIIB4DCCAYoCAQEwDQYJKoZIhvcNAQEEBQAwezELMAkGA1UEBhMCVVMxCzAJBgNV" +
0N/A"BAgTAkNBMRIwEAYDVQQHEwlDdXBlcnRpbm8xGTAXBgNVBAoTEFN1biBNaWNyb3N5" +
0N/A"c3RlbXMxFjAUBgNVBAsTDUphdmEgU29mdHdhcmUxGDAWBgNVBAMTD0pDRSBEZXZl" +
0N/A"bG9wbWVudDAeFw0wMjEwMzExNTI3NDRaFw0wNzEwMzExNTI3NDRaMHsxCzAJBgNV" +
0N/A"BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJQ3VwZXJ0aW5vMRkwFwYDVQQK" +
0N/A"ExBTdW4gTWljcm9zeXN0ZW1zMRYwFAYDVQQLEw1KYXZhIFNvZnR3YXJlMRgwFgYD" +
0N/A"VQQDEw9KQ0UgRGV2ZWxvcG1lbnQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAo/4C" +
0N/A"ddEOa3M6v9JFAhnBYgTq54Y30++F8yzCK9EeYaG3AzvzZqNshDy579647p0cOM/4" +
0N/A"VO6rU2PgbzgKXPcs8wIDAQABMA0GCSqGSIb3DQEBBAUAA0EACqPlFmVdKdYSCTNl" +
0N/A"tXKQnBqss9GNjbnB+CitvWrwN+oOK8qQpvV+5LB6LruvRy6zCedCV95Z2kXKg/Fn" +
0N/A"j0gvsg==\n" +
0N/A"-----END CERTIFICATE-----";
0N/A
0N/A private final static String S2 =
0N/A"-----BEGIN CERTIFICATE-----\n" +
0N/A"MIIB4DCCAYoCAQIwDQYJKoZIhvcNAQEEBQAwezELMAkGA1UEBhMCVVMxCzAJBgNV" +
0N/A"BAgTAkNBMRIwEAYDVQQHEwlDdXBlcnRpbm8xGTAXBgNVBAoTEFN1biBNaWNyb3N5" +
0N/A"c3RlbXMxFjAUBgNVBAsTDUphdmEgU29mdHdhcmUxGDAWBgNVBAMTD0pDRSBEZXZl" +
0N/A"bG9wbWVudDAeFw0wMjEwMzExNTI3NDRaFw0wNzEwMzExNTI3NDRaMHsxCzAJBgNV" +
0N/A"BAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJQ3VwZXJ0aW5vMRkwFwYDVQQK" +
0N/A"ExBTdW4gTWljcm9zeXN0ZW1zMRYwFAYDVQQLEw1KYXZhIFNvZnR3YXJlMRgwFgYD" +
0N/A"VQQDEw9KQ0UgRGV2ZWxvcG1lbnQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAr1OS" +
0N/A"XaOzpnVoqL2LqS5+HLy1kVvBwiM/E5iYT9eZaghE8qvF+4fETipWUNTWCQzHR4cD" +
0N/A"JGJOl9Nm77tELhES4QIDAQABMA0GCSqGSIb3DQEBBAUAA0EAL+WcVFyj+iXlEVNV" +
0N/A"QbNOOUlWmlmXGiNKKXnIdNcc1ZUyi+JW0zmlfZ7iU/eRYhEEJBwdrUoyiGOGLo7p" +
0N/A"i6JzAA==\n" +
0N/A"-----END CERTIFICATE-----";
0N/A
0N/A private static CertificateFactory cf;
0N/A
0N/A private static X509Certificate parseCert(String s) throws Exception {
0N/A if (cf == null) {
0N/A cf = CertificateFactory.getInstance("X.509");
0N/A }
0N/A InputStream in = new ByteArrayInputStream(s.getBytes("UTF8"));
0N/A return (X509Certificate)cf.generateCertificate(in);
0N/A }
0N/A
0N/A public static void main(String[] args) throws Exception {
0N/A main("JKS", true);
0N/A main("CaseExactJKS", false);
0N/A }
0N/A
0N/A private static void main(String jks, boolean caseInsensitive) throws Exception {
0N/A X509Certificate c1 = parseCert(S1);
0N/A X509Certificate c2 = parseCert(S2);
0N/A X509Certificate[] a1 = {c1};
0N/A X509Certificate[] a2 = {c2};
0N/A
0N/A KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
0N/A kpg.initialize(512);
0N/A PrivateKey p1 = kpg.generateKeyPair().getPrivate();
0N/A PrivateKey p2 = kpg.generateKeyPair().getPrivate();
0N/A
0N/A KeyStore ks = KeyStore.getInstance(jks);
0N/A ks.load(null, null);
0N/A
0N/A char[] pw = "pw".toCharArray();
0N/A
0N/A ks.setKeyEntry("Alias", p1, pw, a1);
0N/A ks.setKeyEntry("ALIAS", p2, pw, a2);
0N/A
0N/A if (caseInsensitive) {
0N/A if (ks.size() != 1) {
0N/A throw new Exception("size mismatch: " + ks.size());
0N/A }
0N/A match(p2, ks.getKey("alias", pw));
0N/A match(p2, ks.getKey("Alias", pw));
0N/A match(p2, ks.getKey("ALIAS", pw));
0N/A match(a2, ks.getCertificateChain("alias"));
0N/A match(a2, ks.getCertificateChain("Alias"));
0N/A match(a2, ks.getCertificateChain("ALIAS"));
0N/A } else {
0N/A if (ks.size() != 2) {
0N/A throw new Exception("size mismatch: " + ks.size());
0N/A }
0N/A match(null, ks.getKey("alias", pw));
0N/A match(p1, ks.getKey("Alias", pw));
0N/A match(p2, ks.getKey("ALIAS", pw));
0N/A match(null, ks.getCertificateChain("alias"));
0N/A match(a1, ks.getCertificateChain("Alias"));
0N/A match(a2, ks.getCertificateChain("ALIAS"));
0N/A }
0N/A
0N/A System.out.println("OK: " + jks);
0N/A }
0N/A
0N/A private static void match(Key p1, Key p2) throws Exception {
0N/A System.out.println(String.valueOf(p2).split("\\n")[0]);
0N/A if ((p1 != p2) && (p1.equals(p2) == false)) {
0N/A throw new Exception("Private key mismatch");
0N/A }
0N/A }
0N/A
0N/A private static void match(Certificate[] a1, Certificate[] a2) throws Exception {
0N/A System.out.println(String.valueOf(a2).split("\\n")[0]);
0N/A if ((a1 != a2) && (Arrays.equals(a1, a2) == false)) {
0N/A throw new Exception("chain mismatch");
0N/A }
0N/A }
0N/A
0N/A}