359 lines
22 KiB
Java
359 lines
22 KiB
Java
package org.bouncycastle.crypto.tls;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.security.SecureRandom;
|
|
import java.util.Hashtable;
|
|
import java.util.Vector;
|
|
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
|
|
import org.bouncycastle.crypto.tls.DTLSReliableHandshake;
|
|
import org.bouncycastle.crypto.util.PublicKeyFactory;
|
|
import org.bouncycastle.util.Arrays;
|
|
|
|
/* loaded from: classes6.dex */
|
|
public class DTLSServerProtocol extends DTLSProtocol {
|
|
protected boolean verifyRequests;
|
|
|
|
public void setVerifyRequests(boolean z) {
|
|
this.verifyRequests = z;
|
|
}
|
|
|
|
protected DTLSTransport serverHandshake(ServerHandshakeState serverHandshakeState, DTLSRecordLayer dTLSRecordLayer) throws IOException {
|
|
Certificate certificate;
|
|
CertificateStatus certificateStatus;
|
|
SecurityParameters securityParameters = serverHandshakeState.serverContext.getSecurityParameters();
|
|
DTLSReliableHandshake dTLSReliableHandshake = new DTLSReliableHandshake(serverHandshakeState.serverContext, dTLSRecordLayer);
|
|
DTLSReliableHandshake.Message receiveMessage = dTLSReliableHandshake.receiveMessage();
|
|
if (receiveMessage.getType() != 1) {
|
|
throw new TlsFatalAlert((short) 10);
|
|
}
|
|
processClientHello(serverHandshakeState, receiveMessage.getBody());
|
|
byte[] generateServerHello = generateServerHello(serverHandshakeState);
|
|
applyMaxFragmentLengthExtension(dTLSRecordLayer, securityParameters.maxFragmentLength);
|
|
ProtocolVersion serverVersion = serverHandshakeState.serverContext.getServerVersion();
|
|
dTLSRecordLayer.setReadVersion(serverVersion);
|
|
dTLSRecordLayer.setWriteVersion(serverVersion);
|
|
dTLSReliableHandshake.sendMessage((short) 2, generateServerHello);
|
|
dTLSReliableHandshake.notifyHelloComplete();
|
|
Vector serverSupplementalData = serverHandshakeState.server.getServerSupplementalData();
|
|
if (serverSupplementalData != null) {
|
|
dTLSReliableHandshake.sendMessage((short) 23, generateSupplementalData(serverSupplementalData));
|
|
}
|
|
serverHandshakeState.keyExchange = serverHandshakeState.server.getKeyExchange();
|
|
serverHandshakeState.keyExchange.init(serverHandshakeState.serverContext);
|
|
serverHandshakeState.serverCredentials = serverHandshakeState.server.getCredentials();
|
|
if (serverHandshakeState.serverCredentials == null) {
|
|
serverHandshakeState.keyExchange.skipServerCredentials();
|
|
certificate = null;
|
|
} else {
|
|
serverHandshakeState.keyExchange.processServerCredentials(serverHandshakeState.serverCredentials);
|
|
certificate = serverHandshakeState.serverCredentials.getCertificate();
|
|
dTLSReliableHandshake.sendMessage((short) 11, generateCertificate(certificate));
|
|
}
|
|
if (certificate == null || certificate.isEmpty()) {
|
|
serverHandshakeState.allowCertificateStatus = false;
|
|
}
|
|
if (serverHandshakeState.allowCertificateStatus && (certificateStatus = serverHandshakeState.server.getCertificateStatus()) != null) {
|
|
dTLSReliableHandshake.sendMessage((short) 22, generateCertificateStatus(serverHandshakeState, certificateStatus));
|
|
}
|
|
byte[] generateServerKeyExchange = serverHandshakeState.keyExchange.generateServerKeyExchange();
|
|
if (generateServerKeyExchange != null) {
|
|
dTLSReliableHandshake.sendMessage((short) 12, generateServerKeyExchange);
|
|
}
|
|
if (serverHandshakeState.serverCredentials != null) {
|
|
serverHandshakeState.certificateRequest = serverHandshakeState.server.getCertificateRequest();
|
|
if (serverHandshakeState.certificateRequest != null) {
|
|
if (TlsUtils.isTLSv12(serverHandshakeState.serverContext) != (serverHandshakeState.certificateRequest.getSupportedSignatureAlgorithms() != null)) {
|
|
throw new TlsFatalAlert((short) 80);
|
|
}
|
|
serverHandshakeState.keyExchange.validateCertificateRequest(serverHandshakeState.certificateRequest);
|
|
dTLSReliableHandshake.sendMessage((short) 13, generateCertificateRequest(serverHandshakeState, serverHandshakeState.certificateRequest));
|
|
TlsUtils.trackHashAlgorithms(dTLSReliableHandshake.getHandshakeHash(), serverHandshakeState.certificateRequest.getSupportedSignatureAlgorithms());
|
|
}
|
|
}
|
|
dTLSReliableHandshake.sendMessage((short) 14, TlsUtils.EMPTY_BYTES);
|
|
dTLSReliableHandshake.getHandshakeHash().sealHashAlgorithms();
|
|
DTLSReliableHandshake.Message receiveMessage2 = dTLSReliableHandshake.receiveMessage();
|
|
if (receiveMessage2.getType() == 23) {
|
|
processClientSupplementalData(serverHandshakeState, receiveMessage2.getBody());
|
|
receiveMessage2 = dTLSReliableHandshake.receiveMessage();
|
|
} else {
|
|
serverHandshakeState.server.processClientSupplementalData(null);
|
|
}
|
|
if (serverHandshakeState.certificateRequest == null) {
|
|
serverHandshakeState.keyExchange.skipClientCredentials();
|
|
} else if (receiveMessage2.getType() == 11) {
|
|
processClientCertificate(serverHandshakeState, receiveMessage2.getBody());
|
|
receiveMessage2 = dTLSReliableHandshake.receiveMessage();
|
|
} else {
|
|
if (TlsUtils.isTLSv12(serverHandshakeState.serverContext)) {
|
|
throw new TlsFatalAlert((short) 10);
|
|
}
|
|
notifyClientCertificate(serverHandshakeState, Certificate.EMPTY_CHAIN);
|
|
}
|
|
if (receiveMessage2.getType() != 16) {
|
|
throw new TlsFatalAlert((short) 10);
|
|
}
|
|
processClientKeyExchange(serverHandshakeState, receiveMessage2.getBody());
|
|
TlsHandshakeHash prepareToFinish = dTLSReliableHandshake.prepareToFinish();
|
|
securityParameters.sessionHash = TlsProtocol.getCurrentPRFHash(serverHandshakeState.serverContext, prepareToFinish, null);
|
|
TlsProtocol.establishMasterSecret(serverHandshakeState.serverContext, serverHandshakeState.keyExchange);
|
|
dTLSRecordLayer.initPendingEpoch(serverHandshakeState.server.getCipher());
|
|
if (expectCertificateVerifyMessage(serverHandshakeState)) {
|
|
processCertificateVerify(serverHandshakeState, dTLSReliableHandshake.receiveMessageBody((short) 15), prepareToFinish);
|
|
}
|
|
processFinished(dTLSReliableHandshake.receiveMessageBody((short) 20), TlsUtils.calculateVerifyData(serverHandshakeState.serverContext, ExporterLabel.client_finished, TlsProtocol.getCurrentPRFHash(serverHandshakeState.serverContext, dTLSReliableHandshake.getHandshakeHash(), null)));
|
|
if (serverHandshakeState.expectSessionTicket) {
|
|
dTLSReliableHandshake.sendMessage((short) 4, generateNewSessionTicket(serverHandshakeState, serverHandshakeState.server.getNewSessionTicket()));
|
|
}
|
|
dTLSReliableHandshake.sendMessage((short) 20, TlsUtils.calculateVerifyData(serverHandshakeState.serverContext, ExporterLabel.server_finished, TlsProtocol.getCurrentPRFHash(serverHandshakeState.serverContext, dTLSReliableHandshake.getHandshakeHash(), null)));
|
|
dTLSReliableHandshake.finish();
|
|
serverHandshakeState.server.notifyHandshakeComplete();
|
|
return new DTLSTransport(dTLSRecordLayer);
|
|
}
|
|
|
|
protected void processClientSupplementalData(ServerHandshakeState serverHandshakeState, byte[] bArr) throws IOException {
|
|
serverHandshakeState.server.processClientSupplementalData(TlsProtocol.readSupplementalDataMessage(new ByteArrayInputStream(bArr)));
|
|
}
|
|
|
|
protected void processClientKeyExchange(ServerHandshakeState serverHandshakeState, byte[] bArr) throws IOException {
|
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bArr);
|
|
serverHandshakeState.keyExchange.processClientKeyExchange(byteArrayInputStream);
|
|
TlsProtocol.assertEmpty(byteArrayInputStream);
|
|
}
|
|
|
|
protected void processClientHello(ServerHandshakeState serverHandshakeState, byte[] bArr) throws IOException {
|
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bArr);
|
|
ProtocolVersion readVersion = TlsUtils.readVersion(byteArrayInputStream);
|
|
if (!readVersion.isDTLS()) {
|
|
throw new TlsFatalAlert((short) 47);
|
|
}
|
|
byte[] readFully = TlsUtils.readFully(32, byteArrayInputStream);
|
|
if (TlsUtils.readOpaque8(byteArrayInputStream).length > 32) {
|
|
throw new TlsFatalAlert((short) 47);
|
|
}
|
|
TlsUtils.readOpaque8(byteArrayInputStream);
|
|
int readUint16 = TlsUtils.readUint16(byteArrayInputStream);
|
|
if (readUint16 < 2 || (readUint16 & 1) != 0) {
|
|
throw new TlsFatalAlert((short) 50);
|
|
}
|
|
serverHandshakeState.offeredCipherSuites = TlsUtils.readUint16Array(readUint16 / 2, byteArrayInputStream);
|
|
short readUint8 = TlsUtils.readUint8(byteArrayInputStream);
|
|
if (readUint8 <= 0) {
|
|
throw new TlsFatalAlert((short) 47);
|
|
}
|
|
serverHandshakeState.offeredCompressionMethods = TlsUtils.readUint8Array(readUint8, byteArrayInputStream);
|
|
serverHandshakeState.clientExtensions = TlsProtocol.readExtensions(byteArrayInputStream);
|
|
TlsServerContextImpl tlsServerContextImpl = serverHandshakeState.serverContext;
|
|
SecurityParameters securityParameters = tlsServerContextImpl.getSecurityParameters();
|
|
securityParameters.extendedMasterSecret = TlsExtensionsUtils.hasExtendedMasterSecretExtension(serverHandshakeState.clientExtensions);
|
|
tlsServerContextImpl.setClientVersion(readVersion);
|
|
serverHandshakeState.server.notifyClientVersion(readVersion);
|
|
serverHandshakeState.server.notifyFallback(Arrays.contains(serverHandshakeState.offeredCipherSuites, CipherSuite.TLS_FALLBACK_SCSV));
|
|
securityParameters.clientRandom = readFully;
|
|
serverHandshakeState.server.notifyOfferedCipherSuites(serverHandshakeState.offeredCipherSuites);
|
|
serverHandshakeState.server.notifyOfferedCompressionMethods(serverHandshakeState.offeredCompressionMethods);
|
|
if (Arrays.contains(serverHandshakeState.offeredCipherSuites, 255)) {
|
|
serverHandshakeState.secure_renegotiation = true;
|
|
}
|
|
byte[] extensionData = TlsUtils.getExtensionData(serverHandshakeState.clientExtensions, TlsProtocol.EXT_RenegotiationInfo);
|
|
if (extensionData != null) {
|
|
serverHandshakeState.secure_renegotiation = true;
|
|
if (!Arrays.constantTimeAreEqual(extensionData, TlsProtocol.createRenegotiationInfo(TlsUtils.EMPTY_BYTES))) {
|
|
throw new TlsFatalAlert((short) 40);
|
|
}
|
|
}
|
|
serverHandshakeState.server.notifySecureRenegotiation(serverHandshakeState.secure_renegotiation);
|
|
if (serverHandshakeState.clientExtensions != null) {
|
|
TlsExtensionsUtils.getPaddingExtension(serverHandshakeState.clientExtensions);
|
|
serverHandshakeState.server.processClientExtensions(serverHandshakeState.clientExtensions);
|
|
}
|
|
}
|
|
|
|
protected void processClientCertificate(ServerHandshakeState serverHandshakeState, byte[] bArr) throws IOException {
|
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bArr);
|
|
Certificate parse = Certificate.parse(byteArrayInputStream);
|
|
TlsProtocol.assertEmpty(byteArrayInputStream);
|
|
notifyClientCertificate(serverHandshakeState, parse);
|
|
}
|
|
|
|
protected void processCertificateVerify(ServerHandshakeState serverHandshakeState, byte[] bArr, TlsHandshakeHash tlsHandshakeHash) throws IOException {
|
|
byte[] sessionHash;
|
|
if (serverHandshakeState.certificateRequest == null) {
|
|
throw new IllegalStateException();
|
|
}
|
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bArr);
|
|
TlsServerContextImpl tlsServerContextImpl = serverHandshakeState.serverContext;
|
|
DigitallySigned parse = DigitallySigned.parse(tlsServerContextImpl, byteArrayInputStream);
|
|
TlsProtocol.assertEmpty(byteArrayInputStream);
|
|
try {
|
|
SignatureAndHashAlgorithm algorithm = parse.getAlgorithm();
|
|
if (TlsUtils.isTLSv12(tlsServerContextImpl)) {
|
|
TlsUtils.verifySupportedSignatureAlgorithm(serverHandshakeState.certificateRequest.getSupportedSignatureAlgorithms(), algorithm);
|
|
sessionHash = tlsHandshakeHash.getFinalHash(algorithm.getHash());
|
|
} else {
|
|
sessionHash = tlsServerContextImpl.getSecurityParameters().getSessionHash();
|
|
}
|
|
AsymmetricKeyParameter createKey = PublicKeyFactory.createKey(serverHandshakeState.clientCertificate.getCertificateAt(0).getSubjectPublicKeyInfo());
|
|
TlsSigner createTlsSigner = TlsUtils.createTlsSigner(serverHandshakeState.clientCertificateType);
|
|
createTlsSigner.init(tlsServerContextImpl);
|
|
if (createTlsSigner.verifyRawSignature(algorithm, parse.getSignature(), createKey, sessionHash)) {
|
|
} else {
|
|
throw new TlsFatalAlert((short) 51);
|
|
}
|
|
} catch (TlsFatalAlert e) {
|
|
throw e;
|
|
} catch (Exception e2) {
|
|
throw new TlsFatalAlert((short) 51, e2);
|
|
}
|
|
}
|
|
|
|
protected void notifyClientCertificate(ServerHandshakeState serverHandshakeState, Certificate certificate) throws IOException {
|
|
if (serverHandshakeState.certificateRequest == null) {
|
|
throw new IllegalStateException();
|
|
}
|
|
if (serverHandshakeState.clientCertificate != null) {
|
|
throw new TlsFatalAlert((short) 10);
|
|
}
|
|
serverHandshakeState.clientCertificate = certificate;
|
|
if (certificate.isEmpty()) {
|
|
serverHandshakeState.keyExchange.skipClientCredentials();
|
|
} else {
|
|
serverHandshakeState.clientCertificateType = TlsUtils.getClientCertificateType(certificate, serverHandshakeState.serverCredentials.getCertificate());
|
|
serverHandshakeState.keyExchange.processClientCertificate(certificate);
|
|
}
|
|
serverHandshakeState.server.notifyClientCertificate(certificate);
|
|
}
|
|
|
|
public boolean getVerifyRequests() {
|
|
return this.verifyRequests;
|
|
}
|
|
|
|
protected byte[] generateServerHello(ServerHandshakeState serverHandshakeState) throws IOException {
|
|
SecurityParameters securityParameters = serverHandshakeState.serverContext.getSecurityParameters();
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
ProtocolVersion serverVersion = serverHandshakeState.server.getServerVersion();
|
|
if (!serverVersion.isEqualOrEarlierVersionOf(serverHandshakeState.serverContext.getClientVersion())) {
|
|
throw new TlsFatalAlert((short) 80);
|
|
}
|
|
serverHandshakeState.serverContext.setServerVersion(serverVersion);
|
|
TlsUtils.writeVersion(serverHandshakeState.serverContext.getServerVersion(), byteArrayOutputStream);
|
|
byteArrayOutputStream.write(securityParameters.getServerRandom());
|
|
TlsUtils.writeOpaque8(TlsUtils.EMPTY_BYTES, byteArrayOutputStream);
|
|
int selectedCipherSuite = serverHandshakeState.server.getSelectedCipherSuite();
|
|
if (!Arrays.contains(serverHandshakeState.offeredCipherSuites, selectedCipherSuite) || selectedCipherSuite == 0 || CipherSuite.isSCSV(selectedCipherSuite) || !TlsUtils.isValidCipherSuiteForVersion(selectedCipherSuite, serverHandshakeState.serverContext.getServerVersion())) {
|
|
throw new TlsFatalAlert((short) 80);
|
|
}
|
|
validateSelectedCipherSuite(selectedCipherSuite, (short) 80);
|
|
securityParameters.cipherSuite = selectedCipherSuite;
|
|
short selectedCompressionMethod = serverHandshakeState.server.getSelectedCompressionMethod();
|
|
if (!Arrays.contains(serverHandshakeState.offeredCompressionMethods, selectedCompressionMethod)) {
|
|
throw new TlsFatalAlert((short) 80);
|
|
}
|
|
securityParameters.compressionAlgorithm = selectedCompressionMethod;
|
|
TlsUtils.writeUint16(selectedCipherSuite, byteArrayOutputStream);
|
|
TlsUtils.writeUint8(selectedCompressionMethod, (OutputStream) byteArrayOutputStream);
|
|
serverHandshakeState.serverExtensions = serverHandshakeState.server.getServerExtensions();
|
|
if (serverHandshakeState.secure_renegotiation && TlsUtils.getExtensionData(serverHandshakeState.serverExtensions, TlsProtocol.EXT_RenegotiationInfo) == null) {
|
|
serverHandshakeState.serverExtensions = TlsExtensionsUtils.ensureExtensionsInitialised(serverHandshakeState.serverExtensions);
|
|
serverHandshakeState.serverExtensions.put(TlsProtocol.EXT_RenegotiationInfo, TlsProtocol.createRenegotiationInfo(TlsUtils.EMPTY_BYTES));
|
|
}
|
|
if (securityParameters.extendedMasterSecret) {
|
|
serverHandshakeState.serverExtensions = TlsExtensionsUtils.ensureExtensionsInitialised(serverHandshakeState.serverExtensions);
|
|
TlsExtensionsUtils.addExtendedMasterSecretExtension(serverHandshakeState.serverExtensions);
|
|
}
|
|
if (serverHandshakeState.serverExtensions != null) {
|
|
securityParameters.encryptThenMAC = TlsExtensionsUtils.hasEncryptThenMACExtension(serverHandshakeState.serverExtensions);
|
|
securityParameters.maxFragmentLength = evaluateMaxFragmentLengthExtension(serverHandshakeState.resumedSession, serverHandshakeState.clientExtensions, serverHandshakeState.serverExtensions, (short) 80);
|
|
securityParameters.truncatedHMac = TlsExtensionsUtils.hasTruncatedHMacExtension(serverHandshakeState.serverExtensions);
|
|
serverHandshakeState.allowCertificateStatus = !serverHandshakeState.resumedSession && TlsUtils.hasExpectedEmptyExtensionData(serverHandshakeState.serverExtensions, TlsExtensionsUtils.EXT_status_request, (short) 80);
|
|
serverHandshakeState.expectSessionTicket = !serverHandshakeState.resumedSession && TlsUtils.hasExpectedEmptyExtensionData(serverHandshakeState.serverExtensions, TlsProtocol.EXT_SessionTicket, (short) 80);
|
|
TlsProtocol.writeExtensions(byteArrayOutputStream, serverHandshakeState.serverExtensions);
|
|
}
|
|
securityParameters.prfAlgorithm = TlsProtocol.getPRFAlgorithm(serverHandshakeState.serverContext, securityParameters.getCipherSuite());
|
|
securityParameters.verifyDataLength = 12;
|
|
return byteArrayOutputStream.toByteArray();
|
|
}
|
|
|
|
protected byte[] generateNewSessionTicket(ServerHandshakeState serverHandshakeState, NewSessionTicket newSessionTicket) throws IOException {
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
newSessionTicket.encode(byteArrayOutputStream);
|
|
return byteArrayOutputStream.toByteArray();
|
|
}
|
|
|
|
protected byte[] generateCertificateStatus(ServerHandshakeState serverHandshakeState, CertificateStatus certificateStatus) throws IOException {
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
certificateStatus.encode(byteArrayOutputStream);
|
|
return byteArrayOutputStream.toByteArray();
|
|
}
|
|
|
|
protected byte[] generateCertificateRequest(ServerHandshakeState serverHandshakeState, CertificateRequest certificateRequest) throws IOException {
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
certificateRequest.encode(byteArrayOutputStream);
|
|
return byteArrayOutputStream.toByteArray();
|
|
}
|
|
|
|
protected boolean expectCertificateVerifyMessage(ServerHandshakeState serverHandshakeState) {
|
|
return serverHandshakeState.clientCertificateType >= 0 && TlsUtils.hasSigningCapability(serverHandshakeState.clientCertificateType);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: protected */
|
|
/* loaded from: classes6.dex */
|
|
public static class ServerHandshakeState {
|
|
TlsServer server = null;
|
|
TlsServerContextImpl serverContext = null;
|
|
int[] offeredCipherSuites = null;
|
|
short[] offeredCompressionMethods = null;
|
|
Hashtable clientExtensions = null;
|
|
Hashtable serverExtensions = null;
|
|
boolean resumedSession = false;
|
|
boolean secure_renegotiation = false;
|
|
boolean allowCertificateStatus = false;
|
|
boolean expectSessionTicket = false;
|
|
TlsKeyExchange keyExchange = null;
|
|
TlsCredentials serverCredentials = null;
|
|
CertificateRequest certificateRequest = null;
|
|
short clientCertificateType = -1;
|
|
Certificate clientCertificate = null;
|
|
|
|
protected ServerHandshakeState() {
|
|
}
|
|
}
|
|
|
|
public DTLSTransport accept(TlsServer tlsServer, DatagramTransport datagramTransport) throws IOException {
|
|
if (tlsServer == null) {
|
|
throw new IllegalArgumentException("'server' cannot be null");
|
|
}
|
|
if (datagramTransport == null) {
|
|
throw new IllegalArgumentException("'transport' cannot be null");
|
|
}
|
|
SecurityParameters securityParameters = new SecurityParameters();
|
|
securityParameters.entity = 0;
|
|
ServerHandshakeState serverHandshakeState = new ServerHandshakeState();
|
|
serverHandshakeState.server = tlsServer;
|
|
serverHandshakeState.serverContext = new TlsServerContextImpl(this.secureRandom, securityParameters);
|
|
securityParameters.serverRandom = TlsProtocol.createRandomBlock(tlsServer.shouldUseGMTUnixTime(), serverHandshakeState.serverContext.getNonceRandomGenerator());
|
|
tlsServer.init(serverHandshakeState.serverContext);
|
|
DTLSRecordLayer dTLSRecordLayer = new DTLSRecordLayer(datagramTransport, serverHandshakeState.serverContext, tlsServer, (short) 22);
|
|
try {
|
|
return serverHandshake(serverHandshakeState, dTLSRecordLayer);
|
|
} catch (RuntimeException e) {
|
|
dTLSRecordLayer.fail((short) 80);
|
|
throw new TlsFatalAlert((short) 80, e);
|
|
} catch (TlsFatalAlert e2) {
|
|
dTLSRecordLayer.fail(e2.getAlertDescription());
|
|
throw e2;
|
|
} catch (IOException e3) {
|
|
dTLSRecordLayer.fail((short) 80);
|
|
throw e3;
|
|
}
|
|
}
|
|
|
|
public DTLSServerProtocol(SecureRandom secureRandom) {
|
|
super(secureRandom);
|
|
this.verifyRequests = true;
|
|
}
|
|
}
|