mirror of
https://github.com/crskycode/GARbro.git
synced 2024-11-27 07:34:00 +08:00
(InputCryptoStream): new class derived from CryptoStream.
properly dispose transformations used by CryptoStream.
This commit is contained in:
parent
a303a66501
commit
b6f472ab25
@ -135,7 +135,7 @@ namespace GameRes.Formats.Kogado
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
if (3 == packed_entry.CompressionType)
|
if (3 == packed_entry.CompressionType)
|
||||||
return new CryptoStream (input, new NotTransform(), CryptoStreamMode.Read);
|
return new InputCryptoStream (input, new NotTransform());
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (2 == packed_entry.CompressionType)
|
if (2 == packed_entry.CompressionType)
|
||||||
|
@ -102,7 +102,7 @@ namespace GameRes.Formats.SPack
|
|||||||
if (null == packed_entry || !packed_entry.IsPacked)
|
if (null == packed_entry || !packed_entry.IsPacked)
|
||||||
return input;
|
return input;
|
||||||
if (1 == packed_entry.Method)
|
if (1 == packed_entry.Method)
|
||||||
return new CryptoStream (input, new NotTransform(), CryptoStreamMode.Read);
|
return new InputCryptoStream (input, new NotTransform());
|
||||||
if (2 == packed_entry.Method)
|
if (2 == packed_entry.Method)
|
||||||
{
|
{
|
||||||
using (var reader = new PackedReader (packed_entry, input))
|
using (var reader = new PackedReader (packed_entry, input))
|
||||||
|
@ -193,7 +193,7 @@ namespace GameRes.Formats.CaramelBox
|
|||||||
return input;
|
return input;
|
||||||
if (a3ent.IsEncrypted)
|
if (a3ent.IsEncrypted)
|
||||||
{
|
{
|
||||||
input = new CryptoStream (input, new NotTransform(), CryptoStreamMode.Read);
|
input = new InputCryptoStream (input, new NotTransform());
|
||||||
}
|
}
|
||||||
if (!a3ent.IsPacked)
|
if (!a3ent.IsPacked)
|
||||||
return input;
|
return input;
|
||||||
|
@ -48,7 +48,7 @@ namespace GameRes.Formats.Crowd
|
|||||||
if (key.Length != stream.Read (key, 0, key.Length))
|
if (key.Length != stream.Read (key, 0, key.Length))
|
||||||
return null;
|
return null;
|
||||||
using (var enc = new InputProxyStream (stream.AsStream, true))
|
using (var enc = new InputProxyStream (stream.AsStream, true))
|
||||||
using (var crypto = new CryptoStream (enc, new GaxTransform (key), CryptoStreamMode.Read))
|
using (var crypto = new InputCryptoStream (enc, new GaxTransform (key)))
|
||||||
using (var input = new BinaryStream (crypto, stream.Name))
|
using (var input = new BinaryStream (crypto, stream.Name))
|
||||||
{
|
{
|
||||||
var info = Png.ReadMetaData (input);
|
var info = Png.ReadMetaData (input);
|
||||||
@ -70,7 +70,7 @@ namespace GameRes.Formats.Crowd
|
|||||||
{
|
{
|
||||||
var meta = (GaxMetaData)info;
|
var meta = (GaxMetaData)info;
|
||||||
using (var enc = new StreamRegion (stream.AsStream, 0x14, true))
|
using (var enc = new StreamRegion (stream.AsStream, 0x14, true))
|
||||||
using (var crypto = new CryptoStream (enc, new GaxTransform (meta.Key), CryptoStreamMode.Read))
|
using (var crypto = new InputCryptoStream (enc, new GaxTransform (meta.Key)))
|
||||||
using (var input = new BinaryStream (crypto, stream.Name))
|
using (var input = new BinaryStream (crypto, stream.Name))
|
||||||
return Png.Read (input, info);
|
return Png.Read (input, info);
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ namespace GameRes.Formats.Irrlicht
|
|||||||
public override Stream OpenEntry (ArcFile arc, Entry entry)
|
public override Stream OpenEntry (ArcFile arc, Entry entry)
|
||||||
{
|
{
|
||||||
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
||||||
return new CryptoStream (input, new NotTransform(), CryptoStreamMode.Read);
|
return new InputCryptoStream (input, new NotTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,7 @@ namespace GameRes.Formats.Musica
|
|||||||
{
|
{
|
||||||
input = new XoredStream (input, xor_key);
|
input = new XoredStream (input, xor_key);
|
||||||
var enc = new Blowfish (scheme.ArcKeys[arc_name].IndexKey);
|
var enc = new Blowfish (scheme.ArcKeys[arc_name].IndexKey);
|
||||||
input = new CryptoStream (input, enc.CreateDecryptor(), CryptoStreamMode.Read);
|
input = new InputCryptoStream (input, enc.CreateDecryptor());
|
||||||
using (var index = new ArcView.Reader (input))
|
using (var index = new ArcView.Reader (input))
|
||||||
{
|
{
|
||||||
int count = index.ReadInt32();
|
int count = index.ReadInt32();
|
||||||
@ -291,7 +291,7 @@ namespace GameRes.Formats.Musica
|
|||||||
|
|
||||||
Stream DecryptEntry (Stream input, PazArchive arc, PazEntry entry)
|
Stream DecryptEntry (Stream input, PazArchive arc, PazEntry entry)
|
||||||
{
|
{
|
||||||
input = new CryptoStream (input, arc.Encryption.CreateDecryptor(), CryptoStreamMode.Read);
|
input = new InputCryptoStream (input, arc.Encryption.CreateDecryptor());
|
||||||
var key = entry.Key;
|
var key = entry.Key;
|
||||||
if (null == key)
|
if (null == key)
|
||||||
return input;
|
return input;
|
||||||
@ -305,7 +305,7 @@ namespace GameRes.Formats.Musica
|
|||||||
rc4.NextByte();
|
rc4.NextByte();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new CryptoStream (input, rc4, CryptoStreamMode.Read);
|
return new InputCryptoStream (input, rc4);
|
||||||
}
|
}
|
||||||
|
|
||||||
PazScheme QueryEncryption (string arc_name, uint signature)
|
PazScheme QueryEncryption (string arc_name, uint signature)
|
||||||
|
@ -104,7 +104,7 @@ namespace GameRes.Formats.NSystem
|
|||||||
|| arc.File.View.AsciiEqual (entry.Offset, "MSCENARIO FILE "))
|
|| arc.File.View.AsciiEqual (entry.Offset, "MSCENARIO FILE "))
|
||||||
return base.OpenEntry (arc, entry);
|
return base.OpenEntry (arc, entry);
|
||||||
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
||||||
return new CryptoStream (input, new MsdTransform (msarc.Key), CryptoStreamMode.Read);
|
return new InputCryptoStream (input, new MsdTransform (msarc.Key));
|
||||||
}
|
}
|
||||||
|
|
||||||
string QueryPassword (string arc_name)
|
string QueryPassword (string arc_name)
|
||||||
|
@ -83,7 +83,7 @@ namespace GameRes.Formats.Nags
|
|||||||
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
var input = arc.File.CreateStream (entry.Offset, entry.Size);
|
||||||
if (!entry.Name.EndsWith (".scb", StringComparison.InvariantCultureIgnoreCase))
|
if (!entry.Name.EndsWith (".scb", StringComparison.InvariantCultureIgnoreCase))
|
||||||
return input;
|
return input;
|
||||||
return new CryptoStream (input, new NotTransform(), CryptoStreamMode.Read);
|
return new InputCryptoStream (input, new NotTransform());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ namespace GameRes.Formats.NitroPlus
|
|||||||
{
|
{
|
||||||
var input = narc.File.CreateStream (nent.Segments[0].Offset, nent.Segments[0].AlignedSize);
|
var input = narc.File.CreateStream (nent.Segments[0].Offset, nent.Segments[0].AlignedSize);
|
||||||
var decryptor = narc.Encryption.CreateDecryptor();
|
var decryptor = narc.Encryption.CreateDecryptor();
|
||||||
return new CryptoStream (input, decryptor, CryptoStreamMode.Read);
|
return new InputCryptoStream (input, decryptor);
|
||||||
}
|
}
|
||||||
return new NpkStream (narc, nent);
|
return new NpkStream (narc, nent);
|
||||||
}
|
}
|
||||||
@ -443,7 +443,7 @@ namespace GameRes.Formats.NitroPlus
|
|||||||
var segment = m_segment.Current;
|
var segment = m_segment.Current;
|
||||||
m_stream = m_file.CreateStream (segment.Offset, segment.AlignedSize);
|
m_stream = m_file.CreateStream (segment.Offset, segment.AlignedSize);
|
||||||
var decryptor = m_encryption.CreateDecryptor();
|
var decryptor = m_encryption.CreateDecryptor();
|
||||||
m_stream = new CryptoStream (m_stream, decryptor, CryptoStreamMode.Read);
|
m_stream = new InputCryptoStream (m_stream, decryptor);
|
||||||
if (segment.IsCompressed)
|
if (segment.IsCompressed)
|
||||||
m_stream = new DeflateStream (m_stream, CompressionMode.Decompress);
|
m_stream = new DeflateStream (m_stream, CompressionMode.Decompress);
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ namespace GameRes.Formats.Primel
|
|||||||
default: // not encrypted
|
default: // not encrypted
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
input = new CryptoStream (input, decryptor, CryptoStreamMode.Read);
|
input = new InputCryptoStream (input, decryptor);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (0 != (flags & 0xFF))
|
if (0 != (flags & 0xFF))
|
||||||
|
@ -127,7 +127,7 @@ namespace GameRes.Formats.Selene
|
|||||||
var kpe = entry as KcapEntry;
|
var kpe = entry as KcapEntry;
|
||||||
if (null == kpa || null == kpe || !kpe.Encrypted)
|
if (null == kpa || null == kpe || !kpe.Encrypted)
|
||||||
return input;
|
return input;
|
||||||
return new CryptoStream (input, new KcapTransform(kpa.KeyTable), CryptoStreamMode.Read);
|
return new InputCryptoStream (input, new KcapTransform(kpa.KeyTable));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetPassPhrase (string title)
|
public static string GetPassPhrase (string title)
|
||||||
|
@ -137,4 +137,28 @@ namespace GameRes.Formats
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// CryptoStream that disposes transformation object upon close.
|
||||||
|
/// </summary>
|
||||||
|
public class InputCryptoStream : CryptoStream
|
||||||
|
{
|
||||||
|
ICryptoTransform m_transform;
|
||||||
|
|
||||||
|
public InputCryptoStream (Stream input, ICryptoTransform transform)
|
||||||
|
: base (input, transform, CryptoStreamMode.Read)
|
||||||
|
{
|
||||||
|
m_transform = transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Dispose (bool disposing)
|
||||||
|
{
|
||||||
|
base.Dispose (disposing);
|
||||||
|
if (disposing && m_transform != null)
|
||||||
|
{
|
||||||
|
m_transform.Dispose();
|
||||||
|
m_transform = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ namespace GameRes.Formats.Slg
|
|||||||
public override ImageMetaData ReadMetaData (IBinaryStream stream)
|
public override ImageMetaData ReadMetaData (IBinaryStream stream)
|
||||||
{
|
{
|
||||||
using (var proxy = new ProxyStream (stream.AsStream, true))
|
using (var proxy = new ProxyStream (stream.AsStream, true))
|
||||||
using (var crypt = new CryptoStream (proxy, new TigTransform(), CryptoStreamMode.Read))
|
using (var crypt = new InputCryptoStream (proxy, new TigTransform()))
|
||||||
using (var input = new BinaryStream (crypt, stream.Name))
|
using (var input = new BinaryStream (crypt, stream.Name))
|
||||||
return base.ReadMetaData (input);
|
return base.ReadMetaData (input);
|
||||||
}
|
}
|
||||||
@ -48,7 +48,7 @@ namespace GameRes.Formats.Slg
|
|||||||
public override ImageData Read (IBinaryStream stream, ImageMetaData info)
|
public override ImageData Read (IBinaryStream stream, ImageMetaData info)
|
||||||
{
|
{
|
||||||
using (var proxy = new ProxyStream (stream.AsStream, true))
|
using (var proxy = new ProxyStream (stream.AsStream, true))
|
||||||
using (var crypt = new CryptoStream (proxy, new TigTransform(), CryptoStreamMode.Read))
|
using (var crypt = new InputCryptoStream (proxy, new TigTransform()))
|
||||||
using (var input = new BinaryStream (crypt, stream.Name))
|
using (var input = new BinaryStream (crypt, stream.Name))
|
||||||
return base.Read (input, info);
|
return base.Read (input, info);
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ namespace GameRes.Formats.Tactics
|
|||||||
{
|
{
|
||||||
// NOTE CryptoStream will close an input stream
|
// NOTE CryptoStream will close an input stream
|
||||||
using (var proxy = new InputProxyStream (input, true))
|
using (var proxy = new InputProxyStream (input, true))
|
||||||
using (var xored = new CryptoStream (proxy, new NotTransform(), CryptoStreamMode.Read))
|
using (var xored = new InputCryptoStream (proxy, new NotTransform()))
|
||||||
using (var lzss = new LzssStream (xored))
|
using (var lzss = new LzssStream (xored))
|
||||||
if (m_index.Length != lzss.Read (m_index, 0, m_index.Length))
|
if (m_index.Length != lzss.Read (m_index, 0, m_index.Length))
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user