public override void Read(IChannelHandlerContext context) { TlsHandlerState oldState = this.state; if (!oldState.HasAny(TlsHandlerState.AuthenticationCompleted)) { this.state = oldState | TlsHandlerState.ReadRequestedBeforeAuthenticated; } context.Read(); }
static void HandleHandshakeCompleted(Task task, object state) { var self = (TlsHandler)state; switch (task.Status) { case TaskStatus.RanToCompletion: { TlsHandlerState oldState = self.state; Contract.Assert(!oldState.HasAny(TlsHandlerState.AuthenticationCompleted)); self.state = (oldState | TlsHandlerState.Authenticated) & ~(TlsHandlerState.Authenticating | TlsHandlerState.FlushedBeforeHandshake); self.capturedContext.FireUserEventTriggered(TlsHandshakeCompletionEvent.Success); if (oldState.Has(TlsHandlerState.ReadRequestedBeforeAuthenticated) && !self.capturedContext.Channel.Configuration.AutoRead) { self.capturedContext.Read(); } if (oldState.Has(TlsHandlerState.FlushedBeforeHandshake)) { self.Wrap(self.capturedContext); self.capturedContext.Flush(); } break; } case TaskStatus.Canceled: case TaskStatus.Faulted: { // ReSharper disable once AssignNullToNotNullAttribute -- task.Exception will be present as task is faulted TlsHandlerState oldState = self.state; Contract.Assert(!oldState.HasAny(TlsHandlerState.Authenticated)); self.HandleFailure(task.Exception); break; } default: throw new ArgumentOutOfRangeException(nameof(task), "Unexpected task status: " + task.Status); } }
bool EnsureAuthenticated() { TlsHandlerState oldState = this.state; if (!oldState.HasAny(TlsHandlerState.AuthenticationStarted)) { this.state = oldState | TlsHandlerState.Authenticating; if (this.IsServer) { var serverSettings = (ServerTlsSettings)this.settings; this.sslStream.AuthenticateAsServerAsync(serverSettings.Certificate, serverSettings.NegotiateClientCertificate, serverSettings.EnabledProtocols, serverSettings.CheckCertificateRevocation) .ContinueWith(HandshakeCompletionCallback, this, TaskContinuationOptions.ExecuteSynchronously); } else { var clientSettings = (ClientTlsSettings)this.settings; this.sslStream.AuthenticateAsClientAsync(clientSettings.TargetHost, clientSettings.X509CertificateCollection, clientSettings.EnabledProtocols, clientSettings.CheckCertificateRevocation) .ContinueWith(HandshakeCompletionCallback, this, TaskContinuationOptions.ExecuteSynchronously); } return(false); } return(oldState.Has(TlsHandlerState.Authenticated)); }