public void SetConnectionEncryption(bool bEnabled, byte[] pTargetClientHash, bool bServerConnection) { if (streamCryptState_ != StreamCryptStateEnum.ECS_UNKNOWN && streamCryptState_ != StreamCryptStateEnum.ECS_NONE) { if (!(streamCryptState_ == StreamCryptStateEnum.ECS_NONE) || bEnabled) { Debug.Assert(false); } return; } Debug.Assert(rc4SendKey_ == null); Debug.Assert(rc4ReceiveKey_ == null); if (bEnabled && pTargetClientHash != null && !bServerConnection) { streamCryptState_ = StreamCryptStateEnum.ECS_PENDING; // create obfuscation keys, see on top for key format // use the crypt random generator randomKeyPart_ = MpdUtilities.GetRandomUInt32(); byte[] achKeyData = new byte[21]; MpdUtilities.Md4Cpy(achKeyData, pTargetClientHash); Array.Copy(BitConverter.GetBytes(randomKeyPart_), 0, achKeyData, 17, 4); achKeyData[16] = Convert.ToByte(MuleConstants.MAGICVALUE_REQUESTER); MD5 md5 = MD5.Create(); rc4SendKey_ = MuleUtilities.RC4CreateKey(md5.ComputeHash(achKeyData), 16); achKeyData[16] = Convert.ToByte(MuleConstants.MAGICVALUE_SERVER); rc4ReceiveKey_ = MuleUtilities.RC4CreateKey(md5.ComputeHash(achKeyData), 16); } else if (bServerConnection && bEnabled) { serverCrypt_ = true; streamCryptState_ = StreamCryptStateEnum.ECS_PENDING_SERVER; } else { Debug.Assert(!bEnabled); streamCryptState_ = StreamCryptStateEnum.ECS_NONE; } }