what-the-bank/sources/io/grpc/util/AdvancedTlsX509TrustManager...

267 lines
12 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package io.grpc.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509ExtendedTrustManager;
/* loaded from: classes6.dex */
public final class AdvancedTlsX509TrustManager extends X509ExtendedTrustManager {
private static final Logger log = Logger.getLogger(AdvancedTlsX509TrustManager.class.getName());
private volatile X509ExtendedTrustManager delegateManager;
private final SslSocketAndEnginePeerVerifier socketAndEnginePeerVerifier;
private final Verification verification;
/* loaded from: classes6.dex */
public interface Closeable extends java.io.Closeable {
@Override // java.io.Closeable, java.lang.AutoCloseable
void close();
}
/* loaded from: classes6.dex */
public interface SslSocketAndEnginePeerVerifier {
void verifyPeerCertificate(X509Certificate[] x509CertificateArr, String str, Socket socket) throws CertificateException;
void verifyPeerCertificate(X509Certificate[] x509CertificateArr, String str, SSLEngine sSLEngine) throws CertificateException;
}
/* loaded from: classes6.dex */
public enum Verification {
CERTIFICATE_AND_HOST_NAME_VERIFICATION,
CERTIFICATE_ONLY_VERIFICATION,
INSECURELY_SKIP_ALL_VERIFICATION
}
private AdvancedTlsX509TrustManager(Verification verification, SslSocketAndEnginePeerVerifier sslSocketAndEnginePeerVerifier) throws CertificateException {
this.delegateManager = null;
this.verification = verification;
this.socketAndEnginePeerVerifier = sslSocketAndEnginePeerVerifier;
}
@Override // javax.net.ssl.X509TrustManager
public final void checkClientTrusted(X509Certificate[] x509CertificateArr, String str) throws CertificateException {
throw new CertificateException("Not enough information to validate peer. SSLEngine or Socket required.");
}
@Override // javax.net.ssl.X509ExtendedTrustManager
public final void checkClientTrusted(X509Certificate[] x509CertificateArr, String str, Socket socket) throws CertificateException {
checkTrusted(x509CertificateArr, str, null, socket, false);
}
@Override // javax.net.ssl.X509ExtendedTrustManager
public final void checkClientTrusted(X509Certificate[] x509CertificateArr, String str, SSLEngine sSLEngine) throws CertificateException {
checkTrusted(x509CertificateArr, str, sSLEngine, null, false);
}
@Override // javax.net.ssl.X509ExtendedTrustManager
public final void checkServerTrusted(X509Certificate[] x509CertificateArr, String str, SSLEngine sSLEngine) throws CertificateException {
checkTrusted(x509CertificateArr, str, sSLEngine, null, true);
}
@Override // javax.net.ssl.X509TrustManager
public final void checkServerTrusted(X509Certificate[] x509CertificateArr, String str) throws CertificateException {
throw new CertificateException("Not enough information to validate peer. SSLEngine or Socket required.");
}
@Override // javax.net.ssl.X509ExtendedTrustManager
public final void checkServerTrusted(X509Certificate[] x509CertificateArr, String str, Socket socket) throws CertificateException {
checkTrusted(x509CertificateArr, str, null, socket, true);
}
@Override // javax.net.ssl.X509TrustManager
public final X509Certificate[] getAcceptedIssuers() {
return this.delegateManager == null ? new X509Certificate[0] : this.delegateManager.getAcceptedIssuers();
}
public final void useSystemDefaultTrustCerts() throws CertificateException, KeyStoreException, NoSuchAlgorithmException {
this.delegateManager = createDelegateTrustManager(null);
}
public final void updateTrustCredentials(X509Certificate[] x509CertificateArr) throws IOException, GeneralSecurityException {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
int i = 1;
for (X509Certificate x509Certificate : x509CertificateArr) {
keyStore.setCertificateEntry(Integer.toString(i), x509Certificate);
i++;
}
this.delegateManager = createDelegateTrustManager(keyStore);
}
private static X509ExtendedTrustManager createDelegateTrustManager(KeyStore keyStore) throws CertificateException, KeyStoreException, NoSuchAlgorithmException {
X509ExtendedTrustManager x509ExtendedTrustManager;
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
int i = 0;
while (true) {
if (i >= trustManagers.length) {
x509ExtendedTrustManager = null;
break;
}
TrustManager trustManager = trustManagers[i];
if (trustManager instanceof X509ExtendedTrustManager) {
x509ExtendedTrustManager = (X509ExtendedTrustManager) trustManager;
break;
}
i++;
}
if (x509ExtendedTrustManager != null) {
return x509ExtendedTrustManager;
}
StringBuilder sb = new StringBuilder("Failed to find X509ExtendedTrustManager with default TrustManager algorithm ");
sb.append(TrustManagerFactory.getDefaultAlgorithm());
throw new CertificateException(sb.toString());
}
private void checkTrusted(X509Certificate[] x509CertificateArr, String str, SSLEngine sSLEngine, Socket socket, boolean z) throws CertificateException {
if (x509CertificateArr == null || x509CertificateArr.length == 0) {
throw new IllegalArgumentException("Want certificate verification but got null or empty certificates");
}
if (sSLEngine == null && socket == null) {
throw new CertificateException("Not enough information to validate peer. SSLEngine or Socket required.");
}
if (this.verification != Verification.INSECURELY_SKIP_ALL_VERIFICATION) {
X509ExtendedTrustManager x509ExtendedTrustManager = this.delegateManager;
if (x509ExtendedTrustManager == null) {
throw new CertificateException("No trust roots configured");
}
if (z) {
String str2 = this.verification == Verification.CERTIFICATE_AND_HOST_NAME_VERIFICATION ? "HTTPS" : "";
if (sSLEngine != null) {
SSLParameters sSLParameters = sSLEngine.getSSLParameters();
sSLParameters.setEndpointIdentificationAlgorithm(str2);
sSLEngine.setSSLParameters(sSLParameters);
x509ExtendedTrustManager.checkServerTrusted(x509CertificateArr, str, sSLEngine);
} else {
if (!(socket instanceof SSLSocket)) {
throw new CertificateException("socket is not a type of SSLSocket");
}
SSLSocket sSLSocket = (SSLSocket) socket;
SSLParameters sSLParameters2 = sSLSocket.getSSLParameters();
sSLParameters2.setEndpointIdentificationAlgorithm(str2);
sSLSocket.setSSLParameters(sSLParameters2);
x509ExtendedTrustManager.checkServerTrusted(x509CertificateArr, str, sSLSocket);
}
} else {
x509ExtendedTrustManager.checkClientTrusted(x509CertificateArr, str, sSLEngine);
}
}
SslSocketAndEnginePeerVerifier sslSocketAndEnginePeerVerifier = this.socketAndEnginePeerVerifier;
if (sslSocketAndEnginePeerVerifier != null) {
if (sSLEngine != null) {
sslSocketAndEnginePeerVerifier.verifyPeerCertificate(x509CertificateArr, str, sSLEngine);
} else {
sslSocketAndEnginePeerVerifier.verifyPeerCertificate(x509CertificateArr, str, socket);
}
}
}
public final Closeable updateTrustCredentialsFromFile(File file, long j, TimeUnit timeUnit, ScheduledExecutorService scheduledExecutorService) throws IOException, GeneralSecurityException {
if (readAndUpdate(file, 0L) == 0) {
throw new GeneralSecurityException("Files were unmodified before their initial update. Probably a bug.");
}
return new Closeable(this, scheduledExecutorService.scheduleWithFixedDelay(new LoadFilePathExecution(this, file), j, j, timeUnit)) { // from class: io.grpc.util.AdvancedTlsX509TrustManager.1
final AdvancedTlsX509TrustManager this$0;
final ScheduledFuture val$future;
{
this.this$0 = this;
this.val$future = r2;
}
@Override // io.grpc.util.AdvancedTlsX509TrustManager.Closeable, java.io.Closeable, java.lang.AutoCloseable
public void close() {
this.val$future.cancel(false);
}
};
}
/* loaded from: classes6.dex */
class LoadFilePathExecution implements Runnable {
long currentTime = 0;
File file;
final AdvancedTlsX509TrustManager this$0;
public LoadFilePathExecution(AdvancedTlsX509TrustManager advancedTlsX509TrustManager, File file) {
this.this$0 = advancedTlsX509TrustManager;
this.file = file;
}
@Override // java.lang.Runnable
public void run() {
try {
this.currentTime = this.this$0.readAndUpdate(this.file, this.currentTime);
} catch (IOException | GeneralSecurityException e) {
AdvancedTlsX509TrustManager.log.log(Level.SEVERE, "Failed refreshing trust CAs from file. Using previous CAs", e);
}
}
}
public final void updateTrustCredentialsFromFile(File file) throws IOException, GeneralSecurityException {
if (readAndUpdate(file, 0L) == 0) {
throw new GeneralSecurityException("Files were unmodified before their initial update. Probably a bug.");
}
}
/* JADX INFO: Access modifiers changed from: private */
public long readAndUpdate(File file, long j) throws IOException, GeneralSecurityException {
long lastModified = file.lastModified();
if (lastModified == j) {
return j;
}
FileInputStream fileInputStream = new FileInputStream(file);
try {
updateTrustCredentials(CertificateUtils.getX509Certificates(fileInputStream));
return lastModified;
} finally {
fileInputStream.close();
}
}
public static Builder newBuilder() {
return new Builder();
}
/* loaded from: classes6.dex */
public static final class Builder {
private SslSocketAndEnginePeerVerifier socketAndEnginePeerVerifier;
private Verification verification;
private Builder() {
this.verification = Verification.CERTIFICATE_AND_HOST_NAME_VERIFICATION;
}
public final AdvancedTlsX509TrustManager build() throws CertificateException {
return new AdvancedTlsX509TrustManager(this.verification, this.socketAndEnginePeerVerifier);
}
public final Builder setVerification(Verification verification) {
this.verification = verification;
return this;
}
public final Builder setSslSocketAndEnginePeerVerifier(SslSocketAndEnginePeerVerifier sslSocketAndEnginePeerVerifier) {
this.socketAndEnginePeerVerifier = sslSocketAndEnginePeerVerifier;
return this;
}
}
}