public async Task Auth() { var block = await ReadBlock(); if (block.Type == BlockType.HAND_SHAKE) { var resp = Authenticator.ValidateChallenge(block.Data.Span); if (block.Id != 0) { ChangeId(block.Id); } block = new BlockData() { Id = Id, Type = BlockType.HAND_SHAKE, Data = resp }; await WriteBlock(block); block = await ReadBlock(); ConfigureCryptor(Authenticator.DecodePassword(block.Data.Span)); } else if (block.Type == BlockType.FAST_CONNECT) { var data = block.Data; var(id, challenge, password, encryptedData) = FastConnectUtils.ParseFactConnectData(data); ConfigureCryptor(Authenticator.DecodePassword(password.Span)); block.Data = encryptedData.ToArray(); DecryptBlock(ref block); if (id != 0) { ChangeId(id); } #pragma warning disable CS4014 // no wait the http connecting this.ProcessConnect(block, true, Authenticator.ValidateChallenge(challenge.Span)); #pragma warning restore CS4014 } }
public async Task <BlockData> FastConnect(int id, HostData hostData) { var data = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(hostData)); var password = _authenticator.GenerateEncodedPassword(); var block = new BlockData() { Id = id, Type = BlockType.FAST_CONNECT }; ConfigureCryptor(_authenticator.DecodePassword(password)); block.Data = data; EncryptBlock(ref block); block.Data = FastConnectUtils.GenerateFastConnectData(Id, _authenticator.GenerateChallenge(), password, block.Data.Span); await WriteBlock(block); block = await ReadBlock(); DecryptBlock(ref block); var resultId = BitConverter.ToInt32(block.Data.Span); _authenticator.ValidateChallengeResponse(block.Data.Span.Slice(4)); if (Id == 0) { Id = resultId; } else { if (Id != resultId) { throw new SharkException("FastConnect hand shake failed, id challenge failed"); } } Initialized = true; return(block); }