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