/* * Copyright (c) 2003, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test 1.1, 03/06/24 * @bug 4850376 * @summary Provide generic storage KeyStore storage facilities */ import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Principal; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SignatureException; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateNotYetValidException; import java.security.cert.X509Certificate; import java.util.Date; import java.util.Set; import java.util.HashSet; import java.math.BigInteger; import javax.security.auth.x500.X500Principal; public class DefaultEntryType { private static class PrivKey1 implements PrivateKey { public String getAlgorithm() { return ("matching_alg"); } public String getFormat() { return "privkey1"; } public byte[] getEncoded() { return (byte[])null; } } private static class PubKey1 implements PublicKey { public String getAlgorithm() { return ("non_matching_alg"); } public String getFormat() { return "pubkey1"; } public byte[] getEncoded() { return (byte[])null; } } private static class PubKey2 implements PublicKey { public String getAlgorithm() { return ("matching_alg"); } public String getFormat() { return "pubkey2"; } public byte[] getEncoded() { return (byte[])null; } } private static class Cert extends Certificate { public Cert() { super("cert"); } public byte[] getEncoded() throws CertificateEncodingException { return (byte[])null; } public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { } public void verify(PublicKey key, String sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { } public String toString() { return "cert"; } public PublicKey getPublicKey() { return new PubKey1(); } } private static class X509Cert extends X509Certificate { public byte[] getEncoded() throws CertificateEncodingException { return (byte[])null; } public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { } public void verify(PublicKey key, String sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { } public String toString() { return "x509cert"; } public PublicKey getPublicKey() { return new PubKey2(); } public void checkValidity() throws CertificateExpiredException, CertificateNotYetValidException { } public void checkValidity(java.util.Date date) throws CertificateExpiredException, CertificateNotYetValidException { } public int getVersion() { return 1; } public BigInteger getSerialNumber() { return new BigInteger("5", 10); } public Principal getIssuerDN() { return new X500Principal("cn=x509cert"); } public X500Principal getIssuerX500Principal() { return new X500Principal("cn=x509cert"); } public Principal getSubjectDN() { return new X500Principal("cn=x509cert"); } public X500Principal getSubjectX500Principal() { return new X500Principal("cn=x509cert"); } public Date getNotBefore() { return new Date(); } public Date getNotAfter() { return new Date(); } public byte[] getTBSCertificate() throws CertificateEncodingException { return (byte[])null; } public byte[] getSignature() { return (byte[])null; } public String getSigAlgName() { return "x509cert"; } public String getSigAlgOID() { return "x509cert"; } public byte[] getSigAlgParams() { return (byte[])null; } public boolean[] getIssuerUniqueID() { return (boolean[])null; } public boolean[] getSubjectUniqueID() { return (boolean[])null; } public boolean[] getKeyUsage() { return (boolean[]) null; } public int getBasicConstraints() { return 1; } public boolean hasUnsupportedCriticalExtension() { return true; } public Set getCriticalExtensionOIDs() { return new HashSet(); } public Set getNonCriticalExtensionOIDs() { return new HashSet(); } public byte[] getExtensionValue(String oid) { return (byte[])null; } } public static void main(String[] args) throws Exception { testPrivateKeyEntry(); testSecretKeyEntry(); testTrustedCertificateEntry(); } private static void testPrivateKeyEntry() throws Exception { // TEST null private key try { Certificate[] chain = new Certificate[0]; KeyStore.PrivateKeyEntry pke = new KeyStore.PrivateKeyEntry (null, chain); throw new SecurityException("test 1 failed"); } catch (NullPointerException npe) { // good System.out.println("test 1 passed"); } // TEST null chain try { KeyStore.PrivateKeyEntry pke = new KeyStore.PrivateKeyEntry (new PrivKey1(), null); throw new SecurityException("test 2 failed"); } catch (NullPointerException npe) { // good System.out.println("test 2 passed"); } // TEST empty chain try { Certificate[] chain = new Certificate[0]; KeyStore.PrivateKeyEntry pke = new KeyStore.PrivateKeyEntry (new PrivKey1(), chain); throw new SecurityException("test 3 failed"); } catch (IllegalArgumentException npe) { // good System.out.println("test 3 passed"); } // TEST non-homogenous chain try { Certificate[] chain = new Certificate[2]; chain[0] = new Cert(); chain[1] = new X509Cert(); KeyStore.PrivateKeyEntry pke = new KeyStore.PrivateKeyEntry (new PrivKey1(), chain); throw new SecurityException("test 4 failed"); } catch (IllegalArgumentException npe) { // good System.out.println("test 4 passed"); } // TEST non matching algorithms try { Certificate[] chain = new Certificate[1]; chain[0] = new Cert(); KeyStore.PrivateKeyEntry pke = new KeyStore.PrivateKeyEntry (new PrivKey1(), chain); throw new SecurityException("test 5 failed"); } catch (IllegalArgumentException npe) { // good System.out.println("test 5 passed"); } // TEST correct behavior Certificate[] chain = new Certificate[2]; chain[0] = new X509Cert(); chain[1] = new X509Cert(); PrivateKey pkey = new PrivKey1(); KeyStore.PrivateKeyEntry pke = new KeyStore.PrivateKeyEntry (pkey, chain); Certificate[] gotChain = pke.getCertificateChain(); if (gotChain instanceof X509Certificate[]) { System.out.println("test 6 passed"); } else { throw new SecurityException("test 6 failed"); } if (gotChain.length == 2 && gotChain[0] == chain[0] && gotChain[1] == chain[1]) { System.out.println("test 7 passed"); } else { throw new SecurityException("test 7 failed"); } if (pke.getPrivateKey() == pkey) { System.out.println("test 8 passed"); } else { throw new SecurityException("test 8 failed"); } } private static void testSecretKeyEntry() throws Exception { } private static void testTrustedCertificateEntry() throws Exception { } }