using System; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using Mono.Security.Protocol.Tls.Handshake; using Mono.Security.X509; namespace Mono.Security.Protocol.Tls { // Token: 0x02000099 RID: 153 public class SslClientStream : SslStreamBase { // Token: 0x0600057B RID: 1403 RVA: 0x0001FC58 File Offset: 0x0001DE58 public SslClientStream(Stream stream, string targetHost, bool ownsStream) : this(stream, targetHost, ownsStream, SecurityProtocolType.Default, null) { } // Token: 0x0600057C RID: 1404 RVA: 0x0001FC6C File Offset: 0x0001DE6C public SslClientStream(Stream stream, string targetHost, global::System.Security.Cryptography.X509Certificates.X509Certificate clientCertificate) : this(stream, targetHost, false, SecurityProtocolType.Default, new global::System.Security.Cryptography.X509Certificates.X509CertificateCollection(new global::System.Security.Cryptography.X509Certificates.X509Certificate[] { clientCertificate })) { } // Token: 0x0600057D RID: 1405 RVA: 0x0001FC98 File Offset: 0x0001DE98 public SslClientStream(Stream stream, string targetHost, global::System.Security.Cryptography.X509Certificates.X509CertificateCollection clientCertificates) : this(stream, targetHost, false, SecurityProtocolType.Default, clientCertificates) { } // Token: 0x0600057E RID: 1406 RVA: 0x0001FCAC File Offset: 0x0001DEAC public SslClientStream(Stream stream, string targetHost, bool ownsStream, SecurityProtocolType securityProtocolType) : this(stream, targetHost, ownsStream, securityProtocolType, new global::System.Security.Cryptography.X509Certificates.X509CertificateCollection()) { } // Token: 0x0600057F RID: 1407 RVA: 0x0001FCC0 File Offset: 0x0001DEC0 public SslClientStream(Stream stream, string targetHost, bool ownsStream, SecurityProtocolType securityProtocolType, global::System.Security.Cryptography.X509Certificates.X509CertificateCollection clientCertificates) : base(stream, ownsStream) { if (targetHost == null || targetHost.Length == 0) { throw new ArgumentNullException("targetHost is null or an empty string."); } this.context = new ClientContext(this, securityProtocolType, targetHost, clientCertificates); this.protocol = new ClientRecordProtocol(this.innerStream, (ClientContext)this.context); } // Token: 0x14000002 RID: 2 // (add) Token: 0x06000580 RID: 1408 RVA: 0x0001FD20 File Offset: 0x0001DF20 // (remove) Token: 0x06000581 RID: 1409 RVA: 0x0001FD3C File Offset: 0x0001DF3C internal event CertificateValidationCallback ServerCertValidation; // Token: 0x14000003 RID: 3 // (add) Token: 0x06000582 RID: 1410 RVA: 0x0001FD58 File Offset: 0x0001DF58 // (remove) Token: 0x06000583 RID: 1411 RVA: 0x0001FD74 File Offset: 0x0001DF74 internal event CertificateSelectionCallback ClientCertSelection; // Token: 0x14000004 RID: 4 // (add) Token: 0x06000584 RID: 1412 RVA: 0x0001FD90 File Offset: 0x0001DF90 // (remove) Token: 0x06000585 RID: 1413 RVA: 0x0001FDAC File Offset: 0x0001DFAC internal event PrivateKeySelectionCallback PrivateKeySelection; // Token: 0x14000005 RID: 5 // (add) Token: 0x06000586 RID: 1414 RVA: 0x0001FDC8 File Offset: 0x0001DFC8 // (remove) Token: 0x06000587 RID: 1415 RVA: 0x0001FDE4 File Offset: 0x0001DFE4 public event CertificateValidationCallback2 ServerCertValidation2; // Token: 0x17000165 RID: 357 // (get) Token: 0x06000588 RID: 1416 RVA: 0x0001FE00 File Offset: 0x0001E000 internal Stream InputBuffer { get { return this.inputBuffer; } } // Token: 0x17000166 RID: 358 // (get) Token: 0x06000589 RID: 1417 RVA: 0x0001FE08 File Offset: 0x0001E008 public global::System.Security.Cryptography.X509Certificates.X509CertificateCollection ClientCertificates { get { return this.context.ClientSettings.Certificates; } } // Token: 0x17000167 RID: 359 // (get) Token: 0x0600058A RID: 1418 RVA: 0x0001FE1C File Offset: 0x0001E01C public global::System.Security.Cryptography.X509Certificates.X509Certificate SelectedClientCertificate { get { return this.context.ClientSettings.ClientCertificate; } } // Token: 0x17000168 RID: 360 // (get) Token: 0x0600058B RID: 1419 RVA: 0x0001FE30 File Offset: 0x0001E030 // (set) Token: 0x0600058C RID: 1420 RVA: 0x0001FE38 File Offset: 0x0001E038 public CertificateValidationCallback ServerCertValidationDelegate { get { return this.ServerCertValidation; } set { this.ServerCertValidation = value; } } // Token: 0x17000169 RID: 361 // (get) Token: 0x0600058D RID: 1421 RVA: 0x0001FE44 File Offset: 0x0001E044 // (set) Token: 0x0600058E RID: 1422 RVA: 0x0001FE4C File Offset: 0x0001E04C public CertificateSelectionCallback ClientCertSelectionDelegate { get { return this.ClientCertSelection; } set { this.ClientCertSelection = value; } } // Token: 0x1700016A RID: 362 // (get) Token: 0x0600058F RID: 1423 RVA: 0x0001FE58 File Offset: 0x0001E058 // (set) Token: 0x06000590 RID: 1424 RVA: 0x0001FE60 File Offset: 0x0001E060 public PrivateKeySelectionCallback PrivateKeyCertSelectionDelegate { get { return this.PrivateKeySelection; } set { this.PrivateKeySelection = value; } } // Token: 0x06000591 RID: 1425 RVA: 0x0001FE6C File Offset: 0x0001E06C ~SslClientStream() { base.Dispose(false); } // Token: 0x06000592 RID: 1426 RVA: 0x0001FEA8 File Offset: 0x0001E0A8 protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { this.ServerCertValidation = null; this.ClientCertSelection = null; this.PrivateKeySelection = null; this.ServerCertValidation2 = null; } } // Token: 0x06000593 RID: 1427 RVA: 0x0001FED4 File Offset: 0x0001E0D4 internal override IAsyncResult OnBeginNegotiateHandshake(AsyncCallback callback, object state) { IAsyncResult asyncResult; try { if (this.context.HandshakeState != HandshakeState.None) { this.context.Clear(); } this.context.SupportedCiphers = CipherSuiteFactory.GetSupportedCiphers(this.context.SecurityProtocol); this.context.HandshakeState = HandshakeState.Started; asyncResult = this.protocol.BeginSendRecord(HandshakeType.ClientHello, callback, state); } catch (TlsException ex) { this.protocol.SendAlert(ex.Alert); throw new IOException("The authentication or decryption has failed.", ex); } catch (Exception ex2) { this.protocol.SendAlert(AlertDescription.InternalError); throw new IOException("The authentication or decryption has failed.", ex2); } return asyncResult; } // Token: 0x06000594 RID: 1428 RVA: 0x0001FFB4 File Offset: 0x0001E1B4 private void SafeReceiveRecord(Stream s) { byte[] array = this.protocol.ReceiveRecord(s); if (array == null || array.Length == 0) { throw new TlsException(AlertDescription.HandshakeFailiure, "The server stopped the handshake."); } } // Token: 0x06000595 RID: 1429 RVA: 0x0001FFEC File Offset: 0x0001E1EC internal override void OnNegotiateHandshakeCallback(IAsyncResult asyncResult) { this.protocol.EndSendRecord(asyncResult); while (this.context.LastHandshakeMsg != HandshakeType.ServerHelloDone) { this.SafeReceiveRecord(this.innerStream); if (this.context.AbbreviatedHandshake && this.context.LastHandshakeMsg == HandshakeType.ServerHello) { break; } } if (this.context.AbbreviatedHandshake) { ClientSessionCache.SetContextFromCache(this.context); this.context.Negotiating.Cipher.ComputeKeys(); this.context.Negotiating.Cipher.InitializeCipher(); this.protocol.SendChangeCipherSpec(); while (this.context.HandshakeState != HandshakeState.Finished) { this.SafeReceiveRecord(this.innerStream); } this.protocol.SendRecord(HandshakeType.Finished); } else { bool flag = this.context.ServerSettings.CertificateRequest; if (this.context.SecurityProtocol == SecurityProtocolType.Ssl3) { flag = this.context.ClientSettings.Certificates != null && this.context.ClientSettings.Certificates.Count > 0; } if (flag) { this.protocol.SendRecord(HandshakeType.Certificate); } this.protocol.SendRecord(HandshakeType.ClientKeyExchange); this.context.Negotiating.Cipher.InitializeCipher(); if (flag && this.context.ClientSettings.ClientCertificate != null) { this.protocol.SendRecord(HandshakeType.CertificateVerify); } this.protocol.SendChangeCipherSpec(); this.protocol.SendRecord(HandshakeType.Finished); while (this.context.HandshakeState != HandshakeState.Finished) { this.SafeReceiveRecord(this.innerStream); } } this.context.HandshakeMessages.Reset(); this.context.ClearKeyInfo(); } // Token: 0x06000596 RID: 1430 RVA: 0x000201DC File Offset: 0x0001E3DC internal override global::System.Security.Cryptography.X509Certificates.X509Certificate OnLocalCertificateSelection(global::System.Security.Cryptography.X509Certificates.X509CertificateCollection clientCertificates, global::System.Security.Cryptography.X509Certificates.X509Certificate serverCertificate, string targetHost, global::System.Security.Cryptography.X509Certificates.X509CertificateCollection serverRequestedCertificates) { if (this.ClientCertSelection != null) { return this.ClientCertSelection(clientCertificates, serverCertificate, targetHost, serverRequestedCertificates); } return null; } // Token: 0x1700016B RID: 363 // (get) Token: 0x06000597 RID: 1431 RVA: 0x000201FC File Offset: 0x0001E3FC internal override bool HaveRemoteValidation2Callback { get { return this.ServerCertValidation2 != null; } } // Token: 0x06000598 RID: 1432 RVA: 0x0002020C File Offset: 0x0001E40C internal override ValidationResult OnRemoteCertificateValidation2(Mono.Security.X509.X509CertificateCollection collection) { CertificateValidationCallback2 serverCertValidation = this.ServerCertValidation2; if (serverCertValidation != null) { return serverCertValidation(collection); } return null; } // Token: 0x06000599 RID: 1433 RVA: 0x00020230 File Offset: 0x0001E430 internal override bool OnRemoteCertificateValidation(global::System.Security.Cryptography.X509Certificates.X509Certificate certificate, int[] errors) { if (this.ServerCertValidation != null) { return this.ServerCertValidation(certificate, errors); } return errors != null && errors.Length == 0; } // Token: 0x0600059A RID: 1434 RVA: 0x00020268 File Offset: 0x0001E468 internal virtual bool RaiseServerCertificateValidation(global::System.Security.Cryptography.X509Certificates.X509Certificate certificate, int[] certificateErrors) { return base.RaiseRemoteCertificateValidation(certificate, certificateErrors); } // Token: 0x0600059B RID: 1435 RVA: 0x00020274 File Offset: 0x0001E474 internal virtual ValidationResult RaiseServerCertificateValidation2(Mono.Security.X509.X509CertificateCollection collection) { return base.RaiseRemoteCertificateValidation2(collection); } // Token: 0x0600059C RID: 1436 RVA: 0x00020280 File Offset: 0x0001E480 internal global::System.Security.Cryptography.X509Certificates.X509Certificate RaiseClientCertificateSelection(global::System.Security.Cryptography.X509Certificates.X509CertificateCollection clientCertificates, global::System.Security.Cryptography.X509Certificates.X509Certificate serverCertificate, string targetHost, global::System.Security.Cryptography.X509Certificates.X509CertificateCollection serverRequestedCertificates) { return base.RaiseLocalCertificateSelection(clientCertificates, serverCertificate, targetHost, serverRequestedCertificates); } // Token: 0x0600059D RID: 1437 RVA: 0x00020290 File Offset: 0x0001E490 internal override AsymmetricAlgorithm OnLocalPrivateKeySelection(global::System.Security.Cryptography.X509Certificates.X509Certificate certificate, string targetHost) { if (this.PrivateKeySelection != null) { return this.PrivateKeySelection(certificate, targetHost); } return null; } // Token: 0x0600059E RID: 1438 RVA: 0x000202AC File Offset: 0x0001E4AC internal AsymmetricAlgorithm RaisePrivateKeySelection(global::System.Security.Cryptography.X509Certificates.X509Certificate certificate, string targetHost) { return base.RaiseLocalPrivateKeySelection(certificate, targetHost); } } }