Пример #1
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[SignedMod(length * Keytable[0], 512)];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                switch (SignedMod(kidx, 3))
                {
                case 0:
                    kidx += 103;
                    break;

                case 1:
                    kidx = (uint)SignedMod(4 * kidx, header.BuildVersion);
                    break;

                case 2:
                    --kidx;
                    break;
                }
            }

            return(buffer);
        }
Пример #2
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = Keytable[header.m_dataCount & 511];
            for (uint i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                switch (SignedMod(kidx, 3))
                {
                case 0:
                    kidx += 103;
                    break;

                case 1:
                    kidx = (uint)SignedMod(kidx * 4, header.m_buildVersion);
                    break;

                case 2:
                    --kidx;
                    break;
                }
            }
            return(buffer);
        }
Пример #3
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = (uint)(digest[7] + header.m_dataCount) & 511;
            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                switch (SignedMod(kidx, 3))
                {
                case 0:
                    kidx += 103;
                    break;

                case 1:
                    kidx = (uint)SignedMod(kidx * 4, header.m_buildVersion);
                    break;

                case 2:
                    --kidx;
                    break;
                }
                buffer[i] ^= digest[SignedMod(kidx + header.m_buildVersion, SHA1_DIGESTSIZE)];
            }
            return(buffer);
        }
Пример #4
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[header.BuildVersion & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[kidx % 512];
                switch (kidx % 3)
                {
                case 0:
                    kidx += 103;
                    break;

                case 1:
                    kidx = 4 * kidx % header.BuildVersion;
                    break;

                case 2:
                    --kidx;
                    break;
                }
            }

            return(buffer);
        }
Пример #5
0
        public const int ENCRYPTED_MAGIC = 0x636D66; // todo: use the thingy again?

        public ContentManifestFile(ClientHandler client, Stream stream, string name)
        {
            using (BinaryReader reader = new BinaryReader(stream)) {
                m_header = reader.Read <CMFHeader>();
                if (m_header.m_buildVersion < ProductHandler_Tank.VERSION_148_PTR)   // before 1.48
                {
                    stream.Position = 0;
                    m_header        = reader.Read <CMFHeader25>().Upgrade();
                }

                if (m_header.m_buildVersion >= 12923648 || m_header.m_buildVersion < 52320)
                {
                    throw new NotSupportedException("Overwatch 1.29 or earlier is not supported");
                }

                if (m_header.IsEncrypted())
                {
                    using (var decryptedReader = ManifestCryptoHandler.GetDecryptedReader(name, "CMF", m_header, m_header.m_buildVersion, client.Product, stream))
                        ParseEntries(decryptedReader);
                }
                else
                {
                    ParseEntries(reader);
                }
            }
        }
Пример #6
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = (uint)(length * header.BuildVersion);

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                switch (SignedMod(kidx, 3))
                {
                case 0:
                    kidx += 103;
                    break;

                case 1:
                    kidx = (4 * kidx) % header.BuildVersion;
                    break;

                case 2:
                    --kidx;
                    break;
                }
                buffer[i] ^= digest[SignedMod(kidx + header.BuildVersion, SHA1_DIGESTSIZE)];
            }

            return(buffer);
        }
Пример #7
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[(digest[7] * Keytable[0]) & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[kidx % 512];
                switch (kidx % 3)
                {
                case 0:
                    kidx += 103;
                    break;

                case 1:
                    kidx = 4 * kidx % header.BuildVersion;
                    break;

                case 2:
                    --kidx;
                    break;
                }

                buffer[i] ^= digest[(kidx + header.BuildVersion) % SHA1_DIGESTSIZE];
            }

            return(buffer);
        }
Пример #8
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = 0;
            }

            return(buffer);
        }
Пример #9
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = (uint)length * header.m_buildVersion;

            for (uint i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     -= header.m_buildVersion & 511;
            }
            return(buffer);
        }
Пример #10
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = Keytable[header.m_dataCount & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i]  = Keytable[SignedMod(kidx, 512)];
                kidx      -= 43;
                buffer[i] ^= digest[SignedMod(kidx + header.m_dataCount, SHA1_DIGESTSIZE)];
            }
            return(buffer);
        }
Пример #11
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = Keytable[(uint)header.DataCount & 511];

            for (uint i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += (uint)(header.BuildVersion * header.DataCount) % 7;
            }

            return(buffer);
        }
Пример #12
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = Keytable[(length * Keytable[0]) & 511];
            for (uint i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += 3;
            }
            return(buffer);
        }
Пример #13
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = Keytable[header.m_buildVersion & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += ((uint)header.m_dataCount + digest[SignedMod(header.m_dataCount, SHA1_DIGESTSIZE)]) % 17;
                buffer[i] = digest[SignedMod(kidx, SHA1_DIGESTSIZE)];
            }
            return(buffer);
        }
Пример #14
0
 public byte[] IV(CMFHeader header, byte[] digest, int length)
 {
   byte[] buffer = new byte[length];
   uint kidx, okidx;
   kidx = okidx = Keytable[(uint)header.m_dataCount & 511];
   for (int i = 0; i != length; ++i)
   {
     buffer[i] = Keytable[SignedMod(kidx, 512)];
     kidx -= header.m_buildVersion & 511;
     buffer[i] ^= digest[SignedMod(kidx + header.m_buildVersion, SHA1_DIGESTSIZE)];
   }
   return buffer;
 }
Пример #15
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = Keytable[header.m_buildVersion & 511];
            for (uint i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += (uint)header.m_dataCount;
            }
            return(buffer);
        }
Пример #16
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = Keytable[SignedMod(length * Keytable[0], 512)];

            for (uint i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += (uint)header.EntryCount;
            }

            return(buffer);
        }
Пример #17
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = (uint)(header.BuildVersion * length);

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx      = header.BuildVersion - kidx;
            }

            return(buffer);
        }
Пример #18
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[header.DataCount & 511];

            for (int i = 0; i != length; ++i)
            {
                kidx     += (uint)header.EntryCount + digest[header.EntryCount % SHA1_DIGESTSIZE];
                buffer[i] = digest[kidx % SHA1_DIGESTSIZE];
            }

            return(buffer);
        }
Пример #19
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = Keytable[(digest[7] * Keytable[0]) & 511];
            for (int i = 0; i != length; ++i)
            {
                buffer[i]  = Keytable[SignedMod(kidx, 512)];
                kidx      += (uint)(header.m_buildVersion * header.m_dataCount) % 7;
                buffer[i] ^= digest[SignedMod(kidx - 73, SHA1_DIGESTSIZE)];
            }
            return(buffer);
        }
Пример #20
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = Keytable[SignedMod((2 * digest[13]) - length, 512)];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += (uint)header.EntryCount + digest[SignedMod(header.EntryCount, SHA1_DIGESTSIZE)];
                buffer[i] = digest[SignedMod(kidx, SHA1_DIGESTSIZE)];
            }

            return(buffer);
        }
Пример #21
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = Keytable[((2 * digest[13]) - length) & 511];
            for (int i = 0; i != length; ++i)
            {
                buffer[i]  = Keytable[SignedMod(kidx, 512)];
                kidx       = header.m_buildVersion - kidx;
                buffer[i] ^= digest[SignedMod(kidx + i, SHA1_DIGESTSIZE)];
            }
            return(buffer);
        }
Пример #22
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Constrain(length * header.m_buildVersion);

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[kidx % 512];
                kidx     += (uint)header.m_entryCount;
            }

            return(buffer);
        }
Пример #23
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[header.BuildVersion & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[kidx % 512];
                kidx     += (uint)header.EntryCount;
            }

            return(buffer);
        }
Пример #24
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx, okidx;

            kidx = okidx = Keytable[(digest[7] * Keytable[0]) & 511];
            for (int i = 0; i != length; ++i)
            {
                buffer[i]  = Keytable[SignedMod(kidx, 512)];
                kidx      += ((digest[6] & 1) != 0) ? 37 : (okidx % 61);
                buffer[i] ^= digest[SignedMod(kidx - i, SHA1_DIGESTSIZE)];
            }
            return(buffer);
        }
Пример #25
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];
            uint   kidx   = Keytable[header.m_dataCount & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i]  = Keytable[kidx % 512];
                kidx      += 3;
                buffer[i] ^= digest[(kidx - i) % SHA1_DIGESTSIZE];
            }

            return(buffer);
        }
Пример #26
0
        public byte[] IV(CMFHeader header, byte[] digest, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = (uint)((digest[7] + header.DataCount) & 511);

            for (int i = 0; i != length; ++i)
            {
                kidx     += (uint)header.EntryCount + digest[header.EntryCount % SHA1_DIGESTSIZE];
                buffer[i] = digest[SignedMod(kidx, SHA1_DIGESTSIZE)];
            }

            return(buffer);
        }
Пример #27
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[header.DataCount & 511];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     -= 57;
            }

            return(buffer);
        }
Пример #28
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = header.m_buildVersion * (uint)length;

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[SignedMod(kidx, 512)];
                kidx     += (uint)header.m_entryCount;
            }

            return(buffer);
        }
Пример #29
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = Keytable[length * Keytable[0] % 512];

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[kidx % 512];
                kidx     += (uint)header.m_entryCount;
            }

            return(buffer);
        }
Пример #30
0
        public byte[] Key(CMFHeader header, int length)
        {
            byte[] buffer = new byte[length];

            uint kidx = header.m_buildVersion * (uint)length;

            for (int i = 0; i != length; ++i)
            {
                buffer[i] = Keytable[kidx % 512];
                kidx     += 3;
            }

            return(buffer);
        }