コード例 #1
0
ファイル: HideIt.cs プロジェクト: cornerback/hideit
        /// <summary>
        /// Called when an application request to send a file
        /// </summary>
        /// <param name="client"></param>
        private void AcceptFile(Socket client)
        {
            try
            {
                HandshakeData data = this._receiver.Handshake(client);

                if (data == null)
                {
                    return;
                }

                DialogResult result = UIMessage.Ask(this, "A computer " + data.MachineName +
                                                    " wishes to transfer a file " + data.FileName +
                                                    " of size" + this.ToSize(data.FileLen) +
                                                    "\r\nAccept?", "Receive file");

                this._receiver.HandshakeResponse(client, result == DialogResult.Yes);

                ///If user decided to not receive the file
                if (result == DialogResult.No)
                {
                    return;
                }

                ///Fire the delegate that will call the ShowReceiveFileForm method
                this.BeginInvoke(new OpenReceiveFormCallback(this.ShowReceiveFileForm), client, data);
            }
            catch (Exception)
            {
            }
        }
コード例 #2
0
        public void Handshake()
        {
            LogManager.SetupLogManager();
            var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod());

            log.Info("Start");


            HandshakeData handshake_data = null;

            var socket = new Socket(CreateOptionsSecure());

            socket.On(Socket.EVENT_HANDSHAKE, (data) =>
            {
                log.Info(Socket.EVENT_HANDSHAKE + string.Format(" data = {0}", data));
                handshake_data = data as HandshakeData;
            });

            socket.Open();
            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(4));
            socket.Close();

            Assert.IsNotNull(handshake_data);
            Assert.IsNotNull(handshake_data.Upgrades);
            Assert.IsTrue(handshake_data.Upgrades.Count > 0);
            Assert.IsTrue(handshake_data.PingInterval > 0);
            Assert.IsTrue(handshake_data.PingTimeout > 0);
        }
コード例 #3
0
            public void Call(params object[] args)
            {
                var log = LogManager.GetLogger(Global.CallerName());

                log.Info(string.Format("open args[0]={0} args.Length={1}", args[0], args.Length));
                HandshakeData = args[0] as HandshakeData;
            }
コード例 #4
0
        public void Handshake()
        {
            LogManager.SetupLogManager();
            var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod());

            log.Info("Start");
            _manualResetEvent = new ManualResetEvent(false);

            HandshakeData handshake_data = null;

            var socket = new Socket(CreateOptions());

            socket.On(Socket.EVENT_HANDSHAKE, (data) =>
            {
                log.Info(Socket.EVENT_HANDSHAKE + string.Format(" data = {0}", data));
                handshake_data = data as HandshakeData;
                _manualResetEvent.Set();
            });

            socket.Open();
            _manualResetEvent.WaitOne();
            socket.Close();

            Assert.IsNotNull(handshake_data);
            Assert.IsNotNull(handshake_data.Upgrades);
            Assert.IsTrue(handshake_data.Upgrades.Count > 0);
            Assert.IsTrue(handshake_data.PingInterval > 0);
            Assert.IsTrue(handshake_data.PingTimeout > 0);
        }
コード例 #5
0
        public void Handshake()
        {
            _manualResetEvent = new ManualResetEvent(false);

            HandshakeData handshake_data = null;

            var socket = new Socket(CreateOptionsSecure());

            socket.On(Socket.EVENT_HANDSHAKE, (data) =>
            {
                //log.Info(Socket.EVENT_HANDSHAKE + string.Format(" data = {0}", data));
                handshake_data = data as HandshakeData;
                _manualResetEvent.Set();
            });

            socket.Open();
            _manualResetEvent.WaitOne();
            socket.Close();

            Assert.NotNull(handshake_data);
            Assert.NotNull(handshake_data.Upgrades);
            Assert.True(handshake_data.Upgrades.Count > 0);
            Assert.True(handshake_data.PingInterval > 0);
            Assert.True(handshake_data.PingTimeout > 0);
        }
コード例 #6
0
ファイル: HandshakeProvider.cs プロジェクト: zhoujue1110/AElf
        public async Task <Handshake> GetHandshakeAsync()
        {
            var chain = await _blockchainService.GetChainAsync();

            var handshakeData = new HandshakeData
            {
                ChainId                     = chain.Id,
                Version                     = KernelConstants.ProtocolVersion,
                ListeningPort               = _networkOptions.ListeningPort,
                Pubkey                      = ByteString.CopyFrom(await _accountService.GetPublicKeyAsync()),
                BestChainHash               = chain.BestChainHash,
                BestChainHeight             = chain.BestChainHeight,
                LastIrreversibleBlockHash   = chain.LastIrreversibleBlockHash,
                LastIrreversibleBlockHeight = chain.LastIrreversibleBlockHeight,
                Time = TimestampHelper.GetUtcNow()
            };

            var signature = await _accountService.SignAsync(Hash.FromMessage(handshakeData).ToByteArray());

            var handshake = new Handshake
            {
                HandshakeData = handshakeData,
                SessionId     = ByteString.CopyFrom(GenerateRandomToken()),
                Signature     = ByteString.CopyFrom(signature)
            };

            return(handshake);
        }
コード例 #7
0
            public void Call(params object[] args)
            {
                LogManager.SetupLogManager();
                var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod());

                log.Info(string.Format("open args[0]={0} args.Length={1}", args[0], args.Length));
                HandshakeData = args[0] as HandshakeData;
            }
コード例 #8
0
            public void Call(params object[] args)
            {
                var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod());

                log.Info(string.Format("open args[0]={0} args.Length={1}", args[0], args.Length));
                HandshakeData = args[0] as HandshakeData;
                serverConnectionTest._manualResetEvent.Set();
            }
コード例 #9
0
        public AlphaWebSocketConnection(AlphaContext context, WebSocket webSocket, string ip)
            : base(context, webSocket, ip, 1024, 64 * 1024)
        {
            var hd = new HandshakeData();

            hd.Randomize();
            HandshakeData = hd;
            _             = SendMessage(new HandshakeInit {
                HandshakeData = hd
            });
        }
コード例 #10
0
        public AlphaWebSocketConnection(WebSocket webSocket, string ip)
            : base(webSocket, ip)
        {
            var hd = new HandshakeData();

            hd.Randomize();
            HandshakeData = hd;
            _             = SendMessage(new HandshakeInit {
                HandshakeData = hd
            });

#if !DEBUG
            InitTimer();
#endif
        }
コード例 #11
0
ファイル: NetworkTestContext.cs プロジェクト: wymoon2690/AElf
        public Handshake CreateValidHandshake(ECKeyPair producer, long bestChainHeight, int chainId = NetworkTestConstants.DefaultChainId)
        {
            var data = new HandshakeData
            {
                BestChainHead  = CreateFakeBlockHeader(chainId, bestChainHeight, producer),
                LibBlockHeight = 1,
                Pubkey         = ByteString.CopyFrom(producer.PublicKey)
            };

            var signature = CryptoHelper.SignWithPrivateKey(producer.PrivateKey, Hash.FromMessage(data).ToByteArray());

            return(new Handshake {
                HandshakeData = data, Signature = ByteString.CopyFrom(signature)
            });
        }
コード例 #12
0
        public Handshake CreateHandshake(ECKeyPair initiatorPeer, int chainId = NetworkTestConstants.DefaultChainId)
        {
            var data = new HandshakeData
            {
                ChainId = _blockchainService.GetChainId(),
                Version = KernelConstants.ProtocolVersion,
                Pubkey  = ByteString.CopyFrom(initiatorPeer.PublicKey),
                Time    = TimestampHelper.GetUtcNow()
            };

            var signature = CryptoHelper.SignWithPrivateKey(initiatorPeer.PrivateKey, Hash.FromMessage(data).ToByteArray());

            return(new Handshake {
                HandshakeData = data, Signature = ByteString.CopyFrom(signature)
            });
        }
コード例 #13
0
        public void Test()
        {
            var json = @"{
                sid: 'nne323',
                upgrades: ['u1','u2'],
                pingInterval: 12,
                pingTimeout: 23
            }";

            var handshakeData = new HandshakeData(json);

            Assert.Equal("u1", handshakeData.Upgrades[0]);
            Assert.Equal("u2", handshakeData.Upgrades[1]);

            Assert.Equal(12, handshakeData.PingInterval);
            Assert.Equal(23, handshakeData.PingTimeout);
        }
コード例 #14
0
        public void HandshakeInvalidDataTest()
        {
            Global.AppState.State = ApplicationState.Ready;

            var clientConnection = new AlphaWebSocketConnection(new FakeWebSocket(), "127.0.0.1");

            var handshake = new HandshakeData();

            handshake.Randomize();

            var envelope = new HandshakeInit {
                HandshakeData = handshake
            }.CreateEnvelope();

            envelope.Sign(TestEnvironment.Client1KeyPair);

            Assert.ThrowsAsync <ConnectionCloseException>(async() => await MessageHandlers <AlphaWebSocketConnection> .HandleMessage(clientConnection, envelope));
        }
コード例 #15
0
        public async Task HandshakeTest()
        {
            Global.AppState.State = ApplicationState.Running;

            var clientConnection = new AuditorWebSocketConnection(new FakeWebSocket(), null);

            var hd = new HandshakeData();

            hd.Randomize();

            var envelope = new HandshakeInit {
                HandshakeData = hd
            }.CreateEnvelope();

            envelope.Sign(TestEnvironment.AlphaKeyPair);
            var isHandled = await MessageHandlers <AuditorWebSocketConnection> .HandleMessage(clientConnection, envelope);

            Assert.IsTrue(isHandled);
        }
コード例 #16
0
        public void TestMethod1()
        {
            string b64InputKey = "MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVQxN/wFsMiYihwv1psUgKRIhgX02OPBQl0aKYNtKXoCk67hE/lsR8UC77Fqm1HPuMALWG8RcihSHoZwx2HfOz11QkwvlKEf8UuMrbp0yt/mQNJx6QQm6CiZ7e63sYqdV";

            ECPublicKeyParameters asyKey = (ECPublicKeyParameters)
                                           PublicKeyFactory.CreateKey(b64InputKey.DecodeBase64Url());

            ECParameters param = new ECParameters();

            param.Curve = ECCurve.NamedCurves.nistP384;
            param.Q.X   = asyKey.Q.AffineXCoord.GetEncoded();
            param.Q.Y   = asyKey.Q.AffineYCoord.GetEncoded();

            var ecPublicKey = ECDiffieHellman.Create(param).PublicKey;

            var          effi          = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP384);
            ECParameters privateKey    = effi.ExportParameters(true);
            var          secretPrepend = Encoding.UTF8.GetBytes("RANDOM SECRET");

            byte[] secret = effi.DeriveKeyFromHash(ecPublicKey, HashAlgorithmName.SHA256, secretPrepend, new byte[0]);

            IBufferedCipher decryptor = CipherUtilities.GetCipher("AES/CFB8/NoPadding");
            IBufferedCipher encryptor = CipherUtilities.GetCipher("AES/CFB8/NoPadding");

            decryptor.Init(false, new ParametersWithIV(new KeyParameter(secret), secret.Take(16).ToArray()));

            encryptor.Init(true, new ParametersWithIV(new KeyParameter(secret), secret.Take(16).ToArray()));

            string b64PublicKey  = effi.PublicKey.ToDerEncoded().EncodeBase64();
            var    handshakeJson = new HandshakeData()
            {
                salt = secretPrepend.EncodeBase64()
            };

            var signKey = ECDsa.Create(privateKey);

            string val = JWT.Encode(handshakeJson, signKey, JwsAlgorithm.ES384, new Dictionary <string, object> {
                { "x5u", b64PublicKey }
            });
            //Log.Warn($"Headers: {string.Join(";", JWT.Headers(val))}");
            //Log.Warn($"Return salt:\n{JWT.Payload(val)}");
        }
コード例 #17
0
ファイル: HandshakeProvider.cs プロジェクト: wymoon2690/AElf
        public async Task <Handshake> GetHandshakeAsync()
        {
            var chain = await _blockchainService.GetChainAsync();

            var nd = new HandshakeData
            {
                Pubkey         = ByteString.CopyFrom(await _accountService.GetPublicKeyAsync()),
                BestChainHead  = await _blockchainService.GetBestChainLastBlockHeaderAsync(),
                LibBlockHeight = chain?.LastIrreversibleBlockHeight ?? 0
            };

            byte[] sig = await _accountService.SignAsync(Hash.FromMessage(nd).ToByteArray());

            var hsk = new Handshake
            {
                HandshakeData = nd,
                Signature     = ByteString.CopyFrom(sig)
            };

            return(hsk);
        }
コード例 #18
0
        private async Task <Handshake> BuildHandshakeAsync()
        {
            var nd = new HandshakeData
            {
                ListeningPort = _networkOptions.ListeningPort,
                PublicKey     = ByteString.CopyFrom(await _accountService.GetPublicKeyAsync()),
                Version       = KernelConstants.ProtocolVersion,
                ChainId       = _blockchainService.GetChainId()
            };

            byte[] sig = await _accountService.SignAsync(Hash.FromMessage(nd).ToByteArray());

            var hsk = new Handshake
            {
                HskData = nd,
                Sig     = ByteString.CopyFrom(sig),
                Header  = await _blockchainService.GetBestChainLastBlockHeaderAsync()
            };

            return(hsk);
        }
コード例 #19
0
        public static Handshake CreateValidHandshake(ECKeyPair producer, long bestChainHeight, int chainId = NetworkTestConstants.DefaultChainId, int port = 0)
        {
            var data = new HandshakeData
            {
                ChainId                     = chainId,
                Version                     = KernelConstants.ProtocolVersion,
                ListeningPort               = port,
                Pubkey                      = ByteString.CopyFrom(producer.PublicKey),
                BestChainHash               = Hash.FromString("BestChainHash"),
                BestChainHeight             = bestChainHeight,
                LastIrreversibleBlockHash   = Hash.FromString("LastIrreversibleBlockHash"),
                LastIrreversibleBlockHeight = 1,
                Time = TimestampHelper.GetUtcNow()
            };

            var signature = CryptoHelper.SignWithPrivateKey(producer.PrivateKey, Hash.FromMessage(data).ToByteArray());

            return(new Handshake {
                HandshakeData = data, Signature = ByteString.CopyFrom(signature)
            });
        }
コード例 #20
0
        public void HandshakeInvalidDataTest()
        {
            context.AppState.State = ApplicationState.Ready;

            var clientConnection = new AlphaWebSocketConnection(context, new FakeWebSocket(), "127.0.0.1");

            var handshake = new HandshakeData();

            handshake.Randomize();

            var envelope = new HandshakeInit {
                HandshakeData = handshake
            }.CreateEnvelope();

            envelope.Sign(TestEnvironment.Client1KeyPair);

            using var writer = new XdrBufferWriter();
            var inMessage = envelope.ToIncomingMessage(writer);

            Assert.ThrowsAsync <ConnectionCloseException>(async() => await context.MessageHandlers.HandleMessage(clientConnection, inMessage));
        }
コード例 #21
0
        public async Task HandshakeTest()
        {
            context.AppState.State = ApplicationState.Running;

            var clientConnection = new AuditorWebSocketConnection(context, new FakeAuditorConnectionInfo(new FakeWebSocket()));

            var hd = new HandshakeData();

            hd.Randomize();

            var envelope = new HandshakeInit {
                HandshakeData = hd
            }.CreateEnvelope();

            envelope.Sign(TestEnvironment.AlphaKeyPair);
            using var writer = new XdrBufferWriter();
            var inMessage = envelope.ToIncomingMessage(writer);
            var isHandled = await context.MessageHandlers.HandleMessage(clientConnection, inMessage);

            Assert.IsTrue(isHandled);
        }
コード例 #22
0
        private Handshake CreateHandshake(ECKeyPair initiatorPeer = null, int port = 0)
        {
            if (initiatorPeer == null)
            {
                initiatorPeer = CryptoHelper.GenerateKeyPair();
            }

            var data = new HandshakeData
            {
                ChainId       = _blockchainService.GetChainId(),
                Version       = KernelConstants.ProtocolVersion,
                Pubkey        = ByteString.CopyFrom(initiatorPeer.PublicKey),
                Time          = TimestampHelper.GetUtcNow(),
                ListeningPort = port
            };

            var signature =
                CryptoHelper.SignWithPrivateKey(initiatorPeer.PrivateKey, HashHelper.ComputeFrom(data).ToByteArray());

            return(new Handshake {
                HandshakeData = data, Signature = ByteString.CopyFrom(signature)
            });
        }
コード例 #23
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="handshakeData"></param>
 /// <returns></returns>
 protected abstract bool CheckSignKey(HandshakeData handshakeData);
コード例 #24
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="handshakeData"></param>
 /// <returns></returns>
 protected override bool CheckSignKey(HandshakeData handshakeData)
 {
     byte[] secAccept;
     byte[] signKey;
     if (handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecAccept, out secAccept) &&
         handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecSignKey, out signKey))
     {
         return secAccept.IndexOf(signKey) != -1;
     }
     return false;
 }
コード例 #25
0
 private string GenreateKey(HandshakeData handshakeData)
 {
     string key;
     if (handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecKey, out key))
     {
         return GenreateKey(key);
     }
     return string.Empty;
 }
コード例 #26
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="handshakeData"></param>
        /// <returns></returns>
        protected override bool ResponseHandshake(ExSocket socket, HandshakeData handshakeData)
        {
            if (handshakeData.WebSocketVersion < _version)
            {
                return base.ResponseHandshake(socket, handshakeData);
            }

            string secKeyAccept = GenreateKey(handshakeData);
            StringBuilder response = new StringBuilder();
            response.AppendLine(HandshakeHeadKeys.RespHead_10);
            response.AppendLine(HandshakeHeadKeys.RespUpgrade);
            response.AppendLine(HandshakeHeadKeys.RespConnection);
            response.AppendLine(string.Format(HandshakeHeadKeys.RespAccept, secKeyAccept));

            if (!string.IsNullOrEmpty(handshakeData.Protocol))
            {
                response.AppendLine(string.Format(HandshakeHeadKeys.RespProtocol, handshakeData.Protocol));
            }
            response.AppendLine();
            Handler.SendMessage(socket, response.ToString(), Encoding, result => { });
            return true;
        }
コード例 #27
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="handshakeData"></param>
 /// <returns></returns>
 protected override bool CheckSignKey(HandshakeData handshakeData)
 {
     if (handshakeData.WebSocketVersion < _version)
     {
         return base.CheckSignKey(handshakeData);
     }
     string signKey;
     string accecpKey;
     if (handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecAccept, out accecpKey) &&
         handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecSignKey, out signKey))
     {
         return string.Equals(signKey, accecpKey);
     }
     return false;
 }
コード例 #28
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="handshakeData"></param>
 protected abstract bool ResponseHandshake(ExSocket socket, HandshakeData handshakeData);
コード例 #29
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="handshake"></param>
 /// <param name="cookieStr"></param>
 /// <returns></returns>
 protected void ParseCookies(HandshakeData handshake, string cookieStr)
 {
     if (handshake == null) return;
     if (handshake.Cookies == null)
     {
         handshake.Cookies = new Dictionary<string, string>();
     }
     var array = cookieStr.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
     foreach (var item in array)
     {
         var kvs = item.Split('=');
         if (kvs.Length == 2 && !string.IsNullOrEmpty(kvs[0]))
         {
             handshake.Cookies[Uri.UnescapeDataString(kvs[0])] = Uri.UnescapeDataString(kvs[1].Trim());
         }
     }
 }
コード例 #30
0
ファイル: HideIt.cs プロジェクト: cornerback/hideit
        /// <summary>
        /// Called when handshake is completed
        /// </summary>
        /// <param name="client"></param>
        /// <param name="data"></param>
        private void ShowReceiveFileForm(Socket client, HandshakeData data)
        {
            ReceiveFile_Form receiveForm = new ReceiveFile_Form(this._receiver, client, data);

            receiveForm.Show(this);
        }
コード例 #31
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="handshakeData"></param>
        /// <returns></returns>
        protected override bool ResponseHandshake(ExSocket socket, HandshakeData handshakeData)
        {
            string secKey1;
            string secKey2;
            byte[] secKey3;
            if (handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecKey1, out secKey1) &&
                handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecKey2, out secKey2) &&
                handshakeData.ParamItems.TryGet(HandshakeHeadKeys.SecKey3, out secKey3))
            {
                //The minimum version support 
                StringBuilder response = new StringBuilder();
                response.AppendLine(HandshakeHeadKeys.RespHead_00);
                response.AppendLine(HandshakeHeadKeys.RespUpgrade00);
                response.AppendLine(HandshakeHeadKeys.RespConnection);
                string origin;
                if (handshakeData.ParamItems.TryGet(HandshakeHeadKeys.Origin, out origin))
                {
                    response.AppendLine(string.Format(HandshakeHeadKeys.RespOriginLine, origin));
                }
                response.AppendLine(string.Format(HandshakeHeadKeys.SecLocation, handshakeData.UriSchema, handshakeData.Host, handshakeData.UrlPath));
                if (!string.IsNullOrEmpty(handshakeData.Protocol))
                {
                    response.AppendLine(string.Format(HandshakeHeadKeys.RespProtocol, handshakeData.Protocol));
                }
                response.AppendLine();
                Handler.SendMessage(socket, response.ToString(), Encoding, result => { });
                //Encrypt message
                byte[] securityKey = GetResponseSecurityKey(secKey1, secKey2, secKey3);
                Handler.SendMessage(socket, securityKey,  result => { });

                return true;
            }
            return false;
        }
コード例 #32
0
 public void Call(params object[] args)
 {
     //log.Info(string.Format("open args[0]={0} args.Length={1}", args[0], args.Length));
     HandshakeData = args[0] as HandshakeData;
     serverConnectionTest._manualResetEvent.Set();
 }
コード例 #33
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="message"></param>
        /// <param name="handshakeData"></param>
        /// <param name="error"></param>
        /// <returns></returns>
        protected virtual bool TryParseHandshake(string message, HandshakeData handshakeData, out string error)
        {
            using (var reader = new StringReader(message))
            {
                error = string.Empty;
                string headData = reader.ReadLine() ?? "";
                var headParams = headData.Split(' ');
                if (headParams.Length < 3 ||
                    (headParams[0] != HandshakeHeadKeys.Method && headParams[0] != HandshakeHeadKeys.HttpVersion))
                {
                    return false;
                }
                bool isResponse = headParams[0] == HandshakeHeadKeys.HttpVersion;
                if (!isResponse)
                {
                    if (Handler.IsSecurity) handshakeData.UriSchema = "wss";
                    handshakeData.Method = headParams[0];
                    handshakeData.UrlPath = headParams[1];
                    handshakeData.HttpVersion = headParams[2];
                }

                string paramStr;
                while (!string.IsNullOrEmpty(paramStr = reader.ReadLine()))
                {
                    //ex: Upgrade: WebSocket
                    var paramArr = paramStr.Split(':');
                    if (paramArr.Length < 2)
                    {
                        continue;
                    }
                    string key = paramArr[0].Trim();
                    //value includ spance char
                    string value = string.Join("", paramArr, 1, paramArr.Length - 1);
                    if (value.Length > 1) value = value.Substring(1); //pre char is spance
                    if (string.IsNullOrEmpty(key))
                    {
                        continue;
                    }
                    if (string.Equals(HandshakeHeadKeys.Host, key))
                    {
                        handshakeData.Host = value;
                        continue;
                    }
                    if (string.Equals(HandshakeHeadKeys.SecVersion, key))
                    {
                        handshakeData.WebSocketVersion = value.ToInt();
                        continue;
                    }
                    if (string.Equals(HandshakeHeadKeys.SecProtocol, key))
                    {
                        handshakeData.Protocol = GetFirstProtocol(value);
                        continue;
                    }
                    if (string.Equals(HandshakeHeadKeys.Cookie, key))
                    {
                        ParseCookies(handshakeData, value);
                        continue;
                    }
                    handshakeData.ParamItems[key] = value;
                }

                if (handshakeData.ParamItems.ContainsKey(HandshakeHeadKeys.Upgrade) &&
                    handshakeData.ParamItems.ContainsKey(HandshakeHeadKeys.Connection))
                {
                    return true;
                }
                error = "not support websocket ";
            }

            return false;
        }