/* * Copyright (c) 2003, 2006, 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. */ import java.io.*; import java.util.*; import java.lang.reflect.*; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.KeyFactory; import java.security.KeyPairGenerator; import java.security.KeyPair; import java.security.SecureRandom; import java.security.AuthProvider; import java.security.PrivateKey; import java.security.Provider; import java.security.ProviderException; import java.security.Signature; import java.security.Security; import java.security.cert.*; import java.security.spec.*; import java.security.interfaces.*; import javax.crypto.SecretKey; import javax.security.auth.Subject; import javax.security.auth.login.LoginException; import com.sun.security.auth.module.*; import com.sun.security.auth.callback.*; public class Basic extends PKCS11Test { private static final char SEP = File.separatorChar; private static String DIR = System.getProperty("DIR"); private static char[] tokenPwd; private static final char[] ibuttonPwd = new char[0]; private static final char[] activcardPwd = new char[] { '1', '1', '2', '2', '3', '3' }; private static final char[] nssPwd = new char[] { 't', 'e', 's', 't', '1', '2' }; private static final char[] solarisPwd = new char[] { 'p', 'i', 'n' }; private static final char[] sca1000Pwd = new char[] { 'p', 'a', 's', 's', 'w', 'o', 'r', 'd' }; private static final char[] sPwd = { 'f', 'o', 'o' }; private static SecretKey sk1; private static SecretKey sk2; private static SecretKey sk3; private static SecretKey sk4; private static RSAPrivateCrtKey pk1; private static PrivateKey pk2; private static PrivateKey pk3; private static Certificate[] chain1; private static Certificate[] chain2; private static Certificate[] chain3; private static Certificate[] chain4; private static X509Certificate randomCert; private static KeyStore ks; private static final String KS_TYPE = "PKCS11"; private static Provider provider; private static class FooEntry implements KeyStore.Entry { } private static class P11SecretKey implements SecretKey { String alg; int length; public P11SecretKey(String alg, int length) { this.alg = alg; this.length = length; } public String getAlgorithm() { return alg; } public String getFormat() { return "raw"; } public byte[] getEncoded() { return new byte[length/8]; } } public static void main(String[] args) throws Exception { main(new Basic()); } public void main(Provider p) throws Exception { this.provider = p; // get private keys KeyFactory kf = KeyFactory.getInstance("RSA", "SunJSSE"); KeyFactory dsaKf = KeyFactory.getInstance("DSA", "SUN"); ObjectInputStream ois1 = new ObjectInputStream (new FileInputStream(new File(DIR, "pk1.key"))); byte[] keyBytes = (byte[])ois1.readObject(); ois1.close(); PrivateKey tmpKey = kf.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); pk1 = (RSAPrivateCrtKey)tmpKey; ObjectInputStream ois2 = new ObjectInputStream (new FileInputStream(new File(DIR, "pk2.key"))); keyBytes = (byte[])ois2.readObject(); ois2.close(); pk2 = kf.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); ObjectInputStream ois3 = new ObjectInputStream (new FileInputStream(new File(DIR, "pk3.key"))); keyBytes = (byte[])ois3.readObject(); pk3 = kf.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); ois3.close(); // get cert chains for private keys CertificateFactory cf = CertificateFactory.getInstance("X.509", "SUN"); Certificate caCert = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "ca.cert"))); Certificate ca2Cert = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "ca2.cert"))); Certificate pk1cert = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "pk1.cert"))); Certificate pk1cert2 = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "pk1.cert2"))); Certificate pk2cert = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "pk2.cert"))); Certificate pk3cert = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "pk3.cert"))); chain1 = new Certificate[] { pk1cert, caCert }; chain2 = new Certificate[] { pk2cert, caCert }; chain3 = new Certificate[] { pk3cert, caCert }; chain4 = new Certificate[] { pk1cert2, ca2Cert }; // create secret keys sk1 = new P11SecretKey("DES", 64); sk2 = new P11SecretKey("DESede", 192); sk3 = new P11SecretKey("AES", 128); sk4 = new P11SecretKey("RC4", 128); // read randomCert randomCert = (X509Certificate)cf.generateCertificate (new FileInputStream(new File(DIR, "random.cert"))); doTest(); } private static void doTest() throws Exception { String token = System.getProperty("TOKEN"); String test = System.getProperty("TEST"); if (token == null || token.length() == 0) { throw new Exception("token arg required"); } if (test == null || test.length() == 0) { throw new Exception("test arg required"); } if ("ibutton".equals(token)) { tokenPwd = ibuttonPwd; } else if ("activcard".equals(token)) { tokenPwd = activcardPwd; } else if ("nss".equals(token)) { tokenPwd = nssPwd; } else if ("sca1000".equals(token)) { tokenPwd = sca1000Pwd; } else if ("solaris".equals(token)) { tokenPwd = solarisPwd; } if ("list".equals(test)) { Basic.list(); } else if ("basic".equals(test)) { int testnum = 1; if ("ibutton".equals(token)) { // pkey and setAttribute testnum = Basic.pkey(testnum); testnum = Basic.setAttribute(testnum); } else if ("activcard".equals(token)) { // sign testnum = Basic.signAlias(testnum, null); } else if ("nss".equals(token)) { // setAttribute, pkey, sign testnum = Basic.setAttribute(testnum); testnum = Basic.pkey(testnum); testnum = Basic.sign(testnum); testnum = Basic.copy(testnum); } else if ("solaris".equals(token)) { testnum = Basic.setAttribute(testnum); testnum = Basic.pkey(testnum); testnum = Basic.sign(testnum); testnum = Basic.skey(testnum); testnum = Basic.copy(testnum); } else if ("sca1000".equals(token)) { // setAttribute, pkey, sign, skey, copy testnum = Basic.setAttribute(testnum); testnum = Basic.pkey(testnum); testnum = Basic.sign(testnum); testnum = Basic.skey(testnum); testnum = Basic.copy(testnum); } } else if ("pkey".equals(test)) { Basic.pkey(1); } else if ("skey".equals(test)) { Basic.skey(1); } else if ("setAttribute".equals(test)) { Basic.setAttribute(1); } else if ("copy".equals(test)) { Basic.copy(1); } else if ("sign".equals(test)) { Basic.sign(1); } else if ("module".equals(test)) { Basic.module(); } else if ("nss-extended".equals(test)) { // this only works if NSS_TEST is set to true in P11KeyStore.java int testnum = 1; testnum = Basic.setAttribute(testnum); testnum = Basic.pkey(testnum); testnum = Basic.sign(testnum); testnum = Basic.extended(testnum); } else { System.out.println("unrecognized command"); } } private static int sign(int testnum) throws Exception { if (ks == null) { ks = KeyStore.getInstance(KS_TYPE, provider); ks.load(null, tokenPwd); } if (!ks.containsAlias("pk1")) { ks.setKeyEntry("pk1", pk1, null, chain1); } System.out.println("test " + testnum++ + " passed"); return signAlias(testnum, "pk1"); } private static int signAlias(int testnum, String alias) throws Exception { if (ks == null) { ks = KeyStore.getInstance(KS_TYPE, provider); ks.load(null, tokenPwd); } if (alias == null) { Enumeration enu = ks.aliases(); if (enu.hasMoreElements()) { alias = (String)enu.nextElement(); } } PrivateKey pkey = (PrivateKey)ks.getKey(alias, null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("got [" + alias + "] signing key: " + pkey); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } Signature s = Signature.getInstance("MD5WithRSA", ks.getProvider()); s.initSign(pkey); System.out.println("initialized signature object with key"); s.update("hello".getBytes()); System.out.println("signature object updated with [hello] bytes"); byte[] signed = s.sign(); System.out.println("received signature " + signed.length + " bytes in length"); Signature v = Signature.getInstance("MD5WithRSA", ks.getProvider()); v.initVerify(ks.getCertificate(alias)); v.update("hello".getBytes()); v.verify(signed); System.out.println("signature verified"); System.out.println("test " + testnum++ + " passed"); return testnum; } private static int copy(int testnum) throws Exception { if (ks == null) { ks = KeyStore.getInstance(KS_TYPE, provider); ks.load(null, tokenPwd); } KeyFactory kf = KeyFactory.getInstance("RSA", provider); PrivateKey pkSession = (PrivateKey)kf.translateKey(pk3); System.out.println("pkSession = " + pkSession); ks.setKeyEntry("pkSession", pkSession, null, chain3); KeyStore.PrivateKeyEntry pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pkSession", null); System.out.println("pkSession = " + pke.getPrivateKey()); Certificate[] chain = pke.getCertificateChain(); if (chain.length != chain3.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain3[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); return testnum; } private static void list() throws Exception { int testnum = 1; ks = KeyStore.getInstance(KS_TYPE, provider); // check instance if (ks.getProvider() instanceof java.security.AuthProvider) { System.out.println("keystore provider instance of AuthProvider"); System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("did not get AuthProvider KeyStore"); } // load ks.load(null, tokenPwd); System.out.println("test " + testnum++ + " passed"); // aliases Enumeration enu = ks.aliases(); int count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } } private static void module() throws Exception { // perform Security.addProvider of P11 provider Provider p = getSunPKCS11(System.getProperty("CUSTOM_P11_CONFIG")); if (p != null) { Security.addProvider(p); } else { throw new Exception("Error: PKCS11 provider configuration failed"); } String KS_PROVIDER = "SunPKCS11-" + System.getProperty("TOKEN"); KeyStoreLoginModule m = new KeyStoreLoginModule(); Subject s = new Subject(); Map options = new HashMap(); options.put("keyStoreURL", "NONE"); options.put("keyStoreType", KS_TYPE); options.put("keyStoreProvider", KS_PROVIDER); options.put("debug", "true"); m.initialize(s, new TextCallbackHandler(), new HashMap(), options); m.login(); m.commit(); System.out.println("authenticated subject = " + s); m.logout(); System.out.println("authenticated subject = " + s); } /** * SCA1000 does not handle extended secret key tests * . Blowfish (CKR_TEMPLATE_INCOMPLETE) * . AES (CKR_TEMPLATE_INCOMPLETE) * . RC4 (CKR_ATTRIBUTE_TYPE_INVALID) * so do this instead */ private static int skey(int testnum) throws Exception { if (ks == null) { ks = KeyStore.getInstance(KS_TYPE, provider); ks.load(null, tokenPwd); } // delete all old aliases Enumeration enu = ks.aliases(); int count = 0; while (enu.hasMoreElements()) { String next = (String)enu.nextElement(); ks.deleteEntry(next); System.out.println("deleted entry for: " + next); } // set good ske 1 ks.setKeyEntry("sk1", sk1, null, null); System.out.println("test " + testnum++ + " passed"); // set good ske 2 ks.setKeyEntry("sk2", sk2, null, null); System.out.println("test " + testnum++ + " passed"); // getEntry good ske 1 KeyStore.SecretKeyEntry ske = (KeyStore.SecretKeyEntry)ks.getEntry("sk1", null); if ("DES".equals(ske.getSecretKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DES, got " + ske.getSecretKey().getAlgorithm()); } // getEntry good ske 2 ske = (KeyStore.SecretKeyEntry)ks.getEntry("sk2", null); if ("DESede".equals(ske.getSecretKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DESede, got " + ske.getSecretKey().getAlgorithm()); } // getKey good ske 1 SecretKey skey = (SecretKey)ks.getKey("sk1", null); if ("DES".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DES, got " + skey.getAlgorithm()); } // getKey good ske 2 skey = (SecretKey)ks.getKey("sk2", null); if ("DESede".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DESede, got " + skey.getAlgorithm()); } // aliases enu = ks.aliases(); count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } if (count == 2) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 2 aliases"); } // size if (ks.size() == 2) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 2"); } // isCertificateEntry sk1 if (!ks.isCertificateEntry("sk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // isKeyEntry sk1 if (ks.isKeyEntry("sk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // entryInstanceOf sk2 if (ks.entryInstanceOf("sk2", KeyStore.SecretKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } return testnum; } private static int setAttribute(int testnum) throws Exception { if (ks == null) { ks = KeyStore.getInstance(KS_TYPE, provider); ks.load(null, tokenPwd); } if (!ks.containsAlias("pk1")) { // set good pke 1 ks.setKeyEntry("pk1", pk1, null, chain1); System.out.println("test " + testnum++ + " passed"); } // delete all old aliases except pk1 Enumeration enu = ks.aliases(); int count = 0; while (enu.hasMoreElements()) { String next = (String)enu.nextElement(); if (!"pk1".equals(next)) { ks.deleteEntry(next); System.out.println("deleted entry for: " + next); } } KeyStore.PrivateKeyEntry pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1", null); System.out.println("pk1 = " + pke.getPrivateKey()); Certificate[] chain = pke.getCertificateChain(); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); /** * test change alias only */ // test C_SetAttribute PrivateKey pkey = pke.getPrivateKey(); ks.setEntry("pk1SA", new KeyStore.PrivateKeyEntry(pkey, chain1), null); System.out.println("test " + testnum++ + " passed"); // aliases enu = ks.aliases(); count = 0; String newAlias = null; while (enu.hasMoreElements()) { count++; newAlias = (String)enu.nextElement(); System.out.println("alias " + count + " = " + newAlias); } if (count == 1 && "pk1SA".equals(newAlias)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 1 alias"); } // size if (ks.size() == 1) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 1"); } pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1", null); if (pke != null) { throw new SecurityException("expected not to find pk1"); } System.out.println("test " + testnum++ + " passed"); pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1SA", null); System.out.println("pk1SA = " + pke.getPrivateKey()); chain = pke.getCertificateChain(); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); /** * test change cert chain */ pkey = pke.getPrivateKey(); ks.setEntry("pk1SA-2", new KeyStore.PrivateKeyEntry(pkey, chain4), null); System.out.println("test " + testnum++ + " passed"); // aliases enu = ks.aliases(); count = 0; newAlias = null; while (enu.hasMoreElements()) { count++; newAlias = (String)enu.nextElement(); System.out.println("alias " + count + " = " + newAlias); } if (count == 1 && "pk1SA-2".equals(newAlias)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 1 alias"); } // size if (ks.size() == 1) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 1"); } pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1SA", null); if (pke != null) { throw new SecurityException("expected not to find pk1SA"); } System.out.println("test " + testnum++ + " passed"); pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1SA-2", null); System.out.println("pk1SA-2 = " + pke.getPrivateKey()); chain = pke.getCertificateChain(); if (chain.length != chain4.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain4[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); return testnum; } private static int pkey(int testnum) throws Exception { if (ks == null) { ks = KeyStore.getInstance(KS_TYPE, provider); ks.load(null, tokenPwd); System.out.println("test " + testnum++ + " passed"); } // check instance if (ks.getProvider() instanceof java.security.AuthProvider) { System.out.println("keystore provider instance of AuthProvider"); System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("did not get AuthProvider KeyStore"); } // delete all old aliases Enumeration enu = ks.aliases(); int count = 0; while (enu.hasMoreElements()) { String next = (String)enu.nextElement(); ks.deleteEntry(next); System.out.println("deleted entry for: " + next); } // set good pke 1 ks.setKeyEntry("pk1", pk1, null, chain1); System.out.println("test " + testnum++ + " passed"); // set good pke 2 ks.setEntry("pk2", new KeyStore.PrivateKeyEntry(pk2, chain2), null); System.out.println("test " + testnum++ + " passed"); // getEntry good pke 1 KeyStore.PrivateKeyEntry pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1", null); System.out.println("pk1 = " + pke.getPrivateKey()); Certificate[] chain = pke.getCertificateChain(); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } // getKey good pke 1 PrivateKey pkey = (PrivateKey)ks.getKey("pk1", null); System.out.println("pk1 = " + pkey); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // getCertificate chain chain 1 chain = ks.getCertificateChain("pk1"); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); // getEntry good pke 2 pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk2", null); if ("RSA".equals(pke.getPrivateKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pke.getPrivateKey().getAlgorithm()); } System.out.println("pk2 = " + pke.getPrivateKey()); chain = pke.getCertificateChain(); if (chain.length != chain2.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain2[i])) { throw new SecurityException("received chain not equal"); } } // getKey good pke 2 pkey = (PrivateKey)ks.getKey("pk2", null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // getCertificate chain chain 2 chain = ks.getCertificateChain("pk2"); if (chain.length != chain2.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain2[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); // aliases enu = ks.aliases(); count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } if (count == 2) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 2 aliases"); } // size if (ks.size() == 2) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 2"); } // getCertificate if (ks.getCertificate("pk1").equals(chain1[0])) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected certificate pk1 end entity"); } // containsAlias if (ks.containsAlias("pk1") && ks.containsAlias("pk2") && !ks.containsAlias("foobar") && !ks.containsAlias("pk1.2") && !ks.containsAlias("pk2.2")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("unexpected aliases encountered"); } // isKeyEntry if (ks.isKeyEntry("pk1") && ks.isKeyEntry("pk2") && !ks.isKeyEntry("foobar")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("isKeyEntry failed"); } // isCertificateEntry if (!ks.isCertificateEntry("foobar") && !ks.isCertificateEntry("pk1") && !ks.isCertificateEntry("pk2")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("isCertificateEntry failed"); } // getCertificateAlias if (ks.getCertificateAlias(chain1[0]).equals("pk1") && ks.getCertificateAlias(chain2[0]).equals("pk2") && ks.getCertificateAlias(randomCert) == null) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("getCertificateAlias failed"); } if (ks.entryInstanceOf("pk1", KeyStore.PrivateKeyEntry.class) && ks.entryInstanceOf("pk2", KeyStore.PrivateKeyEntry.class) && !ks.entryInstanceOf("pk1", KeyStore.TrustedCertificateEntry.class) && !ks.entryInstanceOf("pk2", KeyStore.TrustedCertificateEntry.class) && !ks.entryInstanceOf("foobar", KeyStore.TrustedCertificateEntry.class) && !ks.entryInstanceOf("foobar", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("entryInstanceOf failed"); } ks.deleteEntry("pk2"); if (ks.containsAlias("pk1") && !ks.containsAlias("pk2")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("deleteEntry failed"); } // getEntry good pke 1 pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1", null); System.out.println("pk1 = " + pke.getPrivateKey()); chain = pke.getCertificateChain(); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } System.out.println("test " + testnum++ + " passed"); // aliases enu = ks.aliases(); count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } if (count == 1) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 1 alias"); } // size if (ks.size() == 1) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 1"); } return testnum; } private static int extended(int testnum) throws Exception { // setEntry unknown entry type try { ks.setEntry("foo", new FooEntry(), null); throw new SecurityException("setEntry should have failed"); } catch (KeyStoreException kse) { System.out.println("test " + testnum++ + " passed"); } // getEntry random foo if (ks.getEntry("foo", null) != null) { throw new SecurityException("expected null entry"); } else { System.out.println("test " + testnum++ + " passed"); } // set good ske 1 ks.setKeyEntry("sk1", sk1, null, null); System.out.println("test " + testnum++ + " passed"); // set good ske 2 ks.setKeyEntry("sk2", sk2, null, null); System.out.println("test " + testnum++ + " passed"); // set good ske 3 ks.setEntry("sk3", new KeyStore.SecretKeyEntry(sk3), null); System.out.println("test " + testnum++ + " passed"); // set good ske 4 ks.setEntry("sk4", new KeyStore.SecretKeyEntry(sk4), null); System.out.println("test " + testnum++ + " passed"); // getEntry good ske 1 KeyStore.SecretKeyEntry ske = (KeyStore.SecretKeyEntry)ks.getEntry("sk1", null); if ("DES".equals(ske.getSecretKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DES, got " + ske.getSecretKey().getAlgorithm()); } // getEntry good ske 2 ske = (KeyStore.SecretKeyEntry)ks.getEntry("sk2", null); if ("DESede".equals(ske.getSecretKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DESede, got " + ske.getSecretKey().getAlgorithm()); } // getEntry good ske 3 ske = (KeyStore.SecretKeyEntry)ks.getEntry("sk3", null); if ("AES".equals(ske.getSecretKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected AES, got " + ske.getSecretKey().getAlgorithm()); } // getEntry good ske 4 ske = (KeyStore.SecretKeyEntry)ks.getEntry("sk4", null); if ("ARCFOUR".equals(ske.getSecretKey().getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected ARCFOUR, got " + ske.getSecretKey().getAlgorithm()); } // getKey good ske 1 SecretKey skey = (SecretKey)ks.getKey("sk1", null); if ("DES".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DES, got " + skey.getAlgorithm()); } // getKey good ske 2 skey = (SecretKey)ks.getKey("sk2", null); if ("DESede".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DESede, got " + skey.getAlgorithm()); } // getKey good ske 3 skey = (SecretKey)ks.getKey("sk3", null); if ("AES".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected AES, got " + skey.getAlgorithm()); } // getKey good ske 4 skey = (SecretKey)ks.getKey("sk4", null); if ("ARCFOUR".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected ARCFOUR, got " + skey.getAlgorithm()); } // aliases Enumeration enu = ks.aliases(); int count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } if (count == 5) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 5 aliases"); } // size if (ks.size() == 5) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 5"); } // set good pke 2 ks.setEntry("pk2", new KeyStore.PrivateKeyEntry(pk2, chain2), null); System.out.println("test " + testnum++ + " passed"); // set good pke 3 ks.setEntry("pk3", new KeyStore.PrivateKeyEntry(pk3, chain3), null); System.out.println("test " + testnum++ + " passed"); // getEntry good pke 1 KeyStore.PrivateKeyEntry pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk1", null); System.out.println("pk1 = " + pke.getPrivateKey()); Certificate[] chain = pke.getCertificateChain(); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } // getEntry good pke 2 pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk2", null); System.out.println("pk2 = " + pke.getPrivateKey()); chain = pke.getCertificateChain(); if (chain.length != chain2.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain2[i])) { throw new SecurityException("received chain not equal"); } } // getEntry good pke 3 pke = (KeyStore.PrivateKeyEntry)ks.getEntry("pk3", null); System.out.println("pk3 = " + pke.getPrivateKey()); chain = pke.getCertificateChain(); if (chain.length != chain3.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain3[i])) { throw new SecurityException("received chain not equal"); } } // getKey good pke 1 PrivateKey pkey = (PrivateKey)ks.getKey("pk1", null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // getCertificate chain chain 1 chain = ks.getCertificateChain("pk1"); if (chain.length != chain1.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain1[i])) { throw new SecurityException("received chain not equal"); } } // getKey good pke 2 pkey = (PrivateKey)ks.getKey("pk2", null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // getCertificate chain chain 2 chain = ks.getCertificateChain("pk2"); if (chain.length != chain2.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain2[i])) { throw new SecurityException("received chain not equal"); } } // getKey good pke 3 pkey = (PrivateKey)ks.getKey("pk3", null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // getCertificate chain chain 3 chain = ks.getCertificateChain("pk3"); if (chain.length != chain3.length) { throw new SecurityException("received chain not correct length"); } for (int i = 0; i < chain.length; i++) { if (!chain[i].equals(chain3[i])) { throw new SecurityException("received chain not equal"); } } // aliases enu = ks.aliases(); count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } if (count == 7) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 7 aliases"); } // size if (ks.size() == 7) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 7"); } // getCertificate good chain 1 if (ks.getCertificate("pk1").equals(chain1[0])) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("retrieved cert not equal"); } // getCertificate good chain 3 if (ks.getCertificate("pk3").equals(chain3[0])) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("retrieved cert not equal"); } // getKey good ske 1 skey = (SecretKey)ks.getKey("sk1", null); if ("DES".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected DES, got " + skey.getAlgorithm()); } // getKey good ske 4 skey = (SecretKey)ks.getKey("sk4", null); if ("ARCFOUR".equals(skey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected ARCFOUR, got " + skey.getAlgorithm()); } // getKey good pke 1 pkey = (PrivateKey)ks.getKey("pk1", null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // getKey good pke 3 pkey = (PrivateKey)ks.getKey("pk3", null); if ("RSA".equals(pkey.getAlgorithm())) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException ("expected RSA, got " + pkey.getAlgorithm()); } // contains alias if (!ks.containsAlias("pk1") || !ks.containsAlias("pk2") || !ks.containsAlias("pk3") || !ks.containsAlias("sk1") || !ks.containsAlias("sk2") || !ks.containsAlias("sk3") || !ks.containsAlias("sk4")) { throw new SecurityException("did not contain all aliases"); } System.out.println("test " + testnum++ + " passed"); // getCertificateAlias pk1 if (ks.getCertificateAlias(chain1[0]).equals("pk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected cert pk1"); } // getCertificateAlias pk3 if (ks.getCertificateAlias(chain3[0]).equals("pk3")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected cert pk3"); } // isCertificateEntry pk1 if (!ks.isCertificateEntry("pk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // isCertificateEntry pk3 if (!ks.isCertificateEntry("pk3")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // isCertificateEntry sk1 if (!ks.isCertificateEntry("sk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // isCertificateEntry sk4 if (!ks.isCertificateEntry("sk4")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // isKeyEntry pk1 if (ks.isKeyEntry("pk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // isKeyEntry pk3 if (ks.isKeyEntry("pk3")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // isKeyEntry sk1 if (ks.isKeyEntry("sk1")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // isKeyEntry sk4 if (ks.isKeyEntry("sk4")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // isCertificateEntry random foo if (!ks.isCertificateEntry("foo")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected foo"); } // isKeyEntry random foo if (!ks.isKeyEntry("foo")) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected foo"); } // entryInstanceOf pk1 if (!ks.entryInstanceOf ("pk1", KeyStore.TrustedCertificateEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected tce"); } // entryInstanceOf pk3 if (!ks.entryInstanceOf ("pk3", KeyStore.TrustedCertificateEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected tce"); } // entryInstanceOf sk1 if (!ks.entryInstanceOf ("sk1", KeyStore.TrustedCertificateEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected tce"); } // entryInstanceOf sk4 if (!ks.entryInstanceOf ("sk4", KeyStore.TrustedCertificateEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected tce"); } // entryInstanceOf pk1 if (ks.entryInstanceOf("pk1", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // entryInstanceOf pk3 if (ks.entryInstanceOf("pk3", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // entryInstanceOf sk1 if (!ks.entryInstanceOf("sk1", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // entryInstanceOf sk4 if (!ks.entryInstanceOf("sk4", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // entryInstanceOf sk1 if (ks.entryInstanceOf("sk1", KeyStore.SecretKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // entryInstanceOf sk4 if (ks.entryInstanceOf("sk4", KeyStore.SecretKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // entryInstanceOf pk1 if (!ks.entryInstanceOf("pk1", KeyStore.SecretKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // entryInstanceOf pk3 if (!ks.entryInstanceOf("pk3", KeyStore.SecretKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected ske"); } // getEntry random foobar if (ks.getEntry("foobar", null) != null) { throw new SecurityException("expected null entry"); } else { System.out.println("test " + testnum++ + " passed"); } // deleteEntry ks.deleteEntry("pk1"); ks.deleteEntry("pk3"); ks.deleteEntry("sk2"); ks.deleteEntry("sk3"); System.out.println("test " + testnum++ + " passed"); // aliases enu = ks.aliases(); count = 0; while (enu.hasMoreElements()) { count++; System.out.println("alias " + count + " = " + (String)enu.nextElement()); } if (count == 3) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected 3 aliases"); } // size if (ks.size() == 3) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected size 6"); } // entryInstanceOf sk1 if (!ks.entryInstanceOf("sk1", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // entryInstanceOf sk4 if (!ks.entryInstanceOf("sk4", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } // entryInstanceOf pk2 if (ks.entryInstanceOf("pk2", KeyStore.PrivateKeyEntry.class)) { System.out.println("test " + testnum++ + " passed"); } else { throw new SecurityException("expected pke"); } System.out.println("test " + testnum++ + " passed"); return testnum; } }