mirror of
https://github.com/crskycode/GARbro.git
synced 2026-06-06 05:38:48 +08:00
style: Format
This commit is contained in:
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
using GameRes.Compression;
|
using GameRes.Compression;
|
||||||
using GameRes.Utility;
|
using GameRes.Utility;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@@ -54,14 +53,14 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
public string NamesFile;
|
public string NamesFile;
|
||||||
public Dictionary<string, HxIndexKey> IndexKeyDict;
|
public Dictionary<string, HxIndexKey> IndexKeyDict;
|
||||||
|
|
||||||
public HxCrypt(CxScheme scheme) : base(scheme)
|
public HxCrypt (CxScheme scheme) : base (scheme)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonSerialized]
|
[NonSerialized]
|
||||||
uint[] _lookup32 = null;
|
uint[] _lookup32 = null;
|
||||||
|
|
||||||
void CreateLookup32()
|
void CreateLookup32 ()
|
||||||
{
|
{
|
||||||
if (null != _lookup32)
|
if (null != _lookup32)
|
||||||
return;
|
return;
|
||||||
@@ -74,7 +73,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
_lookup32 = result;
|
_lookup32 = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
string BinaryToString(byte[] data)
|
string BinaryToString (byte[] data)
|
||||||
{
|
{
|
||||||
if (data.Length == 0)
|
if (data.Length == 0)
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
@@ -89,7 +88,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return new string(result);
|
return new string(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal virtual Dictionary<string, HxEntry> ReadIndex(string arc_name, byte[] data)
|
internal virtual Dictionary<string, HxEntry> ReadIndex (string arc_name, byte[] data)
|
||||||
{
|
{
|
||||||
if (data.Length <= 20) // 16 + 4
|
if (data.Length <= 20) // 16 + 4
|
||||||
return null;
|
return null;
|
||||||
@@ -124,8 +123,8 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
if (null == root_obj)
|
if (null == root_obj)
|
||||||
return null;
|
return null;
|
||||||
CreateLookup32 ();
|
CreateLookup32 ();
|
||||||
var path_map = new Dictionary<string, string>();
|
var path_map = new Dictionary<string, string> ();
|
||||||
var name_map = new Dictionary<string, string>();
|
var name_map = new Dictionary<string, string> ();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FormatCatalog.Instance.ReadFileList (NamesFile, line => {
|
FormatCatalog.Instance.ReadFileList (NamesFile, line => {
|
||||||
@@ -139,7 +138,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
var entry_info_map = new Dictionary<string, HxEntry>();
|
var entry_info_map = new Dictionary<string, HxEntry> ();
|
||||||
for (var i = 0; i < root_obj.Length; i += 2)
|
for (var i = 0; i < root_obj.Length; i += 2)
|
||||||
{
|
{
|
||||||
var path_hash = root_obj[i] as byte[];
|
var path_hash = root_obj[i] as byte[];
|
||||||
@@ -181,7 +180,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return entry_info_map;
|
return entry_info_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal virtual string GetUnicodeName(uint hash)
|
internal virtual string GetUnicodeName (uint hash)
|
||||||
{
|
{
|
||||||
var buf = new char[4];
|
var buf = new char[4];
|
||||||
var i = 0;
|
var i = 0;
|
||||||
@@ -196,7 +195,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal virtual HxFilterKey CreateFilterKey(ulong entry_key, ulong header_key_seed)
|
internal virtual HxFilterKey CreateFilterKey (ulong entry_key, ulong header_key_seed)
|
||||||
{
|
{
|
||||||
var result = new HxFilterKey
|
var result = new HxFilterKey
|
||||||
{
|
{
|
||||||
@@ -209,16 +208,16 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
uint key0 = (uint)(entry_key & 0xffffffff);
|
uint key0 = (uint)(entry_key & 0xffffffff);
|
||||||
uint key1 = (uint)((entry_key >> 32) & 0xffffffff);
|
uint key1 = (uint)((entry_key >> 32) & 0xffffffff);
|
||||||
|
|
||||||
var k0 = ExecuteXCode(key0);
|
var k0 = ExecuteXCode (key0);
|
||||||
result.Key[0] = (ulong)k0.Item1 | ((ulong)k0.Item2 << 32);
|
result.Key[0] = (ulong)k0.Item1 | ((ulong)k0.Item2 << 32);
|
||||||
var k1 = ExecuteXCode(key1);
|
var k1 = ExecuteXCode (key1);
|
||||||
result.Key[1] = (ulong)k1.Item1 | ((ulong)k1.Item2 << 32);
|
result.Key[1] = (ulong)k1.Item1 | ((ulong)k1.Item2 << 32);
|
||||||
|
|
||||||
result.SplitPosition = (long)((this.m_offset + ((entry_key >> 16) & this.m_mask)) & 0xffffffff);
|
result.SplitPosition = (long)((this.m_offset + ((entry_key >> 16) & this.m_mask)) & 0xffffffff);
|
||||||
|
|
||||||
/* create header key */
|
/* create header key */
|
||||||
|
|
||||||
var k3 = ExecuteXCode((uint)header_key_seed);
|
var k3 = ExecuteXCode ((uint)header_key_seed);
|
||||||
var v5 = (ulong)k3.Item1 | ((ulong)k3.Item2 << 32);
|
var v5 = (ulong)k3.Item1 | ((ulong)k3.Item2 << 32);
|
||||||
v5 = ~v5;
|
v5 = ~v5;
|
||||||
|
|
||||||
@@ -227,7 +226,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
result.HeaderKey[i] = (byte)((v5 >> j) & 0xff);
|
result.HeaderKey[i] = (byte)((v5 >> j) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
k3 = ExecuteXCode((uint)v5);
|
k3 = ExecuteXCode ((uint)v5);
|
||||||
v5 = (ulong)k3.Item1 | ((ulong)k3.Item2 << 32);
|
v5 = (ulong)k3.Item1 | ((ulong)k3.Item2 << 32);
|
||||||
v5 = ~v5;
|
v5 = ~v5;
|
||||||
|
|
||||||
@@ -242,7 +241,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal virtual void CreateFilter(Xp3Entry entry)
|
internal virtual void CreateFilter (Xp3Entry entry)
|
||||||
{
|
{
|
||||||
var info = entry.Extra as HxEntry;
|
var info = entry.Extra as HxEntry;
|
||||||
if (null == info)
|
if (null == info)
|
||||||
@@ -257,7 +256,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
info.Filter = new HxFilter (key);
|
info.Filter = new HxFilter (key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Init(ArcFile arc)
|
public override void Init (ArcFile arc)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -271,7 +270,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return base.EntryReadFilter (entry, input);
|
return base.EntryReadFilter (entry, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte Decrypt(Xp3Entry entry, long offset, byte value)
|
public override byte Decrypt (Xp3Entry entry, long offset, byte value)
|
||||||
{
|
{
|
||||||
var info = entry.Extra as HxEntry;
|
var info = entry.Extra as HxEntry;
|
||||||
if (null == info)
|
if (null == info)
|
||||||
@@ -286,7 +285,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return buf[0];
|
return buf[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Decrypt(Xp3Entry entry, long offset, byte[] buffer, int pos, int count)
|
public override void Decrypt (Xp3Entry entry, long offset, byte[] buffer, int pos, int count)
|
||||||
{
|
{
|
||||||
var info = entry.Extra as HxEntry;
|
var info = entry.Extra as HxEntry;
|
||||||
if (null == info)
|
if (null == info)
|
||||||
@@ -299,14 +298,14 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Encrypt(Xp3Entry entry, long offset, byte[] values, int pos, int count)
|
public override void Encrypt (Xp3Entry entry, long offset, byte[] values, int pos, int count)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal override CxProgram NewProgram(uint seed)
|
internal override CxProgram NewProgram (uint seed)
|
||||||
{
|
{
|
||||||
return new HxProgram(seed, ControlBlock, RandomType);
|
return new HxProgram (seed, ControlBlock, RandomType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,7 +347,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
public long Position;
|
public long Position;
|
||||||
public HxBufferSpan Data;
|
public HxBufferSpan Data;
|
||||||
|
|
||||||
bool AdjustHeaderKey(HxHeaderKey key, HxHeaderKey new_key)
|
bool AdjustHeaderKey (HxHeaderKey key, HxHeaderKey new_key)
|
||||||
{
|
{
|
||||||
if (this.Data.Buffer == null)
|
if (this.Data.Buffer == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -382,11 +381,11 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DecryptHeader(HxHeaderKey key)
|
public void DecryptHeader (HxHeaderKey key)
|
||||||
{
|
{
|
||||||
var key2 = new HxHeaderKey();
|
var key2 = new HxHeaderKey ();
|
||||||
|
|
||||||
if (AdjustHeaderKey(key, key2))
|
if (AdjustHeaderKey (key, key2))
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < key2.Length; i++)
|
for (uint i = 0; i < key2.Length; i++)
|
||||||
{
|
{
|
||||||
@@ -396,7 +395,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Split(long split_position, HxFilterSpan[] sub_span)
|
public int Split (long split_position, HxFilterSpan[] sub_span)
|
||||||
{
|
{
|
||||||
if (this.Data.Buffer == null)
|
if (this.Data.Buffer == null)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -445,7 +444,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FirstDecrypt(uint key)
|
public void FirstDecrypt (uint key)
|
||||||
{
|
{
|
||||||
if (this.Data.Buffer == null)
|
if (this.Data.Buffer == null)
|
||||||
return;
|
return;
|
||||||
@@ -453,7 +452,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
if (this.Data.Length == 0)
|
if (this.Data.Length == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var buf = BitConverter.GetBytes(key);
|
var buf = BitConverter.GetBytes (key);
|
||||||
|
|
||||||
for (int i = 0; i < this.Data.Length; i++)
|
for (int i = 0; i < this.Data.Length; i++)
|
||||||
{
|
{
|
||||||
@@ -469,7 +468,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
private uint FirstDecryptKey;
|
private uint FirstDecryptKey;
|
||||||
private uint DecryptKey;
|
private uint DecryptKey;
|
||||||
|
|
||||||
public HxFilterSpanDecryptor(ulong key, bool flag)
|
public HxFilterSpanDecryptor (ulong key, bool flag)
|
||||||
{
|
{
|
||||||
this.DecryptKey = (uint)((key >> 8) & 0xFF);
|
this.DecryptKey = (uint)((key >> 8) & 0xFF);
|
||||||
this.DecryptKey |= (uint)((key >> 8) & 0xFF00);
|
this.DecryptKey |= (uint)((key >> 8) & 0xFF00);
|
||||||
@@ -494,9 +493,9 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
this.FirstDecryptKey *= 0x1010101;
|
this.FirstDecryptKey *= 0x1010101;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Decrypt(HxFilterSpan span)
|
public void Decrypt (HxFilterSpan span)
|
||||||
{
|
{
|
||||||
span.FirstDecrypt(FirstDecryptKey);
|
span.FirstDecrypt (FirstDecryptKey);
|
||||||
|
|
||||||
byte key1 = (byte)(this.DecryptKey & 0xFF);
|
byte key1 = (byte)(this.DecryptKey & 0xFF);
|
||||||
byte key2 = (byte)((this.DecryptKey >> 8) & 0xFF);
|
byte key2 = (byte)((this.DecryptKey >> 8) & 0xFF);
|
||||||
@@ -527,17 +526,17 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
private long SplitPosition;
|
private long SplitPosition;
|
||||||
private HxHeaderKey HeaderKey;
|
private HxHeaderKey HeaderKey;
|
||||||
|
|
||||||
public HxFilter(HxFilterKey key)
|
public HxFilter (HxFilterKey key)
|
||||||
{
|
{
|
||||||
this.Span = new HxFilterSpanDecryptor[2]
|
this.Span = new HxFilterSpanDecryptor[2]
|
||||||
{
|
{
|
||||||
new HxFilterSpanDecryptor(key.Key[0], key.Flag),
|
new HxFilterSpanDecryptor (key.Key[0], key.Flag),
|
||||||
new HxFilterSpanDecryptor(key.Key[1], key.Flag),
|
new HxFilterSpanDecryptor (key.Key[1], key.Flag),
|
||||||
};
|
};
|
||||||
|
|
||||||
this.SplitPosition = key.SplitPosition;
|
this.SplitPosition = key.SplitPosition;
|
||||||
|
|
||||||
this.HeaderKey = new HxHeaderKey();
|
this.HeaderKey = new HxHeaderKey ();
|
||||||
|
|
||||||
if (key.HasHeaderKey)
|
if (key.HasHeaderKey)
|
||||||
{
|
{
|
||||||
@@ -546,7 +545,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Decrypt(long position, byte[] buffer, int buffer_ptr, int length)
|
public void Decrypt (long position, byte[] buffer, int buffer_ptr, int length)
|
||||||
{
|
{
|
||||||
var span = new HxFilterSpan
|
var span = new HxFilterSpan
|
||||||
{
|
{
|
||||||
@@ -562,21 +561,21 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
|
|
||||||
if (span.Position < this.HeaderKey.Position + this.HeaderKey.Length)
|
if (span.Position < this.HeaderKey.Position + this.HeaderKey.Length)
|
||||||
{
|
{
|
||||||
span.DecryptHeader(this.HeaderKey);
|
span.DecryptHeader (this.HeaderKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
var sub_span = new HxFilterSpan[2];
|
var sub_span = new HxFilterSpan[2];
|
||||||
|
|
||||||
var flags = span.Split(this.SplitPosition, sub_span);
|
var flags = span.Split (this.SplitPosition, sub_span);
|
||||||
|
|
||||||
if ((flags & 1) != 0)
|
if ((flags & 1) != 0)
|
||||||
{
|
{
|
||||||
this.Span[0].Decrypt(sub_span[0]);
|
this.Span[0].Decrypt (sub_span[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & 2) != 0)
|
if ((flags & 2) != 0)
|
||||||
{
|
{
|
||||||
this.Span[1].Decrypt(sub_span[1]);
|
this.Span[1].Decrypt (sub_span[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -585,12 +584,12 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
{
|
{
|
||||||
private ulong m_seed;
|
private ulong m_seed;
|
||||||
|
|
||||||
public HxSplittableRandom(ulong seed)
|
public HxSplittableRandom (ulong seed)
|
||||||
{
|
{
|
||||||
m_seed = seed;
|
m_seed = seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ulong Next()
|
public ulong Next ()
|
||||||
{
|
{
|
||||||
ulong z;
|
ulong z;
|
||||||
|
|
||||||
@@ -620,7 +619,7 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
readonly int m_random_method;
|
readonly int m_random_method;
|
||||||
new readonly M64[] m_seed;
|
new readonly M64[] m_seed;
|
||||||
|
|
||||||
public HxProgram(uint seed, uint[] control_block, int random_method) : base(seed, control_block)
|
public HxProgram (uint seed, uint[] control_block, int random_method) : base(seed, control_block)
|
||||||
{
|
{
|
||||||
m_random_method = random_method;
|
m_random_method = random_method;
|
||||||
m_seed = new M64[2];
|
m_seed = new M64[2];
|
||||||
@@ -630,19 +629,19 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
|
|
||||||
var r = new HxSplittableRandom(s);
|
var r = new HxSplittableRandom(s);
|
||||||
|
|
||||||
m_seed[0].u64 = r.Next();
|
m_seed[0].u64 = r.Next ();
|
||||||
m_seed[1].u64 = r.Next();
|
m_seed[1].u64 = r.Next ();
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong GetOldRandom()
|
ulong GetOldRandom ()
|
||||||
{
|
{
|
||||||
/* These codes only work correctly in little endian mode! */
|
/* These codes only work correctly in little endian mode! */
|
||||||
|
|
||||||
var a = new M64();
|
var a = new M64 ();
|
||||||
var b = new M64();
|
var b = new M64 ();
|
||||||
var c = new M64();
|
var c = new M64 ();
|
||||||
var d = new M64();
|
var d = new M64 ();
|
||||||
var e = new M64();
|
var e = new M64 ();
|
||||||
|
|
||||||
ulong t;
|
ulong t;
|
||||||
|
|
||||||
@@ -678,14 +677,14 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong GetNewRandom()
|
ulong GetNewRandom ()
|
||||||
{
|
{
|
||||||
/* These codes only work correctly in little endian mode! */
|
/* These codes only work correctly in little endian mode! */
|
||||||
|
|
||||||
var a = new M64();
|
var a = new M64 ();
|
||||||
var b = new M64();
|
var b = new M64 ();
|
||||||
var c = new M64();
|
var c = new M64 ();
|
||||||
var d = new M64();
|
var d = new M64 ();
|
||||||
|
|
||||||
ulong t;
|
ulong t;
|
||||||
|
|
||||||
@@ -721,12 +720,12 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override uint GetRandom()
|
public override uint GetRandom ()
|
||||||
{
|
{
|
||||||
if (0 == m_random_method)
|
if (0 == m_random_method)
|
||||||
return (uint)GetOldRandom();
|
return (uint) GetOldRandom ();
|
||||||
else
|
else
|
||||||
return (uint)GetNewRandom();
|
return (uint) GetNewRandom ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -743,9 +742,9 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
|
|
||||||
readonly State m_state;
|
readonly State m_state;
|
||||||
|
|
||||||
public HxChachaDecryptor(byte[] key, byte[] nonce, uint[] seed)
|
public HxChachaDecryptor (byte[] key, byte[] nonce, uint[] seed)
|
||||||
{
|
{
|
||||||
m_state = new State();
|
m_state = new State ();
|
||||||
|
|
||||||
var constant = Encoding.ASCII.GetBytes ("expand 32-byte k");
|
var constant = Encoding.ASCII.GetBytes ("expand 32-byte k");
|
||||||
|
|
||||||
@@ -757,91 +756,91 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
Array.Copy (nonce, 0, m_state.Data, 56, 8);
|
Array.Copy (nonce, 0, m_state.Data, 56, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransformState(State src, State dst)
|
void TransformState (State src, State dst)
|
||||||
{
|
{
|
||||||
uint z0, z1, z2, z3, z4, z5, z6, z7,
|
uint z0, z1, z2, z3, z4, z5, z6, z7,
|
||||||
z8, z9, za, zb, zc, zd, ze, zf;
|
z8, z9, za, zb, zc, zd, ze, zf;
|
||||||
|
|
||||||
z0 = LittleEndian.ToUInt32(src.Data, 0);
|
z0 = LittleEndian.ToUInt32 (src.Data, 0);
|
||||||
z1 = LittleEndian.ToUInt32(src.Data, 4);
|
z1 = LittleEndian.ToUInt32 (src.Data, 4);
|
||||||
z2 = LittleEndian.ToUInt32(src.Data, 8);
|
z2 = LittleEndian.ToUInt32 (src.Data, 8);
|
||||||
z3 = LittleEndian.ToUInt32(src.Data, 12);
|
z3 = LittleEndian.ToUInt32 (src.Data, 12);
|
||||||
z4 = LittleEndian.ToUInt32(src.Data, 16);
|
z4 = LittleEndian.ToUInt32 (src.Data, 16);
|
||||||
z5 = LittleEndian.ToUInt32(src.Data, 20);
|
z5 = LittleEndian.ToUInt32 (src.Data, 20);
|
||||||
z6 = LittleEndian.ToUInt32(src.Data, 24);
|
z6 = LittleEndian.ToUInt32 (src.Data, 24);
|
||||||
z7 = LittleEndian.ToUInt32(src.Data, 28);
|
z7 = LittleEndian.ToUInt32 (src.Data, 28);
|
||||||
z8 = LittleEndian.ToUInt32(src.Data, 32);
|
z8 = LittleEndian.ToUInt32 (src.Data, 32);
|
||||||
z9 = LittleEndian.ToUInt32(src.Data, 36);
|
z9 = LittleEndian.ToUInt32 (src.Data, 36);
|
||||||
za = LittleEndian.ToUInt32(src.Data, 40);
|
za = LittleEndian.ToUInt32 (src.Data, 40);
|
||||||
zb = LittleEndian.ToUInt32(src.Data, 44);
|
zb = LittleEndian.ToUInt32 (src.Data, 44);
|
||||||
zc = LittleEndian.ToUInt32(src.Data, 48);
|
zc = LittleEndian.ToUInt32 (src.Data, 48);
|
||||||
zd = LittleEndian.ToUInt32(src.Data, 52);
|
zd = LittleEndian.ToUInt32 (src.Data, 52);
|
||||||
ze = LittleEndian.ToUInt32(src.Data, 56);
|
ze = LittleEndian.ToUInt32 (src.Data, 56);
|
||||||
zf = LittleEndian.ToUInt32(src.Data, 60);
|
zf = LittleEndian.ToUInt32 (src.Data, 60);
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++)
|
for (int i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
// QUARTER(z0, z4, z8, zc);
|
// QUARTER(z0, z4, z8, zc);
|
||||||
z0 += z4; zc = Binary.RotL(zc ^ z0, 16);
|
z0 += z4; zc = Binary.RotL (zc ^ z0, 16);
|
||||||
z8 += zc; z4 = Binary.RotL(z4 ^ z8, 12);
|
z8 += zc; z4 = Binary.RotL (z4 ^ z8, 12);
|
||||||
z0 += z4; zc = Binary.RotL(zc ^ z0, 8);
|
z0 += z4; zc = Binary.RotL (zc ^ z0, 8);
|
||||||
z8 += zc; z4 = Binary.RotL(z4 ^ z8, 7);
|
z8 += zc; z4 = Binary.RotL (z4 ^ z8, 7);
|
||||||
// QUARTER(z1, z5, z9, zd);
|
// QUARTER(z1, z5, z9, zd);
|
||||||
z1 += z5; zd = Binary.RotL(zd ^ z1, 16);
|
z1 += z5; zd = Binary.RotL (zd ^ z1, 16);
|
||||||
z9 += zd; z5 = Binary.RotL(z5 ^ z9, 12);
|
z9 += zd; z5 = Binary.RotL (z5 ^ z9, 12);
|
||||||
z1 += z5; zd = Binary.RotL(zd ^ z1, 8);
|
z1 += z5; zd = Binary.RotL (zd ^ z1, 8);
|
||||||
z9 += zd; z5 = Binary.RotL(z5 ^ z9, 7);
|
z9 += zd; z5 = Binary.RotL (z5 ^ z9, 7);
|
||||||
// QUARTER(z2, z6, za, ze);
|
// QUARTER(z2, z6, za, ze);
|
||||||
z2 += z6; ze = Binary.RotL(ze ^ z2, 16);
|
z2 += z6; ze = Binary.RotL (ze ^ z2, 16);
|
||||||
za += ze; z6 = Binary.RotL(z6 ^ za, 12);
|
za += ze; z6 = Binary.RotL (z6 ^ za, 12);
|
||||||
z2 += z6; ze = Binary.RotL(ze ^ z2, 8);
|
z2 += z6; ze = Binary.RotL (ze ^ z2, 8);
|
||||||
za += ze; z6 = Binary.RotL(z6 ^ za, 7);
|
za += ze; z6 = Binary.RotL (z6 ^ za, 7);
|
||||||
// QUARTER(z3, z7, zb, zf);
|
// QUARTER(z3, z7, zb, zf);
|
||||||
z3 += z7; zf = Binary.RotL(zf ^ z3, 16);
|
z3 += z7; zf = Binary.RotL (zf ^ z3, 16);
|
||||||
zb += zf; z7 = Binary.RotL(z7 ^ zb, 12);
|
zb += zf; z7 = Binary.RotL (z7 ^ zb, 12);
|
||||||
z3 += z7; zf = Binary.RotL(zf ^ z3, 8);
|
z3 += z7; zf = Binary.RotL (zf ^ z3, 8);
|
||||||
zb += zf; z7 = Binary.RotL(z7 ^ zb, 7);
|
zb += zf; z7 = Binary.RotL (z7 ^ zb, 7);
|
||||||
// QUARTER(z0, z5, za, zf);
|
// QUARTER(z0, z5, za, zf);
|
||||||
z0 += z5; zf = Binary.RotL(zf ^ z0, 16);
|
z0 += z5; zf = Binary.RotL (zf ^ z0, 16);
|
||||||
za += zf; z5 = Binary.RotL(z5 ^ za, 12);
|
za += zf; z5 = Binary.RotL (z5 ^ za, 12);
|
||||||
z0 += z5; zf = Binary.RotL(zf ^ z0, 8);
|
z0 += z5; zf = Binary.RotL (zf ^ z0, 8);
|
||||||
za += zf; z5 = Binary.RotL(z5 ^ za, 7);
|
za += zf; z5 = Binary.RotL (z5 ^ za, 7);
|
||||||
// QUARTER(z1, z6, zb, zc);
|
// QUARTER(z1, z6, zb, zc);
|
||||||
z1 += z6; zc = Binary.RotL(zc ^ z1, 16);
|
z1 += z6; zc = Binary.RotL (zc ^ z1, 16);
|
||||||
zb += zc; z6 = Binary.RotL(z6 ^ zb, 12);
|
zb += zc; z6 = Binary.RotL (z6 ^ zb, 12);
|
||||||
z1 += z6; zc = Binary.RotL(zc ^ z1, 8);
|
z1 += z6; zc = Binary.RotL (zc ^ z1, 8);
|
||||||
zb += zc; z6 = Binary.RotL(z6 ^ zb, 7);
|
zb += zc; z6 = Binary.RotL (z6 ^ zb, 7);
|
||||||
// QUARTER(z2, z7, z8, zd);
|
// QUARTER(z2, z7, z8, zd);
|
||||||
z2 += z7; zd = Binary.RotL(zd ^ z2, 16);
|
z2 += z7; zd = Binary.RotL (zd ^ z2, 16);
|
||||||
z8 += zd; z7 = Binary.RotL(z7 ^ z8, 12);
|
z8 += zd; z7 = Binary.RotL (z7 ^ z8, 12);
|
||||||
z2 += z7; zd = Binary.RotL(zd ^ z2, 8);
|
z2 += z7; zd = Binary.RotL (zd ^ z2, 8);
|
||||||
z8 += zd; z7 = Binary.RotL(z7 ^ z8, 7);
|
z8 += zd; z7 = Binary.RotL (z7 ^ z8, 7);
|
||||||
// QUARTER(z3, z4, z9, ze);
|
// QUARTER(z3, z4, z9, ze);
|
||||||
z3 += z4; ze = Binary.RotL(ze ^ z3, 16);
|
z3 += z4; ze = Binary.RotL (ze ^ z3, 16);
|
||||||
z9 += ze; z4 = Binary.RotL(z4 ^ z9, 12);
|
z9 += ze; z4 = Binary.RotL (z4 ^ z9, 12);
|
||||||
z3 += z4; ze = Binary.RotL(ze ^ z3, 8);
|
z3 += z4; ze = Binary.RotL (ze ^ z3, 8);
|
||||||
z9 += ze; z4 = Binary.RotL(z4 ^ z9, 7);
|
z9 += ze; z4 = Binary.RotL (z4 ^ z9, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
LittleEndian.Pack(z0, dst.Data, 0);
|
LittleEndian.Pack (z0, dst.Data, 0);
|
||||||
LittleEndian.Pack(z1, dst.Data, 4);
|
LittleEndian.Pack (z1, dst.Data, 4);
|
||||||
LittleEndian.Pack(z2, dst.Data, 8);
|
LittleEndian.Pack (z2, dst.Data, 8);
|
||||||
LittleEndian.Pack(z3, dst.Data, 12);
|
LittleEndian.Pack (z3, dst.Data, 12);
|
||||||
LittleEndian.Pack(z4, dst.Data, 16);
|
LittleEndian.Pack (z4, dst.Data, 16);
|
||||||
LittleEndian.Pack(z5, dst.Data, 20);
|
LittleEndian.Pack (z5, dst.Data, 20);
|
||||||
LittleEndian.Pack(z6, dst.Data, 24);
|
LittleEndian.Pack (z6, dst.Data, 24);
|
||||||
LittleEndian.Pack(z7, dst.Data, 28);
|
LittleEndian.Pack (z7, dst.Data, 28);
|
||||||
LittleEndian.Pack(z8, dst.Data, 32);
|
LittleEndian.Pack (z8, dst.Data, 32);
|
||||||
LittleEndian.Pack(z9, dst.Data, 36);
|
LittleEndian.Pack (z9, dst.Data, 36);
|
||||||
LittleEndian.Pack(za, dst.Data, 40);
|
LittleEndian.Pack (za, dst.Data, 40);
|
||||||
LittleEndian.Pack(zb, dst.Data, 44);
|
LittleEndian.Pack (zb, dst.Data, 44);
|
||||||
LittleEndian.Pack(zc, dst.Data, 48);
|
LittleEndian.Pack (zc, dst.Data, 48);
|
||||||
LittleEndian.Pack(zd, dst.Data, 52);
|
LittleEndian.Pack (zd, dst.Data, 52);
|
||||||
LittleEndian.Pack(ze, dst.Data, 56);
|
LittleEndian.Pack (ze, dst.Data, 56);
|
||||||
LittleEndian.Pack(zf, dst.Data, 60);
|
LittleEndian.Pack (zf, dst.Data, 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Decrypt(byte[] input, int input_pos, byte[] output, int output_pos, int length)
|
public void Decrypt (byte[] input, int input_pos, byte[] output, int output_pos, int length)
|
||||||
{
|
{
|
||||||
var state = new State ();
|
var state = new State ();
|
||||||
var num_block = length / 64;
|
var num_block = length / 64;
|
||||||
@@ -895,19 +894,19 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
|
|
||||||
internal class HxIndexDeserializer
|
internal class HxIndexDeserializer
|
||||||
{
|
{
|
||||||
public static object Deserialize(Stream stream)
|
public static object Deserialize (Stream stream)
|
||||||
{
|
{
|
||||||
using (var reader = new BinaryReader(stream, Encoding.ASCII, true))
|
using (var reader = new BinaryReader (stream, Encoding.ASCII, true))
|
||||||
{
|
{
|
||||||
var obj = ReadObject(reader);
|
var obj = ReadObject (reader);
|
||||||
Debug.Assert(stream.Position == stream.Length);
|
Debug.Assert (stream.Position == stream.Length);
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static object ReadObject(BinaryReader reader)
|
static object ReadObject (BinaryReader reader)
|
||||||
{
|
{
|
||||||
var type = reader.ReadByte();
|
var type = reader.ReadByte ();
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
@@ -921,88 +920,88 @@ namespace GameRes.Formats.KiriKiri
|
|||||||
}
|
}
|
||||||
case 0x02:
|
case 0x02:
|
||||||
{
|
{
|
||||||
return ReadString(reader);
|
return ReadString (reader);
|
||||||
}
|
}
|
||||||
case 0x03:
|
case 0x03:
|
||||||
{
|
{
|
||||||
return ReadByteArray(reader);
|
return ReadByteArray (reader);
|
||||||
}
|
}
|
||||||
case 0x04:
|
case 0x04:
|
||||||
{
|
{
|
||||||
return ReadInt64(reader);
|
return ReadInt64 (reader);
|
||||||
}
|
}
|
||||||
case 0x05:
|
case 0x05:
|
||||||
{
|
{
|
||||||
return ReadInt64(reader);
|
return ReadInt64 (reader);
|
||||||
}
|
}
|
||||||
case 0x81:
|
case 0x81:
|
||||||
{
|
{
|
||||||
return ReadArray(reader);
|
return ReadArray (reader);
|
||||||
}
|
}
|
||||||
case 0xC1:
|
case 0xC1:
|
||||||
{
|
{
|
||||||
return ReadDictionary(reader);
|
return ReadDictionary (reader);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
throw new Exception("unknown object type");
|
throw new Exception ("unknown object type");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static object ReadByteArray(BinaryReader reader)
|
static object ReadByteArray (BinaryReader reader)
|
||||||
{
|
{
|
||||||
var count = ReadInt32(reader);
|
var count = ReadInt32 (reader);
|
||||||
var array = reader.ReadBytes(count);
|
var array = reader.ReadBytes (count);
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
static object ReadArray(BinaryReader reader)
|
static object ReadArray (BinaryReader reader)
|
||||||
{
|
{
|
||||||
var count = ReadInt32(reader);
|
var count = ReadInt32 (reader);
|
||||||
|
|
||||||
var array = new List<object>(count);
|
var array = new List<object> (count);
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
var obj = ReadObject(reader);
|
var obj = ReadObject (reader);
|
||||||
array.Add(obj);
|
array.Add (obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return array.ToArray();
|
return array.ToArray ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static object ReadDictionary(BinaryReader reader)
|
static object ReadDictionary (BinaryReader reader)
|
||||||
{
|
{
|
||||||
var count = ReadInt32(reader);
|
var count = ReadInt32 (reader);
|
||||||
|
|
||||||
var dictionary = new Dictionary<string, object>(count);
|
var dictionary = new Dictionary<string, object> (count);
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
var name = ReadString(reader);
|
var name = ReadString (reader);
|
||||||
var obj = ReadObject(reader);
|
var obj = ReadObject (reader);
|
||||||
dictionary.Add(name, obj);
|
dictionary.Add (name, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dictionary;
|
return dictionary;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ReadInt32(BinaryReader reader)
|
static int ReadInt32 (BinaryReader reader)
|
||||||
{
|
{
|
||||||
return Binary.BigEndian(reader.ReadInt32());
|
return Binary.BigEndian (reader.ReadInt32 ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static long ReadInt64(BinaryReader reader)
|
static long ReadInt64 (BinaryReader reader)
|
||||||
{
|
{
|
||||||
return Binary.BigEndian(reader.ReadInt64());
|
return Binary.BigEndian (reader.ReadInt64 ());
|
||||||
}
|
}
|
||||||
|
|
||||||
static string ReadString(BinaryReader reader)
|
static string ReadString (BinaryReader reader)
|
||||||
{
|
{
|
||||||
var length = ReadInt32(reader);
|
var length = ReadInt32 (reader);
|
||||||
var buffer = reader.ReadBytes(sizeof(short) * length);
|
var buffer = reader.ReadBytes (sizeof(short) * length);
|
||||||
return Encoding.Unicode.GetString(buffer);
|
return Encoding.Unicode.GetString (buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user