示例#1
0
        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;
            }
        }