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); }