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