jdk-24/jdk/test/java/security/KeyStore/TestKeyStoreBasic.java
Zaiyao Liu 0fdc2863c1 8048621: Implement basic keystore tests
Reviewed-by: xuelei
2014-09-03 06:57:40 +00:00

192 lines
6.5 KiB
Java

/*
* Copyright (c) 2001, 2014, 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 static java.lang.System.out;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.Provider;
import java.security.Security;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/*
* @test
* @bug 8048621
* @summary Test the basic operations of KeyStore, provided by SunJCE (jceks),
* and SunPKCS11-Solaris(PKCS11KeyStore)
* @author Yu-Ching Valerie PENG
*/
public class TestKeyStoreBasic {
private static final char[] PASSWD2 = new char[] {
'b', 'o', 'r', 'e', 'd'
};
private static final char[] PASSWDK = new String("cannot be null")
.toCharArray();
private static final String[] KS_Type = {
"jks", "jceks", "pkcs12", "PKCS11KeyStore"
};
private static final String[] PRO_TYPE = {
"SUN", "SunJCE", "SunJSSE", "SunPKCS11-Solaris"
};
private static final String ALIAS_HEAD = "test";
public static void main(String args[]) throws Exception {
TestKeyStoreBasic jstest = new TestKeyStoreBasic();
jstest.run();
}
public void run() throws Exception {
Provider[] providers = Security.getProviders();
for (Provider p: providers) {
String prvName = p.getName();
if (prvName.startsWith("SunJCE")
|| prvName.startsWith("SunPKCS11-Solaris")) {
try {
runTest(p);
out.println("Test with provider " + p.getName() + ""
+ " passed");
} catch (java.security.KeyStoreException e) {
if (prvName.startsWith("SunPKCS11-Solaris")) {
out.println("KeyStoreException is expected "
+ "PKCS11KeyStore is invalid keystore type.");
e.printStackTrace();
} else {
throw e;
}
}
}
}
}
public void runTest(Provider p) throws Exception {
SecretKey key = new SecretKeySpec(
new String("No one knows").getBytes(), "PBE");
int numEntries = 5;
String proName = p.getName();
String type = null;
for (int i = 0; i < PRO_TYPE.length; i++) {
if (proName.compareTo(PRO_TYPE[i]) == 0) {
type = KS_Type[i];
break;
}
}
KeyStore ks = KeyStore.getInstance(type, p);
KeyStore ks2 = KeyStore.getInstance(type, ks.getProvider().getName());
// create an empty key store
ks.load(null, null);
// store the secret keys
for (int j = 0; j < numEntries; j++) {
ks.setKeyEntry(ALIAS_HEAD + j, key, PASSWDK, null);
}
// initialize the 2nd key store object with the 1st one
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ks.store(baos, PASSWDK);
byte[] bArr = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bArr);
ks2.load(bais, null);
// check 2nd key store type
checkType(ks2, type);
// check the existing aliases for the 2nd key store
checkAlias(ks2, numEntries);
// compare the creation date of the 2 key stores for all aliases
compareCreationDate(ks, ks2, numEntries);
// remove the last entry from the 2nd key store
numEntries--;
ks2.deleteEntry(ALIAS_HEAD + numEntries);
// re-initialize the 1st key store with the 2nd key store
baos.reset();
ks2.store(baos, PASSWD2);
bais = new ByteArrayInputStream(baos.toByteArray());
try {
// expect an exception since the password is incorrect
ks.load(bais, PASSWDK);
throw new RuntimeException(
"ERROR: passed the loading with incorrect password");
} catch (IOException ex) {
bais.reset();
ks.load(bais, PASSWD2);
bais.reset();
ks.load(bais, null);
} finally {
bais.close();
baos.close();
}
// check key store type
checkType(ks, type);
// check the existing aliases
checkAlias(ks, numEntries);
// compare the creation date of the 2 key stores for all aliases
compareCreationDate(ks, ks2, numEntries);
}
// check key store type
private void checkType(KeyStore obj, String type) {
if (!obj.getType().equals(type)) {
throw new RuntimeException("ERROR: wrong key store type");
}
}
// check the existing aliases
private void checkAlias(KeyStore obj, int range) throws KeyStoreException {
for (int k = 0; k < range; k++) {
if (!obj.containsAlias(ALIAS_HEAD + k)) {
throw new RuntimeException("ERROR: alias (" + k
+ ") should exist");
}
}
}
// compare the creation dates - true if all the same
private void compareCreationDate(KeyStore o1, KeyStore o2, int range)
throws KeyStoreException {
boolean result = true;
String alias = null;
for (int k = 0; k < range; k++) {
alias = ALIAS_HEAD + k;
if (!o1.getCreationDate(alias).equals(o2.getCreationDate(alias))) {
throw new RuntimeException("ERROR: entry creation time (" + k
+ ") differs");
}
}
}
}