/// <summary> /// <see cref = "PasswordProvided" /> 이벤트를 발생시킵니다. /// Raises the <see cref="PasswordProvided"/> event. /// </summary> /// <param name="e"> /// The event arguments. /// </param> protected virtual void OnPasswordProvided(PasswordProvidedEventArgs e) { var ev = this.PasswordProvided; if (ev != null) { ev(this, e); } }
private void NegotiateSecurity(AuthenticationMethod[] methods) { this.logger?.Log(LogLevel.Info, () => "Negotiating security"); this.c.SendByte((byte)methods.Length); VncStream.Require( methods.Length > 0, "Client is not allowed in.", VncFailureReason.NoSupportedAuthenticationMethods); foreach (var method in methods) { this.c.SendByte((byte)method); } var selectedMethod = (AuthenticationMethod)this.c.ReceiveByte(); VncStream.Require( methods.Contains(selectedMethod), "Invalid authentication method.", VncFailureReason.UnrecognizedProtocolElement); bool success = true; if (selectedMethod == AuthenticationMethod.Password) { var challenge = this.passwordChallenge.GenerateChallenge(); using (new Utility.AutoClear(challenge)) { this.c.Send(challenge); var response = this.c.Receive(16); using (new Utility.AutoClear(response)) { var e = new PasswordProvidedEventArgs(this.passwordChallenge, challenge, response); this.OnPasswordProvided(e); success = e.IsAuthenticated; } } } this.c.SendUInt32BE(success ? 0 : (uint)1); VncStream.Require( success, "Failed to authenticate.", VncFailureReason.AuthenticationFailed); this.logger?.Log(LogLevel.Info, () => "The user authenticated successfully."); this.securityNegotiated = true; }