static void Write(IO.EndianWriter s, bool encrypt, IO.IEndianStreamable obj, long size = 0, ulong userKey = 0, Action <IO.EndianWriter> writeLeftovers = null) { if (!encrypt) { obj.Write(s); if (writeLeftovers != null) { writeLeftovers(s); } } else { using (var ms = new System.IO.MemoryStream()) using (var sin = new IO.EndianWriter(ms, Shell.EndianFormat.Big)) using (var encrypted = new IO.EndianReader(ms, Shell.EndianFormat.Big)) { obj.Write(sin); if (writeLeftovers != null) { writeLeftovers(sin); } encrypted.Seek(0); var tea = new Security.Cryptography.PhxTEA(encrypted, s); tea.InitializeKey(Security.Cryptography.PhxTEA.kKeyGameFile, userKey); tea.Encrypt(size); } } }
static void Read(IO.EndianReader s, bool decrypt, IO.IEndianStreamable obj, long size = 0, ulong userKey = 0, Action <IO.EndianReader> readLeftovers = null) { if (!decrypt) { obj.Read(s); } else { using (var ms = new System.IO.MemoryStream()) using (var sout = new IO.EndianWriter(ms, Shell.EndianFormat.Big)) using (var decrypted = new IO.EndianReader(ms, Shell.EndianFormat.Big)) { long position = s.BaseStream.Position; var tea = new Security.Cryptography.PhxTEA(s, sout); tea.InitializeKey(Security.Cryptography.PhxTEA.kKeyGameFile, userKey); tea.Decrypt(size); decrypted.Seek(0); obj.Read(decrypted); if (readLeftovers != null) { readLeftovers(decrypted); } } } }