1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.xnet.provider.jsse; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Principal; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateEncodingException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.X509Certificate; 25f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilsonimport java.util.HashMap; 26f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilsonimport java.util.Map; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ssl.SSLPeerUnverifiedException; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ssl.SSLSession; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ssl.SSLSessionBindingEvent; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ssl.SSLSessionBindingListener; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ssl.SSLSessionContext; 326186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3429b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilsonpublic final class SSLSessionImpl implements SSLSession, Cloneable { 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3629b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson /** Session object reporting an invalid cipher suite of "SSL_NULL_WITH_NULL_NULL" */ 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final SSLSessionImpl NULL_SESSION = new SSLSessionImpl(null); 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private long creationTime; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isValid = true; 4129b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson private final Map<String, Object> values = new HashMap<String, Object>(); 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] id; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long lastAccessedTime; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProtocolVersion protocol; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherSuite cipherSuite; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SSLSessionContext context; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project X509Certificate[] localCertificates; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project X509Certificate[] peerCertificates; 50f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson private String peerHost; 51f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson private int peerPort = -1; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] master_secret; 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] clientRandom; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] serverRandom; 55f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson final boolean isServer; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5729b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson public SSLSessionImpl(CipherSuite cipher_suite, SecureRandom secureRandom) { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project creationTime = System.currentTimeMillis(); 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastAccessedTime = creationTime; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cipher_suite == null) { 616882e31b7ce2d04ebbc91c7a55d7840e8fdce8a5Brian Carlstrom this.cipherSuite = CipherSuite.SSL_NULL_WITH_NULL_NULL; 62693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes id = EmptyArray.BYTE; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isServer = false; 64bcfb325d5b1f9529b439cc0805a1c140521510f7Brian Carlstrom isValid = false; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.cipherSuite = cipher_suite; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project id = new byte[32]; 6829b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson secureRandom.nextBytes(id); 69f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson long time = creationTime / 1000; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project id[28] = (byte) ((time & 0xFF000000) >>> 24); 71f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson id[29] = (byte) ((time & 0x00FF0000) >>> 16); 72f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson id[30] = (byte) ((time & 0x0000FF00) >>> 8); 73f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson id[31] = (byte) ((time & 0x000000FF)); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isServer = true; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 7929b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson public SSLSessionImpl(SecureRandom secureRandom) { 8029b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson this(null, secureRandom); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getApplicationBufferSize() { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return SSLRecordProtocol.MAX_DATA_LENGTH; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getCipherSuite() { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return cipherSuite.getName(); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getCreationTime() { 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return creationTime; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getId() { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return id; 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getLastAccessedTime() { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return lastAccessedTime; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate[] getLocalCertificates() { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return localCertificates; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Principal getLocalPrincipal() { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (localCertificates != null && localCertificates.length > 0) { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return localCertificates[0].getSubjectX500Principal(); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson return null; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getPacketBufferSize() { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return SSLRecordProtocol.MAX_SSL_PACKET_SIZE; 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public javax.security.cert.X509Certificate[] getPeerCertificateChain() 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws SSLPeerUnverifiedException { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (peerCertificates == null) { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SSLPeerUnverifiedException("No peer certificate"); 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project javax.security.cert.X509Certificate[] certs = new javax.security.cert.X509Certificate[peerCertificates.length]; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < certs.length; i++) { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 126f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson certs[i] = javax.security.cert.X509Certificate.getInstance(peerCertificates[i] 127f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson .getEncoded()); 12829b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson } catch (javax.security.cert.CertificateException ignored) { 12929b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson } catch (CertificateEncodingException ignored) { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return certs; 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (peerCertificates == null) { 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SSLPeerUnverifiedException("No peer certificate"); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return peerCertificates; 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getPeerHost() { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return peerHost; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getPeerPort() { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return peerPort; 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (peerCertificates == null) { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SSLPeerUnverifiedException("No peer certificate"); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return peerCertificates[0].getSubjectX500Principal(); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getProtocol() { 158bcfb325d5b1f9529b439cc0805a1c140521510f7Brian Carlstrom return (protocol == null) ? "NONE" : protocol.name; 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SSLSessionContext getSessionContext() { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return context; 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getValue(String name) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name == null) { 16729b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson throw new IllegalArgumentException("name == null"); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 16929b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson return values.get(name); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String[] getValueNames() { 17329b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson return values.keySet().toArray(new String[values.size()]); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void invalidate() { 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isValid = false; 178bcfb325d5b1f9529b439cc0805a1c140521510f7Brian Carlstrom context = null; 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isValid() { 182f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson if (isValid && context != null && context.getSessionTimeout() != 0 183f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson && lastAccessedTime + context.getSessionTimeout() > System.currentTimeMillis()) { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isValid = false; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isValid; 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void putValue(String name, Object value) { 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name == null || value == null) { 19129b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson throw new IllegalArgumentException("name == null || value == null"); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 19329b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson Object old = values.put(name, value); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value instanceof SSLSessionBindingListener) { 195f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson ((SSLSessionBindingListener) value).valueBound(new SSLSessionBindingEvent(this, name)); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197ecd469016485b59ea886faea126796af968a6b47Elliott Hughes if (old instanceof SSLSessionBindingListener) { 198f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson ((SSLSessionBindingListener) old).valueUnbound(new SSLSessionBindingEvent(this, name)); 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void removeValue(String name) { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name == null) { 20529b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson throw new IllegalArgumentException("name == null"); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 20729b3bd4475263c4a16c6850d45aca045ed4a926aJesse Wilson Object old = values.remove(name); 208ecd469016485b59ea886faea126796af968a6b47Elliott Hughes if (old instanceof SSLSessionBindingListener) { 209ecd469016485b59ea886faea126796af968a6b47Elliott Hughes SSLSessionBindingListener listener = (SSLSessionBindingListener) old; 210ecd469016485b59ea886faea126796af968a6b47Elliott Hughes listener.valueUnbound(new SSLSessionBindingEvent(this, name)); 211ecd469016485b59ea886faea126796af968a6b47Elliott Hughes } 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 214f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson @Override 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object clone() { 216f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson try { 217f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson return super.clone(); 218f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } catch (CloneNotSupportedException e) { 219f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson throw new AssertionError(e); 220f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void setPeer(String peerHost, int peerPort) { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.peerHost = peerHost; 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.peerPort = peerPort; 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 228