Пример #1
0
        private List <byte[]> ProcessHandshakeRequest(Message message)
        {
            var frames = message.Frames;
            var list   = new List <byte[]>();

            if (frames.Count != 4)
            {
                list.Add(MessageHeader.HandshakeResponseFailure);
                list.Add(_protocol.ComputeHash(_protocol.CryptRand()));
                list.Add(_protocol.ComputeHash(_protocol.CryptRand()));
                _logger.Debug("Protocol handshake failed for {0}.", message.ClientId);
            }
            else
            {
                using (var rsa = new RSACryptoServiceProvider())
                {
                    rsa.ImportParameters(_serverPublicPrivateKey);
                    _identity         = Encoding.UTF8.GetString(rsa.Decrypt(frames[1], RSAEncryptionPadding.Pkcs1));
                    _clientEphemeralA = rsa.Decrypt(frames[2], RSAEncryptionPadding.Pkcs1);
                    _clientIpAddress  = Encoding.UTF8.GetString(rsa.Decrypt(frames[3], RSAEncryptionPadding.Pkcs1));
                }
                _identityHash = _repository.GetIdentityKeyHashSet(_identity);

                if (null == _identityHash)
                {
                    list.Add(MessageHeader.HandshakeResponseFailure);
                    list.Add(_protocol.ComputeHash(_protocol.CryptRand()));
                    list.Add(_protocol.ComputeHash(_protocol.CryptRand()));
                    _logger.Debug("Protocol handshake failed for {0}.", message.ClientId);
                }
                else
                {
                    _serverEphemeralB = _protocol.GetServerEphemeralB(_identityHash.Salt,
                                                                      _identityHash.Verifier, _protocol.CryptRand());

                    _scramble = _protocol.CalculateRandomScramble(_clientEphemeralA, _serverEphemeralB);

                    _serverSessionKey = _protocol.ServerComputeSessionKey(_identityHash.Salt, _identityHash.Key,
                                                                          _clientEphemeralA, _serverEphemeralB, _scramble);

                    list.Add(MessageHeader.HandshakeResponseSuccess);
                    using (var rsa = new RSACryptoServiceProvider())
                    {
                        rsa.ImportParameters(_clientPublicKey);
                        list.Add(rsa.Encrypt(_identityHash.Salt, RSAEncryptionPadding.Pkcs1));
                        list.Add(rsa.Encrypt(_serverEphemeralB, RSAEncryptionPadding.Pkcs1));
                    }
                    _logger.Debug("Protocol handshake completed for {0}.", message.ClientId);
                }
            }
            return(list);
        }