public static void HandleKeyData(StsSession session, ClientKeyDataMessage keyData)
        {
            session.KeyExchange.CalculateSecret(keyData.A);

            byte[] key = session.KeyExchange.CalculateSessionKey();
            if (!session.KeyExchange.VerifyClientEvidenceMessage(keyData.M1))
            {
                session.EnqueueMessageError(new ServerErrorMessage((int)ErrorCode.InvalidAccountNameOrPassword));
                return;
            }

            byte[] M2 = session.KeyExchange.CalculateServerEvidenceMessage();

            using (MemoryStream stream = new MemoryStream())
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    writer.Write(M2.Length);
                    writer.Write(M2, 0, M2.Length);

                    session.EnqueueMessageOk(new ServerKeyDataMessage
                    {
                        KeyData = Convert.ToBase64String(stream.ToArray())
                    });
                }

            // enqueue new key to be set after next packet flush
            session.InitialiseEncryption(key);
        }
        public static void HandleKeyData(StsSession session, ClientKeyDataMessage keyData)
        {
            session.KeyExchange.CalculateSecret(keyData.A);

            byte[] key = session.KeyExchange.CalculateSessionKey();
            if (!session.KeyExchange.VerifyClientEvidenceMessage(keyData.M1))
            {
                // TODO: send error
                return;
            }

            byte[] M2 = session.KeyExchange.CalculateServerEvidenceMessage();

            using (MemoryStream stream = new MemoryStream())
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    writer.Write(M2.Length);
                    writer.Write(M2, 0, M2.Length);

                    session.EnqueueMessageOk(new ServerKeyDataMessage
                    {
                        KeyData = Convert.ToBase64String(stream.ToArray())
                    });
                }

            // must be set after sending response
            session.InitialiseEncryption(key);
        }