1c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin/* 2c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * Copyright (C) 2014 The Android Open Source Project 3c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * 4c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * Licensed under the Apache License, Version 2.0 (the "License"); 5c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * you may not use this file except in compliance with the License. 6c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * You may obtain a copy of the License at 7c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * 8c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * http://www.apache.org/licenses/LICENSE-2.0 9c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * 10c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * Unless required by applicable law or agreed to in writing, software 11c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * distributed under the License is distributed on an "AS IS" BASIS, 12c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * See the License for the specific language governing permissions and 14c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * limitations under the License. 15c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin */ 16c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 17c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinpackage libcore.javax.net.ssl; 18c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 19c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport java.lang.reflect.InvocationHandler; 20c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport java.lang.reflect.Method; 21c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport java.lang.reflect.Proxy; 22c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport java.net.Socket; 23c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport javax.crypto.SecretKey; 24c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport javax.net.ssl.KeyManager; 25c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinimport javax.net.ssl.SSLEngine; 26c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 27c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin/** 28c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * Reflection-based implementation of {@code PSKKeyManager} from Conscrypt on which these tests 29c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * cannot depend directly. 30c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin */ 31c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubinclass PSKKeyManagerProxy implements InvocationHandler { 32c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 33c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin static KeyManager getConscryptPSKKeyManager(PSKKeyManagerProxy delegate) { 34c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin Class<?> pskKeyManagerInterface; 35c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin try { 36c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin pskKeyManagerInterface = Class.forName("com.android.org.conscrypt.PSKKeyManager"); 37c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } catch (ClassNotFoundException e) { 38c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin throw new RuntimeException(e); 39c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 40c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return (KeyManager) Proxy.newProxyInstance( 41c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin PSKKeyManagerProxy.class.getClassLoader(), 42c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin new Class[] {pskKeyManagerInterface}, 43c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin delegate); 44c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 45c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 46c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @SuppressWarnings("unused") 47c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin protected SecretKey getKey(String identityHint, String identity, Socket socket) { 48c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return null; 49c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 50c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 51c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @SuppressWarnings("unused") 52c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin protected SecretKey getKey(String identityHint, String identity, SSLEngine engine) { 53c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return null; 54c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 55c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 56c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @SuppressWarnings("unused") 57c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin protected String chooseServerKeyIdentityHint(Socket socket) { 58c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return null; 59c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 60c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 61c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @SuppressWarnings("unused") 62c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin protected String chooseServerKeyIdentityHint(SSLEngine engine) { 63c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return null; 64c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 65c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 66c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @SuppressWarnings("unused") 67c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin protected String chooseClientKeyIdentity(String identityHint, Socket socket) { 68c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return null; 69c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 70c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 71c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @SuppressWarnings("unused") 72c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin protected String chooseClientKeyIdentity(String identityHint, SSLEngine engine) { 73c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return null; 74c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 75c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin 76c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin @Override 77c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin public final Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 78c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin String methodName = method.getName(); 79c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin Class<?>[] parameterTypes = method.getParameterTypes(); 80c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin boolean sslEngineVariant = (parameterTypes.length > 0) 81c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin && (SSLEngine.class.equals(parameterTypes[parameterTypes.length - 1])); 82c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin if ("getKey".equals(methodName)) { 83c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin if (sslEngineVariant) { 84c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return getKey((String) args[0], (String) args[1], (SSLEngine) args[2]); 85c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } else { 86c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return getKey((String) args[0], (String) args[1], (Socket) args[2]); 87c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 88c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } else if ("chooseServerKeyIdentityHint".equals(methodName)) { 89c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin if (sslEngineVariant) { 90c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return chooseServerKeyIdentityHint((SSLEngine) args[0]); 91c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } else { 92c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return chooseServerKeyIdentityHint((Socket) args[0]); 93c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 94c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } else if ("chooseClientKeyIdentity".equals(methodName)) { 95c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin if (sslEngineVariant) { 96c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return chooseClientKeyIdentity((String) args[0], (SSLEngine) args[1]); 97c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } else { 98c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin return chooseClientKeyIdentity((String) args[0], (Socket) args[1]); 99c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 100c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } else { 101c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin throw new IllegalArgumentException("Unexpected method: " + method); 102c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 103c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin } 104c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin}