mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-17 19:58:57 +03:00
Remove legacy class, we do not need them for the migration
Migration tested again and OK
This commit is contained in:
parent
ba26aee54c
commit
cec5cd864c
5 changed files with 0 additions and 611 deletions
|
@ -1,284 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2020 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.matrix.android.internal.legacy.riot;
|
||||
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLPeerUnverifiedException;
|
||||
import javax.net.ssl.SSLSession;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.TrustManagerFactory;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
|
||||
import okhttp3.CipherSuite;
|
||||
import okhttp3.ConnectionSpec;
|
||||
import okhttp3.TlsVersion;
|
||||
import timber.log.Timber;
|
||||
|
||||
/*
|
||||
* IMPORTANT: This class is imported from Riot-Android to be able to perform a migration. Do not use it for any other purpose
|
||||
*/
|
||||
|
||||
/**
|
||||
* Various utility classes for dealing with X509Certificates
|
||||
*/
|
||||
public class CertUtil {
|
||||
/**
|
||||
* Generates the SHA-256 fingerprint of the given certificate
|
||||
*
|
||||
* @param cert the certificate.
|
||||
* @return the finger print
|
||||
* @throws CertificateException the certificate exception
|
||||
*/
|
||||
public static byte[] generateSha256Fingerprint(X509Certificate cert) throws CertificateException {
|
||||
return generateFingerprint(cert, "SHA-256");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the SHA-1 fingerprint of the given certificate
|
||||
*
|
||||
* @param cert the certificated
|
||||
* @return the SHA1 fingerprint
|
||||
* @throws CertificateException the certificate exception
|
||||
*/
|
||||
public static byte[] generateSha1Fingerprint(X509Certificate cert) throws CertificateException {
|
||||
return generateFingerprint(cert, "SHA-1");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the fingerprint for a dedicated type.
|
||||
*
|
||||
* @param cert the certificate
|
||||
* @param type the type
|
||||
* @return the fingerprint
|
||||
* @throws CertificateException certificate exception
|
||||
*/
|
||||
private static byte[] generateFingerprint(X509Certificate cert, String type) throws CertificateException {
|
||||
final byte[] fingerprint;
|
||||
final MessageDigest md;
|
||||
try {
|
||||
md = MessageDigest.getInstance(type);
|
||||
} catch (Exception e) {
|
||||
// This really *really* shouldn't throw, as java should always have a SHA-256 and SHA-1 impl.
|
||||
throw new CertificateException(e);
|
||||
}
|
||||
|
||||
fingerprint = md.digest(cert.getEncoded());
|
||||
|
||||
return fingerprint;
|
||||
}
|
||||
|
||||
final private static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
||||
|
||||
/**
|
||||
* Convert the fingerprint to an hexa string.
|
||||
*
|
||||
* @param fingerprint the fingerprint
|
||||
* @return the hexa string.
|
||||
*/
|
||||
public static String fingerprintToHexString(byte[] fingerprint) {
|
||||
return fingerprintToHexString(fingerprint, ' ');
|
||||
}
|
||||
|
||||
public static String fingerprintToHexString(byte[] fingerprint, char sep) {
|
||||
char[] hexChars = new char[fingerprint.length * 3];
|
||||
for (int j = 0; j < fingerprint.length; j++) {
|
||||
int v = fingerprint[j] & 0xFF;
|
||||
hexChars[j * 3] = hexArray[v >>> 4];
|
||||
hexChars[j * 3 + 1] = hexArray[v & 0x0F];
|
||||
hexChars[j * 3 + 2] = sep;
|
||||
}
|
||||
return new String(hexChars, 0, hexChars.length - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively checks the exception to see if it was caused by an
|
||||
* UnrecognizedCertificateException
|
||||
*
|
||||
* @param e the throwable.
|
||||
* @return The UnrecognizedCertificateException if exists, else null.
|
||||
*/
|
||||
public static UnrecognizedCertificateException getCertificateException(Throwable e) {
|
||||
int i = 0; // Just in case there is a getCause loop
|
||||
while (e != null && i < 10) {
|
||||
if (e instanceof UnrecognizedCertificateException) {
|
||||
return (UnrecognizedCertificateException) e;
|
||||
}
|
||||
e = e.getCause();
|
||||
i++;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a SSLSocket factory for a HS config.
|
||||
*
|
||||
* @param hsConfig the HS config.
|
||||
* @return SSLSocket factory
|
||||
*/
|
||||
public static Pair<SSLSocketFactory, X509TrustManager> newPinnedSSLSocketFactory(HomeServerConnectionConfig hsConfig) {
|
||||
X509TrustManager defaultTrustManager = null;
|
||||
|
||||
// If we haven't specified that we wanted to pin the certs, fallback to standard
|
||||
// X509 checks if fingerprints don't match.
|
||||
if (!hsConfig.shouldPin()) {
|
||||
TrustManagerFactory trustManagerFactory = null;
|
||||
|
||||
// get the PKIX instance
|
||||
try {
|
||||
trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
Timber.e(e, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance failed");
|
||||
}
|
||||
|
||||
// it doesn't exist, use the default one.
|
||||
if (trustManagerFactory == null) {
|
||||
try {
|
||||
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
Timber.e(e, "## newPinnedSSLSocketFactory() : TrustManagerFactory.getInstance with default algorithm failed");
|
||||
}
|
||||
}
|
||||
|
||||
if (trustManagerFactory != null) {
|
||||
try {
|
||||
trustManagerFactory.init((KeyStore) null);
|
||||
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
|
||||
|
||||
for (int i = 0; i < trustManagers.length; i++) {
|
||||
if (trustManagers[i] instanceof X509TrustManager) {
|
||||
defaultTrustManager = (X509TrustManager) trustManagers[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (KeyStoreException e) {
|
||||
Timber.e(e, "## newPinnedSSLSocketFactory()");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
X509TrustManager trustManager = new PinnedTrustManager(hsConfig.getAllowedFingerprints(), defaultTrustManager);
|
||||
|
||||
TrustManager[] trustManagers = new TrustManager[]{
|
||||
trustManager
|
||||
};
|
||||
|
||||
SSLSocketFactory sslSocketFactory;
|
||||
|
||||
try {
|
||||
if (hsConfig.forceUsageOfTlsVersions() && hsConfig.getAcceptedTlsVersions() != null) {
|
||||
// Force usage of accepted Tls Versions for Android < 20
|
||||
sslSocketFactory = new TLSSocketFactory(trustManagers, hsConfig.getAcceptedTlsVersions());
|
||||
} else {
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||
sslContext.init(null, trustManagers, new java.security.SecureRandom());
|
||||
sslSocketFactory = sslContext.getSocketFactory();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// This is too fatal
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return new Pair<>(sslSocketFactory, trustManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Host name verifier for a hs config.
|
||||
*
|
||||
* @param hsConfig the hs config.
|
||||
* @return a new HostnameVerifier.
|
||||
*/
|
||||
public static HostnameVerifier newHostnameVerifier(HomeServerConnectionConfig hsConfig) {
|
||||
final HostnameVerifier defaultVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
|
||||
final List<Fingerprint> trusted_fingerprints = hsConfig.getAllowedFingerprints();
|
||||
|
||||
return new HostnameVerifier() {
|
||||
@Override
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
if (defaultVerifier.verify(hostname, session)) return true;
|
||||
if (trusted_fingerprints == null || trusted_fingerprints.size() == 0) return false;
|
||||
|
||||
// If remote cert matches an allowed fingerprint, just accept it.
|
||||
try {
|
||||
for (Certificate cert : session.getPeerCertificates()) {
|
||||
for (Fingerprint allowedFingerprint : trusted_fingerprints) {
|
||||
if (allowedFingerprint != null && cert instanceof X509Certificate && allowedFingerprint.matchesCert((X509Certificate) cert)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SSLPeerUnverifiedException e) {
|
||||
return false;
|
||||
} catch (CertificateException e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a list of accepted TLS specifications for a hs config.
|
||||
*
|
||||
* @param hsConfig the hs config.
|
||||
* @param url the url of the end point, used to check if we have to enable CLEARTEXT communication.
|
||||
* @return a list of accepted TLS specifications.
|
||||
*/
|
||||
public static List<ConnectionSpec> newConnectionSpecs(@NonNull HomeServerConnectionConfig hsConfig, @NonNull String url) {
|
||||
final ConnectionSpec.Builder builder = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS);
|
||||
|
||||
final List<TlsVersion> tlsVersions = hsConfig.getAcceptedTlsVersions();
|
||||
if (null != tlsVersions) {
|
||||
builder.tlsVersions(tlsVersions.toArray(new TlsVersion[0]));
|
||||
}
|
||||
|
||||
final List<CipherSuite> tlsCipherSuites = hsConfig.getAcceptedTlsCipherSuites();
|
||||
if (null != tlsCipherSuites) {
|
||||
builder.cipherSuites(tlsCipherSuites.toArray(new CipherSuite[0]));
|
||||
}
|
||||
|
||||
builder.supportsTlsExtensions(hsConfig.shouldAcceptTlsExtensions());
|
||||
|
||||
List<ConnectionSpec> list = new ArrayList<>();
|
||||
|
||||
list.add(builder.build());
|
||||
|
||||
if (url.startsWith("http://")) {
|
||||
list.add(ConnectionSpec.CLEARTEXT);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
|
@ -21,8 +21,6 @@ import android.util.Base64;
|
|||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.Arrays;
|
||||
|
||||
/*
|
||||
|
@ -40,20 +38,10 @@ public class Fingerprint {
|
|||
|
||||
private final HashType mHashType;
|
||||
private final byte[] mBytes;
|
||||
private String mDisplayableHexRepr;
|
||||
|
||||
public Fingerprint(HashType hashType, byte[] bytes) {
|
||||
mHashType = hashType;
|
||||
mBytes = bytes;
|
||||
mDisplayableHexRepr = null;
|
||||
}
|
||||
|
||||
public static Fingerprint newSha256Fingerprint(X509Certificate cert) throws CertificateException {
|
||||
return new Fingerprint(HashType.SHA256, CertUtil.generateSha256Fingerprint(cert));
|
||||
}
|
||||
|
||||
public static Fingerprint newSha1Fingerprint(X509Certificate cert) throws CertificateException {
|
||||
return new Fingerprint(HashType.SHA1, CertUtil.generateSha1Fingerprint(cert));
|
||||
}
|
||||
|
||||
public HashType getType() {
|
||||
|
@ -64,14 +52,6 @@ public class Fingerprint {
|
|||
return mBytes;
|
||||
}
|
||||
|
||||
public String getBytesAsHexString() {
|
||||
if (mDisplayableHexRepr == null) {
|
||||
mDisplayableHexRepr = CertUtil.fingerprintToHexString(mBytes);
|
||||
}
|
||||
|
||||
return mDisplayableHexRepr;
|
||||
}
|
||||
|
||||
public JSONObject toJson() throws JSONException {
|
||||
JSONObject obj = new JSONObject();
|
||||
obj.put("bytes", Base64.encodeToString(getBytes(), Base64.DEFAULT));
|
||||
|
@ -95,24 +75,6 @@ public class Fingerprint {
|
|||
return new Fingerprint(hashType, fingerprintBytes);
|
||||
}
|
||||
|
||||
public boolean matchesCert(X509Certificate cert) throws CertificateException {
|
||||
Fingerprint o = null;
|
||||
switch (mHashType) {
|
||||
case SHA256:
|
||||
o = Fingerprint.newSha256Fingerprint(cert);
|
||||
break;
|
||||
case SHA1:
|
||||
o = Fingerprint.newSha1Fingerprint(cert);
|
||||
break;
|
||||
}
|
||||
|
||||
return equals(o);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return String.format("Fingerprint{type: '%s', fingeprint: '%s'}", mHashType.toString(), getBytesAsHexString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
|
|
|
@ -1,107 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2020 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.matrix.android.internal.legacy.riot;
|
||||
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
|
||||
/*
|
||||
* IMPORTANT: This class is imported from Riot-Android to be able to perform a migration. Do not use it for any other purpose
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements a TrustManager that checks Certificates against an explicit list of known
|
||||
* fingerprints.
|
||||
*/
|
||||
public class PinnedTrustManager implements X509TrustManager {
|
||||
private final List<Fingerprint> mFingerprints;
|
||||
@Nullable
|
||||
private final X509TrustManager mDefaultTrustManager;
|
||||
|
||||
/**
|
||||
* @param fingerprints An array of SHA256 cert fingerprints
|
||||
* @param defaultTrustManager Optional trust manager to fall back on if cert does not match
|
||||
* any of the fingerprints. Can be null.
|
||||
*/
|
||||
public PinnedTrustManager(List<Fingerprint> fingerprints, @Nullable X509TrustManager defaultTrustManager) {
|
||||
mFingerprints = fingerprints;
|
||||
mDefaultTrustManager = defaultTrustManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String s) throws CertificateException {
|
||||
try {
|
||||
if (mDefaultTrustManager != null) {
|
||||
mDefaultTrustManager.checkClientTrusted(
|
||||
chain, s
|
||||
);
|
||||
return;
|
||||
}
|
||||
} catch (CertificateException e) {
|
||||
// If there is an exception we fall back to checking fingerprints
|
||||
if (mFingerprints == null || mFingerprints.size() == 0) {
|
||||
throw new UnrecognizedCertificateException(chain[0], Fingerprint.newSha256Fingerprint(chain[0]), e.getCause());
|
||||
}
|
||||
}
|
||||
checkTrusted("client", chain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] chain, String s) throws CertificateException {
|
||||
try {
|
||||
if (mDefaultTrustManager != null) {
|
||||
mDefaultTrustManager.checkServerTrusted(
|
||||
chain, s
|
||||
);
|
||||
return;
|
||||
}
|
||||
} catch (CertificateException e) {
|
||||
// If there is an exception we fall back to checking fingerprints
|
||||
if (mFingerprints == null || mFingerprints.isEmpty()) {
|
||||
throw new UnrecognizedCertificateException(chain[0], Fingerprint.newSha256Fingerprint(chain[0]), e.getCause());
|
||||
}
|
||||
}
|
||||
checkTrusted("server", chain);
|
||||
}
|
||||
|
||||
private void checkTrusted(String type, X509Certificate[] chain) throws CertificateException {
|
||||
X509Certificate cert = chain[0];
|
||||
|
||||
boolean found = false;
|
||||
if (mFingerprints != null) {
|
||||
for (Fingerprint allowedFingerprint : mFingerprints) {
|
||||
if (allowedFingerprint != null && allowedFingerprint.matchesCert(cert)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
throw new UnrecognizedCertificateException(cert, Fingerprint.newSha256Fingerprint(cert), null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public X509Certificate[] getAcceptedIssuers() {
|
||||
return new X509Certificate[0];
|
||||
}
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2020 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.matrix.android.internal.legacy.riot;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.Socket;
|
||||
import java.net.UnknownHostException;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLSocket;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import javax.net.ssl.TrustManager;
|
||||
|
||||
import okhttp3.TlsVersion;
|
||||
import timber.log.Timber;
|
||||
|
||||
/*
|
||||
* IMPORTANT: This class is imported from Riot-Android to be able to perform a migration. Do not use it for any other purpose
|
||||
*/
|
||||
|
||||
/**
|
||||
* Force the usage of Tls versions on every created socket
|
||||
* Inspired from https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/
|
||||
*/
|
||||
/*package*/ class TLSSocketFactory extends SSLSocketFactory {
|
||||
private SSLSocketFactory internalSSLSocketFactory;
|
||||
|
||||
private String[] enabledProtocols;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param trustPinned
|
||||
* @param acceptedTlsVersions
|
||||
* @throws KeyManagementException
|
||||
* @throws NoSuchAlgorithmException
|
||||
*/
|
||||
/*package*/ TLSSocketFactory(TrustManager[] trustPinned, List<TlsVersion> acceptedTlsVersions) throws KeyManagementException, NoSuchAlgorithmException {
|
||||
SSLContext context = SSLContext.getInstance("TLS");
|
||||
context.init(null, trustPinned, new SecureRandom());
|
||||
internalSSLSocketFactory = context.getSocketFactory();
|
||||
|
||||
enabledProtocols = new String[acceptedTlsVersions.size()];
|
||||
int i = 0;
|
||||
for (TlsVersion tlsVersion : acceptedTlsVersions) {
|
||||
enabledProtocols[i] = tlsVersion.javaName();
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getDefaultCipherSuites() {
|
||||
return internalSSLSocketFactory.getDefaultCipherSuites();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getSupportedCipherSuites() {
|
||||
return internalSSLSocketFactory.getSupportedCipherSuites();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Socket createSocket() throws IOException {
|
||||
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
|
||||
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
|
||||
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
|
||||
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Socket createSocket(InetAddress host, int port) throws IOException {
|
||||
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
|
||||
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
|
||||
}
|
||||
|
||||
private Socket enableTLSOnSocket(Socket socket) {
|
||||
if (socket != null && (socket instanceof SSLSocket)) {
|
||||
SSLSocket sslSocket = (SSLSocket) socket;
|
||||
|
||||
List<String> supportedProtocols = Arrays.asList(sslSocket.getSupportedProtocols());
|
||||
List<String> filteredEnabledProtocols = new ArrayList<>();
|
||||
|
||||
for (String protocol : enabledProtocols) {
|
||||
if (supportedProtocols.contains(protocol)) {
|
||||
filteredEnabledProtocols.add(protocol);
|
||||
}
|
||||
}
|
||||
|
||||
if (!filteredEnabledProtocols.isEmpty()) {
|
||||
try {
|
||||
sslSocket.setEnabledProtocols(filteredEnabledProtocols.toArray(new String[filteredEnabledProtocols.size()]));
|
||||
} catch (Exception e) {
|
||||
Timber.e(e, "Exception");
|
||||
}
|
||||
}
|
||||
}
|
||||
return socket;
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2020 New Vector Ltd
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package im.vector.matrix.android.internal.legacy.riot;
|
||||
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
/*
|
||||
* IMPORTANT: This class is imported from Riot-Android to be able to perform a migration. Do not use it for any other purpose
|
||||
*/
|
||||
|
||||
/**
|
||||
* Thrown when we are given a certificate that does match the certificate we were told to
|
||||
* expect.
|
||||
*/
|
||||
public class UnrecognizedCertificateException extends CertificateException {
|
||||
private final X509Certificate mCert;
|
||||
private final Fingerprint mFingerprint;
|
||||
|
||||
public UnrecognizedCertificateException(X509Certificate cert, Fingerprint fingerprint, Throwable cause) {
|
||||
super("Unrecognized certificate with unknown fingerprint: " + cert.getSubjectDN(), cause);
|
||||
mCert = cert;
|
||||
mFingerprint = fingerprint;
|
||||
}
|
||||
|
||||
public X509Certificate getCertificate() {
|
||||
return mCert;
|
||||
}
|
||||
|
||||
public Fingerprint getFingerprint() {
|
||||
return mFingerprint;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue