0fdc2863c1
Reviewed-by: xuelei
192 lines
6.5 KiB
Java
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");
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|