Пример #1
0
 protected LibIndexReader(ArcView file, IMalieDecryptor decryptor, byte[] header)
 {
     m_view       = file.View;
     m_max_offset = file.MaxOffset;
     m_dec        = decryptor;
     m_header     = header;
 }
Пример #2
0
 protected LibIndexReader(ArcView file, Camellia encryption, byte[] header)
 {
     m_view       = file.View;
     m_max_offset = file.MaxOffset;
     m_enc        = encryption;
     m_header     = header;
 }
Пример #3
0
 public DscDecoder(ArcView.Frame input)
     : base(new ArcViewStream(input, input.Offset + 0x20, input.Reserved - 0x20))
 {
     m_magic     = (uint)input.ReadUInt16(input.Offset) << 16;
     m_key       = input.ReadUInt32(input.Offset + 0x10);
     m_dst_size  = input.ReadUInt32(input.Offset + 0x14);
     m_dec_count = input.ReadUInt32(input.Offset + 0x18);
     m_output    = new byte[m_dst_size];
 }
Пример #4
0
        static byte[] ReadBlock(ArcView.Frame view, INekoFormat enc, long offset, out int length)
        {
            uint hash = view.ReadUInt32(offset);

            length = view.ReadInt32(offset + 4);

            int aligned_size = (length + 7) & ~7;

            byte[] buffer = new byte[aligned_size];
            length = view.Read(offset + 8, buffer, 0, (uint)length);
            if (0 != hash)
            {
                enc.Decrypt(hash, buffer, 0, aligned_size);
            }
            return(buffer);
        }
Пример #5
0
        static byte[] ReadBlock(ArcView.Frame view, INekoEncryption enc, long offset, out int length)
        {
            uint hash = view.ReadUInt32(offset);

            length = view.ReadInt32(offset + 4);
            // parity check
//            if (CalcParity (((NekoEncryption32bit)enc).Parity, (uint)length) != hash)
//                throw new InvalidFormatException();

            int aligned_size = (length + 7) & ~7;

            byte[] buffer = new byte[aligned_size];
            length = view.Read(offset + 8, buffer, 0, (uint)length);
            if (0 != hash)
            {
                enc.Decrypt(hash, buffer, 0, aligned_size);
            }
            return(buffer);
        }
Пример #6
0
        public override Stream OpenEntry(ArcFile arc, Entry entry)
        {
            var entry_offset = entry.Offset;
            var input        = new ArcView.Frame(arc.File, entry_offset, entry.Size);

            try
            {
                if (entry.Size > 0x220 && input.AsciiEqual(entry_offset, "DSC FORMAT 1.00\0"))
                {
                    using (var decoder = new DscDecoder(input))
                    {
                        decoder.Unpack();
                        return(new BinMemoryStream(decoder.Output, entry.Name));
                    }
                }
                return(new ArcViewStream(input, entry_offset, entry.Size));
            }
            catch (Exception X)
            {
                System.Diagnostics.Trace.WriteLine(X.Message, "BgiOpener");
                return(arc.File.CreateStream(entry.Offset, entry.Size));
            }
        }
Пример #7
0
        private static int ReadEncrypted(ArcView.Frame view, IMalieDecryptor dec, long offset, byte[] buffer, int index, int length)
        {
            int offset_pad  = (int)offset & 0xF;
            int aligned_len = (offset_pad + length + 0xF) & ~0xF;

            byte[] aligned_buf;
            int    block = 0;

            if (aligned_len == length)
            {
                aligned_buf = buffer;
                block       = index;
            }
            else
            {
                aligned_buf = new byte[aligned_len];
            }

            int read = view.Read(offset - offset_pad, aligned_buf, block, (uint)aligned_len);

            if (read < offset_pad)
            {
                return(0);
            }

            for (int block_count = aligned_len / 0x10; block_count > 0; --block_count)
            {
                dec.DecryptBlock(offset, aligned_buf, block);
                block  += 0x10;
                offset += 0x10;
            }
            if (aligned_buf != buffer)
            {
                Buffer.BlockCopy(aligned_buf, offset_pad, buffer, index, length);
            }
            return(Math.Min(length, read - offset_pad));
        }
Пример #8
0
 public EncryptedStream(ArcView mmap, Camellia encryption)
 {
     m_view       = mmap.CreateFrame();
     m_enc        = encryption;
     m_max_offset = mmap.MaxOffset;
 }
Пример #9
0
 public EncryptedViewStream(ArcView mmap, byte[] key)
 {
     m_view       = mmap.CreateFrame();
     m_key        = key;
     m_max_offset = mmap.MaxOffset;
 }
Пример #10
0
 public EncryptedViewStream(ArcView mmap, byte[] key)
 {
     m_view = mmap.CreateFrame();
     m_key = key;
     m_max_offset = mmap.MaxOffset;
 }
Пример #11
0
 public EncryptedStream(ArcView mmap, Camellia encryption)
 {
     m_view = mmap.CreateFrame();
     m_enc = encryption;
     m_max_offset = mmap.MaxOffset;
 }
Пример #12
0
 public Reader(ArcView file)
 {
     m_view = file.View;
 }
Пример #13
0
 protected LibIndexReader(ArcView file, Camellia encryption, byte[] header)
 {
     m_view = file.View;
     m_max_offset = file.MaxOffset;
     m_enc = encryption;
     m_header = header;
 }
Пример #14
0
 public Reader(ArcView file)
 {
     m_view = file.View;
 }
Пример #15
0
 public EncryptedStream(ArcView mmap, IMalieDecryptor decryptor)
 {
     m_view       = mmap.CreateFrame();
     m_dec        = decryptor;
     m_max_offset = mmap.MaxOffset;
 }
Пример #16
0
 public CsafStream(CsafArchive arc)
 {
     m_length     = arc.File.MaxOffset;
     m_view       = arc.File.CreateFrame();
     m_encryption = arc.Encryption;
 }
Пример #17
0
 public ViewStreamBase(ArcView mmap)
 {
     m_view       = mmap.CreateFrame();
     m_max_offset = mmap.MaxOffset;
 }