• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.conscrypt;
18 
19 import javax.net.ssl.SSLContext;
20 
21 /**
22  * Caches server sessions. Indexes by session ID. Users typically look up
23  * sessions using the ID provided by an SSL client.
24  */
25 @Internal
26 public final class ServerSessionContext extends AbstractSessionContext {
27     private SSLServerSessionCache persistentCache;
28 
ServerSessionContext()29     ServerSessionContext() {
30         super(100);
31 
32         // TODO make sure SSL_CTX does not automaticaly clear sessions we want it to cache
33         // SSL_CTX_set_session_cache_mode(sslCtxNativePointer, SSL_SESS_CACHE_NO_AUTO_CLEAR);
34 
35         // TODO remove SSL_CTX session cache limit so we can manage it
36         // SSL_CTX_sess_set_cache_size(sslCtxNativePointer, 0);
37 
38         // TODO override trimToSize and removeEldestEntry to use
39         // SSL_CTX_sessions to remove from native cache
40 
41         // Set a trivial session id context. OpenSSL uses this to make
42         // sure you don't reuse sessions externalized with i2d_SSL_SESSION
43         // between apps. However our sessions are either in memory or
44         // exported to a app's SSLServerSessionCache.
45         NativeCrypto.SSL_CTX_set_session_id_context(sslCtxNativePointer, this, new byte[] { ' ' });
46     }
47 
48     /**
49      * Applications should not use this method. Instead use {@link
50      * Conscrypt#setServerSessionCache(SSLContext, SSLServerSessionCache)}.
51      */
setPersistentCache(SSLServerSessionCache persistentCache)52     public void setPersistentCache(SSLServerSessionCache persistentCache) {
53         this.persistentCache = persistentCache;
54     }
55 
56     @Override
getSessionFromPersistentCache(byte[] sessionId)57     NativeSslSession getSessionFromPersistentCache(byte[] sessionId) {
58         if (persistentCache != null) {
59             byte[] data = persistentCache.getSessionData(sessionId);
60             if (data != null) {
61                 NativeSslSession session = NativeSslSession.newInstance(this, data, null, -1);
62                 if (session != null && session.isValid()) {
63                     cacheSession(session);
64                     return session;
65                 }
66             }
67         }
68 
69         return null;
70     }
71 
72     @Override
onBeforeAddSession(NativeSslSession session)73     void onBeforeAddSession(NativeSslSession session) {
74         // TODO: Do this in background thread.
75         if (persistentCache != null) {
76             byte[] data = session.toBytes();
77             if (data != null) {
78                 persistentCache.putSessionData(session.toSSLSession(), data);
79             }
80         }
81     }
82 
83     @Override
onBeforeRemoveSession(NativeSslSession session)84     void onBeforeRemoveSession(NativeSslSession session) {
85         // Do nothing.
86     }
87 }
88