public async Task Connect() { await _physicalConnection.Connect(_clientOptions).ConfigureAwait(false); var greetingsResponseBytes = new byte[128]; var readCount = await _physicalConnection.ReadAsync(greetingsResponseBytes, 0, greetingsResponseBytes.Length).ConfigureAwait(false); if (readCount != greetingsResponseBytes.Length) { throw ExceptionHelper.UnexpectedGreetingBytesCount(readCount); } var greetings = new GreetingsResponse(greetingsResponseBytes); _clientOptions.LogWriter?.WriteLine($"Greetings received, salt is {Convert.ToBase64String(greetings.Salt)} ."); PingsFailedByTimeoutCount = 0; _responseReader.BeginReading(); _requestWriter.BeginWriting(); _clientOptions.LogWriter?.WriteLine("Server responses reading started."); await LoginIfNotGuest(greetings).ConfigureAwait(false); }
public static AuthenticationRequest Create(GreetingsResponse greetings, UriBuilder uri) { var scrable = GetScrable(greetings, uri.Password); var authenticationPacket = new AuthenticationRequest(uri.UserName, scrable); return(authenticationPacket); }
private static byte[] GetScrable(GreetingsResponse greetings, string password) { var decodedSalt = greetings.Salt; var first20SaltBytes = new byte[20]; Array.Copy(decodedSalt, first20SaltBytes, 20); var step1 = Sha1Utils.Hash(password); var step2 = Sha1Utils.Hash(step1); var step3 = Sha1Utils.Hash(first20SaltBytes, step2); var scrambleBytes = Sha1Utils.Xor(step1, step3); return(scrambleBytes); }
private async Task LoginIfNotGuest(GreetingsResponse greetings) { var singleNode = _clientOptions.ConnectionOptions.Nodes.Single(); if (string.IsNullOrEmpty(singleNode.Uri.UserName)) { _clientOptions.LogWriter?.WriteLine("Guest mode, no authentication attempt."); return; } var authenticateRequest = AuthenticationRequest.Create(greetings, singleNode.Uri); await SendRequestWithEmptyResponse(authenticateRequest).ConfigureAwait(false); _clientOptions.LogWriter?.WriteLine($"Authentication request send: {authenticateRequest}"); }
private async Task LoginIfNotGuest(GreetingsResponse greetings) { if (!_clientOptions.ConnectionOptions.Nodes.Any()) { throw new ClientSetupException("There are zero configured nodes, you should provide one"); } var singleNode = _clientOptions.ConnectionOptions.Nodes.Single(); if (string.IsNullOrEmpty(singleNode.Uri.UserName)) { _clientOptions.LogWriter?.WriteLine("Guest mode, no authentication attempt."); return; } var authenticateRequest = AuthenticationRequest.Create(greetings, singleNode.Uri); await SendRequestWithEmptyResponse(authenticateRequest).ConfigureAwait(false); _clientOptions.LogWriter?.WriteLine($"Authentication request send: {authenticateRequest}"); }