Inheritance: ICryptoTransform
Esempio n. 1
0
        public override void WriteFooter(Stream stream, List<IWriteFile> files, int[] sizes, int[] CRCs)
        {
            DirPosition = (int)stream.Position;

            ICryptoTransform cryptoTrans = new CryptoTransformOneCode(DirMask);
            CryptoStream cryptoStream = new CryptoStream(stream, cryptoTrans, CryptoStreamMode.Write);
            BinaryWriter cryptoWriter = new BinaryWriter(cryptoStream);
            byte[] nameBuf = new byte[128];
            for (int i = 0, offset = 4; i < files.Count; i++)
            {
                cryptoWriter.Write(offset);
                cryptoWriter.Write(sizes[i]);

                Utility.EncodingShiftJIS.GetBytes(files[i].Name).CopyTo(nameBuf, 0);
                int len = files[i].Name.Length;
                while (len < nameBuf.Length && nameBuf[len] != 0)
                    nameBuf[len++] = 0;
                cryptoWriter.Write(nameBuf);

                cryptoWriter.Write(CRCs[i]);

                offset += sizes[i];
            }

            BinaryWriter writer = new BinaryWriter(stream);
            writer.Write(DirMask);
            writer.Write(DirPosition);
        }
Esempio n. 2
0
        public override List<IWriteFile> ReadDirectory(string path)
        {
            List<IWriteFile> subfiles = null;
            using (BinaryReader reader = new BinaryReader(File.OpenRead(path)))
            {
                int numFiles = reader.ReadInt32() & (int)~0x80000000;
                reader.BaseStream.Seek(-8, SeekOrigin.End);
                DirMask = reader.ReadBytes(4);
                DirPosition = reader.ReadInt32();
                reader.BaseStream.Seek(DirPosition, SeekOrigin.Begin);

                ICryptoTransform cryptoTrans = new CryptoTransformOneCode(DirMask);
                CryptoStream cryptoStream = new CryptoStream(reader.BaseStream, cryptoTrans, CryptoStreamMode.Read);
                using (BinaryReader cryptoReader = new BinaryReader(cryptoStream))
                {
                    subfiles = new List<IWriteFile>(numFiles);
                    for (int i = 0; i < numFiles; i++)
                    {
                        fpkSubfile subfile = new fpkSubfile(path);
                        subfile.offset = cryptoReader.ReadUInt32();
                        subfile.size = cryptoReader.ReadUInt32();
                        byte[] nameBuf = cryptoReader.ReadBytes(128);
                        int len = 0;
                        while (len < nameBuf.Length && nameBuf[len] != 0)
                            len++;
                        subfile.Name = Utility.EncodingShiftJIS.GetString(nameBuf, 0, len);
                        subfile.crc = cryptoReader.ReadInt32();
                        subfiles.Add(subfile);

                        try
                        {
                            if (Hash(nameBuf) != subfile.crc)
                                Report.ReportLog("bad hash code for <" + subfile.Name + ">");
                        }
                        catch
                        {
                        }
                    }
                }
            }

            return subfiles;
        }