/// <summary> /// Authenticates the client, if the password characters match. /// </summary> /// <param name="password">The characters of the password.</param> /// <returns><c>true</c> if authentication succeeded.</returns> public bool Accept(char[] password) { Throw.If.Null(password, "password"); var response = new byte[16]; VncPasswordChallenge.GetChallengeResponse(this.challenge, password, response); return(this.Test(response)); }
void NegotiateSecurity(AuthenticationMethod[] methods) { _c.SendByte((byte)methods.Length); //验证密码 VncStream.Require(methods.Length > 0, "Client is not allowed in.", VncFailureReason.NoSupportedAuthenticationMethods); foreach (var method in methods) { _c.SendByte((byte)method); } var selectedMethod = (AuthenticationMethod)_c.ReceiveByte(); VncStream.Require(methods.Contains(selectedMethod), "Invalid authentication method.", VncFailureReason.UnrecognizedProtocolElement); bool success = true; if (selectedMethod == AuthenticationMethod.Password) { var challenge = VncPasswordChallenge.GenerateChallenge(); using (new Utility.AutoClear(challenge)) { _c.Send(challenge); var response = _c.Receive(16); using (new Utility.AutoClear(response)) { var e = new PasswordProvidedEventArgs(challenge, response); OnPasswordProvided(e); success = e.IsAuthenticated; } } } _c.SendUInt32BE(success ? 0 : (uint)1); if (!success) { _c.SendString("Password authentication failed!", true); } VncStream.Require(success, "Failed to authenticate.", VncFailureReason.AuthenticationFailed); }
public void GetChallengeResponseTest() { VncPasswordChallenge challenger = new VncPasswordChallenge(); var challenge = new byte[] { 0x71, 0x43, 0x19, 0xf2, 0xb3, 0xf6, 0xac, 0xcf, 0x8c, 0x10, 0xc0, 0x06, 0x6e, 0x73, 0xb1, 0xd9 }; var password = "******".ToCharArray(); var passwordBytes = VncStream.EncodeString(password, 0, password.Length); var response = new byte[16]; challenger.GetChallengeResponse(challenge, passwordBytes, response); var expectedResponse = new byte[] { 0x71, 0xb3, 0x6f, 0xa2, 0x44, 0x5a, 0xee, 0x4f, 0x08, 0x70, 0x21, 0x69, 0x6e, 0x32, 0x87, 0x8e }; Assert.Equal(expectedResponse, response); }