/// <summary>
        /// Creates a new <see cref="PatchEncryptionKey"/> based on the provided
        /// <see cref="vector"/>.
        /// </summary>
        /// <param name="vector">The vector to base the key from.</param>
        /// <returns>A new initalized patch encryption key.</returns>
        public static PatchEncryptionKey Create(uint vector)
        {
            PatchEncryptionKey key = new PatchEncryptionKey();

            InitializeKey(key, vector);

            return(key);
        }
        public PatchServerCryptoProvider(PatchEncryptionKey key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            Key = key;
        }
 public unsafe void CRYPT_PC_CryptData(PatchEncryptionKey key, byte[] data, int offset, int count)
 {
     for (uint x = (uint)offset; x < count; x += 4)
     {
         fixed(void *p = &data[x])
         {
             *(uint *)p = (*(uint *)p) ^ key.CRYPT_PC_GetNextKey();
         }
     }
 }
        private static void InitializeKey(PatchEncryptionKey key, uint val)
        {
            uint index, tmp;

            tmp          = 1;
            key.Keys[55] = val;

            for (int i1 = 0x15; i1 <= 0x46E; i1 += 0x15)
            {
                index           = (uint)(i1 % 55);
                val            -= tmp;
                key.Keys[index] = tmp;
                tmp             = val;
                val             = (uint)key.Keys[index];
            }

            for (int i = 0; i < 4; i++)
            {
                key.CRYPT_PC_MixKeys();
            }

            key.Position = 56;
        }