Example #1
0
        private static void TryDecrypt(ABNDFileEntry entry, List <ABNDChunk> chunks)
        {
            Debug.Assert(entry.EncryptionType == EncryptionType.ChaCha);

            uint totalLen = 0;

            foreach (var chunk in chunks)
            {
                totalLen += chunk.Length;
            }

            var encrypted = GetConcatenatedEncryptedChunks(totalLen, chunks);

            var IV        = entry.IV;
            var xor       = IV.Xor(12);
            var decrypted = ChaCha.Decrypt(encrypted, xor, entry.MAC);

            if (decrypted == null)
            {
                throw new Exception();
            }

            // rechunk data
            GetDecryptedChunks(chunks, decrypted);
        }
Example #2
0
        public List <ABNDChunk> GetChunkData(ABNDFileEntry entry)
        {
            var result = new List <ABNDChunk>();
            var ofs    = entry.CompressedOffset;

            if ((entry.Flags & ABNDFileEntryFlag.Compressed) == 0)
            {
                var blob = new ABNDChunk
                {
                    Data   = Data,
                    Length = (uint)entry.CompressedLength,
                };
                result.Add(blob);
                return(result);
            }

            do
            {
                var len = BitConverter.ToInt32(Data, ofs);

                // copy chunk data to final array at current position
                byte[] chunk = Util.GetSlice(Data, ofs + 4, len);
                var    blob  = new ABNDChunk
                {
                    Data   = chunk,
                    Length = (uint)len,
                };
                result.Add(blob);

                // advance to next chunk
                ofs += 4 + len;
            } while (ofs < entry.CompressedOffset + entry.CompressedLength);

            return(result);
        }
Example #3
0
        private byte[] GetFileData(ABNDFileEntry entry, List <ABNDChunk> chunks)
        {
            if ((entry.Flags & ABNDFileEntryFlag.Compressed) == 0)
            {
                return(GetDecompressedFileData(entry, chunks));
            }

            var result = LZ4.DecodeChunks(chunks, ExtHeader.BlockSizeSectors << 9, entry.DecompressedLength);

            Debug.Assert(result.Length == entry.DecompressedLength);
            return(result);
        }
Example #4
0
        public byte[] GetFileData(ABNDFileEntry entry)
        {
            var chunks = GetChunkData(entry);

            if ((entry.Flags & ABNDFileEntryFlag.Encrypted) != 0)
            {
                TryDecrypt(entry, chunks);
            }

            var file_data = GetFileData(entry, chunks);

            Debug.Assert(file_data != null);

            return(file_data);
        }
Example #5
0
        private static byte[] GetDecompressedFileData(ABNDFileEntry entry, List <ABNDChunk> chunks)
        {
            Debug.Assert(entry.CompressedLength == entry.DecompressedLength);
            var result = new byte[entry.DecompressedLength];

            uint offset = 0;

            foreach (var chunk in chunks)
            {
                chunk.Data.CopyTo(result, offset);
                offset += chunk.Length;
            }

            return(result);
        }
Example #6
0
        public string GetFileName(ABNDFileEntry entry)
        {
            var encoding = Encoding.UTF8;

            return(encoding.GetString(FileNameTable, entry.FileNameOffset, entry.FileNameLength));
        }