コード例 #1
0
        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
            }
        }
コード例 #2
0
        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);
        }