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