コード例 #1
0
 internal override Task <bool> HandleP01KeyExchange(P01KeyExchange p)
 {
     parent.ExceptionHandler.CloseConnection("InvalidPacket",
                                             "VSL clients cannot handle P01KeyExchange.",
                                             nameof(PacketHandlerClient), nameof(HandleP01KeyExchange));
     return(Task.FromResult(false));
 }
コード例 #2
0
        internal override async Task <bool> HandleP01KeyExchange(P01KeyExchange p)
        {
            ushort?vslVersion     = VersionManager.GetSharedVersion(parent.Settings.LatestVslVersion, parent.Settings.OldestVslVersion, p.LatestVSL, p.OldestVSL);
            ushort?productVersion = VersionManager.GetSharedVersion(latestProduct, oldestProduct, p.LatestProduct, p.OldestProduct);

            if (!vslVersion.HasValue || !productVersion.HasValue)
            {
                return(await parent.Manager.SendPacketAsync(CryptoAlgorithm.None, new P03FinishHandshake(ConnectionState.NotCompatible)));
            }

            parent.Manager.AesKey    = p.AesKey;
            parent.ConnectionVersion = vslVersion.Value;
            P03FinishHandshake packet;

            if (vslVersion.Value < 2)
            {
                parent.Manager.SendIV    = p.ServerIV;
                parent.Manager.ReceiveIV = p.ClientIV;
                parent.Manager.Ready4Aes = true;
                packet = new P03FinishHandshake(ConnectionState.CompatibilityMode);
            }
            else if (vslVersion.Value == 2)
            {
                parent.Manager.HmacKey   = Util.ConcatBytes(p.ClientIV, p.ServerIV);
                parent.Manager.Ready4Aes = true;
                packet = new P03FinishHandshake(ConnectionState.Compatible, vslVersion.Value, productVersion.Value);
            }
            else
            {
                parent.Manager.SendIV    = p.ServerIV;
                parent.Manager.ReceiveIV = p.ClientIV;
                parent.Manager.HmacKey   = Util.ConcatBytes(p.ClientIV, p.ServerIV);
                parent.Manager.Ready4Aes = true;
                packet = new P03FinishHandshake(ConnectionState.Compatible, vslVersion.Value, productVersion.Value);
            }

            if (!await parent.Manager.SendPacketAsync(VersionManager.GetNetworkAlgorithm(vslVersion), packet))
            {
                return(false);
            }
            await parent.OnConnectionEstablished();

            return(true);
        }
コード例 #3
0
 internal abstract Task <bool> HandleP01KeyExchange(P01KeyExchange p);