blob: 03420fe65484a6506c2352cc101e05d5bfb8d52b [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.javax.net.ssl;
import java.io.PrintStream;
import java.net.Socket;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.X509ExtendedKeyManager;
import libcore.java.io.NullPrintStream;
import libcore.java.security.StandardNames;
/**
* TestKeyManager is a simple proxy class that wraps an existing
* X509ExtendedKeyManager to provide debug logging and recording of
* values.
*/
public final class TestKeyManager extends X509ExtendedKeyManager {
private static final boolean LOG = false;
private static final PrintStream out = LOG ? System.out : new NullPrintStream();
private final X509ExtendedKeyManager keyManager;
public static KeyManager[] wrap(KeyManager[] keyManagers) {
KeyManager[] result = keyManagers.clone();
for (int i = 0; i < result.length; i++) {
result[i] = wrap(result[i]);
}
return result;
}
public static KeyManager wrap(KeyManager keyManager) {
if (!(keyManager instanceof X509ExtendedKeyManager)) {
return keyManager;
}
return new TestKeyManager((X509ExtendedKeyManager) keyManager);
}
public TestKeyManager(X509ExtendedKeyManager keyManager) {
out.println("TestKeyManager.<init> keyManager=" + keyManager);
this.keyManager = keyManager;
}
public String chooseClientAlias(String[] keyTypes, Principal[] issuers, Socket socket) {
out.print("TestKeyManager.chooseClientAlias");
out.print(" | keyTypes: ");
for (String keyType : keyTypes) {
out.print(keyType);
out.print(' ');
}
dumpIssuers(issuers);
dumpSocket(socket);
assertKeyTypes(keyTypes);
return dumpAlias(keyManager.chooseClientAlias(keyTypes, issuers, socket));
}
private void assertKeyTypes(String[] keyTypes) {
for (String keyType : keyTypes) {
assertKeyType(keyType);
}
}
private void assertKeyType(String keyType) {
if (!StandardNames.KEY_TYPES.contains(keyType)) {
throw new AssertionError("Unexpected key type " + keyType);
}
}
public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
out.print("TestKeyManager.chooseServerAlias");
out.print(" | keyType: ");
out.print(keyType);
out.print(' ');
dumpIssuers(issuers);
dumpSocket(socket);
assertKeyType(keyType);
return dumpAlias(keyManager.chooseServerAlias(keyType, issuers, socket));
}
private void dumpSocket(Socket socket) {
out.print(" | socket: ");
out.print(String.valueOf(socket));
}
private void dumpIssuers(Principal[] issuers) {
out.print(" | issuers: ");
if (issuers == null) {
out.print("null");
return;
}
for (Principal issuer : issuers) {
out.print(issuer);
out.print(' ');
}
}
private String dumpAlias(String alias) {
out.print(" => ");
out.println(alias);
return alias;
}
public X509Certificate[] getCertificateChain(String alias) {
out.print("TestKeyManager.getCertificateChain");
out.print(" | alias: ");
out.print(alias);
return dumpCerts(keyManager.getCertificateChain(alias));
}
private X509Certificate[] dumpCerts(X509Certificate[] certs) {
out.print(" => ");
for (X509Certificate cert : certs) {
out.print(cert.getSubjectDN());
out.print(' ');
}
out.println();
return certs;
}
public String[] getClientAliases(String keyType, Principal[] issuers) {
out.print("TestKeyManager.getClientAliases");
out.print(" | keyType: ");
out.print(keyType);
dumpIssuers(issuers);
assertKeyType(keyType);
return dumpAliases(keyManager.getClientAliases(keyType, issuers));
}
public String[] getServerAliases(String keyType, Principal[] issuers) {
out.print("TestKeyManager.getServerAliases");
out.print(" | keyType: ");
out.print(keyType);
dumpIssuers(issuers);
assertKeyType(keyType);
return dumpAliases(keyManager.getServerAliases(keyType, issuers));
}
private String[] dumpAliases(String[] aliases) {
out.print(" => ");
for (String alias : aliases) {
out.print(alias);
out.print(' ');
}
out.println();
return aliases;
}
public PrivateKey getPrivateKey(String alias) {
out.print("TestKeyManager.getPrivateKey");
out.print(" | alias: ");
out.print(alias);
PrivateKey pk = keyManager.getPrivateKey(alias);
out.print(" => ");
out.println(String.valueOf(pk));
return pk;
}
public String chooseEngineClientAlias(String[] keyTypes, Principal[] issuers, SSLEngine e) {
out.print("TestKeyManager.chooseEngineClientAlias");
out.print(" | keyTypes: ");
for (String keyType : keyTypes) {
out.print(keyType);
out.print(' ');
}
dumpIssuers(issuers);
dumpEngine(e);
assertKeyTypes(keyTypes);
return dumpAlias(keyManager.chooseEngineClientAlias(keyTypes, issuers, e));
}
public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine e) {
out.print("TestKeyManager.chooseEngineServerAlias");
out.print(" | keyType: ");
out.print(keyType);
out.print(' ');
dumpIssuers(issuers);
dumpEngine(e);
assertKeyType(keyType);
return dumpAlias(keyManager.chooseEngineServerAlias(keyType, issuers, e));
}
private void dumpEngine(SSLEngine engine) {
out.print(" | engine: ");
out.print(String.valueOf(engine));
}
}