internal override Task <bool> HandleP01KeyExchange(P01KeyExchange p) { parent.ExceptionHandler.CloseConnection("InvalidPacket", "VSL clients cannot handle P01KeyExchange.", nameof(PacketHandlerClient), nameof(HandleP01KeyExchange)); return(Task.FromResult(false)); }
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); }
internal abstract Task <bool> HandleP01KeyExchange(P01KeyExchange p);