/*
* Copyright (C) 2014 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.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;
import javax.crypto.SecretKey;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLEngine;
/**
* Reflection-based implementation of {@code PSKKeyManager} from Conscrypt on which these tests
* cannot depend directly.
*/
class PSKKeyManagerProxy implements InvocationHandler {
static KeyManager getConscryptPSKKeyManager(PSKKeyManagerProxy delegate) {
Class<?> pskKeyManagerInterface;
try {
pskKeyManagerInterface = Class.forName("com.android.org.conscrypt.PSKKeyManager");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
return (KeyManager) Proxy.newProxyInstance(
PSKKeyManagerProxy.class.getClassLoader(),
new Class[] {pskKeyManagerInterface},
delegate);
}
@SuppressWarnings("unused")
protected SecretKey getKey(String identityHint, String identity, Socket socket) {
return null;
}
@SuppressWarnings("unused")
protected SecretKey getKey(String identityHint, String identity, SSLEngine engine) {
return null;
}
@SuppressWarnings("unused")
protected String chooseServerKeyIdentityHint(Socket socket) {
return null;
}
@SuppressWarnings("unused")
protected String chooseServerKeyIdentityHint(SSLEngine engine) {
return null;
}
@SuppressWarnings("unused")
protected String chooseClientKeyIdentity(String identityHint, Socket socket) {
return null;
}
@SuppressWarnings("unused")
protected String chooseClientKeyIdentity(String identityHint, SSLEngine engine) {
return null;
}
@Override
public final Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
Class<?>[] parameterTypes = method.getParameterTypes();
boolean sslEngineVariant = (parameterTypes.length > 0)
&& (SSLEngine.class.equals(parameterTypes[parameterTypes.length - 1]));
if ("getKey".equals(methodName)) {
if (sslEngineVariant) {
return getKey((String) args[0], (String) args[1], (SSLEngine) args[2]);
} else {
return getKey((String) args[0], (String) args[1], (Socket) args[2]);
}
} else if ("chooseServerKeyIdentityHint".equals(methodName)) {
if (sslEngineVariant) {
return chooseServerKeyIdentityHint((SSLEngine) args[0]);
} else {
return chooseServerKeyIdentityHint((Socket) args[0]);
}
} else if ("chooseClientKeyIdentity".equals(methodName)) {
if (sslEngineVariant) {
return chooseClientKeyIdentity((String) args[0], (SSLEngine) args[1]);
} else {
return chooseClientKeyIdentity((String) args[0], (Socket) args[1]);
}
} else {
throw new IllegalArgumentException("Unexpected method: " + method);
}
}
}