1 /*
2  * Copyright (C) 2017 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 java.security.Principal;
20 import java.security.cert.Certificate;
21 import java.security.cert.X509Certificate;
22 import java.util.ArrayList;
23 import java.util.List;
24 import javax.net.ssl.SSLPeerUnverifiedException;
25 import javax.net.ssl.SSLSessionContext;
26 
27 /**
28  * A snapshot of the content of another {@link ConscryptSession}. This copies everything over
29  * except for the certificates.
30  */
31 final class SessionSnapshot implements ConscryptSession {
32     private final SSLSessionContext sessionContext;
33     private final byte[] id;
34     private final String requestedServerName;
35     private final List<byte[]> statusResponses;
36     private final byte[] peerTlsSctData;
37     private final long creationTime;
38     private final long lastAccessedTime;
39     private final String cipherSuite;
40     private final String protocol;
41     private final String peerHost;
42     private final int peerPort;
43 
SessionSnapshot(ConscryptSession session)44     SessionSnapshot(ConscryptSession session) {
45         sessionContext = session.getSessionContext();
46         id = session.getId();
47         requestedServerName = session.getRequestedServerName();
48         statusResponses = session.getStatusResponses();
49         peerTlsSctData = session.getPeerSignedCertificateTimestamp();
50         creationTime = session.getCreationTime();
51         lastAccessedTime = session.getLastAccessedTime();
52         cipherSuite = session.getCipherSuite();
53         protocol = session.getProtocol();
54         peerHost = session.getPeerHost();
55         peerPort = session.getPeerPort();
56     }
57 
58     @Override
getRequestedServerName()59     public String getRequestedServerName() {
60         return requestedServerName;
61     }
62 
63     @Override
getStatusResponses()64     public List<byte[]> getStatusResponses() {
65         List<byte[]> ret = new ArrayList<byte[]>(statusResponses.size());
66         for (byte[] resp : statusResponses) {
67             ret.add(resp.clone());
68         }
69         return ret;
70     }
71 
72     @Override
getPeerSignedCertificateTimestamp()73     public byte[] getPeerSignedCertificateTimestamp() {
74         return peerTlsSctData != null ? peerTlsSctData.clone() : null;
75     }
76 
77     @Override
getId()78     public byte[] getId() {
79         return id;
80     }
81 
82     @Override
getSessionContext()83     public SSLSessionContext getSessionContext() {
84         return sessionContext;
85     }
86 
87     @Override
getCreationTime()88     public long getCreationTime() {
89         return creationTime;
90     }
91 
92     @Override
getLastAccessedTime()93     public long getLastAccessedTime() {
94         return lastAccessedTime;
95     }
96 
97     @Override
invalidate()98     public void invalidate() {
99         // Do nothing.
100     }
101 
102     @Override
isValid()103     public boolean isValid() {
104         return false;
105     }
106 
107     @Override
putValue(String s, Object o)108     public void putValue(String s, Object o) {
109         throw new UnsupportedOperationException(
110                 "All calls to this method should be intercepted by ProvidedSessionDecorator.");
111     }
112 
113     @Override
getValue(String s)114     public Object getValue(String s) {
115         throw new UnsupportedOperationException(
116                 "All calls to this method should be intercepted by ProvidedSessionDecorator.");
117     }
118 
119     @Override
removeValue(String s)120     public void removeValue(String s) {
121         throw new UnsupportedOperationException(
122                 "All calls to this method should be intercepted by ProvidedSessionDecorator.");
123     }
124 
125     @Override
getValueNames()126     public String[] getValueNames() {
127         throw new UnsupportedOperationException(
128                 "All calls to this method should be intercepted by ProvidedSessionDecorator.");
129     }
130 
131     @Override
getPeerCertificates()132     public X509Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
133         throw new SSLPeerUnverifiedException("No peer certificates");
134     }
135 
136     @Override
getLocalCertificates()137     public Certificate[] getLocalCertificates() {
138         return null;
139     }
140 
141     @Override
getPeerCertificateChain()142     public javax.security.cert.X509Certificate[] getPeerCertificateChain()
143         throws SSLPeerUnverifiedException {
144         throw new SSLPeerUnverifiedException("No peer certificates");
145     }
146 
147     @Override
getPeerPrincipal()148     public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
149         throw new SSLPeerUnverifiedException("No peer certificates");
150     }
151 
152     @Override
getLocalPrincipal()153     public Principal getLocalPrincipal() {
154         return null;
155     }
156 
157     @Override
getCipherSuite()158     public String getCipherSuite() {
159         return cipherSuite;
160     }
161 
162     @Override
getProtocol()163     public String getProtocol() {
164         return protocol;
165     }
166 
167     @Override
getPeerHost()168     public String getPeerHost() {
169         return peerHost;
170     }
171 
172     @Override
getPeerPort()173     public int getPeerPort() {
174         return peerPort;
175     }
176 
177     @Override
getPacketBufferSize()178     public int getPacketBufferSize() {
179         return NativeConstants.SSL3_RT_MAX_PACKET_SIZE;
180     }
181 
182     @Override
getApplicationBufferSize()183     public int getApplicationBufferSize() {
184         return NativeConstants.SSL3_RT_MAX_PLAIN_LENGTH;
185     }
186 }
187