blob: 86b54c4bdbd67dfbc6714bbc687fae3f3745ba3e [file] [log] [blame]
package org.apache.harmony.security.tests.support;
import org.apache.harmony.security.tests.support.cert.MyCertificate;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.KeyStoreException;
import java.security.KeyStoreSpi;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.UnrecoverableKeyException;
import java.security.KeyStore.LoadStoreParameter;
import java.security.KeyStore.PasswordProtection;
import java.security.KeyStore.ProtectionParameter;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.SecretKey;
public class TestKeyStoreSpi extends KeyStoreSpi {
Map<String, Object> aliases = new HashMap<String, Object>();
public static final Certificate CERT = new MyCertificate("certtype",
new byte[] {});
public static final Certificate[] CERTCHAIN = new Certificate[] {
new MyCertificate("cert1", new byte[] {}),
new MyCertificate("cert2", new byte[] {})};
public static final Key KEY = new SecretKey() {
public String getAlgorithm() {
return "secret";
}
public byte[] getEncoded() {
return new byte[] {42};
}
public String getFormat() {
return "format";
}
};
public static final Object DUMMY = new Object();
public TestKeyStoreSpi() {
aliases.put("certalias", CERT);
aliases.put("chainalias", CERTCHAIN);
aliases.put("keyalias", KEY);
aliases.put("unknownalias", DUMMY);
}
@Override
public Enumeration<String> engineAliases() {
return Collections.enumeration(aliases.keySet());
}
@Override
public boolean engineContainsAlias(String alias) {
return aliases.containsKey(alias);
}
@Override
public void engineDeleteEntry(String alias) throws KeyStoreException {
throw new KeyStoreException("entry " + alias + " cannot be deleted");
}
@Override
public Certificate engineGetCertificate(String alias) {
return (Certificate) aliases.get(alias);
}
@Override
public String engineGetCertificateAlias(Certificate cert) {
if (cert == null) {
throw new NullPointerException();
}
for (Map.Entry<String, Object> alias : aliases.entrySet()) {
if (alias.getValue() == cert) {
return alias.getKey();
}
}
return null;
}
@Override
public Certificate[] engineGetCertificateChain(String alias) {
return (Certificate[]) aliases.get(alias);
}
@Override
public Date engineGetCreationDate(String alias) {
return new Date(42 * 1024 * 1024);
}
@Override
public Key engineGetKey(String alias, char[] password)
throws NoSuchAlgorithmException, UnrecoverableKeyException {
if (engineContainsAlias(alias)) {
if (!engineIsKeyEntry(alias)) {
if (password == null) {
throw new NoSuchAlgorithmException("no such alg");
} else {
throw new UnrecoverableKeyException();
}
}
return (Key) aliases.get(alias);
}
throw new UnrecoverableKeyException();
}
@Override
public boolean engineIsCertificateEntry(String alias) {
try {
Certificate c = (Certificate) aliases.get(alias);
return true;
} catch (ClassCastException e) {
return false;
}
}
@Override
public boolean engineIsKeyEntry(String alias) {
try {
Key k = (Key) aliases.get(alias);
return true;
} catch (ClassCastException e) {
return false;
}
}
@Override
public void engineLoad(InputStream stream, char[] password)
throws IOException, NoSuchAlgorithmException, CertificateException {
if (stream != null) {
if (stream.available() == 0)
{
throw new IOException();
}
}
if (password == null) {
throw new NoSuchAlgorithmException();
} else if (password.length == 0) {
throw new CertificateException();
}
}
@Override
public void engineLoad(LoadStoreParameter param) throws IOException,
NoSuchAlgorithmException, CertificateException {
if (param == null) {
engineLoad(null, null);
return;
}
ProtectionParameter pParam = param.getProtectionParameter();
if (pParam == null) {
throw new NoSuchAlgorithmException();
}
if (pParam instanceof PasswordProtection) {
char[] password = ((PasswordProtection) pParam).getPassword();
if (password == null) {
throw new NoSuchAlgorithmException();
} else {
return;
}
}
throw new CertificateException();
}
@Override
public void engineSetCertificateEntry(String alias, Certificate cert)
throws KeyStoreException {
if (engineContainsAlias(alias)) {
if (!engineIsCertificateEntry(alias)) {
throw new KeyStoreException("alias is not a cert entry");
}
}
aliases.put(alias, cert);
}
@Override
public void engineSetKeyEntry(String alias, Key key, char[] password,
Certificate[] chain) throws KeyStoreException {
if (engineContainsAlias(alias)) {
if (!engineIsKeyEntry(alias)) {
throw new KeyStoreException("alias is not a key enrty");
}
}
if (key instanceof PrivateKey)
{
if (chain == null || chain.length == 0) {
throw new IllegalArgumentException();
}
}
aliases.put(alias, key);
}
@Override
public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain)
throws KeyStoreException {
throw new KeyStoreException("set entry failed");
}
@Override
public int engineSize() {
return aliases.size();
}
@Override
public void engineStore(OutputStream stream, char[] password)
throws IOException, NoSuchAlgorithmException, CertificateException {
if (stream == null) {
throw new IOException("store failed");
}
if (password == null) {
throw new NoSuchAlgorithmException();
} else if (password.length == 0) {
throw new CertificateException();
}
}
@Override
public void engineStore(LoadStoreParameter param) throws IOException,
NoSuchAlgorithmException, CertificateException {
if (param == null) {
throw new IOException();
}
ProtectionParameter pParam = param.getProtectionParameter();
if (pParam instanceof PasswordProtection) {
char[] password = ((PasswordProtection) pParam).getPassword();
if (password == null) {
throw new NoSuchAlgorithmException();
} else if (password.length == 0) {
throw new CertificateException();
}
return;
}
throw new UnsupportedOperationException();
}
}