implemented external storage of resource schemes.

This commit is contained in:
morkt 2015-09-18 01:27:53 +04:00
parent eef86f0804
commit 9a8bff184d
32 changed files with 478 additions and 1431 deletions

View File

@ -1,6 +1,6 @@
// Game Resource Browser // Game Resource Browser
// //
// Copyright (C) 2014 by morkt // Copyright (C) 2014-2015 by morkt
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
@ -23,15 +23,12 @@
using System; using System;
using System.IO; using System.IO;
using System.Configuration; using System.Linq;
using System.Collections.Generic;
using System.Windows; using System.Windows;
using System.Windows.Threading;
using System.Reflection;
using System.Diagnostics; using System.Diagnostics;
using GARbro.GUI.Strings;
using GARbro.GUI.Properties; using GARbro.GUI.Properties;
using GameRes; using GameRes;
using GameRes.Compression;
namespace GARbro.GUI namespace GARbro.GUI
{ {
@ -51,9 +48,9 @@ namespace GARbro.GUI
void ApplicationStartup (object sender, StartupEventArgs e) void ApplicationStartup (object sender, StartupEventArgs e)
{ {
string exe_dir = Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly().Location);
#if DEBUG #if DEBUG
string trace_dir = Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly().Location); Trace.Listeners.Add (new TextWriterTraceListener (Path.Combine (exe_dir, "trace.log")));
Trace.Listeners.Add (new TextWriterTraceListener (Path.Combine (trace_dir, "trace.log")));
Trace.AutoFlush = true; Trace.AutoFlush = true;
#endif #endif
Trace.WriteLine ("ApplicationStartup --------------------------------", "GARbro.GUI.App"); Trace.WriteLine ("ApplicationStartup --------------------------------", "GARbro.GUI.App");
@ -80,11 +77,36 @@ namespace GARbro.GUI
if (string.IsNullOrEmpty (InitPath)) if (string.IsNullOrEmpty (InitPath))
InitPath = Directory.GetCurrentDirectory(); InitPath = Directory.GetCurrentDirectory();
string scheme_file = Path.Combine (exe_dir, "Formats.dat");
try
{
using (var file = File.OpenRead (scheme_file))
DeserializeScheme (file);
}
catch (Exception X)
{
Trace.WriteLine (X.Message, "scheme deserialization");
}
} }
void ApplicationExit (object sender, ExitEventArgs e) void ApplicationExit (object sender, ExitEventArgs e)
{ {
Settings.Default.Save(); Settings.Default.Save();
} }
void DeserializeScheme (Stream file)
{
using (var reader = new BinaryReader (file))
{
var scheme_id = FormatCatalog.Instance.SchemeID;
var header = reader.ReadChars (scheme_id.Length);
if (!header.SequenceEqual (scheme_id))
throw new FormatException ("Invalid serialization file");
int version = reader.ReadInt32();
using (var zs = new ZLibStream (file, CompressionMode.Decompress))
FormatCatalog.Instance.DeserializeScheme (zs);
}
}
} }
} }

View File

@ -44,6 +44,20 @@ namespace GameRes.Formats.AVC
} }
} }
[Serializable]
public class ArchiveScheme
{
public string Password;
public int KeyOffset;
public int HeaderOffset;
};
[Serializable]
public class AvcScheme : ResourceScheme
{
public ArchiveScheme[] KnownSchemes;
}
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class DatOpener : ArchiveFormat public class DatOpener : ArchiveFormat
{ {
@ -177,19 +191,13 @@ namespace GameRes.Formats.AVC
return dir; return dir;
} }
internal class Scheme internal static ArchiveScheme[] KnownSchemes = new ArchiveScheme[0];
{ }
public string Password;
public int KeyOffset;
public int HeaderOffset;
};
private static readonly Scheme[] KnownSchemes = new Scheme[] { public override ResourceScheme Scheme
new Scheme { Password="SETSUEI-", KeyOffset=0x08, HeaderOffset=0x10 }, // Setsuei {
new Scheme { Password="CHOKOPAI", KeyOffset=0x35, HeaderOffset=0x51 }, // Chokotto*Vampire! get { return new AvcScheme { KnownSchemes = AdvReader.KnownSchemes }; }
new Scheme { Password="ClOVeRrE", KeyOffset=0x11, HeaderOffset=0x46 }, // Clover Point set { AdvReader.KnownSchemes = ((AvcScheme)value).KnownSchemes; }
new Scheme { Password="-AYASEKE", KeyOffset=0x0c, HeaderOffset=0x15 }, // Ayase Ke no Onna
};
} }
} }
} }

View File

@ -323,12 +323,6 @@
<Name>GameRes</Name> <Name>GameRes</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\ShiinaRio4.jpg" />
<EmbeddedResource Include="Resources\ShiinaRio1.png" />
<EmbeddedResource Include="Resources\ShiinaRio2.png" />
<EmbeddedResource Include="Resources\ShiinaRio3.jpg" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" /> <None Include="app.config" />
<None Include="packages.config" /> <None Include="packages.config" />
@ -336,9 +330,6 @@
<Generator>PublicSettingsSingleFileGenerator</Generator> <Generator>PublicSettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput> <LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None> </None>
<EmbeddedResource Include="Resources\DecodeV1.bin" />
<EmbeddedResource Include="Resources\DecodeV241.bin" />
<EmbeddedResource Include="Resources\DecodeV249.bin" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Include="Amaterasu\CreateAMIWidget.xaml"> <Page Include="Amaterasu\CreateAMIWidget.xaml">
@ -441,9 +432,6 @@
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Strings\arcStrings.ru-RU.resx" /> <EmbeddedResource Include="Strings\arcStrings.ru-RU.resx" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\ShiinaRio5.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PreBuildEvent>perl "$(SolutionDir)inc-revision.pl" "$(ProjectPath)" $(ConfigurationName)</PreBuildEvent> <PreBuildEvent>perl "$(SolutionDir)inc-revision.pl" "$(ProjectPath)" $(ConfigurationName)</PreBuildEvent>

View File

@ -48,7 +48,20 @@ namespace GameRes.Formats.CatSystem
} }
} }
[Serializable()] [Serializable]
public struct KeyData
{
public uint Key;
public string Passphrase;
}
[Serializable]
public class IntScheme : ResourceScheme
{
public Dictionary<string, KeyData> KnownKeys;
}
[Serializable]
public class IntEncryptionInfo public class IntEncryptionInfo
{ {
public uint? Key { get; set; } public uint? Key { get; set; }
@ -62,7 +75,7 @@ namespace GameRes.Formats.CatSystem
if (!string.IsNullOrEmpty (Scheme)) if (!string.IsNullOrEmpty (Scheme))
{ {
IntOpener.KeyData keydata; KeyData keydata;
if (IntOpener.KnownSchemes.TryGetValue (Scheme, out keydata)) if (IntOpener.KnownSchemes.TryGetValue (Scheme, out keydata))
return keydata.Key; return keydata.Key;
} }
@ -298,18 +311,13 @@ namespace GameRes.Formats.CatSystem
return key; return key;
} }
public struct KeyData public static Dictionary<string, KeyData> KnownSchemes = new Dictionary<string, KeyData>();
{
public uint Key;
public string Passphrase;
}
public static readonly Dictionary<string, KeyData> KnownSchemes = new Dictionary<string, KeyData> { public override ResourceScheme Scheme
{ "Grisaia no Kajitsu", new KeyData { Key=0x1DAD9120, Passphrase="FW-6JD55162" }}, {
{ "Shukufuku no Campanella", new KeyData { Key=0x4260E643, Passphrase="CAMPANELLA" }}, get { return new IntScheme { KnownKeys = KnownSchemes }; }
{ "Makai Tenshi Djibril -Episode 4-", new KeyData { Key=0xA5A166AA, Passphrase="FW_MAKAI-TENSHI_DJIBRIL4" }}, set { KnownSchemes = ((IntScheme)value).KnownKeys; }
{ "Sengoku Tenshi Djibril (trial)", new KeyData { Key=0xef870610, Passphrase="FW-8O9B6WDS" }}, }
};
public override ResourceOptions GetDefaultOptions () public override ResourceOptions GetDefaultOptions ()
{ {

View File

@ -36,7 +36,7 @@ namespace GameRes.Formats.GUI
void OnSchemeChanged (object sender, SelectionChangedEventArgs e) void OnSchemeChanged (object sender, SelectionChangedEventArgs e)
{ {
var widget = sender as ComboBox; var widget = sender as ComboBox;
IntOpener.KeyData keydata; KeyData keydata;
if (IntOpener.KnownSchemes.TryGetValue (widget.SelectedItem as string, out keydata)) if (IntOpener.KnownSchemes.TryGetValue (widget.SelectedItem as string, out keydata))
{ {
Passphrase.TextChanged -= OnPassphraseChanged; Passphrase.TextChanged -= OnPassphraseChanged;

View File

@ -40,6 +40,7 @@ namespace GameRes.Formats.Dac
public uint Key2; public uint Key2;
} }
[Serializable]
public class DpkScheme public class DpkScheme
{ {
public uint Key1 { get; set; } public uint Key1 { get; set; }
@ -48,6 +49,12 @@ namespace GameRes.Formats.Dac
public string OriginalTitle { get; set; } public string OriginalTitle { get; set; }
} }
[Serializable]
public class ArchiveScheme : ResourceScheme
{
public DpkScheme[] KnownSchemes;
}
internal class DpkEntry : Entry internal class DpkEntry : Entry
{ {
public uint Hash; public uint Hash;
@ -75,27 +82,7 @@ namespace GameRes.Formats.Dac
public override bool IsHierarchic { get { return true; } } public override bool IsHierarchic { get { return true; } }
public override bool CanCreate { get { return false; } } public override bool CanCreate { get { return false; } }
public static readonly DpkScheme[] KnownSchemes = new DpkScheme[] public static DpkScheme[] KnownSchemes = new DpkScheme[0];
{
new DpkScheme { Key1 = 0x0FF98, Name = arcStrings.ArcDefault,
Key2 = 0x43E78A5C },
new DpkScheme { Key1 = 0x0C3BD, Name = "Inbou no Wakusei",
Key2 = 0x577D4861, OriginalTitle = "淫暴の惑星~破壊と欲望の衝動~" },
new DpkScheme { Key1 = 0x04D49, Name = "Ryoshuu",
Key2 = 0x39712FED, OriginalTitle = "虜囚 -RYOSYU-" },
new DpkScheme { Key1 = 0x11EAF, Name = "Ryobaku ~Haitoku no Atelier~",
Key2 = 0xB9976112, OriginalTitle = "虜縛~背徳のアトリエ~" },
new DpkScheme { Key1 = 0x0527F, Name = "Ryoshuu ~Jogakusei Choukyou~",
Key2 = 0x339B266F, OriginalTitle = "虜讐~女学生調教~" },
new DpkScheme { Key1 = 0x0946E, Name = "Shirogane no Cal to Soukuu no Joou",
Key2 = 0xB1956783, OriginalTitle = "白銀のカルと蒼空の女王" },
new DpkScheme { Key1 = 0x0BB51, Name = "Shiromiko",
Key2 = 0x891F52A3, OriginalTitle = "白神子 ~しろみこ~" },
new DpkScheme { Key1 = 0x09F59, Name = "Shoujotachi no Saezuri",
Key2 = 0x5DDE9B8D, OriginalTitle = "少女達のさえずり" },
new DpkScheme { Key1 = 0x0583F, Name = "Yumemiru Tsuki no Lunalutia",
Key2 = 0xB81031D7, OriginalTitle = "夢みる月のルナルティア" },
};
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
@ -229,5 +216,22 @@ namespace GameRes.Formats.Dac
{ {
return new GUI.WidgetDPK(); return new GUI.WidgetDPK();
} }
public override ResourceScheme Scheme
{
get
{
var known = KnownSchemes.Clone() as DpkScheme[];
// first entry should be a default scheme, replace localized "Name" field
known[0] = new DpkScheme { Name = known[0].Name, Key1 = known[0].Key1, Key2 = known[0].Key2 };
return new ArchiveScheme { KnownSchemes = known };
}
set
{
KnownSchemes = ((ArchiveScheme)value).KnownSchemes;
if (string.IsNullOrEmpty (KnownSchemes[0].Name))
KnownSchemes[0].Name = arcStrings.ArcDefault;
}
}
} }
} }

View File

@ -59,6 +59,12 @@ namespace GameRes.Formats.Entis
} }
} }
[Serializable]
public class NoaScheme : ResourceScheme
{
public Dictionary<string, Dictionary<string, string>> KnownKeys;
}
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class NoaOpener : ArchiveFormat public class NoaOpener : ArchiveFormat
{ {
@ -73,30 +79,8 @@ namespace GameRes.Formats.Entis
Extensions = new string[] { "noa", "dat" }; Extensions = new string[] { "noa", "dat" };
} }
public static readonly Dictionary<string, Dictionary<string, string>> KnownKeys = public static Dictionary<string, Dictionary<string, string>> KnownKeys =
new Dictionary<string, Dictionary<string, string>> { new Dictionary<string, Dictionary<string, string>>();
{ arcStrings.NOAIgnoreEncryption, new Dictionary<string, string>() },
{ "Alea Akaki Tsuki o Haruka ni Nozomi", new Dictionary<string, string> {
{ "data2.noa", "pnnAiYVqktMdLlVq9pnrXs1795vhu8ZluLh3MxmXyBBrhrhLoP2rlGn5dxcBP6d1cAAz08TMRIXNUFatVdJFWAwVphtAh4hx5NHMmLs8LoBE2KHAA8GnKJB1PpKeyMHu" },
{ "data4.noa", "yEbgydEFtIq3YiGUNMpCarJwR9mZbufPrbXtsoqbrJwT4F278kOWIgYzLtm1nP1Hns81u3F4Stwc42gdtrWIbnp9XfX3LsKiZe1TFUyrlTqsbhX8R8dEAVxLk9SVvCE7" } } },
{ "Do S Ane to Boku no Hounyou Kankei", new Dictionary<string, string> {
{ "d02.dat", "vwerc7s65r21bnfu" },
{ "d03.dat", "ctfvgbhnj67y8u" } } },
{ "Innyuu Famiresu", new Dictionary<string, string> {
{ "d01.dat", "vdiu$43AfUCfh9aksf" },
{ "d03.dat", "gaivnwq7365e021gf" } } },
{ "Konneko", new Dictionary<string, string> {
{ "script.noa", "convini_cat" } } },
{ "Santaful☆Summer", new Dictionary<string, string> {
{ "data02.noa", "20130611VER1" },
{ "data03.noa", "20130611VER2" } } },
{ "Yatohime Zankikou", new Dictionary<string, string> {
{ "data1.noa", "arcdatapass" },
{ "data6.noa", "cfe7231hf9qccda" },
{ "data7.noa", "ceiuvw86680efq0hHDUHF673j" } } },
{ "You! Apron Chakuyou", new Dictionary<string, string> {
{ "containerb.noa", "7DQ1Xm7ZahIv1ZwlFgyMTMryKC6OP9V6cAgL64WD5JLyvmeEyqTSA5rUbRigOtebnnK4MuOptwsbOf4K8UBDH4kpAUOQgB71Qr1qxtHGxQl8KZKj6WIYWpPh0G3JOJat" } } },
};
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
@ -299,6 +283,12 @@ namespace GameRes.Formats.Entis
return true; return true;
} }
} }
public override ResourceScheme Scheme
{
get { return new NoaScheme { KnownKeys = KnownKeys }; }
set { KnownKeys = ((NoaScheme)value).KnownKeys; }
}
} }
internal abstract class ERISADecodeContext internal abstract class ERISADecodeContext

View File

@ -4,7 +4,7 @@
xmlns:entis="clr-namespace:GameRes.Formats.Entis" xmlns:entis="clr-namespace:GameRes.Formats.Entis"
xmlns:p="clr-namespace:GameRes.Formats.Properties" xmlns:p="clr-namespace:GameRes.Formats.Properties"
MaxWidth="300"> MaxWidth="300">
<ComboBox Name="Scheme" ItemsSource="{Binding Source={x:Static entis:NoaOpener.KnownKeys}, Path=Keys, Mode=OneWay}" <ComboBox Name="Scheme" ItemsSource="{Binding}"
SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=NOAScheme, Mode=TwoWay}" SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=NOAScheme, Mode=TwoWay}"
Width="200"/> Width="200"/>
</Grid> </Grid>

View File

@ -1,4 +1,7 @@
using System.Windows.Controls; using GameRes.Formats.Entis;
using GameRes.Formats.Strings;
using System.Linq;
using System.Windows.Controls;
namespace GameRes.Formats.GUI namespace GameRes.Formats.GUI
{ {
@ -10,6 +13,8 @@ namespace GameRes.Formats.GUI
public WidgetNOA () public WidgetNOA ()
{ {
InitializeComponent (); InitializeComponent ();
var keys = new string[] { arcStrings.NOAIgnoreEncryption };
Scheme.ItemsSource = keys.Concat (NoaOpener.KnownKeys.Keys.OrderBy (x => x));
// select first scheme as default // select first scheme as default
if (-1 == Scheme.SelectedIndex) if (-1 == Scheme.SelectedIndex)
Scheme.SelectedIndex = 0; Scheme.SelectedIndex = 0;

View File

@ -93,6 +93,12 @@ namespace GameRes.Formats.Ikura
} }
} }
[Serializable]
public class IsfScheme : ResourceScheme
{
public Dictionary<string, byte[]> KnownSecrets;
}
internal class IsfOptions : ResourceOptions internal class IsfOptions : ResourceOptions
{ {
public byte[] Secret; public byte[] Secret;
@ -171,11 +177,11 @@ namespace GameRes.Formats.Ikura
public override Stream OpenEntry (ArcFile arc, Entry entry) public override Stream OpenEntry (ArcFile arc, Entry entry)
{ {
if (!(arc is IsfArchive) || entry.Type != "script" || entry.Size <= 0x10) var isf = arc as IsfArchive;
if (null == isf || entry.Type != "script" || entry.Size <= 0x10)
return arc.File.CreateStream (entry.Offset, entry.Size); return arc.File.CreateStream (entry.Offset, entry.Size);
bool encoded = arc.File.View.AsciiEqual (entry.Offset+entry.Size-0x10, "SECRETFILTER100a"); bool encoded = arc.File.View.AsciiEqual (entry.Offset+entry.Size-0x10, "SECRETFILTER100a");
uint entry_size = entry.Size; uint entry_size = entry.Size;
var isf = arc as IsfArchive;
if (encoded) if (encoded)
{ {
entry_size -= 0x10; entry_size -= 0x10;
@ -211,7 +217,7 @@ namespace GameRes.Formats.Ikura
public override ResourceOptions GetDefaultOptions () public override ResourceOptions GetDefaultOptions ()
{ {
return new IsfOptions { return new IsfOptions {
Secret = GetSecret (Settings.Default.ISFScheme), Secret = GetSecret (Settings.Default.ISFScheme) ?? new byte[0]
}; };
} }
@ -240,13 +246,13 @@ namespace GameRes.Formats.Ikura
data[i] = (byte)method (data[i]); data[i] = (byte)method (data[i]);
} }
public static readonly Dictionary<string, byte[]> KnownSecrets = new Dictionary<string, byte[]> public static Dictionary<string, byte[]> KnownSecrets = new Dictionary<string, byte[]>();
public override ResourceScheme Scheme
{ {
{ arcStrings.ISFIgnoreEncryption, new byte[0] }, get { return new IsfScheme { KnownSecrets = KnownSecrets }; }
{ "Anata no Osanazuma", Encoding.ASCII.GetBytes("UOB0GMVM8K812GZP1VJCADNP2LX543R3BPOSMRU6BAKIVYB6W2JRRQFHN3YC5NSV5AITT6OXIDOW0YROTRT7MFJ45R1VYFF71MGI4XIOUZC511R0HAJC6WZU0EZEUUH0K7AT0U749KIOVLF5FA4C3BFXM2T4G8F57SW5EG64LU9GXRKZ2O0YGN7QA4QRUMALDFFJJ6NHLTVYYHKHRMWERQ8K782KITVCCH2G65C2WRQ85HINSMLHW06TIBADAGLEDK9YDARS47ET2A6JAF4I8WAW7K1FIXISKJKNNC0KP1MSO5Y6C2JBEFIA7G5NTECMXMNLYSTC0D9SF6VNXW7ALIGEBRJFDUGZE9FILWM4BMDY25N3YHKCAUBSBJBMMZX0T7XHAQHXUF3ZUROO5P6WGU2YU3RPICFVXGAA646TOTT2DEXK9RTXFQ8IE1BNC7ARDCW4TP2US01YN84ZV1FYWJ10HAJZUPKYQF7R5V654IEX39K6HC1Z32C3FZ6Q5NVNELWIJT9VG6QRK89FJLXLKUPFJL4GROK7TZQ7QHM6J3ZU9NU0B5GV8A9PXUFAO9KW80Q6WNABYMA1VVNC2J5GHHWNPQ9U7LK3TF0CMSYGAFYPGZLPXNPH3D41VL1A3NU6N6S3V9XXYFESEUCKYK0NAM1MBZ9BJ6AMQKKF25719V8RN54C1Q27LRI8SSK62RKSZ4VTYAE2J87LFAVI2U1V21YQ13ULOQW86PH9RDUEVA7UEJ6JTU7X1GJYNC1VR66F2EAC3TFGC4AKOVAZW137EW0V6AAU201X7ND3YTUNX2QBR24DXXC1BWTEZUXVTXNB63W5RD9GIQV9IP6CDDPAEW2IGADTKBW7DPANCAOBU18Z84PHLF6EQ2H7S7A2DHC75Q1AX4NSN7JQNGJGXHTAOBHI5DDMME5ZQPT856DEIMM6VM8XI8WE4E4JKYMY5W7ABEH82LSRX4GKFAYNHLUSBT4C0A215KZTVX1K49EHAO8O7YJCUS8YVVU2B3XG8QOBQMUJBJ3IH1XWH6FM29OLYS9DHMZ83PJVRM0M7JH7RAQDV9DS4FJ2IF27CCVZZBVX18AHEQDI8486Y3NETMBG3LBF41FTGMVXNC7R914HXOHFQYQ4EDUKJ4VJJWGIE63H12VG3361832LZO6KFAHMEFPZK6BAJ643VJWZT4Z4QS3JAUM5P5394MS2GDVP9IJ727D6831GDB9NYONACW2ITF51S2LTUQ05XJ18WJUSABOJ51W9QODRH9R1D1CZB175ZEWTAIZRLIGFSVFCIHNBUJB0Z5LWDTNGW5505H1K8CROH1YGNFC4CW760NK9TWIWX9M6QFLZZKFCSP7RCEJ5DT854MJ6T55ODQ98NQB5MKFQYXM44D5ZYX0RMHPWKTHJVUEFA9WBQVLLZT0DR7P4XXQPQTMU0CC9C3VFYI0L5390P887CXEFY5MJYBGUUWLK123ANOE220DLPK5B7SU6GMXR3UV6K931FJ0I6JVLWLBADZO6Z381MZXR8E2IFVS4AH0Z5N72DV3GV9QAMDB5EJYUQ6RVHTN9OY50W378H67U4SAY9AAXM9C67I7SKWLQW7W9MOSQIUMNVNCGEN0CRRIXMV62AGPRLNBU8VT41HYGMNXZTHQO6CU15X121MYGOTZAFR8WVT98M33KJVBOZXRI9FMG03HUAF0IQ4ZF6P5EZ4X6V45E14R4RDBA59DVWD2UED1ZB6SRJDKREO4F05CMOV1465RCANAZHLHR0FVHV86126OODW2MB67UNGS1GGD3UHBV7TL8GRWQZBTHCZHQBPUSUJPKO5LQ4HM95UOZGL0FL30LXL6CK2FOTEQIK6PTNMJVE5G7U3PONIA6WMSV7YZLHO4CZ8ZPOL7JRJOOD79U5T7RVKYJQB54GR5E23964QRYA1POKM19EEWC6MFIU5Y75J5Y9QXER3HQFQEURNB7XTYAZMWWJO25SPI7AAVX3BKERW6817IQMRKD533O6ANRDIL840HSGRAG9ZX9AX1XK1DRE6URAGE5NWT0") }, set { KnownSecrets = ((IsfScheme)value).KnownSecrets; }
{ "Kohitsuji-tachi no Rakuen", Encoding.ASCII.GetBytes("UOB0GMVM8K812GZP1VJCADNP2LX543R3BPOSMRU6BAKIVYB6W2JRRQFHN3YC5NSV5AITT6OXIDOW0YROTRT7MFJ45R1VYFF71MGI4XIOUZC511R0HAJC6WZU0EZEUUH0K7AT0U749KIOVLF5FA4C3BFXM2T4G8F57SW5EG64LU9GXRKZ2O0YGN7QA4QRUMALDFFJJ6NHLTVYYHKHRMWERQ8K782KITVCCH2G65C2WRQ85HINSMLHW06TIBADAGLEDK9YDARS47ET2A6JAF4I8WAW7K1FIXISKJKNNC0KP1MSO5Y6C2JBEFIA7G5NTECMXMNLYSTC0D9SF6VNXW7ALIGEBRJFDUGZE9FILWM4BMDY25N3YHKCAUBSBJBMMZX0T7XHAQHXUF3ZUROO5P6WGU2YU3RPICFVXGAA646TOTT2DEXK9RTXFQ8IE1BNC7ARDCW4TP2US01YN84ZV1FYWJ10HAJZUPKYQF7R5V654IEX39K6HC1Z32C3FZ6Q5NVNELWIJT9VG6QRK89FJLXLKUPFJL4GROK7TZQ7QHM6J3ZU9NU0B5GV8A9PXUFAO9KW80Q6WNABYMA1VVNC2J5GHHWNPQ9U7LK3TF0CMSYGAFYPGZLPXNPH3D41VL1A3NU6N6S3V9XXYFESEUCKYK0NAM1MBZ9BJ6AMQKKF25719V8RN54C1Q27LRI8SSK62RKSZ4VTYAE2J87LFAVI2U1V21YQ13ULOQW86PH9RDUEVA7UEJ6JTU7X1GJYNC1VR66F2EAC3TFGC4AKOVAZW137EW0V6AAU201X7ND3YTUNX2QBR24DXXC1BWTEZUXVTXNB63W5RD9GIQV9IP6CDDPAEW2IGADTKBW7DPANCAOBU18Z84PHLF6EQ2H7S7A2DHC75Q1AX4NSN7JQNGJGXHTAOBHI5DDMME5ZQPT856DEIMM6VM8XI8WE4E4JKYMY5W7ABEH82LSRX4GKFAYNHLUSBT4C0A215KZTVX1K49EHAO8O7YJCUS8YVVU2B3XG8QOBWX2M9EU89MDEKNJM6CZZOTMX6W2Z80U2YOMI98N2N48BFS9KYULOD622RBHZ6MWRH6MR27KWXBTG0LLXZC5URNW4LXA1M9O1SLX2T3J7V5H6HUIYNVOO77EF06EIGC3HCYO962958KT0INSLCHGOQ7NX9E116QSFI6ADEQ7KVCMMCMYHK0ZESHJAPTQERP8RT6FK73NVN62UQPDURB6LD7PSON8GPXL2QN45XJL9DOKOYB4MG23520LELWMA4IWMZEZEU0Z833SR1YZG2F0BBBV3MP6F4HB0JNCMRC6WINVVTJ19JC1RM9500IOB52ALK78X4JSOTVW0NZC84TOE7YM6GIVFJ89TIDEHSHWKYAH8TH8TKOCLE7BUQAZ5W51R1E5EQMHZYZGB8IR7I5KZENM6EEJBYWGZTJ7XFS9YV2X8FTQ9PD5FYBO41C7XX0ANKTHHU9P6TGA0COPGVF4XBNB79K34NFXL0A8NIN63X07XKO1YR8XN9JAMPCG9CHPBYVX5J1OOCIMC6VWM5P5U68083XXSXWLY7DDVHV4MAMRTQP7VWMS1VDRJ2ECBPTFBMINVH14AYX61F1NWVLZTR2JQFTVNMSSV1X3B6T3NLWNXV3RFWA9YRS6NW4ZQ3S3PD6BKSV7EJX8F9KQXY5DECF8QA5CO26HLJOA50BIS2BBRDHPJYKE8G845HNZO1PW0KT5Q3NPUJAJ8FCFYWVOONZYO9A662K1ZETE4URC6BWSC81KLTAS6YPPSLMIROBGA2USAJXS1U8BQ3UHKPXN9YY1LD3R3YZEANZDD2X3DK6K7VFEKORGMSNHTK544IYX288GPSU6SXKBPYW70USN614AX5ZYTJ0WCXFNOK7OJF3LD9ROVBTZXX2KY5UZFODYFWETXXY3IMHRF8YCWAKG25N3OMS585NHECT47RGL937FBURHFXQEWXEIGOVOSPUPXG91FLE80ERFMLW7GHTEY1A9CDX5QMFJBHB9OHZSN7H03JJBN8CAVRMG1VTDVO6SL") }, }
{ "Natsu no Hitoshizuku", Encoding.ASCII.GetBytes("UOB0GMVM8K812GZP1VJCADNP2LX543R3BPOSMRU6BAKIVYB6W2JRRQFHN3YC5NSV5AITT6OXIDOW0YROTRT7MFJ45R1VYFF71MGI4XIOUZC511R0HAJC6WZU0EZEUUH0K7AT0U749KIOVLF5FA4C3BFXM2T4G8F57SW5EG64LU9GXRKZ2O0YGN7QA4QRUMALDFFJJ6NHLTVYYHKHRMWERQ8K782KITVCCH2G65C2WRQ85HINSMLHW06TIBADAGLEDK9YDARS47ET2A6JAF4I8WAW7K1FIXISKJKNNC0KP1MSO5Y6C2JBEFIA7G5NTECMXMNLYSTC0D9SF6VNXW7ALIGEBRJFDUGZE9FILWM4BMDY25N3YHKCAUBSBJBMMZX0T7XHAQHXUF3ZUROO5P6WGU2YU3RPICFVXGAA646TOTT2DEXK9RTXFQ8IE1BNC7ARDCW4TP2US01YN84ZV1FYWJ10HAJZUPKYQF7R5V654IEX39K6HC1Z32C3FZ6Q5NVNELWIJT9VG6QRK89FJLXLKUPFJL4GROK7TZQ7QHM6J3ZU9NU0B5GV8A9PXUFAO9KW80Q6WNABYMA1VVNC2J5GHHWNPQ9U7LK3TF0CMSYGAFYPGZLPXNPH3D41VL1A3NU6N6S3V9XXYFESEUCKYK0NAM1MBZ9BJ6AMQKKF25719V8RN54C1Q27LRI8SSK62RKSZ4VTYAE2J87LFAVI2U1V21YQ13ULOQW86PH9RDUEVA7UEJ6JTU7X1GJYNC1VR66F2EAC3TFGC4AKOVAZW137EW0V6AAU201X7ND3YTUNX2QBR24DXXC1BWTEZUXVTXNB63W5RD9GIQV9IP6CDDPAEW2IGADTKBW7DPANCAOBU18Z84PHLF6EQ2H7S7A2DHC75Q1AX4NSN7JQNGJGXHTAOBHI5DDMME5ZQPT856DEIMM6VM8XI8WE4E4JKYMY5W7ABEH82LSRX4GKFAYNHLUSBT4C0A215KZTVX1K49EHAO8O7YJCUS8YVVU2B3XG8QOBM6XHYQDK2X06ZJTDP4IN5K6GU2NKNS0CK9C2A21LZ1288LBBSEEHQ45NO1585NGFB91OSXUZYE7IBBC6L014RMNBWDZH755CN1PJ3UG8UKZK1KJBCF5LHHMXCSC0TILZBP6F453SHE5DK0637FNELXL0S8I6DTV6VQFM9YO6KZMIJ27WA2LM5ZV1W00PPVRVUSLYA4SYQRH0YY95HQ8UOEBM7LF00AQZOVYSGDNOICWI9OLBQZX61SHB7VLYXFUIZEW8GYPZLBVW15T1VB7BCJC5DL1UR71H5FDXTORFG62M3GFEB9RAWJHNS23V1E7U4ASMGZRS8603KFRDXYFY8YPLT1S8JWWQPW6J1VYPRKZBL0YE5J8J1EGCJRX26HP8UOMNRXUW3EWLO4L3D3CS9BIMWH4WMHYHEADJ8HM661ZNOGW4WX1070E9VO3QXXON5OT9JQ4BX6HVUFO5YMS1NG9195O8JOLWQ2IE4JR42OV4UBHVN199QIWSSYZHDE0GR043ROOGBTTQR5G11D6JZRSD3G66OHYMO9K1SKP8810P1QGF20KDDL0QPALG451MXXTETJ9CC5HFMNYUJPFN94CS2DR2TDNTSC2WYLGR068XRA238G2WFC8HJVD99VOJF5NUML0GJGKP6RL2TJW50ZRUDA7TD9S50B1ZQ5DF5MUTY11MTHHYNHOWRD92ES84IZWNKMLQZKNTMTFQQ6IDA6COQ5OT4MYTUN0OT8FG1GPV3LLCXQV2C4UBAYRHMMLRW3CHKX8O8RUKPNXGOJM5M5VVAEWYGFBGCDZZCE0LG83361H26AXBBWTKKCRNJJ3FVS8L17JADWO5NM17JY5S0SOJRY2K76G8ZZHAYN31P0WZNZY0QSSBS041IOR78BNH6SCMVTP1Y79D5JAKOCH51IIAC9WLQRHTRFJLUJ1JMCELHHQ16D23L2TKMOPAA4KV1CXSHHEV2K5HFRNKZ0IIP6O7P8KEUP0D68MBO2TBIAGE542EOMX807FJSH1JTOP1") },
};
} }
internal class IsfDecoder internal class IsfDecoder

View File

@ -1,10 +1,9 @@
<StackPanel x:Class="GameRes.Formats.GUI.WidgetISF" <StackPanel x:Class="GameRes.Formats.GUI.WidgetISF"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fmt="clr-namespace:GameRes.Formats.Ikura"
xmlns:p="clr-namespace:GameRes.Formats.Properties" xmlns:p="clr-namespace:GameRes.Formats.Properties"
Orientation="Vertical" MaxWidth="250"> Orientation="Vertical" MaxWidth="250">
<ComboBox Name="Scheme" ItemsSource="{Binding Source={x:Static fmt:MpxOpener.KnownSecrets}, Path=Keys, Mode=OneWay}" <ComboBox Name="Scheme" ItemsSource="{Binding}"
SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=ISFScheme, Mode=TwoWay}" SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=ISFScheme, Mode=TwoWay}"
Width="200" Grid.Row="0"/> Width="200" Grid.Row="0"/>
</StackPanel> </StackPanel>

View File

@ -1,4 +1,7 @@
using System.Windows.Controls; using GameRes.Formats.Ikura;
using GameRes.Formats.Strings;
using System.Linq;
using System.Windows.Controls;
namespace GameRes.Formats.GUI namespace GameRes.Formats.GUI
{ {
@ -10,6 +13,8 @@ namespace GameRes.Formats.GUI
public WidgetISF () public WidgetISF ()
{ {
InitializeComponent (); InitializeComponent ();
var keys = new string[] { arcStrings.ISFIgnoreEncryption};
Scheme.ItemsSource = keys.Concat (MpxOpener.KnownSecrets.Keys.OrderBy (x => x));
if (-1 == Scheme.SelectedIndex) if (-1 == Scheme.SelectedIndex)
Scheme.SelectedIndex = 0; Scheme.SelectedIndex = 0;
} }

View File

@ -69,6 +69,12 @@ namespace GameRes.Formats.KiriKiri
public bool RetainDirs { get; set; } public bool RetainDirs { get; set; }
} }
[Serializable]
public class Xp3Scheme : ResourceScheme
{
public Dictionary<string, ICrypt> KnownSchemes;
}
// Archive version 1: encrypt file first, then calculate checksum // Archive version 1: encrypt file first, then calculate checksum
// version 2: calculate checksum, then encrypt // version 2: calculate checksum, then encrypt
@ -86,27 +92,17 @@ namespace GameRes.Formats.KiriKiri
Signatures = new uint[] { 0x0d335058, 0 }; Signatures = new uint[] { 0x0d335058, 0 };
} }
public override ResourceScheme Scheme
{
get { return new Xp3Scheme { KnownSchemes = KnownSchemes }; }
set { KnownSchemes = ((Xp3Scheme)value).KnownSchemes; }
}
public bool ForceEncryptionQuery = true; public bool ForceEncryptionQuery = true;
private static readonly ICrypt NoCryptAlgorithm = new NoCrypt(); private static readonly ICrypt NoCryptAlgorithm = new NoCrypt();
public static readonly Dictionary<string, ICrypt> KnownSchemes = new Dictionary<string, ICrypt> { public static Dictionary<string, ICrypt> KnownSchemes = new Dictionary<string, ICrypt>();
{ arcStrings.ArcNoEncryption, NoCryptAlgorithm },
{ "Cafe Sourire", new XorCrypt (0xcd) },
{ "Coμ", new ComyuCrypt() },
{ "Damegane", new DameganeCrypt() },
{ "Fate/hollow ataraxia", new FateHACrypt() },
{ "Fate/stay night", new FateCrypt() },
{ "Haruiro ☆ Communication ♪", new HaruiroCrypt() },
{ "Hime to Majin to Koi Suru Tamashii", new HashCrypt() },
{ "Imouto Style", new ImoutoStyleCrypt() },
{ "Okiba ga Nai!", new OkibaCrypt() },
{ "Ore no Saimin Fantasia", new SaiminCrypt() },
{ "Seirei Tenshou", new SeitenCrypt() },
{ "Swan Song", new SwanSongCrypt() },
{ "Walpurgis", new WalpurgisCrypt() },
{ "Zecchou Spiral!!", new ZecchouCrypt() },
};
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
@ -756,6 +752,7 @@ NextEntry:
#endregion #endregion
} }
[Serializable]
public abstract class ICrypt public abstract class ICrypt
{ {
/// <summary> /// <summary>
@ -778,6 +775,7 @@ NextEntry:
} }
} }
[Serializable]
public class NoCrypt : ICrypt public class NoCrypt : ICrypt
{ {
public override byte Decrypt (Xp3Entry entry, long offset, byte value) public override byte Decrypt (Xp3Entry entry, long offset, byte value)
@ -794,7 +792,8 @@ NextEntry:
} }
} }
internal class FateCrypt : ICrypt [Serializable]
public class FateCrypt : ICrypt
{ {
public override bool HashAfterCrypt { get { return true; } } public override bool HashAfterCrypt { get { return true; } }
@ -830,7 +829,8 @@ NextEntry:
} }
} }
internal class HashCrypt : ICrypt [Serializable]
public class HashCrypt : ICrypt
{ {
public override byte Decrypt (Xp3Entry entry, long offset, byte value) public override byte Decrypt (Xp3Entry entry, long offset, byte value)
{ {
@ -852,7 +852,8 @@ NextEntry:
} }
} }
internal class XorCrypt : ICrypt [Serializable]
public class XorCrypt : ICrypt
{ {
private byte m_key; private byte m_key;
@ -886,7 +887,8 @@ NextEntry:
} }
} }
internal class SwanSongCrypt : ICrypt [Serializable]
public class SwanSongCrypt : ICrypt
{ {
static private byte Adjust (uint hash, out int shift) static private byte Adjust (uint hash, out int shift)
{ {
@ -930,7 +932,8 @@ NextEntry:
} }
} }
internal class SeitenCrypt : ICrypt [Serializable]
public class SeitenCrypt : ICrypt
{ {
public override byte Decrypt (Xp3Entry entry, long offset, byte value) public override byte Decrypt (Xp3Entry entry, long offset, byte value)
{ {
@ -1001,7 +1004,8 @@ NextEntry:
} }
} }
internal class OkibaCrypt : ICrypt [Serializable]
public class OkibaCrypt : ICrypt
{ {
public override byte Decrypt (Xp3Entry entry, long offset, byte value) public override byte Decrypt (Xp3Entry entry, long offset, byte value)
{ {
@ -1049,7 +1053,8 @@ NextEntry:
} }
} }
internal class SaiminCrypt : ICrypt [Serializable]
public class SaiminCrypt : ICrypt
{ {
public override byte Decrypt (Xp3Entry entry, long offset, byte value) public override byte Decrypt (Xp3Entry entry, long offset, byte value)
{ {
@ -1098,7 +1103,8 @@ NextEntry:
} }
} }
internal class DameganeCrypt : ICrypt [Serializable]
public class DameganeCrypt : ICrypt
{ {
public override byte Decrypt (Xp3Entry entry, long offset, byte value) public override byte Decrypt (Xp3Entry entry, long offset, byte value)
{ {

View File

@ -36,25 +36,44 @@ namespace GameRes.Formats.KiriKiri
} }
} }
internal abstract class CxEncryption : ICrypt [Serializable]
public class CxScheme
{
public uint Mask;
public uint Offset;
public byte[] PrologOrder;
public byte[] OddBranchOrder;
public byte[] EvenBranchOrder;
public uint[] ControlBlock;
}
[Serializable]
public class CxEncryption : ICrypt
{ {
private uint m_mask; private uint m_mask;
private uint m_offset; private uint m_offset;
protected byte[] PrologOrder { get; set; } protected byte[] PrologOrder;
protected byte[] OddBranchOrder { get; set; } protected byte[] OddBranchOrder;
protected byte[] EvenBranchOrder { get; set; } protected byte[] EvenBranchOrder;
protected abstract uint[] ControlBlock { get; } protected uint[] ControlBlock;
public CxEncryption (uint mask, uint offset) [NonSerialized]
CxProgram[] m_program_list = new CxProgram[0x80];
public CxEncryption (CxScheme scheme)
{ {
m_mask = mask; m_mask = scheme.Mask;
m_offset = offset; m_offset = scheme.Offset;
PrologOrder = new byte[] { 0, 1, 2 }; PrologOrder = scheme.PrologOrder;
OddBranchOrder = new byte[] { 0, 1, 2, 3, 4, 5 }; OddBranchOrder = scheme.OddBranchOrder;
EvenBranchOrder = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; EvenBranchOrder = scheme.EvenBranchOrder;
ControlBlock = scheme.ControlBlock;
} }
uint GetBaseOffset (uint hash) uint GetBaseOffset (uint hash)
@ -122,8 +141,6 @@ namespace GameRes.Formats.KiriKiri
Decrypt (entry, offset, values, pos, count); Decrypt (entry, offset, values, pos, count);
} }
CxProgram[] m_program_list = new CxProgram[0x80];
Tuple<uint, uint> ExecuteXCode (uint hash) Tuple<uint, uint> ExecuteXCode (uint hash)
{ {
uint seed = hash & 0x7f; uint seed = hash & 0x7f;
@ -490,858 +507,12 @@ namespace GameRes.Formats.KiriKiri
} }
} }
internal class FateHACrypt : CxEncryption [Serializable]
public class ZecchouCrypt : CxEncryption
{ {
public FateHACrypt () : base (0x143, 0x787) public ZecchouCrypt (CxScheme scheme) : base (scheme)
{ {
} }
protected override uint[] ControlBlock { get { return FateControlBlock; } }
static readonly uint[] FateControlBlock = new uint[] {
0x9c91badf, 0x8b8f868d, 0xdf919096, 0x8b91909c, 0xdf93908d, 0x9c90939d, 0xd2d2df94, 0x9e8bacdf,
0x9e9c968b, 0xdf869393, 0x9bdf8d90, 0x929e9186, 0x939e9c96, 0xdfd38693, 0x9a8d969b, 0x86938b9c,
0xdf8d90df, 0x969b9196, 0x8b9c9a8d, 0xdfd38693, 0x91968c8a, 0x978bdf98, 0x8fdf8c96, 0x8d98908d,
0x9edf929e, 0x90d09b91, 0x939ddf8d, 0xdf949c90, 0x92908d99, 0x978b90df, 0x8fdf8d9a, 0x8d98908d,
0xdf8c929e, 0x93939688, 0xdf9a9ddf, 0x9a939396, 0xdf939e98, 0x8bdf869d, 0x93df9a97, 0x919a9c96,
0x9edf9a8c, 0x9a9a8d98, 0x8b919a92, 0x4e7ddfd1, 0x897c337d, 0xb07c727c, 0x7f7c767c, 0x8a7c1d7d,
0x9d7c727c, 0x0f7db17c, 0x3c6fbe7e, 0x3a7db66c, 0x157d5f7d, 0xb66c516c, 0x5f7d3a7d, 0xbe7e157d,
0x256f436d, 0x3a7db66c, 0x157d5f7d, 0x256f2b75, 0x3a7db66c, 0x157d5f7d, 0x436ebe7e, 0x897c337d,
0xb07c727c, 0x7f7c767c, 0x187d567d, 0x5d7d8f68, 0x4e7d167d, 0x327d397d, 0xbc7c767c, 0x6c7ca57c,
0x367da77c, 0x177d197d, 0x497d2974, 0x157d187d, 0x5d7d3b7d, 0x487d237d, 0x71f5bd7e, 0x7d116e56,
0x7dbe7436, 0x69397d16, 0x7d557d7a, 0x7d4e7d36, 0x7d4e7d36, 0x703b7d4a, 0x7d827390, 0x7d3b7d59,
0x7d157d52, 0xf5bd7e16, 0x53708a7e, 0x337d4f6d, 0x2e6b8a1f, 0x207d9374, 0xa37c0f7d, 0xa57ca47e,
0xa87ca47e, 0x8968337d, 0x3a7d3368, 0x157d1d7d, 0x92df317d, 0x869e938f, 0x557d8d9a, 0x496f3b72,
0x157d4c7d, 0x1a6ebe7e, 0x6571337d, 0x377d367d, 0x427d3e7d, 0x2b6e0c70, 0x337d3a7d, 0xa870be7e,
0x377d9c6d, 0x567d0e7d, 0x377d306a, 0x497d4b75, 0x2074367d, 0x0c705d7d, 0x3a7d2b6e, 0xa47e327d,
0x6ef5897e, 0x7d306a75, 0x7d187d12, 0x7d427647, 0x7d41730f, 0x7d3b7d3e, 0x7d337d16, 0x7d127d56,
0x7d187d56, 0x7d5d7d37, 0x7dbe7e55, 0x7d2b7d42, 0x7d93690e, 0x7342750f, 0x7d4a7d82, 0x7d527d3b,
0x7d3b7d15, 0x7d167d5d, 0x7d417d33, 0x7e5b7d14, 0x70216bbd, 0x7d327d68, 0x7d367d37, 0x7d1d7d18,
0x7d157d5b, 0x7d4f7d4a, 0x7d8a7e36, 0x7d167d20, 0x7d327d32, 0x7d327d20, 0x7e507d15, 0x7d157db4,
0x7d157d50, 0x7d157d50, 0x7d327d15, 0x7d327d15, 0x7d157d32, 0x7d147d20, 0x7e147d20, 0x73397d89,
0x7d5d7d41, 0x7d557d37, 0x69be7e18, 0x75337d93, 0x70397d6c, 0x7d7a6d1c, 0x7d0c710f, 0x7d197150,
0x7e427d3e, 0x6bf5f5bd, 0x7d687021, 0x7d4e7d55, 0x7d377d5b, 0x7d3b7d3e, 0x7d237d4a, 0x7d427d3e,
0x7d327d33, 0x7d4a7d42, 0x7c157756, 0x6e717369, 0x7d417db0, 0x7d427d3e, 0x7d147d41, 0x7e567d5b,
0x7d7a69bd, 0x68406832, 0x7d796d62, 0x7d4e7d36, 0x7d377d0e, 0x7d397d4e, 0x6e04730f, 0x7d3e7d69,
0xf5bd7e42, 0x51758a7e, 0x367dac6e, 0x207d1d68, 0x187d427d, 0x4472be7e, 0x0f7d636c, 0x98cacedf,
0x597d3e76, 0xbe7e3b7d, 0x556a436b, 0x187d527d, 0x53725d7d, 0x3e7d4b7d, 0x397d427d, 0x147d4e7d,
0xbe7e3a7d, 0x2e6b8a1f, 0x6c7cab7c, 0xbe7e327d, 0x5b7d1f7d, 0xb0710e6c, 0x3a7d936f, 0x897e487d,
0x7d9369f5, 0x7d5f7d32, 0x7d3b7d12, 0x6840683b, 0x7d0f7d62, 0x7d207d1d, 0x7e467d4c, 0x70216bbe,
0x740f7d68, 0x7d237d87, 0x7e427d46, 0x7d7a69bd, 0x73427632, 0x6a567133, 0x68557d55, 0x7d626840,
0x7d1d7d0f, 0x7d4c7d20, 0x7d187d46, 0x7d427d15, 0x68567d33, 0x7d0f7662, 0x7d547d3a, 0x7d5d7d37,
0x7d5b7d19, 0x70a36a37, 0x7d417d11, 0x7d427d3e, 0x7dbe7e55, 0x77157d44, 0x7e776837, 0x70216bbe,
0x73337d68, 0x7d8b6841, 0x76626832, 0x6b8c6a0f, 0x7d367da3, 0x7d3e7d37, 0xf5bd7e42, 0x70216bf5,
0x73327d68, 0x7d3e7d41, 0x7d5d7d3b, 0x7d4e7d16, 0x77557d39, 0x6a5e692c, 0x7d41698c, 0x7d417d37,
0x7e3a7d50, 0x728971be, 0x6e567193, 0x7d327d33, 0x7d397d23, 0x7d377d1f, 0x7d5b7d19, 0x7d337d37,
0x72be7e3a, 0x7d20743a, 0x7d5f7d32, 0x69177d23, 0x741f7d93, 0x7d367dbc, 0x7d3b7d4a, 0x7d377d5d,
0x7dbd7e5d, 0x7d397d1f, 0x77397d1f, 0x7d576a3f, 0x7d567d41, 0x7dbe7e18, 0x7d5d7d39, 0x7d337d5b,
0x7d5f7d1f, 0x7dbd7e16, 0x7d3e7d39, 0x71367d52, 0x7d42690a, 0x7d207632, 0x7d3b7d53, 0x7d167d5d,
0x7d507d12, 0x7e4a7d41, 0x684068be, 0x69156f62, 0x7c337d1a, 0x7c6c7cbe, 0x7c727c97, 0x7d977cbc,
0x71397636, 0x6bac6e69, 0x7d0f7d35, 0x7d187d1d, 0x7d3b7d46, 0x7d167d5d, 0x7d417d0e, 0x76187d56,
0x76766a20, 0x7d557d28, 0x7d567d56, 0x7d3b7d3e, 0x7d337d16, 0x7d556a32, 0x7d3e7d56, 0x7d5d7d3b,
0xf5bd7e16, 0x7d397df5, 0x7d417332, 0x7d3b7d3e, 0x7e9c7e1f, 0x7e9c7e9c, 0x684068bd, 0x7d796d62,
0x7d8a7e36, 0x711f7d3a, 0x7c1f7d17, 0x7c907c93, 0x7e907c93, 0x7d3d7d9f, 0x7d3a7d5d, 0x7dbc7136,
0x7c427d3e, 0x7caa7cb2, 0x7caa7cb2, 0x7c767c8b, 0x7c8f7cbc, 0x7c1f7d6c, 0x7c907c93, 0x7e907c93,
0x7d3d7d9f, 0x7d3a7d5d, 0x7dbc7136, 0x7c427d3e, 0x7caa7cb2, 0x7caa7cb2, 0x7c767c8b, 0x7c8f7cbc,
0x7c1f7d6c, 0x7c907c93, 0x7e907c93, 0x7d3d7d9f, 0x7d3a7d5d, 0x7dbc7136, 0x7c427d3e, 0x7caa7cb2,
0x7caa7cb2, 0x7c767c8b, 0x7c8f7cbc, 0x7c1f7d6c, 0x7c907c93, 0x7e907c93, 0x7d3d7d9f, 0x7d3a7d5d,
0x7dbc7136, 0x7c427d3e, 0x7caa7cb2, 0x7caa7cb2, 0x7c767c8b, 0x7c8f7cbc, 0x7c1f7d6c, 0x7c907c93,
0x7e907c93, 0x7d3d7d9f, 0x7d3a7d5d, 0x7dbc7136, 0x7c427d3e, 0x7caa7cb2, 0x7caa7cb2, 0x7c767c8b,
0x7c8f7cbc, 0x7c1f7d6c, 0x7c907c93, 0x7e907c93, 0x7d3d7d9f, 0x7d3a7d5d, 0x7dbc7136, 0x7c427d3e,
0x7caa7cb2, 0x7caa7cb2, 0x7c767c8b, 0x7c8f7cbc, 0x7c1f7d6c, 0x7c907c93, 0x7e907c93, 0x7d3d7d9f,
0x7d3a7d5d, 0x7dbc7136, 0x7c427d3e, 0x7caa7cb2, 0x7caa7cb2, 0x7c767c8b, 0x7c8f7cbc, 0x7c1f7d6c,
0x7c907c93, 0x7e907c93, 0x7d3d7d9f, 0x7d3a7d5d, 0x7dbc7136, 0x7c427d3e, 0x7caa7cb2, 0x7caa7cb2,
0x7c767c8b, 0x7c8f7cbc, 0x7c1f7d6c, 0x7c907c93, 0x7e907c93, 0x7d897e9f, 0x6a567d39, 0x723376bf,
0x7d497d53, 0x763a7d17, 0x7d127d33, 0x7d167d15, 0x7dbe7e39, 0x7d3e7d5d, 0x765d7d42, 0x6f0f7d42,
0x7d127db7, 0x7d157d4c, 0x7d337d16, 0x700e6b56, 0x6a367d12, 0x7d3f778c, 0x7d377d36, 0xf5bd7e16,
0xccad251c, 0x01804437, 0xacf8d91d, 0xf4f495a3, 0xc07183e4, 0x617c1459, 0x279d2e94, 0x697cc3b8,
0x6f05547d, 0x97227782, 0xe5248bd1, 0xb5ebbdcc, 0x82a1cb76, 0x64687a74, 0xce35c18b, 0xe8905e50,
0xafffd2ce, 0x3612af4c, 0xf4bc0fcd, 0x64856fff, 0xead50cc7, 0x5066ed91, 0x7b0f0acf, 0x10cbc0d4,
0xa958c6fc, 0xe4707008, 0xd312636a, 0xd40c3361, 0xaf06d42d, 0x3f6808d2, 0xce796be4, 0x8b709456,
0xfae59248, 0xb6dddb98, 0xb7f56869, 0x14b68dbd, 0x5e5bd9ac, 0xdc8cd143, 0x41846e8e, 0xbf86a321,
0x18b857b3, 0x4db38b85, 0x53a083cc, 0x51336b61, 0x862243e1, 0xe047fbe1, 0xcdd48d79, 0xae3ab3be,
0x6524ddbb, 0xe64899da, 0x0367c27d, 0xdfa3b943, 0xf09ce1e4, 0x1b0f23cd, 0x25ff6afe, 0x82ea0625,
0xc011def6, 0x17600b48, 0xd3dd0e93, 0x548ddf45, 0x4fee40df, 0x3c26652e, 0xe99396f2, 0xa7dd4872,
0xb4a6ecaa, 0xa6da9022, 0xf6d10dd3, 0x2ef86186, 0x46c02be3, 0x9db7d8cf, 0xf410cc59, 0xf1c55546,
0xc7c9c416, 0x527dc4e1, 0x202ba1ea, 0x59d6de93, 0x2ea2c560, 0x138c7c6a, 0x1f8b369c, 0xf1d3f1e8,
0xee767328, 0x989440fe, 0x6ec3d8c5, 0xab83f151, 0xe41110ad, 0x33d88275, 0x9ed82668, 0xe6238d3e,
0xf4e9b036, 0xdfcf1a1c, 0x596aadbb, 0xb75bb192, 0x9b37c762, 0x78cd0322, 0xc0d8acd1, 0xa76d8757,
0xa71a0d57, 0xfe4c50cc, 0xd82f44cf, 0x8ea223e6, 0x73e8e602, 0x4f074710, 0x0f9715c9, 0x4b513841,
0x8c9b590a, 0xb22811da, 0x1bcb3180, 0xebbaf518, 0x8ab58fbb, 0x0c8effb7, 0x16fed8ab, 0x62f3f635,
0x966c212c, 0x2ae9a4cc, 0x42a4b17b, 0xe56fc4ad, 0xa7dca536, 0xc2e8597e, 0x07a05b93, 0x29ab3356,
0x24864a83, 0x7bffbc18, 0xd58fbd55, 0x2e8dd69c, 0xc145444c, 0x31840086, 0xc2cd2b55, 0x0bd3cb87,
0x01d4e666, 0xfc0d9c8c, 0x4af78c64, 0x0498df30, 0xf696e76e, 0xb1f13dad, 0x51824703, 0x9caeda64,
0xe3258725, 0xfc59f066, 0x838680e5, 0x36928f25, 0x16a1e088, 0x58a4be3f, 0x3e16541a, 0x9d9ca177,
0x6dcb242b, 0x786d809b, 0xcd736875, 0xaaea1072, 0x97604118, 0x3a14f5df, 0xfd0eb775, 0xfc68a624,
0xfe80b891, 0x177a10e1, 0xb221bc1a, 0x22a87b49, 0x6e0fd8b3, 0x9471faa0, 0xdc781156, 0xd1d955bb,
0xf06be41d, 0xae5f61d8, 0x3a4de399, 0x8ec113cb, 0xcd131c8a, 0x516825cf, 0xa7242dc1, 0xb27336c9,
0x7bdf287d, 0x3eb6d0ca, 0x1361ef6e, 0xd9298871, 0xd02c758e, 0x06123a76, 0xe6f7c422, 0x71e7d097,
0xc05bbc9e, 0xf2472301, 0x1d84add8, 0x2abbb422, 0x00c6f197, 0xc6a2948d, 0x0ec6b993, 0x49bfa4dc,
0x601a1b59, 0xa302e36f, 0xe107a92f, 0x9442e001, 0x518d0fad, 0x60ba8fb3, 0x7de05d29, 0x660220a6,
0x2305e532, 0xd4193ca6, 0x9669c8e2, 0x99844e6d, 0xa523f6d0, 0x3d768288, 0xff84aaa6, 0xdbb65d74,
0xd22caba8, 0x86e51c5f, 0x9ce3cba3, 0xa031be31, 0xc7eb8c81, 0x732e2e54, 0x1bd70a36, 0xabb9e07c,
0x1f6026ea, 0xf56c5ed4, 0x515d305d, 0xd2688e75, 0xf272f3e9, 0x5669847f, 0xd77f90c4, 0xc1655cb5,
0x981cff0e, 0xca2172e9, 0x80e68137, 0x04c28018, 0x17a1f61e, 0x5305dc98, 0x120b8ca4, 0xc8966d81,
0x48b88869, 0x99e34b6c, 0xcd813746, 0xa2c59dfd, 0xac8dcf74, 0x03debe30, 0x95788a09, 0xe5fc2c69,
0x76b5cf3d, 0x618c56e9, 0xda92dff8, 0xd961919d, 0x4806e3a8, 0x0ed09bff, 0xaced410e, 0x6878b0f9,
0x55d2a073, 0x5fe3eaa9, 0x86840ba7, 0x5106fa6e, 0xb90b8455, 0x470d632b, 0xc83fd88f, 0xd0a4fa65,
0x834c7227, 0x7d1a0d61, 0x9aa6746d, 0xdb0d9da5, 0x70c42d80, 0x99778095, 0x0a7e9b9e, 0x4619b7ce,
0x0b99295b, 0xbc912d1f, 0x4c397dcc, 0xf96b7ed0, 0x1096976d, 0xb1a978dc, 0x3b664a8f, 0x1edb01c1,
0x655cd150, 0xde516adf, 0x3da50d73, 0xd4018fe9, 0xe393b949, 0xb5bc6e0b, 0x575eca9e, 0x598a1ef6,
0xf2166833, 0x20224959, 0x4aff9f0d, 0x44ae2727, 0x34f63270, 0xf6b600d5, 0xfebdbf67, 0xa62f3e23,
0xd0ef945a, 0x6875d000, 0x4f1c9d74, 0x4c3b62fd, 0x076c9136, 0x73b7186e, 0x52bf8a6b, 0xded440a7,
0x9dd0e71c, 0x4c6a8036, 0x01c87ce8, 0x6a5c80cc, 0xff858cef, 0xd64bcfe4, 0x2d24b76f, 0xd36c6bd1,
0x9c4ca179, 0x8cdac4b6, 0x003ff1ea, 0xddc5b34c, 0x15d64b1a, 0xf5fa141f, 0x5812bf1f, 0x9bd50759,
0xc220bc8c, 0x934eb6f5, 0x6cd508e6, 0xc862d424, 0xc35b9d50, 0x538a1855, 0x871d4354, 0x2f6d55a3,
0xadcbf11f, 0xfba75a6c, 0x0d9d2bf1, 0x414f7db8, 0x3e7cc157, 0x9dba44fa, 0xd9d556e4, 0x7c7b0191,
0xa9f120f4, 0x56c2e1a7, 0xda660052, 0xc57e3127, 0x761f1df3, 0xfeb92f5b, 0x59b933d0, 0x5431e7af,
0x2a661b4d, 0x774d66b3, 0x74186a34, 0xc2e28dfb, 0xd99758e0, 0x5d4e8d31, 0x00ac0104, 0x7b404a77,
0xa5b9dbe6, 0x485d01d8, 0x78daf586, 0x8debafeb, 0x30ced20c, 0x0a2d79f2, 0x809695ac, 0x1cc31d1c,
0x79a647a8, 0x61a4c9ba, 0x41101d1d, 0xbae0aeaa, 0x5fed997a, 0x4688d100, 0x8cc6fe5c, 0xa0c23dc1,
0xdf13f396, 0x1942ee68, 0x953587fe, 0x89370d97, 0x85aba55d, 0xb87b9869, 0x2df88986, 0x6ec182e2,
0x0e232d62, 0xad503b2e, 0x5636c5a7, 0xd3a17cae, 0x426a9c64, 0x7a8e14b7, 0x5a14ad86, 0x96afc436,
0xfaa68137, 0x1b56f995, 0x3f7695c4, 0xb14d9592, 0xdc648fb9, 0x0bc7f21f, 0x8a2e4f76, 0x5619c3f5,
0x8047a43d, 0x0c76ed90, 0x0c4bf0ec, 0xb5d5f16a, 0xca043902, 0x2b16fc44, 0xda97feab, 0x97f3ed6d,
0x6cdcbcca, 0x423fc66f, 0x016e0ef3, 0xa0ed2304, 0xaaef9592, 0x9307f834, 0xe6cab837, 0xefb51bed,
0x7579964e, 0x3e09b1ed, 0x629ed018, 0xdc375c19, 0x1a765758, 0xaa132aa7, 0x37efa297, 0x9d8a54fd,
0x8b2d6de4, 0xfdaf5803, 0x4c7f84f7, 0x4f51e520, 0x25c791ed, 0xb4ae3f55, 0x30eb21a6, 0x10218782,
0xa1f328a6, 0x26600064, 0xf8222315, 0xa09386cd, 0x2c39af68, 0x8b09139e, 0x30ce56a6, 0x6112544c,
0xff62eaa6, 0x8f7d06b2, 0xdb4815b8, 0x0b868340, 0x1231da0b, 0x9bd1ebd1, 0x54840c1b, 0x248e42e9,
0xdbcd1327, 0x379e4966, 0xe9586a5d, 0xfb090b72, 0xf252c604, 0xdd9f0af7, 0x22a5fc71, 0x2db6d821,
0xebc4ddd4, 0x4a8d21e9, 0xbef971c2, 0x99797b4a, 0xd7d918bf, 0xe0272f88, 0x908488c2, 0xe6a697aa,
0x09f15f95, 0x21ead25e, 0x257f333e, 0x773219eb, 0xb4ee8710, 0x1388b5d4, 0x7df20323, 0x6ae56ce3,
0xc5ba6c40, 0x8e544d26, 0x926598c1, 0x1668a8b4, 0x6b67d1fc, 0x11e2e018, 0xb3fce656, 0xdde6f22a,
0x52469404, 0x2536ee5c, 0x2868e1ff, 0x5f4ce971, 0x47c4a8af, 0xefbbb6cf, 0xecd91b07, 0x929aad88,
0xe35010fd, 0xdf660e0a, 0x346c0adf, 0x2c0e0695, 0xd142aec4, 0x0007122f, 0xcb1db521, 0xf5dbcfa3,
0x1986d784, 0xa6590191, 0x8004d00b, 0x3cb5d898, 0x109b6212, 0x82b90029, 0xae090378, 0x2fa37649,
0xec0c9ede, 0x4eea87c2, 0x127e1796, 0x11c75395, 0x63f6685b, 0xa0add61c, 0xf3189340, 0x66533a49,
0xd548747a, 0x97f58fa9, 0xdc5581ef, 0xa7c8d34a, 0x9590eb0d, 0xee2a68c1, 0x21f39b12, 0x1d9ab21a,
0x0549c2c4, 0xac426ebf, 0x3b5eedf1, 0xa313c69a, 0x72e8f693, 0x4177233f, 0x6c6d41ca, 0xeda75e23,
0x9cc72f26, 0xf7b32b24, 0x791a1535, 0xd9b3046b, 0xed381a83, 0x96c212f6, 0x3298d4fc, 0xb2006d03,
0x236da0b4, 0x0d15b5fc, 0xcbc90ebc, 0xca6dff19, 0x28d410de, 0x0729bb85, 0x81ae90fb, 0x8f58f849,
0x93fca36d, 0x1b03aa91, 0x5524aab6, 0x1fb32602, 0xedcc6b65, 0xea4521f6, 0x8f98dd84, 0xe84fc42b,
0x1cf33210, 0x8f15111b, 0xa2537850, 0xaf5267dd, 0x87717c41, 0x111ab1af, 0x11fa5e31, 0x39f083e0,
0xf0ddf573, 0x523d6e0e, 0xfc16b1e0, 0x80139739, 0x7a285147, 0xfcc98900, 0xf6a57404, 0x5cc492c8,
0x18724e8b, 0xf799c3ca, 0xabebcb28, 0x8d8dbba8, 0x37c8a37d, 0x54de2b79, 0x9ac4abc2, 0xa40c3bb0,
0x09c5de57, 0xbf842d0b, 0xcfdc79aa, 0x9542c1b3, 0x4ca1174d, 0x6f611ce3, 0x76b07b17, 0x25bc42d2,
0xb9149fd7, 0x9506b278, 0xf5a249d0, 0x6e4ec763, 0x9f41fd64, 0x9e985bf4, 0x5b7b885c, 0x0b1b6a90,
0x445cb520, 0xe2ff9975, 0x294c23b1, 0x1abbd21a, 0xe461e3d8, 0x7274020d, 0x69b7e2e7, 0x2ef3614d,
0x7743c977, 0xcbcfd022, 0x9ecaae13, 0x5b0f9715, 0xa09791eb, 0x153fc68d, 0x0eb044b9, 0x7588ff16,
};
}
internal class ImoutoStyleCrypt : CxEncryption
{
public ImoutoStyleCrypt () : base (0x278, 0xd7)
{
PrologOrder = new byte[] { 2, 1, 0 };
OddBranchOrder = new byte[] { 1, 2, 4, 0, 5, 3 };
EvenBranchOrder = new byte[] { 7, 5, 1, 3, 6, 4, 2, 0 };
}
protected override uint[] ControlBlock { get { return ImoutoControlBlock; } }
static readonly uint[] ImoutoControlBlock = new uint[] {
0x9c91badf, 0x8b8f868d, 0xdf919096, 0x8b91909c, 0xdf93908d, 0x9c90939d, 0xd2d2df94, 0x9e8bacdf,
0x9e9c968b, 0xdf869393, 0x9bdf8d90, 0x929e9186, 0x939e9c96, 0xdfd38693, 0x9a8d969b, 0x86938b9c,
0xdf8d90df, 0x969b9196, 0x8b9c9a8d, 0xdfd38693, 0x91968c8a, 0x978bdf98, 0x8fdf8c96, 0x8d98908d,
0x9edf929e, 0x90d09b91, 0x939ddf8d, 0xdf949c90, 0x92908d99, 0x978b90df, 0x8fdf8d9a, 0x8d98908d,
0xdf8c929e, 0x93939688, 0xdf9a9ddf, 0x9a939396, 0xdf939e98, 0x8bdf869d, 0x93df9a97, 0x919a9c96,
0x9edf9a8c, 0x9a9a8d98, 0x8b919a92, 0x4e7ddfd1, 0x897c337d, 0xb07c727c, 0x7f7c767c, 0x8a7c1d7d,
0x9d7c727c, 0x0f7db17c, 0x3c6fbe7e, 0x3a7db66c, 0x157d5f7d, 0xb66c516c, 0x5f7d3a7d, 0xbe7e157d,
0x256f436d, 0x3a7db66c, 0x157d5f7d, 0x256f2b75, 0x3a7db66c, 0x157d5f7d, 0x436ebe7e, 0x897c337d,
0xb07c727c, 0x7f7c767c, 0x187d567d, 0x5d7d8f68, 0x4e7d167d, 0x327d397d, 0xbc7c767c, 0x6c7ca57c,
0x367da77c, 0x177d197d, 0x497d2974, 0x157d187d, 0x5d7d3b7d, 0x487d237d, 0x7ef5bd7e, 0x69d6bc96,
0x7ca77c7a, 0x7cbc7ca1, 0x72586f74, 0x77307713, 0xdf10760a, 0xcececfcd, 0x4473f5f5, 0x056c1c6e,
0xbe7e8469, 0x916da169, 0x8c6c046a, 0xbd7e8c71, 0x727e72f5, 0x7d39761d, 0x7dbe7e32, 0x7da57357,
0x7d1e7d40, 0xca397d0e, 0x337d936f, 0x557d7a69, 0x217da570, 0x39761a6e, 0xbd7e4f6e, 0x5f7df5f5,
0x056c167d, 0xbc75be7e, 0x3a7db075, 0x69719b71, 0x487d0f7d, 0x4368167d, 0x567d9a6f, 0xbe7e187d,
0x0e7d377d, 0xb67e397d, 0x73577df5, 0x7d407da5, 0x770e7d1e, 0x7db07537, 0x77ac6e32, 0x75bc750a,
0x77367db0, 0x7da57025, 0x7d377d4a, 0x7e5d7d4c, 0x397df5b6, 0x577d337d, 0x4a7dbd6d, 0x547d557d,
0x337d427d, 0xbd7e417d, 0x346cf5f5, 0x337dad6e, 0x85760777, 0x166f4a7d, 0x367d4173, 0x1d727e72,
0x327d3976, 0x646e1a6e, 0x367d537d, 0xf5f5bd7e, 0xa573577d, 0x1e7d407d, 0x337d0e7d, 0x50689c71,
0x7edf327d, 0x7d956d8a, 0x774a7d41, 0x6a936f15, 0x7d187d16, 0x7d4a7d4a, 0x7d1f7d3b, 0x725d7d5d,
0x7d78725f, 0x7d417d5d, 0x7e187d56, 0x417ddf89, 0x5b7d447d, 0xa37e3a7d, 0xf5f5a37e, 0x557d417d,
0x4e7dbe7e, 0x367d157d, 0x3e7d5d72, 0x337d427d, 0x6fca327d, 0x69337d93, 0x7d427d7a, 0xf5bd7e40,
0x7d7a69f5, 0x7d407d42, 0x77ac6e32, 0xf5be7e0a, 0xa573577d, 0x1e7d407d, 0x557d0e7d, 0x417dbe7e,
0x417d5d7d, 0x417d5d7d, 0xa47ea47e, 0x5d7da47e, 0x547d487d, 0x7df5667e, 0x7d3e7d41, 0x7d567d42,
0x7d3a7d18, 0xf5bd7e48, 0x73577df5, 0x7d407da5, 0x7d0e7d1e, 0x69056c0f, 0x7d367d84, 0x7d397d2f,
0x7d9c7117, 0x7d3b7d4a, 0x7d527d57, 0x7d507d12, 0x7d327d36, 0x7d567d5d, 0x7e5d7d37, 0x7b71f5be,
0x9c711f7d, 0xb67e167d, 0x7d5f7df5, 0x7d4a7d42, 0x7d9c7155, 0x7e337d16, 0x397df5b6, 0x7d936fca,
0x7d7a6933, 0x7e127d55, 0x7e127da4, 0x7d547da4, 0x7da47e1e, 0x7e1e7d54, 0x6e337da4, 0x7d646e1a,
0xf5bd7e53, 0x7d487df5, 0x7d427d3e, 0x7d0e7d1f, 0x7d337d41, 0x7e597d48, 0x577df5be, 0x407da573,
0x0e7d1e7d, 0x577d337d, 0x9d675d6f, 0x397da873, 0x3b7d4a7d, 0x397d2f7d, 0x417d177d, 0x056c507d,
0x367d8469, 0x3e7d9c71, 0x1f7d3b7d, 0x5d7d5d7d, 0x397d4e7d, 0xb67e367d, 0x447df5f5, 0x3b7d4a7d,
0xb16dbe7e, 0x9c71557d, 0x337d167d, 0xb77e567d, 0x7d387df5, 0x7d7a6933, 0x7d9c7155, 0x7e567d16,
0x327df5b7, 0x577dbe7e, 0x407da573, 0x0e7d1e7d, 0x7773557d, 0x167d207d, 0x397d4e7d, 0xbd7e367d,
0x327df5f5, 0x4a7d427d, 0x9c713b7d, 0x427d3e7d, 0x397d7a69, 0xa573577d, 0x1e7d407d, 0x337d0e7d,
0xa8732975, 0x5d7d327d, 0x427d3e7d, 0x387d5d7d, 0x377d5b7d, 0x337d167d, 0x4a7d3a7d, 0x5b7d1a7d,
0xb77e567d, 0x917cf5f5, 0x987ca47e, 0x747c8b7c, 0x977cba7e, 0x907ca17c, 0xba7ea17c, 0x767c7a69,
0x667e8a7c, 0x987ca77c, 0x757ca47e, 0x337da47e, 0x7469b575, 0x487d3a7d, 0xf5f5b67e, 0x9c7e9c7e,
0x3e7d5f7d, 0x8168be7e, 0x177d5c6d, 0x577d377d, 0x407da573, 0x0e7d1e7d, 0x61691f7d, 0x337d546e,
0xa47e917c, 0x7f7c737c, 0xa47e747c, 0x1f7d987c, 0x167d5f7d, 0x187d567d, 0xb67e347d, 0xbdbc72f5,
0x45cebcd0, 0xbbd86f7c, 0x0c89acb3, 0x719234f9, 0x500456ec, 0xbf9c5033, 0xc5cdeb7c, 0x57776569,
0x15759c7e, 0xce764abc, 0xb08f0f38, 0x02fd9979, 0x01c1c1d8, 0xb3a0450c, 0x3ad2e0ad, 0xf282a28b,
0x9d4da002, 0x45f7fdc1, 0xa6ac2c9a, 0x8daf7a97, 0xffa843df, 0x0c2a8f16, 0x271c25e9, 0x22164799,
0xa92332a7, 0xdeef4be3, 0x28e596a8, 0xe42833b1, 0x87e9d493, 0x3727307e, 0xc4360c52, 0x141a1c55,
0xb2eebdf8, 0x989f9528, 0x2ebfdb1c, 0x72641c8f, 0x0e362bc2, 0x4fae1791, 0xc8ab8f0e, 0x8fa115ee,
0xada212d8, 0xdac32301, 0xec18485d, 0xbc8ce6f5, 0x79962be5, 0x69814c94, 0x96efead6, 0x69e8e3be,
0x3a6e7485, 0xead7bf5b, 0x04ea533e, 0x887470a5, 0x552f91b3, 0x975f44cc, 0x7ad282d4, 0xf6d9b38c,
0xe76f1cfd, 0xf5706c21, 0xefeccf0e, 0x849dd4c9, 0xade2474f, 0x1b45f369, 0x7e21976e, 0xa10c9eca,
0x2d5d85f7, 0x6accdbd8, 0x65d2bb19, 0x8c325bbc, 0xb90ef4f4, 0xcc18b595, 0x19649633, 0x8341d8d7,
0x2f195257, 0xa0ed9621, 0x1d7953c5, 0xf7daa4c1, 0x9bbcea5f, 0x30aed22a, 0x9c91a871, 0xb368800c,
0x1016536e, 0x9cb72499, 0xe46d7de4, 0x977ccf49, 0xb1f2a544, 0x4c4493d8, 0x950972b2, 0x7169b541,
0x9ceec5b7, 0xde848c5a, 0x85e34c07, 0x6f184730, 0xc8a2e2c6, 0x1c072811, 0xdee6885a, 0x1c6c7fb8,
0x8b597fe9, 0x9412a96a, 0x0b0f42e8, 0x6557e34e, 0x861905b3, 0x4c0c2dff, 0xad4462f9, 0x8ab4d260,
0x537b147a, 0xd35f0ac9, 0xd85f457d, 0xa62616f9, 0xfda1d245, 0xf028be7b, 0x9317fd1e, 0x242d9f12,
0xd532263a, 0x7296f576, 0xbce041fb, 0xf354bc22, 0x7cbf3560, 0xddda6048, 0x9fbebcc0, 0x6b034357,
0x9c5d00d3, 0xb1792e0b, 0x42f68570, 0xa9a6b353, 0x0e67dad9, 0x023c04d5, 0x8b187287, 0xf94b051e,
0xb332cc2e, 0xfb8c65bb, 0xe40553c7, 0x36c6bf95, 0x7a74e52c, 0xe5a6497d, 0xfb5c9bff, 0xabd7abd8,
0xcdd35cf0, 0x6b4ab439, 0x43ab6526, 0x019bc4ee, 0xf332b913, 0xa06c7649, 0x52af60ba, 0x1477e66f,
0xbee3c1e7, 0x825fe633, 0x81f3b272, 0x8e3c104d, 0x0956e686, 0xc58c13ab, 0xae01266f, 0x87d551b9,
0xfe2ab79f, 0x039d6ac1, 0xeaa3ddb8, 0x8ad73c9f, 0x3401d424, 0x0132d093, 0x1932ff32, 0x713585ba,
0x0b73d762, 0x1988732a, 0x3480e775, 0x23d9e24c, 0xad41997d, 0x2f838c6c, 0x7876d7d4, 0x5a1b885e,
0xd5c0e254, 0x9cccdb9e, 0xd42778cd, 0xafaaf2db, 0xe61008ca, 0xa566900e, 0x9e8648e4, 0x58047ac1,
0xd0322bf3, 0x92112b4b, 0x2bd479a5, 0xf05f0c69, 0x3f22edb2, 0x665990fe, 0x98507599, 0x7e1ce769,
0x49c33e7b, 0x6a3e565b, 0xf37bfd1c, 0x6838ba13, 0x71ac8605, 0x5f854028, 0xafb1c299, 0xf738570a,
0xe76c4166, 0xd1d5bb14, 0xd411c2ae, 0x8120f274, 0xa4892784, 0x3d543dab, 0x6af3ab34, 0x9d2a1040,
0x1fe14b56, 0x5e8036d6, 0xb334c47e, 0x527f288e, 0x3bc560e5, 0x1448108c, 0x3c4a1978, 0xc6810326,
0x24c0e9dd, 0x57ac0eff, 0xaeaf2bb4, 0x21fc89e2, 0xd49383e3, 0x278f3ecf, 0xf1d7f02e, 0xf4e87a53,
0x81659a34, 0xfc2a7769, 0x22f947db, 0x18d6f29e, 0x7bd778cc, 0x34e63b74, 0x4327837b, 0x43b23f4a,
0x2faaf555, 0x080f21d8, 0xd883ab31, 0x28f7e548, 0x961e15de, 0x27b56217, 0xa9313edf, 0x4c75e7ba,
0x9441cc74, 0xe617288f, 0xf2fe905a, 0xa58a2a26, 0xc770ac96, 0x057c8dee, 0x042bca16, 0x35ad73bb,
0xbefb0221, 0x989b124b, 0x0183dcfb, 0x93a22db8, 0x7e964b97, 0xff7d84ad, 0x61468d1c, 0x41c58016,
0xbd6022c7, 0xcfafe4e6, 0xd04c6664, 0x71c039ac, 0x08bf2e43, 0x4672f5d3, 0xcc5d8794, 0x4a1345fc,
0xc9fd140f, 0xb8678dd4, 0x1867e8bd, 0x6c4ec398, 0x878ab83a, 0x02c2900e, 0xf97cf590, 0x6c5a671b,
0x8681ecdc, 0x2bfd1a87, 0xbb65a1ee, 0xcbf781c2, 0xa2013ff6, 0x8c026ee2, 0x8ad5524c, 0xfa46551f,
0xd5507bbf, 0x6a5d00ee, 0x1a60b69b, 0x4edeceda, 0x25992ecc, 0x236fc615, 0x8fcab1c1, 0x084380cf,
0xd3723c02, 0xfa1bb4e0, 0x41703b91, 0xc884373d, 0x4db4af4c, 0x4876b7d6, 0x3e6663a5, 0xc3372d5a,
0x8af05730, 0x43f96565, 0x280870dd, 0x258300b2, 0x0f1ff948, 0xe5addfbe, 0xd133f857, 0xf2b45133,
0xddbfe3ab, 0xe0e3706d, 0x3235bd77, 0xe9b6effe, 0x1fe4ef36, 0x8fd89928, 0x27279626, 0xeb799df0,
0x1e2d5bb4, 0x64415ae5, 0xefc24d6e, 0xda6fb0e3, 0x1c8a4ece, 0x8ab56b95, 0x0e91d30a, 0x02ef3eea,
0xd9073f45, 0x113c6ab7, 0x6c77bf54, 0xa52f90bd, 0x01f280b4, 0x83c1b5f7, 0x423d4069, 0x22adcd65,
0x58537598, 0x91930d6a, 0xdff6a6b3, 0x287243d2, 0x33e92ca2, 0xe593d4e6, 0x2636aad3, 0x64f5fe3c,
0x4f875310, 0xceb3e06c, 0xedcdab02, 0xb872fd7a, 0xd7baa454, 0x866ba43c, 0x9e6e8bc5, 0xdf04f14b,
0x5081a7fe, 0x1cc6eaef, 0xf657b595, 0x29012cf3, 0x4a58e4ff, 0x694dd93c, 0xb74938e8, 0xd457436a,
0x560eafdc, 0x2ce09ec8, 0x465de8e9, 0x7ca0ec1b, 0xd93829c7, 0xbca12446, 0x6b60b1a0, 0x9f027d58,
0x9ab391e3, 0x9853ec40, 0x527e834a, 0x198c317a, 0xf985d777, 0x988fb533, 0xefcf3410, 0x9ac81387,
0x93f87488, 0x3b1eb146, 0x12dbb1b0, 0xab1cef83, 0x9e8c014c, 0x56eb135d, 0x35097903, 0x2aa776d0,
0xefba659b, 0xd8576489, 0xa44e176c, 0xf5d417a8, 0x66f0a62b, 0xb7a4f687, 0x1d6f27b4, 0xd30983b9,
0xcdc46346, 0x605567a2, 0x944f9b8e, 0xd3456f55, 0x0d542ee5, 0xa8e34d20, 0x5fdefe07, 0x2fc58135,
0x26e09472, 0xbe691ac6, 0x5aafcbe2, 0x322d4063, 0x77148178, 0x15d30784, 0x21de79cd, 0x999c36b1,
0xdd31ccc4, 0x5c9019a7, 0x98be930e, 0xfb604ed7, 0x0bfcef1f, 0x9544feba, 0x45a65682, 0x240e539b,
0x13451d89, 0xcdf37d73, 0xf1548863, 0xb075b59f, 0x554038cf, 0x28372884, 0x68136660, 0xa51373f7,
0xd87941d0, 0xc3694841, 0x2ecbff33, 0x807c415a, 0xd10347ab, 0x0ed7e4e5, 0x16363adc, 0x89d33036,
0x6016a160, 0x19f19a5a, 0x8956c6b7, 0x1731780f, 0xb4212ec0, 0x72fa92b6, 0x33c32348, 0x56d08e8a,
0xe4be93dd, 0x2739fe6d, 0x2541e828, 0x4daedcc3, 0x7376c3c8, 0xd9f44afe, 0x9272061d, 0x23f7aeca,
0x429152c7, 0xc2697d28, 0x51179d67, 0x62735ef7, 0x6d37d2eb, 0xb55655c3, 0xbfb33ada, 0x02839c8f,
0x49ea2059, 0x6be959b5, 0xda6278b4, 0x5a538796, 0x5c8497f8, 0x36499ff2, 0x85620f5e, 0xa11be0dc,
0xb113a10d, 0x0d398359, 0x3802b809, 0x1e8b4d3a, 0xe67de6af, 0xc3235a27, 0x1bc9930d, 0xd740c0cd,
0x5e3e6b85, 0xd2054645, 0x4d44571e, 0x4532a3e6, 0xeee9d279, 0x87fbde6b, 0x609c8075, 0x7b21adfd,
0x320b8d52, 0xccb86869, 0xbbc67e56, 0x138cb7cd, 0x94422afb, 0xc2cdb1bf, 0x35fbeafd, 0x0f98f183,
0xb985532f, 0xbea5b0da, 0x8d8ffe7f, 0x37d8e708, 0x6325d619, 0x510745a4, 0xa275914a, 0xaf7bd793,
0xed263795, 0x93dfbc22, 0x7a7f9995, 0x1d1665b2, 0x90b2fde0, 0x20fe2705, 0x4e80f43e, 0x745ca349,
0x019e0c38, 0x532456ef, 0xb876f67e, 0x9b2a66de, 0x5043034b, 0x16c5507b, 0x09d1bb96, 0x0439f550,
0x18a1d128, 0x824a0731, 0x258fc0ce, 0x36ec993f, 0x80cf64fe, 0x356c8638, 0xa39bbbb9, 0x22ffeac0,
0x7d39c4d0, 0x32e95341, 0x8d0187d3, 0x6c99079f, 0xec240adc, 0xa9af8c5a, 0x94b8065e, 0x28009b4a,
0xfa5b4c58, 0x8f12a9e1, 0xa95ecd98, 0xe9603646, 0xcc12dc04, 0x50f5fd0f, 0xc334d966, 0x32d07ccd,
0x8300fca5, 0x6001e499, 0x5b838ad5, 0xf5562cca, 0x30232d6f, 0xed01a56f, 0xd1409b8d, 0x137efc62,
0xabc2a7c7, 0xab208ec1, 0x841ef72d, 0xd152c5ec, 0xe81bb7f3, 0x850187aa, 0x9c40f47d, 0x5ff50c62,
0x2b724688, 0x2e8557e4, 0xb135f8ed, 0x4fa38d46, 0x0f3eb921, 0x847159f2, 0xefbeb40a, 0x4339f17f,
0xbf8483f2, 0x6770b2d8, 0x576acb52, 0xda464833, 0x9d295648, 0x86ba73f3, 0xbe44d7c4, 0x868c2115,
0x9aecc2ea, 0x3fce381f, 0x5d4bdac2, 0x7863bbf7, 0x6395a2e2, 0x209c7342, 0x7d9718fb, 0x7f2f4b02,
0x6edc122d, 0x7a39b294, 0xd0a34d11, 0x6d4d9472, 0xb1775b56, 0x66099ca5, 0xc898dba5, 0xff094e89,
0x49eee138, 0xc74554d4, 0xbebb78bd, 0x68069f7f, 0xd143e934, 0x16ea614a, 0x5b03b028, 0x7433b06e,
0x112ac5c4, 0x93c63bb1, 0xddb35880, 0x45398ff9, 0x8a14734a, 0x09e8208e, 0x18109716, 0xf73db871,
0xad841334, 0xb77606af, 0x539aaa53, 0x5b3f9aa2, 0x81b7cd23, 0x4795a0b6, 0xe534763a, 0x1d76556b,
0x7c5c9a58, 0xb7003bec, 0xfd4c55d8, 0x7d9bac3c, 0xb11ef2f5, 0xd17229b8, 0x4e20b59f, 0x274aa421,
0x5cfd682d, 0x13794dee, 0xaa0feb1e, 0xab4e6384, 0x67ef1f62, 0x25686df1, 0x4c0222aa, 0x744c2e19,
0x561f35e9, 0xf8e22c4c, 0x4f863ce0, 0x4f15b253, 0x2bf4b937, 0xf09e873e, 0x96627d1a, 0x5b51e77e,
0x10e61481, 0xfd28b58a, 0xe34fc314, 0x12160d1b, 0xddf8d02f, 0xc56b1376, 0xce64ae6c, 0x4295c0ed,
0x58b1c5c7, 0xf7f5adc3, 0x03c5a5a0, 0x8769e34d, 0x4e01b5b0, 0x793a96dd, 0x4169c9db, 0xadc496aa,
0x7d5dc5e4, 0x286d5a0f, 0x6c307a00, 0x9e8a7f57, 0x8880e20b, 0x4938b163, 0x3acea0cb, 0x36f331ba,
0xf66f3c41, 0xfa626b07, 0x0541bb30, 0xb0b72590, 0x83542c3f, 0xd00c7261, 0x2d9b31dc, 0xb8a6d50b,
0x2a1e7c82, 0x8752abdc, 0x3498e8a6, 0xd7da1c7e, 0x5f451585, 0x13896231, 0x7e8623ec, 0x47c934a6,
0x38c898f7, 0xd265d1a8, 0x563fe6c7, 0x94f4fe90, 0xbf8bdb54, 0xd62f47a5, 0xfaeedc35, 0xb6076992,
0xfe7acb2b, 0x1c7012c9, 0xc82c8820, 0x18c81963, 0x6ac638cc, 0xc728e32e, 0x1931ef4b, 0x7287bf52,
0xc569fde8, 0x12f65cc0, 0x44c44e2e, 0x8d907180, 0xca04d47e, 0x404d63d6, 0x5499167d, 0x039a27d4,
0xb1cb5251, 0x0b231cd2, 0x5b536196, 0x4c350a6a, 0xee0eef22, 0x966f1225, 0x4b474c5b, 0x7fbfd5b3,
0xd3101a66, 0x0dcfa92b, 0x6de5ab3b, 0x974c54a3, 0x69ac86de, 0x1d1f241f, 0x8c5f359c, 0xf9a024f5,
0x784302e2, 0x86d17895, 0x17820cbd, 0x6e955717, 0xc27ea685, 0xd4084ab2, 0xe13c54e7, 0x9c131d1d,
0x284be1be, 0xa4bae6d4, 0x515ad718, 0x3cfc0b5e, 0x049005d4, 0xd580a4c9, 0x00a7540a, 0x431bb5a8,
0x5b8ccb1e, 0x0086d12b, 0xfecef3a1, 0x9899627d, 0xde70b335, 0xe41b39cf, 0xfc562045, 0xc2354b34,
};
}
internal class ComyuCrypt : CxEncryption
{
public ComyuCrypt () : base (0x1a3, 0xb6)
{
OddBranchOrder = new byte[] { 4, 3, 2, 1, 5, 0 };
EvenBranchOrder = new byte[] { 0, 7, 5, 6, 3, 1, 4, 2 };
}
protected override uint[] ControlBlock { get { return ComyuControlBlock; } }
static readonly uint[] ComyuControlBlock = new uint[] {
0x9c91badf, 0x8b8f868d, 0xdf919096, 0x8b91909c, 0xdf93908d, 0x9c90939d, 0xd2d2df94, 0x9e8bacdf,
0x9e9c968b, 0xdf869393, 0x9bdf8d90, 0x929e9186, 0x939e9c96, 0xdfd38693, 0x9a8d969b, 0x86938b9c,
0xdf8d90df, 0x969b9196, 0x8b9c9a8d, 0xdfd38693, 0x91968c8a, 0x978bdf98, 0x8fdf8c96, 0x8d98908d,
0x9edf929e, 0x90d09b91, 0x939ddf8d, 0xdf949c90, 0x92908d99, 0x978b90df, 0x8fdf8d9a, 0x8d98908d,
0xdf8c929e, 0x93939688, 0xdf9a9ddf, 0x9a939396, 0xdf939e98, 0x8bdf869d, 0x93df9a97, 0x919a9c96,
0x9edf9a8c, 0x9a9a8d98, 0x8b919a92, 0x4e7ddfd1, 0x897c337d, 0xb07c727c, 0x7f7c767c, 0x8a7c1d7d,
0x9d7c727c, 0x0f7db17c, 0x3c6fbe7e, 0x3a7db66c, 0x157d5f7d, 0xb66c516c, 0x5f7d3a7d, 0xbe7e157d,
0x256f436d, 0x3a7db66c, 0x157d5f7d, 0x256f2b75, 0x3a7db66c, 0x157d5f7d, 0x436ebe7e, 0x897c337d,
0xb07c727c, 0x7f7c767c, 0x187d567d, 0x5d7d8f68, 0x4e7d167d, 0x327d397d, 0xbc7c767c, 0x6c7ca57c,
0x367da77c, 0x177d197d, 0x497d2974, 0x157d187d, 0x5d7d3b7d, 0x487d237d, 0xbcf5bd7e, 0x8d868f90,
0x8b979896, 0xdfd6bcd7, 0xc6cfcfcd, 0xa83a74df, 0xacb4adb0, 0x93bedfd1, 0x968ddf93, 0x8c8b9798,
0x8c9a8ddf, 0x9a898d9a, 0xf5f5d19b, 0x4b768a7e, 0x407d427d, 0x9f7c327d, 0x7f7ca47e, 0xbd7e417d,
0x7dbf7ef5, 0x7d397d42, 0x73576959, 0x7d367d71, 0x7d326c32, 0x7d377d56, 0x6a2b755d, 0x7d3a7d40,
0xf5bd7e1f, 0x6768bf7e, 0x337dae75, 0x896d1577, 0x74733a7d, 0x3d7d2e7d, 0xbd7e527d, 0x76bf7ef5,
0x744269a1, 0x6e506c5b, 0x7d377d33, 0x6f357d18, 0x74496e49, 0x6e506c5b, 0x7ea37e33, 0x7ea37ea3,
0x72f5f589, 0x718e6e7d, 0x6ca96f8c, 0x7eac6f8c, 0x6973f5bd, 0x397d646e, 0xb67c937c, 0x337d6c7c,
0x3b655165, 0x5f7d3a7d, 0x1669167d, 0xa775337d, 0xbe7e367d, 0x3d7d1577, 0x9f6c337d, 0x557d1f6f,
0x3e7d5f7d, 0xbd7e427d, 0x447df5f5, 0x327d157d, 0x1669be7e, 0x397d4d7d, 0x5b7d3376, 0x337d4973,
0xaf6a3376, 0x5270987e, 0x7ebe6870, 0x6c337d97, 0x6c8c718c, 0x7e1f6f9f, 0x7df5f5bd, 0x76337d44,
0x7d4269a1, 0x7e166933, 0xf5a37ea3, 0x7d4a6cf5, 0x7d796d33, 0x7d447336, 0x7e167d15, 0x70527098,
0x977ebe68, 0x4e6c367d, 0x157d567d, 0x6ff5be7e, 0x714e6e25, 0x7d397d2d, 0x753b7d4a, 0x7d3e6f90,
0x6f427d4a, 0xdf9e676f, 0x936f3a74, 0xbe7e327d, 0x658f6bf5, 0x6d337d2f, 0x733a7d47, 0x7d926d56,
0x7e357d18, 0x69506c98, 0x7d977eba, 0x7d407d42, 0x76907039, 0x7e5b7d10, 0xf5f5f5bd, 0x786d8a7e,
0x497d2b75, 0x377d1e7d, 0x337d5d7d, 0x897eb77e, 0x836dbf7e, 0x72df3276, 0x7e707098, 0x6f987ea1,
0x7d9f744c, 0x6a5e6933, 0xf5977e04, 0x6c8a7ef5, 0x74547d99, 0x7d557dbc, 0x7d167d48, 0x6f387d26,
0x708b703d, 0x7e5d7db3, 0x68bf7e89, 0xdf2b76b2, 0x1e6fa16f, 0x987ea17e, 0x447d5b7d, 0x547d3d7d,
0xf5f5977e, 0x7e6e8a7e, 0xbe74527d, 0x427d177d, 0x197d5d7d, 0x597d347d, 0xbf7e897e, 0x056c8b70,
0x70df6b6a, 0x7ea17e8b, 0x7caa7498, 0x7cbc7c7e, 0xf5977e97, 0x7c8a7ef5, 0x6ca87c97, 0x7d227d5a,
0x7d557d1d, 0x7d427d3e, 0x7dba7118, 0x7e437d48, 0x77bf7e89, 0xdf0d6e36, 0xa17e746b, 0x9f7c987e,
0x8c7c6c7c, 0x977e767c, 0x70f5f5f5, 0x7d207d76, 0x7690703b, 0x7d3e7d10, 0x936fca42, 0x2b75337d,
0x327d367d, 0xb968be7e, 0x1f7d1170, 0xb26fbe7e, 0x1f7d7568, 0x4276be7e, 0x377d1f7d, 0xbd7e5d7d,
0x417df5f5, 0xbd7e557d, 0x6fcaf5f5, 0x6f337d93, 0x714e6e25, 0x7d567d2d, 0x7d377d18, 0x70987e16,
0x7e9c6da8, 0x7cad7c8c, 0x7e7a7c81, 0x7d977e8b, 0xf5be7e32, 0x0f7d3268, 0x127d7872, 0x167d467d,
0x397d4e7d, 0xbe7e3a7d, 0x1a6e6f74, 0x987e377d, 0x337d8372, 0x576a0976, 0xbe7c8c7e, 0xa17c907c,
0x8b7ea47e, 0x0f7d977e, 0x337d2c77, 0x237d237d, 0x7f6e367d, 0x4e7d167d, 0x557d397d, 0xa36b3d76,
0x377d367d, 0xbd7e167d, 0x4271f5f5, 0x337d6a72, 0x907cbe7c, 0xa47ea17c, 0x907c987e, 0x727c8d7c,
0x977e6c7c, 0x256f397d, 0x4c7d4e6e, 0xbe7e157d, 0x1a6e5274, 0x4c68377d, 0x3268337d, 0x17710f7d,
0x4a7d367d, 0x447d427d, 0x056c337d, 0x187d567d, 0x74f5be7e, 0x7d936f3a, 0x7d407d42, 0x7db06e33,
0x7db46936, 0x7e167d15, 0x7e8d72be, 0x7d4a7da7, 0x6c0e6b54, 0x7e127005, 0xf5f5f5bd, 0x0f7d4c68,
0x5b7da06e, 0x576a0976, 0x407d427d, 0x466fbe7e, 0x9271ad74, 0x7768337d, 0xbe7eb469, 0x4a7d447d,
0x9a6b3b7d, 0x337d5b76, 0x576fad73, 0xa37ea37e, 0x7df5f5f5, 0x7d157d44, 0x936fca32, 0xbe7e0f7d,
0x926d936f, 0x357d157d, 0xad7c987e, 0x7a7c817c, 0x5d6f337d, 0x8c7eba75, 0x817cad7c, 0x937c7a7c,
0x987c9d7c, 0x977e8b7e, 0x397d297d, 0x3e7daa68, 0xbd7e427d, 0x447df5f5, 0x3b7d4a7d, 0x936f3a74,
0x926d327d, 0xbd7e167d, 0x7d3268f5, 0x6e327d36, 0x7d61701c, 0x68b46a55, 0x7d417d89, 0x7e427d3e,
0x7cf5f5bd, 0x7c907cbe, 0x7da47ea1, 0x7d3a6955, 0x7d397d2b, 0xf5be7e54, 0x4e6e256f, 0x157d4c7d,
0x987e427d, 0x9c6da870, 0xad7c8c7e, 0x7a7c817c, 0x977e8b7e, 0x237d1f7d, 0xbe7e427d, 0x2b7d3a69,
0xf5f5bd7e, 0x7d447df5, 0x69a17633, 0x69337d42, 0x7ea37e16, 0xf5f5f5a3, 0x0f708c6a, 0x367d6268,
0x557d8e73, 0x427d157d, 0x936f3a74, 0xbe7e327d, 0x72987ef5, 0x69337d6a, 0x7e68707d, 0x6c1b6b97,
0xdfbb6f21, 0xac7cb57c, 0x337d7e7c, 0x0f7d3268, 0x177d2771, 0xbe7e3b7d, 0x7d237df5, 0x7d567341,
0x755d6f35, 0x68367dba, 0x73407d58, 0x7d567d03, 0xf5bd7e5b, 0x8a7ef5f5, 0x157d447d, 0x1f7d3a7d,
0x427d4b76, 0x327d407d, 0xa47e9f7c, 0x417d7f7c, 0x7ef5bd7e, 0x7d427dbf, 0x76597d39, 0x7d427d4b,
0x730f7d40, 0x7d517d8e, 0x7e557d33, 0x7d4e7dbe, 0x7d837233, 0x7d447633, 0x7d576a50, 0x7d507d41,
0x7d397d41, 0x7d3b7d4a, 0xf5897e1f, 0x466cf5f5, 0x397d4476, 0x68707d69, 0x6fcb397d, 0x6d337d93,
0x7e2b7578, 0x7cad7c8c, 0x7e7a7c81, 0x7e337d8b, 0x7d486dbe, 0x7d48685d, 0x7d917155, 0x7e167d23,
0xf5f5f5bd, 0x7ea37ef5, 0x7d4c7da3, 0x72be7e5f, 0x7d16695e, 0x7d577d33, 0x67537d39, 0x7d0f7d9d,
0x7d497d32, 0x7d197d20, 0x22c3f55b, 0x1fe1bca5, 0x296d327f, 0xbf4655bb, 0x271bfd84, 0x9dc9f775,
0x6a396019, 0xbb316b08, 0x7d4ccbf5, 0xef612dc2, 0x4e7cb1a1, 0xefc091a2, 0x0c4095b7, 0x4dcd0f8f,
0x09fe386e, 0x8f83fce6, 0xaf8b737b, 0x4db8803a, 0xc7d3e004, 0xedd446ee, 0xe18f337f, 0xb467401c,
0x11c025fa, 0x0ed6322f, 0x7f493793, 0xa2b52008, 0x35a038c4, 0x4a640e05, 0xe9b611d3, 0x26fa62ce,
0xcef2d932, 0xa2f2ba50, 0x2fcac91c, 0xbcd22555, 0xa02a089a, 0xacbc800e, 0x550f8e29, 0x62c73a93,
0x897f08c6, 0xf3799463, 0x6fd0cc73, 0xed4411f4, 0x7e2321fb, 0xaad6aec5, 0x036078b2, 0x25494cd5,
0xc2d3bfd1, 0xd5ea81fc, 0x0886894d, 0x6cff2667, 0x41fccddb, 0xd396d716, 0x2a9d5a09, 0xe638827b,
0xadf4635c, 0xc6003fef, 0x31454acc, 0xe1500dda, 0x46cf53d5, 0x750cd529, 0xfda3aa39, 0x4b7877a7,
0x53d05d5a, 0x01332627, 0x1dd10160, 0x9e609da4, 0xd6f5a7b6, 0x8b382dc0, 0x004d88b4, 0x545a4018,
0xba980aaa, 0xeea43a3d, 0xb91b3fe4, 0xa0965c99, 0x3731d8f0, 0xe8c0644a, 0x9e72955e, 0xab59a0e7,
0x6b23cb98, 0x1fe4fad6, 0xa37f3f8e, 0x2214b7cb, 0x9c621ea9, 0x8d89f543, 0xe0d49701, 0xb9ac412a,
0x403925dd, 0xe42d1546, 0xcf873ac1, 0x0aa7dae5, 0x21e332aa, 0x39378fd4, 0xbae1f8d7, 0xe2498f35,
0x16c9c11c, 0xb8a652f7, 0x2fa5130b, 0x1a0a5cbf, 0x608d77c0, 0xd313f4bd, 0x9df44553, 0xf8005ec4,
0xc8816b32, 0x41a1f393, 0xb44a9a77, 0x402201bd, 0xe0a33bf0, 0xf05a98fe, 0xe59490e9, 0x34fc3083,
0x057cf4ff, 0x63afcc41, 0xa6e5db4c, 0xa6c33972, 0x109409ab, 0x63ed6914, 0x5b339232, 0xd0a43407,
0x306e5208, 0xae194901, 0xcdcb1d3d, 0xf1695d07, 0x5f3b59d0, 0xa921d2a4, 0xc43e6ffa, 0xf09d7f22,
0xe2086b83, 0x0c887070, 0xed0395e8, 0x854d8765, 0xa770cc28, 0x686f3803, 0xd12289b4, 0x55376b55,
0x347ae04d, 0x13cd8867, 0x21fcd359, 0x6f6838a2, 0x5d878268, 0x081230b0, 0x4e650001, 0x27feb637,
0x2a5a0d75, 0x98b98e8a, 0x37a3d205, 0x9bd9a16b, 0x626f4633, 0x1aff66d5, 0x73775d2d, 0x943acf9f,
0x63bfbdae, 0x690441be, 0xb461c91f, 0x1c31ec2f, 0x15b44e96, 0x5a88b44a, 0xf50a5482, 0x2b90d060,
0x6aed13b0, 0xc367c97e, 0x9aba2ed8, 0xc628c155, 0x0e5cbe5a, 0x41277292, 0x43f59984, 0x3f7e3bf8,
0x487e1fe9, 0xfb462b23, 0xda4f6038, 0x9764f5f1, 0x15ec6247, 0x7659232c, 0xcdd0bb54, 0x5bc0d691,
0xefcc30e6, 0xa35e5432, 0x7dbb9ab6, 0x3937f5c4, 0x49d309fd, 0x477e3255, 0x69a0206f, 0x2850cb81,
0x406ecd8c, 0x8e2af5ac, 0xf8175347, 0x91615d3a, 0xc9ac2788, 0xf57b4d62, 0x0e7f004d, 0xb9d0f4cb,
0x15a46dc1, 0x24e323d0, 0x40690307, 0x0218c53a, 0xae7f20f6, 0x25dc07d6, 0x1a8a4d22, 0x9ed1266b,
0xb8cd5f73, 0x0c69a346, 0x34e036c3, 0x5c95bf6b, 0xee4f4379, 0x7f092573, 0x6a57d5e0, 0xd50f659f,
0xd931e110, 0xab0e36a4, 0x1c1878ef, 0x852a0c8b, 0x7a1c0945, 0x932795e1, 0x9769d174, 0x74811abb,
0xab256a5e, 0xffcb49e9, 0x40aa9400, 0x57938786, 0x41d1eb77, 0xde98b089, 0xe8ee38a6, 0x505c73c0,
0x49ed3142, 0xf4083254, 0xa22c2a55, 0xa14c3606, 0x8b060b88, 0x89688eff, 0xf9006b5c, 0x4830826f,
0xb9e5258a, 0x6f57089e, 0xf3cdcc27, 0x737a1d1d, 0x4e3ef76e, 0xea922ff0, 0x6a6776b4, 0xea6989ef,
0xff16a4c3, 0x1587c95e, 0x3b28c5ad, 0x07fe3b4d, 0x3c297bdc, 0x11b84448, 0x5353674d, 0x9dad7729,
0x0cc568f5, 0x352323c2, 0xb29acf5b, 0x73f73e82, 0x82624fee, 0xbcedf56f, 0x27a5f16e, 0xf5e3a22f,
0xebf59351, 0x48e36eb9, 0x48a2ca0e, 0xf8613963, 0xbbb1532f, 0xd36d1b78, 0x8975b60f, 0xc39823ad,
0x1304073b, 0x396aeeac, 0xefb59893, 0x958f8346, 0x9bc8e713, 0x7ce3f522, 0x549c45cc, 0x829a7a8f,
0x78f8933c, 0x0806232f, 0x80ecc61e, 0xc313d91a, 0xc4d8177e, 0x086f84d8, 0x604bd645, 0x0b70533b,
0x482a2cdb, 0xf472fa55, 0xc2a2c923, 0x3a3d288b, 0xd48cd88c, 0xf4b831b2, 0xf460a283, 0xe1800a44,
0x316acade, 0x49950c6a, 0x769ad791, 0xdb0587c2, 0xa4fb0fd8, 0x79f84441, 0xef0687e9, 0x140761e6,
0xcaa68da5, 0xffc4ebd9, 0x4e049033, 0x6522f813, 0x3beac8d7, 0xfc576d57, 0x1d16d6d8, 0x72035c0e,
0x476701e9, 0x687a5a66, 0x92cf6fbf, 0x40b7bc7e, 0x488791ea, 0x3f3c9d5f, 0x473e966e, 0xe12be8d0,
0xc5b220e3, 0x83f5b5d1, 0xf8425ce8, 0x147ffdfe, 0x3c2e9f70, 0xae377b6d, 0xf2ef4032, 0x37e31d6f,
0xe38a8d07, 0x0bab8299, 0x35d0fa8c, 0xb3b7134f, 0x2d261472, 0x729470d9, 0x1f532499, 0xc17c11d9,
0xa75bebb5, 0xe93f4826, 0x66bbaab8, 0x1a1283c2, 0x63630227, 0x30decdde, 0x3a408005, 0x40708778,
0x03c00538, 0x2d4005cf, 0x1540871f, 0x8336b988, 0x0f13206e, 0x4a7a432a, 0xccab4d42, 0x88f8a974,
0xea3c1597, 0x286a36d3, 0x4a379af7, 0x56ed62cc, 0x00a527a7, 0xcdf6e8d2, 0x496e4258, 0xad0963dc,
0x35849058, 0xd5318630, 0x471347de, 0xd5f41679, 0x6c5dfa1c, 0xa2e3962b, 0xa2a9d0cd, 0x51f389b2,
0x2c32d7d9, 0x0bcbb660, 0xfcc65c4d, 0xebae9861, 0xdb306771, 0xddb68d04, 0x349dd702, 0x41601e5c,
0x45e0a6e6, 0x4d47b8b9, 0xb13de5bd, 0x9470a646, 0x4f8d79c8, 0x5198bd57, 0x464f0f41, 0xa3b94eb5,
0x9ba67548, 0xda8ef82a, 0x5e4f5ddf, 0x87362e51, 0xa54fa800, 0x7a170efd, 0x9eaf1ed6, 0xcba3327b,
0x0eb40a70, 0x6c485e61, 0xb5816353, 0x153a356e, 0xe6ce9561, 0x00401a68, 0xed446533, 0x4aeca02f,
0x23a60800, 0x7cd87f07, 0x66449ba2, 0xfd73ef7f, 0x585f6023, 0xca4e9196, 0x7f9703fb, 0x5ca05a49,
0x8fd8e743, 0x2ccc8bf2, 0x0a344fc5, 0xa8820b45, 0x6def5335, 0x6955a016, 0x0caa83f9, 0xe989cb22,
0x404d2481, 0xfca15ea3, 0xa85a37ec, 0xac76359c, 0x418b2607, 0x1825b50c, 0x49eb49f6, 0x474b902a,
0xd449e36e, 0x96fc5196, 0x7539f749, 0xdd08949c, 0xb1bafce2, 0x83cc94fc, 0xa6f5a778, 0xb164ab0f,
0x40f8b398, 0xe241b707, 0xca525e65, 0x06dffc5a, 0xbf7f22ab, 0x3c02be16, 0x904e2b6e, 0x6890df7d,
0xf923628c, 0x730e1349, 0x4813ba35, 0xe4cb5c64, 0x1fcae404, 0x58ee3503, 0x61771f68, 0x1248d918,
0xef90f892, 0x87e0cedc, 0xb19301af, 0x4c0dcf89, 0xed85398c, 0xd05f11ad, 0x8df2b9ca, 0x4430f3c4,
0x3b826d5e, 0x9a8c1301, 0x7a57976f, 0x4e8cecb0, 0xb49a840b, 0x90619865, 0x72d85bcb, 0x8d5800ff,
0x3923dd0e, 0x5325f55d, 0x818f9c43, 0x3defc69e, 0xf80c6347, 0x7bc18ded, 0x702d62ec, 0xeafc05a3,
0x99d0e9af, 0x054be68a, 0x10581c9d, 0x7f191f91, 0xac7a6274, 0x64212eed, 0xcf38d90a, 0xc213eb86,
0x2ccd58b9, 0xbf09bf04, 0x6e7b4f74, 0x6b97d008, 0x2c7ee79c, 0xb782e7ce, 0x4114e61d, 0xfbd160bb,
0x8c0c905e, 0xbd041c0c, 0xcdab6825, 0x5363e19a, 0xd331c54b, 0x9ca28ca4, 0xf98cd90a, 0xe34976be,
0xd4e91fd1, 0xe4e2808b, 0x4d98c9ea, 0xc623d50a, 0x67160a46, 0x4af9b11c, 0x133681f1, 0x37e36ffc,
0x753e969b, 0xd9f11a04, 0x07713bfa, 0x7eb82b2a, 0xc9de023f, 0x222c5422, 0x98a7a7f0, 0x60483a49,
0x8ee12ab3, 0xeb5a1739, 0x834d7849, 0x60c2def7, 0x46a2b355, 0x61ced01e, 0x0b8c93ce, 0x70deadb9,
0xfcc5828f, 0xc5052168, 0x33f1e2b5, 0x40bb1886, 0x282b920f, 0x6f99e8a2, 0x5fae6602, 0xb932618a,
0x17437ece, 0x3d170b7a, 0x858cdb89, 0xd9779b2d, 0xf42c6ce5, 0x7287a3ef, 0xefd61b2b, 0xb7915615,
0xa1fabb8b, 0x67dc4585, 0xd54b6efa, 0xe809553d, 0xacd3fb38, 0x3b4eec6f, 0x13453165, 0x9085b8f1,
0x7cabc3cf, 0xd1913b48, 0xe8d8927c, 0x12bf3231, 0xbf4f37d6, 0x774e5f3a, 0x1229983c, 0x2bf06330,
0xf1daf9fc, 0xf99c1801, 0x33f8ac7f, 0xe9934bb2, 0xb534d378, 0xff559112, 0xcbdec792, 0x96121910,
0xc974af73, 0xf3205eac, 0xd0084acd, 0xaceb2095, 0x83c8ee13, 0x685a9636, 0x8aa9d8c8, 0x3f675f7c,
0xb781f150, 0x12fccd5b, 0x1f677a9a, 0xc3d87358, 0x9c39831b, 0xc2442b23, 0x99cd89fb, 0xbb291f8a,
0xdb08099a, 0xe93ba3cf, 0x23ed731d, 0x56a9efa9, 0x5e64f72b, 0x5c232c3f, 0xfb89bbb4, 0xe1b8f5fb,
0xd08bab44, 0x9e55b788, 0x105ed931, 0x37e86bdf, 0x110eef10, 0xaf751d5e, 0x6338d467, 0x80e8740e,
};
}
internal class HaruiroCrypt : CxEncryption
{
public HaruiroCrypt () : base (0x101, 0x31D)
{
PrologOrder = new byte[] { 0, 2, 1 };
OddBranchOrder = new byte[] { 5, 2, 3, 0, 1, 4 };
EvenBranchOrder = new byte[] { 5, 0, 2, 1, 7, 3, 6, 4 };
}
protected override uint[] ControlBlock { get { return s_ControlBlock; } }
static readonly uint[] s_ControlBlock = {
0x9C91BADF, 0x8B8F868D, 0xDF919096, 0x8B91909C, 0xDF93908D, 0x9C90939D, 0xD2D2DF94, 0x9E8BACDF,
0x9E9C968B, 0xDF869393, 0x9BDF8D90, 0x929E9186, 0x939E9C96, 0xDFD38693, 0x9A8D969B, 0x86938B9C,
0xDF8D90DF, 0x969B9196, 0x8B9C9A8D, 0xDFD38693, 0x91968C8A, 0x978BDF98, 0x8FDF8C96, 0x8D98908D,
0x9EDF929E, 0x90D09B91, 0x939DDF8D, 0xDF949C90, 0x92908D99, 0x978B90DF, 0x8FDF8D9A, 0x8D98908D,
0xDF8C929E, 0x93939688, 0xDF9A9DDF, 0x9A939396, 0xDF939E98, 0x8BDF869D, 0x93DF9A97, 0x919A9C96,
0x9EDF9A8C, 0x9A9A8D98, 0x8B919A92, 0x4E7DDFD1, 0x897C337D, 0xB07C727C, 0x7F7C767C, 0x8A7C1D7D,
0x9D7C727C, 0x0F7DB17C, 0x3C6FBE7E, 0x3A7DB66C, 0x157D5F7D, 0xB66C516C, 0x5F7D3A7D, 0xBE7E157D,
0x256F436D, 0x3A7DB66C, 0x157D5F7D, 0x256F2B75, 0x3A7DB66C, 0x157D5F7D, 0x436EBE7E, 0x897C337D,
0xB07C727C, 0x7F7C767C, 0x187D567D, 0x5D7D8F68, 0x4E7D167D, 0x327D397D, 0xBC7C767C, 0x6C7CA57C,
0x367DA77C, 0x177D197D, 0x497D2974, 0x157D187D, 0x5D7D3B7D, 0x487D237D, 0x7EF5BD7E, 0x6D9473BF,
0x7D7776B5, 0x72337D5D, 0x705D7D28, 0x7D9E7353, 0x7DB76D0F, 0x7D7B7116, 0x7D956933, 0x70BE7E0F,
0x7D187DA0, 0x69377D56, 0x7D8B70B9, 0x7D686A33, 0x7D706A55, 0x7D3B7D3A, 0x7E527D5D, 0x0872F5BD,
0x6E6A337D, 0xAA715D7D, 0x447D167D, 0x6376337D, 0xBE7E367D, 0x3E7D2F7D, 0x177D447D, 0x3767397D,
0x5B7D237D, 0x4C7D4C7D, 0x567D1D7D, 0x4876377D, 0x97700D6F, 0x447DBD7E, 0x367D4E7D, 0x9C7E9C7E,
0x557D216B, 0x167D7074, 0xF5F5B67E, 0x7B71BF7E, 0x7173BE7E, 0x8B70786C, 0xBD7E7E72, 0x711C77F5,
0x690F7D8B, 0x7D887125, 0x6C3B7D4A, 0x7D10768C, 0x72887533, 0x693A7DA5, 0x74286A2D, 0x7E796D52,
0x9A67F5BD, 0x1F7D2569, 0x187D2C7D, 0x9C7E477D, 0x397D9C7E, 0x5D7D4173, 0x5D7D427D, 0xAD7C987C,
0x0E7D377D, 0x507D417D, 0xBE7E387D, 0x3E7D1D7D, 0x177D307D, 0x417D7B71, 0x3B7D3E7D, 0x5F72B16B,
0x6870337D, 0x8E71337D, 0xBC74BE7E, 0x377D367D, 0x956D167D, 0x8E71337D, 0x2F7D337D, 0x177D397D,
0x187D527D, 0x327D5D7D, 0x167D5D7D, 0xBD7E127D, 0x7D3A7DF5, 0x7D447D1F, 0x7D3D7D5D, 0x7D427D3E,
0x7D1F7D18, 0x7242765B, 0x7D597D93, 0x7D167D3B, 0x7D567D33, 0x7D567D12, 0x7D377D0E, 0x7EB67E5D,
0x7D5F7DBF, 0x7D377D0E, 0x70557D33, 0x71337D68, 0x6F367D8E, 0x7DBC7493, 0x7D167D5F, 0x7D0E7D37,
0x7E347D3B, 0xB17CF5BD, 0x747CA47E, 0xBF7EB77E, 0x367D7B71, 0x127D4173, 0x177D467D, 0x4C691E7D,
0x7A6D256C, 0x417D377D, 0x197D507D, 0x5F7DBD7E, 0x3D7D5D7D, 0x827C337D, 0x867CBC7C, 0xA77CA47E,
0x47733E76, 0x327D367D, 0x367D556C, 0x407D7768, 0x5B7D1E7D, 0xF5F5BD7E, 0x447DBF7E, 0x377D0E7D,
0x557D216B, 0x3976BE7E, 0x8C6C337D, 0x3A7D7872, 0xA5728875, 0x71740F7D, 0x4E7D167D, 0x367D397D,
0x3E7D377D, 0xBD7E427D, 0x7D397DF5, 0x7D5F7D17, 0x6F477D59, 0x7D356F9A, 0x7D567D41, 0x7D0E7D37,
0x7D567D41, 0x7D1D7D55, 0x7D3B7D3E, 0x719C6C16, 0x68337D36, 0x7D267548, 0x7D986F36, 0x7D0E750F,
0x7D167D46, 0x7D4A7D18, 0xF5BD7E5D, 0x367D216B, 0x177DAA6F, 0x4C7D0E76, 0x167D157D, 0xA77E056C,
0x346C327D, 0xB670AD6E, 0x177D127D, 0x6F720F7D, 0x427D4F7D, 0x7B71BD7E, 0x2F7D327D, 0x527D387D,
0x9768516C, 0x3B7D4A7D, 0x9C7E9C7E, 0x387D2F7D, 0x41735D7D, 0x3A7D8B68, 0x5D7D5F7D, 0x397D3D7D,
0x157D356A, 0x4A7D3B7D, 0x3E7D237D, 0xBD7E427D, 0x7D7B71F5, 0x7D216B55, 0x7D417336, 0x7D427D5D,
0x7D3E7D56, 0x7D337D42, 0x7D447D32, 0x73377D0E, 0x7D8B6841, 0x7D1E7D49, 0x7D567D37, 0x7D427D3E,
0x7E367D33, 0x7E9C7E9C, 0x7EF5F5BD, 0x7D447DBF, 0x703B7D4A, 0x7D87748B, 0x71BE7E22, 0x77327D7B,
0x730F7D2C, 0x7D4A7D77, 0x6848683B, 0x7D3E7D58, 0xF5BD7E42, 0x557D216B, 0x187D166A, 0xAD71487D,
0x337D2B75, 0x0D6F4876, 0x297D9770, 0xF5F5BD7E, 0x5D7D5F7D, 0x397D3D7D, 0x5B7D1F7D, 0x876C1577,
0x8B684173, 0x0F730F7D, 0x487D127D, 0x207D427D, 0xBD7E367D, 0x7D447DF5, 0x7E3B7D4A, 0x719C7E9C,
0x74337D7B, 0x7D6271BC, 0x750F7D40, 0x7D567D92, 0x7D167D20, 0x7D207D42, 0xF5B67E36, 0xD2D2F5F5,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0x647EF5D2, 0x6C7173DF, 0x70BF7E78, 0x7E7E728B, 0x7D967EBF, 0x7D547D3D,
0x7E237D4A, 0x7D327DBF, 0xD0567D16, 0x948A8CAB, 0x96978C96, 0xB7DF9E92, 0x948A8D9E, 0xDF957E9E,
0x6EF5DFF5, 0x7D1372B0, 0x7C8E7C33, 0x7CBC7C72, 0x73BE7E6C, 0x6F786C71, 0x7D3B7618, 0x7E7A6933,
0x71F5F5BD, 0x7C337D90, 0x7C827C72, 0x7DA77C6C, 0x7D4D6C36, 0x7D3B7D15, 0x7D167D5D, 0x7D417D33,
0x71BE7E55, 0x6F397D90, 0x6E426B4C, 0xF5337D31, 0x9C7CB37C, 0x546F5D7D, 0x557D9675, 0x4A7D2F76,
0xBE7E3B7D, 0xBC7C827C, 0xA47E867C, 0x377DA77C, 0x936F1A71, 0x367D0973, 0x4A7D316E, 0x327D3B7D,
0x237D5D7D, 0x407D5D7D, 0x436D996E, 0x377D367D, 0x547D177D, 0x377D157D, 0xBD7E5D7D, 0xAF7CF5F5,
0xB57C6C7C, 0x157D356A, 0x3B7D4A7D, 0x237D4A7D, 0x427D3E7D, 0x936F1A71, 0x0F7D0973, 0x347DB469,
0x68F53B7D, 0x7D267548, 0x7D1D7D36, 0x7D3B7D3E, 0x7E167D52, 0xDFF5DFBD, 0xD2D2F5F5, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0x647EF5D2, 0x6B3E76DF, 0x7EAD7103, 0x7E296DBF, 0x7D967EBF, 0x7D227D56, 0x7E237D1D,
0x7D3D7DBF, 0x7E547D31, 0x929EB4A1, 0x929E8696, 0x8CABDF9E, 0x949E9D8A, 0xDF957E96, 0x6AF5DFF5,
0x7D9A6F15, 0x7D5F7D33, 0x7D207D1D, 0x7D5B7439, 0x75486836, 0x6F0F7D26, 0x6F177D27, 0x7D177D48,
0xF5167D48, 0x936F1A71, 0x337D0973, 0x166C9C68, 0x227D0A6F, 0xF5F5BD7E, 0x4E7D387D, 0x4D6B567D,
0x3B7D507D, 0x167D5D7D, 0x1D7D5F7D, 0x0F7D207D, 0xB77C8B7C, 0xA47E727C, 0xBE7E4A7D, 0x3B7DAC6E,
0x7DF50F7D, 0x7D3D7D44, 0x71527D37, 0x7D247217, 0x7D527D19, 0x7D377D4E, 0x7D3B7D4A, 0x7E527D5D,
0x754868BE, 0x6E337D26, 0x6D6A721A, 0xF5BD7E73, 0x417D427D, 0x8E74256F, 0x876C2B6E, 0x507D417D,
0x4C69327D, 0x856E5B77, 0xF5DFBD7E, 0xD2F5F5DF, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0x7EF5D2D2, 0x3E76DF64,
0xAD71036B, 0x5F7DBF7E, 0x207D1D7D, 0x967EBF7E, 0x227D567D, 0x237D1D7D, 0x5F7DBF7E, 0x207D1D7D,
0x9EB4A17E, 0x9E869692, 0xBEDF9E92, 0x9A929E86, 0xF5DF957E, 0x4169F5F5, 0x527D167D, 0x317D4C7D,
0x427D507D, 0x9675546F, 0x036B337D, 0x6870936F, 0xBD7E5470, 0x1A71F5F5, 0x0973936F, 0x4E7D337D,
0x0F7D397D, 0x237DBE7E, 0x3A7D167D, 0x8E71586E, 0x197D337D, 0x367D5B7D, 0x5B773D76, 0x3E7D557D,
0x527D3B7D, 0x3B7D157D, 0x167D5D7D, 0xF5F5BD7E, 0xAD6EA96C, 0x3A7D9173, 0x3569BE7E, 0x5673836C,
0x3868327D, 0x557D5D7D, 0x367D6171, 0x0F7D4276, 0x597D9372, 0x5D7D3B7D, 0x337D167D, 0x446B567D,
0x377D187D, 0x936F5D7D, 0xF5DFBD7E, 0xD2F5F5DF, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0x7EF5D2D2, 0x8176DF64,
0x64718C72, 0xA604BF7E, 0xBF7E8E71, 0x597D967E, 0x537D0E7D, 0x5B7D1A7D, 0xBF7E497D, 0x5B7D197D,
0xA17E4E7D, 0x869891BA, 0x96958A90, 0x8A90A6DF, 0x957E9094, 0x71F5F5DF, 0x7D0373AD, 0x7D5B7D4E,
0x7C7E7C33, 0x7E7C7CA8, 0x76377DA4, 0x750D6F48, 0x773A7DA7, 0x7D2B6B15, 0x7C757C33, 0x7CA47EA2,
0x7C857C98, 0x7D747C9A, 0x70577D33, 0x7E936813, 0x6F1A71BD, 0x7D097393, 0x6C9C6833, 0x7D0A6F16,
0x7D3A7D22, 0x7D5F7D1F, 0xF5BD7E16, 0x6CBB68F5, 0x7D496F66, 0x7D5D7D3A, 0x7C1F7D3D, 0x7C767CB1,
0x710F7DA7, 0x7D276F9B, 0x7D3B7D3E, 0x7D427D5D, 0x7E207D42, 0x744D6EBE, 0x7D4A7D39, 0x7E1F7D3B,
0x7730778A, 0x7E486D0A, 0x73397D89, 0x7D317D3B, 0x7D3B7D15, 0x7E167D5D, 0xDFF5DFBD, 0xD2D2F5F5,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2, 0xD2D2D2D2,
0xD2D2D2D2, 0xD2D2D2D2, 0x647EF5D2, 0x6F226CDF, 0x15BF7E13, 0x7EAB6B5F, 0x7D967EBF, 0x7D2B7D36,
0x7E127D56, 0x7D237DBF, 0x7E337D54, 0x9D96B1A1, 0x889E948A, 0x9EB2DF9E, 0x90919694, 0xF5DF957E,
0x6F4876F5, 0x68367D0D, 0x7DBD6DB9, 0x72486839, 0x68367D8C, 0x7D3B7D77, 0x6C167D5D, 0x7D617473,
0x71687033, 0x6F1A6E8E, 0xF5BD7E49, 0x7D3F71F5, 0x6A1A6E32, 0x6A377D30, 0x7168707A, 0x6F337D8E,
0xF5BD7E93, 0x856E3069, 0x507D417D, 0x536F3A7D, 0x6873886E, 0x3A7D237D, 0x3E7D417D, 0x0D6B3B7D,
0x3A7D0E7D, 0x507D5D7D, 0xBD7E167D, 0x987DF5F5, 0x926D337D, 0x327D5071, 0x876AB369, 0x557D417D,
0x046ABE7E, 0x546F0373, 0x4169327D, 0x567D187D, 0x2B75367D, 0x3E7D1E77, 0x5D7D3B7D, 0xBD7E167D,
0xF5DFF5DF, 0xD8BC801A, 0x7054615E, 0xC328FFDF, 0xDA125C58, 0xE29F76AE, 0x3E985EC9, 0xD68942BB,
0xACF447D9, 0x34A0EC16, 0x1774BA75, 0x6C8C73E8, 0x67F6D63C, 0x0DD99ED2, 0x325664BE, 0x0CB32A77,
0xDA949E84, 0xBC3E8E3E, 0x22C0F818, 0xD352F14E, 0x85E442D5, 0x7BB08649, 0x327D6652, 0x34D2AC9A,
0xB9525C54, 0x5E4D743A, 0x6461F214, 0xE5E044DF, 0xD7F67227, 0x5BDA6038, 0xE6666190, 0xD25A79B2,
0x83876738, 0xEF5EE84A, 0x6B2CAB32, 0x3D877003, 0x3E2EE6D3, 0x0B381E70, 0xB0822C81, 0x69AB1A74,
0x2EF5D5D2, 0xF402AFEC, 0xEEA7A289, 0x61D5E690, 0x465147E5, 0xD5949B1C, 0x31541D66, 0x148184F4,
0x6C1CE67A, 0xDC42ED2B, 0x93BC139A, 0xD3933356, 0x670BEB65, 0x7DAB5094, 0x63D8C733, 0xD903AD70,
0x4D670639, 0xC227AC3D, 0xAA98D504, 0x12FABF63, 0xC5352399, 0xC65E8E6D, 0x6AA6D630, 0x021531E5,
0x39ED9C6F, 0xAE937934, 0x40D1EACE, 0x3AE7BEF1, 0xF02500F2, 0x5D11F536, 0xEF02A224, 0xF9575EF9,
0x5573CEFB, 0x54C3877F, 0x20A894FF, 0x803C3314, 0x235C2CBA, 0x1D4FF3BB, 0xFB2D1256, 0x7056267E,
0x05265C89, 0xA1C309B7, 0xED8FFA88, 0x1502F98C, 0x07C6FA3B, 0xC8904F76, 0x4D943763, 0xFD477F04,
0xD5F33030, 0xC4DC9F81, 0xA95B87C7, 0x2AAD0AD7, 0x708F000B, 0x228B6CBA, 0x098CBD66, 0x55E149C7,
0xC231F621, 0x42AE3F42, 0x10261C48, 0x5822CAEF, 0xEC4BEA29, 0x69E16806, 0xD5AE0EFA, 0xA703BADE,
0xEF63BFFB, 0x4FC961F5, 0x9C72FB3B, 0xB61C58B9, 0x4AEC93B2, 0x755C6398, 0xFEF78F90, 0xA1F78D8B,
0x6F090D0A, 0x1B773587, 0x706CFC97, 0x56955335, 0x004EE05F, 0xBC475257, 0x7E1503C8, 0x5B78B3CD,
0x814E4BC2, 0xC1715B5B, 0xEFBFB8F6, 0x6854031F, 0xF30CE6D4, 0x2E1718D6, 0xD06045FD, 0x9B660A1F,
0x9CC8A258, 0x5897DB15, 0xB6C3C2A4, 0xB57C5D74, 0x3278D081, 0x3B5D98E7, 0x039B6E88, 0x0E24DF39,
0x7ACD36A8, 0xF44AAB04, 0x3DE85824, 0x838781C6, 0xBAA78A54, 0x3B54D906, 0x97C9152C, 0x943DE77F,
0xF99A08C0, 0x46942D51, 0x5A1BE77B, 0x16738C96, 0x32967A15, 0x3536E659, 0x9754C8C9, 0xF428132E,
0x6B4DB3E3, 0x971D7E51, 0x1C5B8614, 0x9BB28962, 0xFE1DB239, 0x18B88247, 0xCBD5D9A9, 0xF24A5632,
0x46691056, 0x2F353918, 0x52BCC5FA, 0xEE39D964, 0x3F81F0EF, 0x520A0E5E, 0xD5912E95, 0x4FB17933,
0x74B6F3C7, 0x532ED363, 0xF46FF821, 0x55A55E80, 0x71459FE5, 0xCEBC430C, 0xB5378EC0, 0x37ECB083,
0x83305B82, 0x31CFAD9C, 0xE7E4097C, 0xC230B646, 0xB95655B4, 0x11B2DBE7, 0x2435B74A, 0x8330B2A0,
0xC31446BA, 0xF3E427EA, 0x3C750CE8, 0x93BEE8B6, 0x404C5410, 0xBCA348C4, 0x9AE3AACF, 0xF8215AC7,
0xBE3AEC25, 0xC4DB481F, 0x71A8582F, 0x22B3EA36, 0x113D0A98, 0x6C826BF2, 0x3BC44E56, 0x052136DF,
0x5A94202F, 0xE7C7C837, 0xAEFFAA96, 0x481C1C2E, 0xBB6BE06C, 0x3B19DEFF, 0x95D97AD1, 0x08FA7AF9,
0x595114F5, 0x3960066E, 0xD7F9FECF, 0xC6F3CB6C, 0xF6827F92, 0x2F21BB23, 0xE2D06DB3, 0xD8A459E7,
0xB8DD726D, 0x96DEE22B, 0x8F41FC78, 0x0A6D7FB0, 0xD46D787F, 0xC8C17671, 0xCCBE2555, 0xCA93F523,
0x3260A587, 0x582375FE, 0xA1EC6529, 0x6F2E3FE2, 0x2600C9A4, 0x05471CA9, 0xA2FA1B00, 0x516844D3,
0xACEC7F36, 0xBF7E7736, 0xC8CD3AEA, 0xFC01E996, 0x79EF5BDE, 0x80837A48, 0x7544A7F6, 0xF52DC05B,
0x48F29041, 0x3D7AF54D, 0xE7A2F6DC, 0xA3324B9E, 0x845308F4, 0x6D6B59F5, 0x1107B7E9, 0x41DB9A4A,
0x664C17F0, 0x2D90801A, 0x5187C18A, 0xD1B6AE77, 0x6B088EAC, 0x7DE5AA05, 0x1CDEF8A3, 0x8895F28C,
0x3E126806, 0x96DFE11E, 0x8100EC01, 0x73EF054A, 0x7DA2ED37, 0xDE911008, 0xE84A955B, 0x4EFCD2B7,
0x67C61BA1, 0xEB08CE97, 0xB1D0F803, 0x5D2CF37D, 0x78759FB0, 0x2B4DD43A, 0xC60EE346, 0xEBDCB11E,
0xB19A3E8B, 0x9C56B73F, 0xD6279055, 0x9463C4A0, 0xC2BCCA31, 0x28E33F02, 0xEED5B252, 0x7B6B410F,
0xAD3640CB, 0x14FF0C8C, 0x41DD0B23, 0x050FBFF0, 0x801173BE, 0x06750586, 0x19F790EC, 0x01CF32C9,
0x124426E5, 0x2C2716A2, 0xED496C38, 0xCBCEEBE7, 0x1379B4F9, 0xF316B595, 0x2B4A27EB, 0x1CD50E1F,
0xD7973546, 0xE69B0AFE, 0x57BDE2C7, 0x6CB0B82A, 0x35B6B86B, 0x1A91DAAB, 0x614DFCC4, 0x6BCC4AA6,
0x611DFD79, 0x32289B49, 0xE0BA9884, 0x1BFD823A, 0x4E75B8A0, 0xBFF03DB2, 0x369D0ED4, 0x85AADDAD,
0x28F34CF4, 0x2CC4D6EA, 0xEC57778C, 0xF5ED1342, 0xC50F04DA, 0x43A9127A, 0x63511EF9, 0xEE53619F,
0xAB2F892B, 0xDAD134F4, 0x865CD0E7, 0x16911E2F, 0x6559CB8E, 0x840B78D7, 0xC9C051F9, 0x28682422,
0x5E64F8CB, 0xBF1FFC23, 0x980BE59C, 0x1534C6E2, 0xFE576703, 0xDCA27A83, 0xB7174088, 0x60741B9B,
};
}
internal class ZecchouCrypt : CxEncryption
{
public ZecchouCrypt () : base (0x1EC, 0x787)
{
PrologOrder = new byte[] { 2, 0, 1 };
OddBranchOrder = new byte[] { 0, 4, 3, 1, 2, 5 };
EvenBranchOrder = new byte[] { 3, 4, 0, 5, 7, 2, 1, 6 };
}
protected override uint[] ControlBlock { get { return s_ControlBlock; } }
static readonly uint[] s_ControlBlock = {
0x9270F55C, 0xB6862F50, 0xCBEE2F3C, 0xB3819E81, 0xFE27C837, 0x0B196E88, 0x4884FC7D, 0xFEB4A2E5,
0x991A44E9, 0x70452B25, 0x8BB83161, 0x87AC6FB8, 0x4D9251EA, 0xB35C674A, 0x18F437D4, 0x3DB344CF,
0x79994177, 0xB9AE14D5, 0x3D014374, 0xB24F96E1, 0x5C2515E8, 0x93FD6325, 0xB903664F, 0xC97BC457,
0x6CA42179, 0xB4C25E64, 0xE4A9DADD, 0x3B14D037, 0xBCACA4C9, 0x97798BD9, 0xDD8F1A4F, 0x87E240E0,
0xDE767108, 0x9AB2A99C, 0x47657059, 0xBB44019B, 0x5C6B4FC8, 0x0E01A6D3, 0xA0646531, 0x0C599669,
0xDE6591C8, 0xC6740F94, 0x7945082C, 0x9E411FF8, 0x4B2F880F, 0x0A5BE1F8, 0xF23A3A7C, 0x29E612DA,
0xFDCA8201, 0x106AADE3, 0x8E1F60CD, 0xC51D484F, 0x66750FBE, 0x6B926CC4, 0x78522E0F, 0x2BDF7E2C,
0x7682A508, 0x02EC77A3, 0x5F9E25DD, 0xF0D7280E, 0x3CA52490, 0x68AA732F, 0x5E669638, 0x8BE3E7D7,
0x52D32A49, 0x0B2D4D08, 0x753DC3A8, 0xE8B71148, 0x232A52AB, 0xF2903DE7, 0xA79B15DC, 0x971134CA,
0x5F1B535B, 0xB7DFCCC6, 0x6CE21BF2, 0xCA08B73B, 0x31824771, 0xD5F6DAD2, 0xFFC6CD89, 0xA712BDF1,
0x8F91EBB9, 0x316A0AA1, 0x3DB53BEE, 0x15803411, 0xBA61E60D, 0x2B2ECC5E, 0x7C3FCB9F, 0x16F8EDFD,
0x5BD8EC08, 0x5A574D63, 0xE3EADD33, 0xF0707487, 0x491CC7EF, 0xA28D0BD7, 0x34F7AF33, 0x5B5BFD9A,
0xAE51DEBC, 0xCD35BD18, 0xADD568A3, 0x4AFF54DB, 0x16FBAD5E, 0x972EAAE0, 0xA756D9EA, 0x5DFA6FE6,
0xAEBC6099, 0x2D17DE69, 0x771E96B6, 0x02561A66, 0xC2D01B3F, 0x843459DB, 0x992F7899, 0x0526E411,
0x2FDF7C17, 0xFEB029D6, 0xD2439AE8, 0x2088904B, 0x328562F8, 0x62FDD7FB, 0x6C51C1DE, 0xCB24ADC7,
0xD3DD7784, 0xA27DC0BD, 0xBAB39B06, 0x99664B04, 0x4B47270B, 0x3004E5C7, 0x2109062B, 0xB62619D1,
0xD2B3A2A7, 0x8E177435, 0x9E87C141, 0x16EDB804, 0xEFB118D7, 0x48547395, 0xEA4420D9, 0x113C3E10,
0x82A1D55F, 0xC0D1B347, 0xE99E3F16, 0xAE1056B6, 0x70E7C756, 0x26BB5BE4, 0xA4F5DE57, 0xF2304702,
0xF3BEE3F9, 0xC12DE4E5, 0x5FAB7070, 0xC2396F00, 0xDA2E2763, 0x0D67EAD6, 0x842434DB, 0xF2287493,
0x139B632C, 0xD31AE186, 0xBE21F391, 0x0F04AD74, 0x760E3D8B, 0x6FD4AB0C, 0x9F506610, 0x6FFAE6E8,
0x6D53455B, 0x5DE866A7, 0x3211718B, 0x2F0E1FB8, 0x6D579EF7, 0x6E41F401, 0x9533E737, 0xB23CBE44,
0xC0F3C6E4, 0x4631C54B, 0xFE6CC1FB, 0xD1567AA8, 0x24524BA3, 0x06301DE1, 0x09A3BFD4, 0x08FFE284,
0x32FD6D39, 0x43D5EF08, 0x449C17B0, 0x6930A066, 0x9B04D47C, 0xE5A536C3, 0x7A295350, 0x6CBC2188,
0x806D8EE5, 0x58C3C762, 0x334606B6, 0x81512651, 0x8400513A, 0x7FB90824, 0x27CB40E6, 0xE8E2BF1E,
0x815D76B9, 0x01A9AA15, 0xCA54128E, 0xCBF55453, 0x4AA5015F, 0xFF6457B8, 0xC66002D5, 0xAD9E485E,
0x894B9EBF, 0x1877BCF5, 0xB0A5D55B, 0x0918A78B, 0xDC8E4F3E, 0x783D3AEC, 0x5A968FC8, 0xA25B6672,
0xEA419133, 0xBB49AD06, 0xCBB54C31, 0x817CAED7, 0xDCA456DE, 0x66CBF223, 0x0BE19BE2, 0x8DD0CC43,
0x7A562E48, 0xADCC9AA4, 0x9F937AE1, 0x3A290B93, 0xA99553FB, 0x6D45CC1E, 0x086F108E, 0x3DF2DD54,
0x7210DE52, 0xF0FCE1D0, 0x359E0E55, 0x001C5D92, 0x171D6AF1, 0xC7271B28, 0x67B88D5F, 0xE26F0853,
0x4CB7BE31, 0x5AE6C6A5, 0xEABC5EB9, 0x89212E43, 0x59208A14, 0xE6B96C15, 0xD10525A4, 0x56667092,
0xA6395218, 0x1069D219, 0x36AAF7E4, 0xAFC507C8, 0xBF83159D, 0xF9D19AAC, 0xF1E9A556, 0x77BBCAAC,
0xB1F4C79D, 0xD15721E7, 0x2F6F1103, 0xA9D42681, 0x75A61F30, 0xFF3E9FB1, 0x74399AE7, 0xA1FFE22C,
0x28864699, 0xA66F4198, 0x7B52E6EA, 0x3487BEA4, 0xC9F9E82F, 0x995F7249, 0x054A04B5, 0x490886D0,
0x1C6941E2, 0x1FFE1313, 0xE9FA70F8, 0x2FFB8BA6, 0xACF7271F, 0x7EDBCD42, 0xCEA3AE90, 0x86D20A4A,
0xF7F9ACBF, 0x865FFE08, 0x2D1541C9, 0xE418439C, 0x5CA169EA, 0x95CEB34F, 0x52F079D3, 0x2CC683FE,
0xC4422599, 0x2A2CC1FC, 0x3F308992, 0x72DC3141, 0x02C34D6E, 0xACD97273, 0xE4395318, 0xA256FCE4,
0x5AAD1F02, 0xE50C02F0, 0x5E47F15A, 0x37CBD054, 0x3A202641, 0x6BC6DBCD, 0x3E39017D, 0x558C86C2,
0x1C6CAC5F, 0x6C52FC13, 0x6A56788A, 0xA95900AA, 0x3BF53A24, 0x6AA72441, 0xE001FC31, 0xE086780F,
0xF331A63B, 0xA84CB9AA, 0xD2FA19E9, 0x3D27E008, 0xB97F3FE6, 0x6ACF6534, 0xDA4FF671, 0x7E9B71E2,
0x7B94AA6F, 0x4CA404D3, 0x0F0D430A, 0xFAF767BC, 0xF594274D, 0x4B450810, 0xD40A4F42, 0x1CF7CBDA,
0x60AB016E, 0x90228816, 0x42C03FB3, 0xC1BF0A28, 0xD38BB39D, 0x03E22FC1, 0x00EA557F, 0x2AC33A59,
0xF3DDE16D, 0xB7837409, 0xF3B643C0, 0x26D31B78, 0x41FBC6F1, 0x9295988D, 0x3BE6B767, 0x2285E0A5,
0xD9FB8861, 0x48AC486C, 0xF68CD9DB, 0xDF3CD901, 0xDAB67306, 0x7FE5EB09, 0x10B86AC2, 0x8CAB3002,
0x0DFEC9FE, 0x399A347B, 0xC2129291, 0x1E39F57B, 0x7A9FA43A, 0xAD0C508D, 0x42F2298D, 0x7379139E,
0x94E54601, 0x07F02928, 0x24A5AB2D, 0xB2C84154, 0x12FC0050, 0x3155D5CE, 0xE1874881, 0x212C217A,
0x616F12F3, 0x3B70ACBA, 0x2975F280, 0xFAC6823A, 0x35F56E57, 0x3BEF7B6F, 0x537B3850, 0xB6D065A5,
0xA2EB4C68, 0x4CB7E715, 0x82A27532, 0x6275AC85, 0x7FFEC38F, 0x688F1404, 0x6AA26DF7, 0xC70ACD80,
0xBA0A7258, 0x7E89CE68, 0xECF582AA, 0xD9A031D4, 0x1C7CA117, 0x242FE683, 0x52C66C4B, 0xA6F47C5A,
0x6394301C, 0x97E085C4, 0xD530351E, 0xE7BE1F0A, 0xF394E9A9, 0x2CDFCD2C, 0x9E45C5D0, 0xD9BBC0C5,
0xBE2B008C, 0x2CC11084, 0x76F241F3, 0x8EDE62AD, 0x71FC5FAF, 0x1E63AF01, 0x390D8007, 0xB5B8365E,
0x6A38B215, 0x7D73F53B, 0x1A4DA747, 0xE5E0C4BD, 0x5ADB5E8E, 0x15800E9D, 0x6883557E, 0x0BD8B04A,
0x7FC16BB6, 0xB7C0C613, 0x560F4264, 0x90CBEB83, 0xBF754442, 0x7AB9C45D, 0xBC629AE9, 0xD814C4C4,
0xE11468C4, 0x856E9F0C, 0x257E9EF7, 0x11E12E28, 0xB372A0FC, 0xED24089E, 0x2CD13FA1, 0x270DA0C4,
0xB02A2E71, 0x2D9126AE, 0x1C4367AA, 0x216EC6BF, 0x9996D214, 0x0F7DB47F, 0xEB678F06, 0x59825E13,
0xE4AA1FB7, 0xA100D8EC, 0x24190CAD, 0xC2AB661D, 0x1B97A351, 0x1D36029B, 0x6507B8CF, 0x5D584C5B,
0x1E6676F5, 0x98177D11, 0x9AC0D28E, 0x8208A12E, 0xDC1207F0, 0xBFCCDA43, 0x3F1CD63F, 0x49D23890,
0xB1777585, 0x9C4E9BD5, 0xDDF710F6, 0x23160493, 0xD913FB31, 0xC515E622, 0xF483128B, 0x61F3BF2E,
0x751A2797, 0xB2B093B9, 0x4EA13F28, 0xE46E324E, 0x029509C1, 0x8CB4460F, 0xBEA15A37, 0x7700207F,
0xA57412F9, 0x0883D935, 0x453B9DC8, 0xD53ADFA0, 0xAFF4FDB0, 0xB1B86FDE, 0x57D11FD9, 0xBF4611A5,
0x32419C89, 0x19535C60, 0x91FE8B49, 0xECCAC288, 0xA80BC4DA, 0x91C950E7, 0x220764A2, 0xE5ACFA83,
0xF2084145, 0x58FB667D, 0x4C938932, 0x1C2701C4, 0xE2B9A3D5, 0x7BC777F0, 0x9D800459, 0xEC5A23EA,
0xD968C81D, 0xA6D03890, 0x6C369684, 0xCDA7E91D, 0xD2F04633, 0xE7632868, 0xE6373A8D, 0xF03D3A43,
0x3AB1F137, 0x9E989421, 0xE8604080, 0xE2A54C4F, 0xD87F6535, 0xE972BF2B, 0x77A96E1D, 0x0BFBB602,
0x839590CD, 0x32003F39, 0x3820E913, 0xD1375906, 0xC4EEFB78, 0x04A51627, 0xD1612DB4, 0xA0D72CC4,
0xE5F36021, 0x55838820, 0x380ADCA8, 0x41F33E77, 0x5995E0B9, 0x204AAADF, 0x941ED08A, 0x5940B193,
0x54D5DE7F, 0x2C9D0E08, 0x6A99ED29, 0x8669BF46, 0x788428F0, 0x8FA2C173, 0x3269D3DF, 0xFE8AA1B8,
0x767BF63A, 0x6794DE8D, 0x17B0C542, 0x50217DF8, 0xF3314021, 0xA5C066F2, 0xEF5424BD, 0x87E33E5C,
0x39EA028B, 0x0F8DB8F3, 0xF0587767, 0xDC17DD25, 0x0D4DCFFA, 0xB691C585, 0xF0FE755F, 0xFD1D1C2D,
0x827AFEC7, 0x0236DB4A, 0x74D6725F, 0x0F8E0B62, 0xCA2F8EBD, 0x927C07C4, 0x4D240BA6, 0x7451F975,
0x4D2F21AB, 0x9F1F1879, 0xE7893491, 0x92D3CA97, 0xB4FC4E4E, 0x279A6216, 0x2DEF215B, 0x783991D3,
0x1FAC97B9, 0xAD96C9B5, 0x22CB8FE7, 0x6EEB78B9, 0x2A4D0F38, 0xBDB1643D, 0xDBF09299, 0xE392A586,
0x7E660D9E, 0x2216ED36, 0x6572751F, 0xF38599DE, 0x3A467EA0, 0xC6795CA9, 0x4AD044B3, 0x82CB59F7,
0xF02376BE, 0xC0711A8D, 0x1A7C8670, 0xAD4AF7DF, 0xD6500F2D, 0x22C2A8AD, 0x9C663A5F, 0x5D73768D,
0xD9EE73CD, 0x047E1533, 0xECB910DB, 0xFDF2645C, 0x761C80CF, 0x24EC3B7B, 0x772B89A3, 0x6DE2BD5C,
0x8F6666D1, 0x2291E961, 0x235B6635, 0xE82D3A68, 0xDCA52C6F, 0xD2BF0617, 0xCA2CD768, 0xD83CAF80,
0x97308EC9, 0xCCD0882D, 0x6F4483DD, 0x5546026B, 0xCD3982C2, 0x4EDBB490, 0x150B2684, 0x0ED54971,
0x3B8F24DE, 0xDC86531E, 0x001EED75, 0x1C0BEC91, 0x1D171CE7, 0xC8D24D9D, 0x4D798200, 0x70B0F4F6,
0x3DC6CD4B, 0xECF5D3D9, 0x9CBB5B72, 0x33DE4F41, 0x90CED478, 0x5FD36868, 0x1FB23723, 0x40DDCC71,
0xD8712397, 0x745D9EB1, 0xC87BDAC8, 0x2B95A8A0, 0x50143C35, 0x274CFF72, 0x17F1ED1D, 0xD2FF3744,
0xAF4C4F48, 0x302165B1, 0xF03D5489, 0x41376BFE, 0xC1EF54B8, 0x1D09B9EC, 0x34E9DD09, 0xBAC7A594,
0x0752E96F, 0x7165005A, 0x38D14E60, 0x203A3661, 0x8EEAE1E9, 0x3BD33A6D, 0xD943B0FC, 0xD8EAF601,
0xA0FD332A, 0x206B03E1, 0x2C70D472, 0x875F68E1, 0xCBB802A4, 0x58ADE48C, 0x4C20AF9D, 0x17BB5E21,
0x36A492CF, 0x1030D7D2, 0x90DCD297, 0x2F7A9352, 0xB029252C, 0x7A05CF9D, 0x551E2CB2, 0x891D2B43,
0x1A17FADF, 0x15B3B985, 0xC6058A53, 0x4FE824CA, 0x8F4E012B, 0xA4C8855C, 0xC7A1E221, 0x36B254DE,
0x9EB5BBE7, 0x22E7354F, 0x7156BAA2, 0xE77AB5D4, 0xDD86ABD9, 0x58CCD168, 0xBB41A85D, 0x0F2EAC84,
0xB6412B9D, 0x0237D93F, 0x1EF229A9, 0xC7301842, 0x3DB32AEA, 0x4DFCF9BA, 0x6021C869, 0x2AD00EA7,
0x4E631C02, 0x0F0B877A, 0xE4D9EB17, 0x132B9EB3, 0x18A5BC60, 0x1E6ADDD9, 0x5CACAF44, 0x9C042275,
0x70746C87, 0x85523E54, 0x9A3EA645, 0x35FB4558, 0x2F67B4AD, 0x73F4A2BB, 0x05F436CF, 0xE9A0C8B7,
0xD21B864A, 0x54AB17BD, 0xE38B0C47, 0x79A39EE0, 0xBF04CB35, 0x5B27F2D9, 0xA26C0F5A, 0x023FE871,
0xADBB1C8D, 0x28A11B64, 0xE1302E70, 0x2725B3EE, 0xCD53962A, 0x4CB14D5A, 0x5DCF5926, 0xF0422432,
0x10BC250F, 0xB42FC381, 0xEF74D666, 0x645B605A, 0x5C9644F7, 0x2F520956, 0x022E456E, 0x938A54FA,
0x02295E3F, 0x2274FFF1, 0xD6482A4E, 0x2ED0D289, 0xB4910F2A, 0x7C2844BF, 0x57E43DB2, 0x0CF0BB92,
0x4C4A6551, 0x10484461, 0xB83C1DC1, 0xAEAC9F3E, 0xBFFD4DD9, 0xEDC2ADBB, 0x9CCA5BBD, 0x38C9FEF9,
0x7366F30A, 0xD2C0253C, 0x4FE44654, 0x32BA9535, 0x15C11484, 0x83621217, 0x07B51233, 0xC42D5EE2,
0x2B5A92B5, 0x2E0322EE, 0xBC90A537, 0x1F76BDD0, 0x821F1E60, 0xBB5E2A97, 0xAB9E91BB, 0x61C6B775,
0x3E0811A1, 0xA0EC4696, 0xBD98758F, 0x0F09EBAB, 0xA45FEE55, 0x0C97E07B, 0x97E83B29, 0xA140D735,
0x4ED5A2A8, 0xF25AFCDA, 0xD599F5BA, 0xD9811EA0, 0x259798B8, 0x1DC27987, 0xDADDE453, 0x44155F12,
0x15FFD7D2, 0xE5AD7B75, 0x81689720, 0x3002B9C6, 0x3FFD0479, 0x921A4C33, 0x07613253, 0xD729DEB7,
0xB1453181, 0x8EAE4454, 0x687945CB, 0xC9066E24, 0xEF740136, 0x3E480CC9, 0x595E537F, 0xCC96D88E,
0x7D3E276A, 0x86CC6BB3, 0x442659B7, 0x2AF9FCA1, 0x49A093E0, 0x6FAF85D3, 0xF8F363CB, 0xA6E9AC53,
0x5A4B85F6, 0xBE80C019, 0xE1885E08, 0x09C7BCD3, 0xE742E00B, 0xBBC8886A, 0xB71AE97C, 0x69FC4DE6,
0x07B3E838, 0xF1E769A0, 0x83077273, 0x73389D3B, 0xED478AF8, 0xFED38179, 0x65F99CD4, 0x23397FAE,
0x1194665A, 0x7895A7EC, 0xB7FF6CA3, 0x1A16415B, 0x0C71A4FA, 0x37291B64, 0xD893C03B, 0x06E491E7,
0x68CE71E0, 0x832E6457, 0xC13E3E58, 0xDE5E3EEA, 0x752955C9, 0x901487DD, 0x571F9234, 0xD35FDAD2,
0x86EBC300, 0x886D856C, 0xF4395FDC, 0x40CB706D, 0x716CA9CA, 0xF8E9E161, 0xE7CFFC60, 0x878CE2AA,
0xB0247CE7, 0x0AF6795A, 0x1CD6D24D, 0x9660CE91, 0x2896C734, 0x43E51A9F, 0xAA50E2B6, 0x0170BB89,
0x0A7BD881, 0x488D056C, 0x96127C2D, 0xF2A28577, 0x3C250228, 0xA8CBDC64, 0x002BE31D, 0x210E3ECF,
0xE4C6B808, 0xA72CE405, 0x69CDF067, 0x035512EE, 0xADCAB9EA, 0x95D3F12B, 0xD4B83A4F, 0x2EDD1857,
0xACF74798, 0x43FE446F, 0x7022F679, 0x179B1195, 0x709AD316, 0x488403A8, 0x38157EB7, 0xB5CE2750,
0x71F2AA5C, 0xAA48B1C4, 0xE1124C6B, 0xFF2EA2D0, 0x57840A94, 0x4A81179E, 0x53E2FA12, 0x1462A9A2,
0xDD361AA5, 0x61DC6CF0, 0x60B7308D, 0xB3938A0A, 0x3A72DDC4, 0xD3CA6348, 0xDCD667DC, 0x3AEF7E0E,
0x4513EB3E, 0xE02FC58B, 0x0744443F, 0x18FAEE12, 0x131B8126, 0x8CC83D6B, 0x97B19076, 0xE24FFB2F,
0x900489D6, 0x8D75141A, 0x9661E2CA, 0x1EB3AF28, 0xD04404F4, 0xDF9F559E, 0xE7B0F8F0, 0xE49179F7,
0xAA2E63F7, 0xFA5B5DF3, 0xB19D6E10, 0x19149357, 0xFBE8A488, 0x6AADC6F8, 0x7AFD6F0D, 0xAB583722,
0x10644431, 0xAF20D09A, 0xEE025A46, 0xB0DC5F77, 0x01BF3B9E, 0xC545A1D8, 0x88C25D8B, 0x34C2588B,
0x3ECA1AF5, 0xA67174B8, 0xE7AAB5B2, 0xC2D24A63, 0x240220E2, 0x3755BD79, 0x946818CD, 0x4D7A3DF3,
0x2FBEB825, 0x4877F84D, 0x44D66C5B, 0x3781D6B1, 0xD82F5408, 0xFF0BBF0A, 0x906BABE2, 0xD26588FB,
0x23EF583E, 0xC7E2C2B1, 0xF7194967, 0x41FF8804, 0x6C26A2A8, 0xECA20589, 0x9C9AF706, 0xE9D39305,
0x82DB5FA2, 0xB46DD348, 0x0BDF1796, 0xF5CBFEA4, 0x3CCDE738, 0x90B6AD5D, 0xE18E90DB, 0x7A4C639D,
0x30164160, 0x5F477A89, 0x8391C827, 0xCA39591C, 0x5D2A5E8F, 0xDE096E9C, 0xC7B9EAED, 0x8E995AAD,
0x49F78270, 0x2A0A06A0, 0x0D59B4A1, 0x8C468DAF, 0x188A5F5A, 0x042A046C, 0x6CF18FE0, 0x11561BBC,
0x038B273B, 0xF2C758D6, 0x870BBFA6, 0x1BF0945F, 0xC984561B, 0x2A5F3786, 0x542644FD, 0x33D29960,
0x41A99BEA, 0x655CE25C, 0xFF60AF4E, 0x771332BC, 0xAC9C6B99, 0x41D07D4E, 0x426B0782, 0x2CF04930,
0x6EA4A08A, 0xCDBC5B3D, 0xE2E1E0F7, 0x8CB1CC6A, 0x646E3524, 0x1874F91C, 0x6AD36E87, 0xE649A9FC,
0xACD87134, 0x3B3FCE3B, 0x4CC72A28, 0x156B9C7E, 0x97211158, 0x7B64B8E5, 0xF22AB8E9, 0xE3E8F795,
0xAF025C49, 0x36BB8118, 0xE7E9F17D, 0x15B5DDE2, 0x9F250A5D, 0xABDD38BC, 0xEFB04E1A, 0x186994F5,
0x86284E75, 0x97AA4AC4, 0xA8E5CD52, 0x8BAC3DDE, 0x722920E7, 0x8D1C7103, 0x29B24FE8, 0xECABDAB8,
0x75B2DB9E, 0xC34642CB, 0x69F06889, 0x4B2BFEDC, 0xE9C4A628, 0xBDAF413E, 0xB074A534, 0xB1A8DA88,
};
}
internal class WalpurgisCrypt : CxEncryption
{
public WalpurgisCrypt () : base (0x2C4, 0x757)
{
PrologOrder = new byte[] { 1, 0, 2 };
OddBranchOrder = new byte[] { 4, 3, 0, 5, 1, 2 };
EvenBranchOrder = new byte[] { 3, 2, 6, 0, 1, 5, 7, 4 };
}
protected override uint[] ControlBlock { get { return s_ControlBlock; } }
static readonly uint[] s_ControlBlock = {
0x9C91BADF, 0x8B8F868D, 0xDF919096, 0x8B91909C, 0xDF93908D, 0x9C90939D, 0xD2D2DF94, 0x9E8BACDF,
0x9E9C968B, 0xDF869393, 0x9BDF8D90, 0x929E9186, 0x939E9C96, 0xDFD38693, 0x9A8D969B, 0x86938B9C,
0xDF8D90DF, 0x969B9196, 0x8B9C9A8D, 0xDFD38693, 0x91968C8A, 0x978BDF98, 0x8FDF8C96, 0x8D98908D,
0x9EDF929E, 0x90D09B91, 0x939DDF8D, 0xDF949C90, 0x92908D99, 0x978B90DF, 0x8FDF8D9A, 0x8D98908D,
0xDF8C929E, 0x93939688, 0xDF9A9DDF, 0x9A939396, 0xDF939E98, 0x8BDF869D, 0x93DF9A97, 0x919A9C96,
0x9EDF9A8C, 0x9A9A8D98, 0x8B919A92, 0x4E7DDFD1, 0x897C337D, 0xB07C727C, 0x7F7C767C, 0x8A7C1D7D,
0x9D7C727C, 0x0F7DB17C, 0x3C6FBE7E, 0x3A7DB66C, 0x157D5F7D, 0xB66C516C, 0x5F7D3A7D, 0xBE7E157D,
0x256F436D, 0x3A7DB66C, 0x157D5F7D, 0x256F2B75, 0x3A7DB66C, 0x157D5F7D, 0x436EBE7E, 0x897C337D,
0xB07C727C, 0x7F7C767C, 0x187D567D, 0x5D7D8F68, 0x4E7D167D, 0x327D397D, 0xBC7C767C, 0x6C7CA57C,
0x367DA77C, 0x177D197D, 0x497D2974, 0x157D187D, 0x5D7D3B7D, 0x487D237D, 0xBCF5BD7E, 0x8D868F90,
0x8B979896, 0xD6BCD7DF, 0xCECFCDDF, 0xBEB4DFCF, 0xBEDFD1B6, 0x8DDF9393, 0x8B979896, 0x9A8DDF8C,
0x898D9A8C, 0xF5D19B9A, 0x7D5F7DF5, 0x7D816C16, 0x7E056C33, 0x7D936FBE, 0x73267755, 0x76337D9F,
0x7D576A09, 0x6E346C36, 0x6F306AAD, 0x7E4A7D98, 0x770371BE, 0x6F337D32, 0x7DA77E93, 0x718C740F,
0x7D487DBA, 0x7D397D16, 0x715B7D5D, 0x7D707369, 0x7DB17455, 0x7E427D54, 0x936FF5BD, 0x327D397D,
0x507D567D, 0x157D5C68, 0x8F71427D, 0x306A367D, 0x4A7D9A68, 0x557D377D, 0x1F7D187D, 0x0A73BE7E,
0xB776167D, 0x62710F7D, 0xBE7E407D, 0x1C70556C, 0x0A73367D, 0x0F7D2968, 0x5D7D076A, 0x447D427D,
0x8F71337D, 0xA96C327D, 0x0F7D9871, 0x636E856E, 0x467D4C7D, 0xBD7E427D, 0x7D936FF5, 0x71A96C55,
0x7D397D98, 0x6F177D37, 0x700F7D93, 0x7E5B7DAF, 0x7D447DBD, 0x7D327D15, 0x7D167D23, 0x7D936F3A,
0x69B67033, 0x730F7D69, 0x7D5971A4, 0x7D3B7D4A, 0x7D167D5D, 0x7D337D56, 0x7D5B7D19, 0x730A7337,
0x7D3A7D96, 0x7D5F7D1F, 0x7E427D3E, 0x6FF5F5BD, 0x6A557D93, 0x7D447630, 0x76427D4A, 0x6A507D44,
0x70337D57, 0x7D9C6DA8, 0x7D59680F, 0xDF167D5D, 0x336EAC7D, 0x4476337D, 0x576A507D, 0x7EDF327D,
0x7C8B7C88, 0x7CA47EB7, 0x7CBC7C88, 0x7CBA7C72, 0xDF877EA6, 0x4369397D, 0x177D1970, 0x9A75BE7E,
0x367DA77E, 0xBE7C327D, 0x767C8A7C, 0x7F7C917C, 0xA96C337D, 0x337D9871, 0x0F7D4369, 0x4A7D5A75,
0x5D7D3B7D, 0xBD7E427D, 0x7D216BF5, 0x7D557D18, 0x7D4E7D38, 0x73187D56, 0x7E157D44, 0x7D4276BE,
0x6C256933, 0x710F7DB6, 0x7D3E7D62, 0x7D936F3B, 0x7DAF700F, 0x7D337D5B, 0x7D9C7E56, 0x7D157D44,
0x7D237D32, 0x7D556A41, 0x7D187D56, 0x7E5D7D37, 0x417DF5BD, 0xBE7E557D, 0x196E6071, 0x447D367D,
0x2777337D, 0x487D836A, 0x547D287D, 0x2272496E, 0xBE7E327D, 0x337D936F, 0xBA755D6F, 0x9C670F7D,
0x3B7D207D, 0x3E7D5D7D, 0xBD7E427D, 0x7D1B7DDF, 0x7D527D3E, 0x7D397D17, 0x7E557D41, 0x719275BE,
0x7E367D3F, 0x7DF5F5BD, 0x7D4A7D44, 0x6A09763B, 0x7D427D57, 0x7D557D40, 0x7D427D1F, 0x6B487D18,
0x7D3A6995, 0x6F187D56, 0x7DBA755D, 0x7D81740F, 0x7D427D5B, 0x7E367D20, 0x732677BE, 0x68367D9F,
0x73407D58, 0x7D567D03, 0x69167D59, 0x6FBF697D, 0x7D927112, 0x6F18770F, 0x7D487D53, 0x76887516,
0x6F557D7F, 0x7D586822, 0x7D157D4C, 0xF5BD7E16, 0x337D447D, 0x7F768875, 0x4C74367D, 0x397D8B71,
0x3B7D4A7D, 0x936F1A71, 0x557D0973, 0x317D3B73, 0x427D157D, 0x447D9C7E, 0x567D4E7D, 0x576A187D,
0x327D1573, 0x237D9171, 0xBD7E167D, 0xE418F5F5, 0x5855C1E9, 0x0F7B077A, 0xA3587DF1, 0xD8245F50,
0xAA38C449, 0xB2E5B613, 0x10D3855C, 0xECAABBA2, 0xA5B0D57F, 0xF4F9A753, 0x6B1B173B, 0xEC955CD0,
0x7BD4C507, 0x55952A45, 0x3628D124, 0x5EB27966, 0xF3FC4226, 0x0E9E1724, 0x40F9F8AA, 0x776B886C,
0x7598325A, 0x1DC64A71, 0x6D1F874C, 0x5B812BA2, 0x5D793B23, 0x98D4DE2B, 0xD3F4568C, 0x4BA1B8BA,
0x730BADCD, 0xC748FD9A, 0xE7157887, 0x7729E399, 0xE967E416, 0xFA2B7FD2, 0xC3D08FAB, 0xF7DBF012,
0xBB7345A4, 0x75D0C47E, 0xC18DF4A6, 0xDBF614F1, 0x4D9F0588, 0x56F40E9C, 0xAB27708F, 0xB5AD30B1,
0xFC3B4413, 0x3BC84DDA, 0x01CCC334, 0xEF5F1A43, 0xE596EC03, 0x7B39364C, 0x9242B02A, 0x1C532415,
0x67C4E337, 0xD4FD4395, 0x2E80AC3C, 0x5A491010, 0x50BC0A3A, 0x1663BE1E, 0xE9E632DB, 0xEBC86067,
0x9490B21A, 0x293EFEC1, 0x38F45171, 0x5AC44996, 0xD401738D, 0x7C81AB7D, 0xA0C2D8ED, 0xA2423B69,
0x38E70130, 0x60046F9F, 0x7A6D2E84, 0xEACBD890, 0x653C6007, 0xC1A63D7C, 0x1184AC97, 0xBAA3731C,
0x75F6ECDD, 0xCB228299, 0x4FAE4014, 0xC5863B64, 0xB1750EB1, 0xF3CA715E, 0x3354A77A, 0x9C3AA37D,
0xEAD8E9ED, 0x15ABE5C6, 0xFA667916, 0xBDD94BD5, 0x181C2E7E, 0x90662F5E, 0xE877AD75, 0xC77ED233,
0x6D67CAE9, 0x986B1D6A, 0x5E70CE82, 0x9365CB3F, 0xCD9DF4BD, 0x2B1D3D79, 0x904DCCE5, 0xFA594694,
0x8923605A, 0x395BEB43, 0xC4115B86, 0x8375BF0D, 0x8465ECBB, 0x1A6C48C1, 0x43B292FF, 0x0059F91F,
0x1B7F7220, 0x1AE08F4E, 0xF70BDC41, 0x844294B6, 0x3F787DFF, 0xEC1040F7, 0x19FFB6E5, 0x4E4E2C80,
0x0114CB07, 0x760C64F0, 0x791FB43B, 0x3BAE624D, 0x69C58E7C, 0x4AFE7A9C, 0x96F85CB7, 0xB7C3B5DE,
0x18BBDC5B, 0x792AEEFF, 0xFFA7C7E8, 0x2A8C40BF, 0x897E7E14, 0x1DDB7D94, 0xD78E63BF, 0x691C84A1,
0x92B73490, 0xC54530B8, 0x9317A22A, 0x79556E27, 0x91782C90, 0x0835C7B9, 0x671E98C5, 0x3DEBCC47,
0xA1668E99, 0xEEC12A48, 0x3C633E4D, 0x93F31999, 0xA57D1F2A, 0x49C707C9, 0xCC7EF17B, 0x99C0767B,
0x762620D5, 0x1FDF0544, 0x827AD289, 0xDBF9AD6A, 0x8B797E54, 0xDBB85373, 0xFA85E56F, 0xA1122BA8,
0x97CCCEFA, 0x419B5700, 0xC33601D3, 0x22B67C56, 0x501E97FF, 0xF8DB804E, 0x4D2411AC, 0x92D9FD1F,
0x3A9EE6C1, 0xFCB0F37D, 0x5CED169D, 0x53383B8A, 0x230539F6, 0x6F3ECFB2, 0xA33402F9, 0x96B85EA3,
0xD289F49A, 0xDC0218D4, 0xA7F2DDB3, 0x96350399, 0x6761DC70, 0x822E2CEE, 0xC0D2B008, 0x52AB265F,
0x4BEA6E63, 0xF3E2E0DD, 0x5834CACC, 0x52D3B1D6, 0x35E5E5A3, 0x6B203081, 0x57BE6FFA, 0xAA6BEEBB,
0x0198F5E6, 0xE9CC50EC, 0x9DBCC1EF, 0x0361D842, 0xA63EF46C, 0x52795D93, 0x187BCD57, 0xAC71B9CC,
0x6867ACDA, 0xC17A2CFF, 0x28910F0D, 0xE79B4A75, 0x3E86E729, 0x47C6F6F9, 0x9DF62818, 0xC18D3742,
0xE0C6DA5E, 0x8DE1A1C1, 0xFCB72DF0, 0xF7E94544, 0x1C8387A1, 0x5D03A736, 0x9C36079E, 0x003D1208,
0x4A4138D1, 0x1BA18B5A, 0xD21A12E3, 0x456EE383, 0x4BE5F876, 0x8E57C676, 0x37C08E87, 0x3A7DA308,
0x3CDEE98D, 0xD4C9BEAE, 0x97575F9B, 0x538B27B0, 0x54D94CCA, 0x3F552A60, 0x0F948D70, 0xEE2FABD5,
0x80A23AC9, 0x8C100E3B, 0x6B72A328, 0x9BCC54F6, 0x780BCE78, 0x87BBD3DE, 0xFB504FCF, 0xC6382CB0,
0xB4FBF823, 0x141C79AC, 0x126F2695, 0xD72998A9, 0x2BC00748, 0x2085DC6E, 0xD4FA4D06, 0x27260F04,
0xF58698BD, 0x7BBE1AEA, 0x96CC1F2D, 0x6B46CA1C, 0x34A76FED, 0x0A6A8E3D, 0x5D59EA75, 0x26E2EE3A,
0x2FCAFEDD, 0xF932B777, 0xA4A521A5, 0x9733C1DF, 0x5CB15407, 0xE94BADB7, 0x745B46A4, 0xFD928A77,
0xE94AF9FC, 0xA3E29101, 0x9A2EF61C, 0x45ABFE9B, 0xE9F3F322, 0x91FA7AAE, 0xE32F6E9D, 0x2999137B,
0x00860239, 0x3972E7C5, 0xC01A6D6E, 0xA0D7EE25, 0xF8464535, 0x11F0B1B4, 0x716CC952, 0xD08375B1,
0x96689233, 0x3AC4A6AA, 0x4B19E877, 0x4A0B3B11, 0x56EBFF25, 0xA5E43B88, 0x51C77810, 0x42CC87C3,
0xF18A4BF4, 0x9E64D1B3, 0x6B434AEA, 0x55D5FB0D, 0x88BF9190, 0x644A1B81, 0xA16F7022, 0x0F98CC43,
0x581F3B61, 0xCBCC9B1E, 0xBDE1B266, 0xEC841EF2, 0x154CDA14, 0x8FF283B6, 0xFB137A90, 0x717BC3B3,
0x8EC4AF5C, 0x4120B228, 0xCAA4988B, 0x768E8127, 0xEB559275, 0xA7041EB7, 0xE8C93ECD, 0x7E32997E,
0x2FA7DC83, 0x3DF2C2B7, 0x15BB634F, 0x1958BF3F, 0x65DF5D2C, 0xA66814C2, 0x575760B6, 0xF7B663CD,
0x855F25E0, 0xBA7EF0E0, 0x9150B418, 0x94712BE7, 0x0DC59CD4, 0x4442BBC0, 0x3AEDFF17, 0x5B3F77C4,
0x159EE967, 0xCB3C9060, 0x19FAE916, 0x63D6D989, 0x92929D3B, 0xE46003C6, 0xEA68B9A7, 0x23AD12E4,
0x1214B44B, 0xC1648E24, 0xB7FC4DE8, 0x40AEC48D, 0x6919D7D8, 0xC67D0795, 0xDE108587, 0x87D0D1C8,
0x09EEFB3A, 0x2B868642, 0x1D028503, 0xFC5D4883, 0x2AE0411F, 0xD381601B, 0xF7A93597, 0xE8A03AC9,
0x02C2A33D, 0xB15C8E7E, 0xBE6AA25E, 0x5A8427AB, 0x1EBFFA40, 0xB38DA2BF, 0x96746A32, 0x8505923B,
0x55D539FB, 0xE8236816, 0xB5F8732A, 0x136EE66F, 0x78D48F56, 0x3902102A, 0x541D818E, 0xC78FD59E,
0xC25548D4, 0x61FCC207, 0xCCA00282, 0x22D47064, 0xD8717B69, 0x649B521B, 0xC87EB1CD, 0x548C426D,
0xA81E88A7, 0x690C88E7, 0x373E1371, 0xAA985E4E, 0xDA9A5FED, 0xF0EDD3FE, 0xF5599E10, 0xFF883063,
0xCF769B7C, 0x7A1E8EF9, 0x962FDBEA, 0xAC0C4619, 0x046D6042, 0xC44CE77F, 0xFA212720, 0x456890D3,
0xFDD4905A, 0xE9DB583D, 0x87C8E54E, 0xD2ABEBB0, 0xCBF048B4, 0x7148C0B1, 0x60B19AC3, 0xE1BC946D,
0x6594A1B4, 0xB6A7151E, 0xE0CC2D6B, 0x055E77BB, 0x9E3BD179, 0x491AF6E6, 0x2F619C2F, 0x3915A45C,
0xA3120756, 0x1F255C43, 0x292AE6F8, 0x29B8D74A, 0x5ACFEFB6, 0xC5BA661D, 0x5A8792EF, 0x8FEB6B0B,
0x02272389, 0x8D520780, 0xC0BC3669, 0xDF085DDD, 0xC4CA84C9, 0x8DDCD1EC, 0x3D13DD8F, 0xD1E57ACB,
0xF59544D5, 0x94D4D743, 0x0289E632, 0xF35BBE5C, 0xA2C44D91, 0x040E29AA, 0xB591F756, 0xA914C2AF,
0x314E752A, 0x87223AB8, 0x4A0244ED, 0x0D6A13A0, 0xA254C0C4, 0x393A5AA7, 0x0808D977, 0x3C071C72,
0x91AA7DE6, 0x61DE1B86, 0xC916C364, 0xFF5839E8, 0x912B2504, 0x98084B62, 0xE800B711, 0xEEF8A2EC,
0xA0029054, 0x4D049080, 0xE2B0C68A, 0x5CF4C335, 0xA5E59DC3, 0xB65B9304, 0x04E720AE, 0xCDCB56B2,
0xA2AA3B28, 0x2EFD9A26, 0x31269C83, 0x5F7C837F, 0x93DF22DD, 0xE842E161, 0xF7A99044, 0xC3E56753,
0xDA11F984, 0x18DDFAA3, 0x4D7C3D98, 0x2157376F, 0x499A3088, 0xFB3860FB, 0xF8B03FB7, 0xE41180BE,
0x764302F7, 0xC5F5584D, 0xBE1E2094, 0xE4A7F906, 0x65DBEAF8, 0x2D637C7F, 0x280221A5, 0x84CC7B78,
0xBF4679FA, 0x30548C78, 0x71A965AC, 0x7850CCE0, 0xAB4F61CE, 0xD4A77595, 0x27BB16AA, 0x70789815,
0xEA1F2B41, 0xFE311834, 0x86211CEF, 0xECDA74A9, 0xA2BDE105, 0x01A24EA5, 0xCEFBA9BB, 0xE57BD8B8,
0x293DE400, 0xFF339AAC, 0xF33B3FEB, 0x65C01C98, 0xF96DF494, 0x06A0032F, 0x7559633B, 0xB6E2A69C,
0x1A8A1C14, 0xF328AB36, 0xAD93F268, 0xFAA59EFF, 0x8A9F90AF, 0xCD59ACDE, 0xDEDAF78A, 0xF4959AD9,
0xC5F03307, 0xFE1F74E7, 0x7544D89B, 0x3898D08C, 0x1E8153F7, 0xFBDE0D1F, 0x692FB7B1, 0xF23BF8B3,
0x32F2CA8E, 0xCA61053C, 0x78E6BE24, 0x9ED63418, 0x686EDDC5, 0x776E66C4, 0xDFF39BB8, 0x16B7ECEA,
0xD2AE6CDB, 0x65934FA2, 0x7EFA5E61, 0xC28835FA, 0x982974F5, 0xBE142660, 0x063E9D92, 0xB81565FC,
0x8040FF8D, 0x4E352A70, 0x3C30AFAA, 0x797F7EC5, 0xC9A58037, 0x8A0922B1, 0x93A7618C, 0x285138CF,
0x9940569C, 0xAD842D38, 0x62A162B5, 0x224C24F5, 0xB43E0EDC, 0xD5DEF08E, 0x222D7772, 0xF6106939,
0xE2B1007E, 0x577ADA0A, 0x0E141520, 0x4BBD9AF8, 0xFACEADEF, 0x2F61908C, 0x4FFDA94A, 0x5CE578F9,
0x3B4447E5, 0xDE3BE0A2, 0xC6BB428A, 0xDCC8BAA0, 0x3D2C977A, 0x9AA0E03F, 0x21E08188, 0x3F0C91BC,
0xF29132EF, 0x7F286998, 0x11C44EBB, 0xE7522002, 0xD7C96EAD, 0x8E012562, 0x0908730A, 0xF37F4819,
0x52633625, 0xA1DF4D9C, 0x5FDBDC28, 0x3DEA1F5D, 0x200014EC, 0x759435DF, 0x29374D1A, 0x64F674E5,
0xDEEC207E, 0xEC59FC6E, 0x3DC7C9F1, 0x5C0DCB08, 0x5DEEA73F, 0x206D61CC, 0xC61BCC70, 0xBCD25371,
0x1ADB2A5A, 0x306A635C, 0x22B85F64, 0x9A611F9B, 0xEC55AFAF, 0x5F8215E8, 0xECFA67AE, 0xB36181B8,
0x73DCCC09, 0xE9A281CB, 0x849FC579, 0xFB4CF7A8, 0x19B911B2, 0xED4DE9A3, 0xCA9952B1, 0xAA9D83E3,
0xF3863991, 0xD2D0EAFF, 0x12130B23, 0x0F6E966E, 0xAC889E14, 0x72F1A314, 0x413AAFD8, 0x606C1FC5,
0x8D9E90FC, 0xCE6CCE66, 0x7A6E8096, 0x2491FE56, 0x27C9E2A3, 0xBFEBEF50, 0x69B84656, 0x3E5FD2E0,
0x36524CF8, 0x21DC206C, 0xD6F2AD6C, 0x20F09DF7, 0x3D82A566, 0xD5F8BEAA, 0x8C5B62CF, 0x6AC5DAE0,
0x4A7E53E6, 0xB53036B9, 0x58FB09B0, 0xD96C0BE2, 0x7636A0D0, 0xEE0E675E, 0x99AAF6E2, 0xB7270E1C,
0x1369474E, 0xB5E5995F, 0xA1E635D4, 0x1D57DF67, 0xDBD1E043, 0xF2CF6D16, 0x41D39259, 0x22EE5E19,
0x565609E6, 0xC5244ADF, 0xCE084F3C, 0x2AAC5970, 0xF16EE209, 0x72CDD167, 0xDEC3F17A, 0x66D87D56,
0x4507638F, 0xC6D2C821, 0x38A4A132, 0xA6542711, 0x159060A8, 0xC040C052, 0xF6D3CC7B, 0xE9E55492,
0x7DD5FB28, 0x4710BECF, 0x64A911F0, 0xB8E13220, 0xA36C4FA8, 0x5650D1C4, 0xFD788567, 0x3C9E8C71,
0x9807B47A, 0xAF2AC13C, 0x3271B069, 0x6D24D008, 0xF51C1066, 0x0B50DB66, 0x50A06E4B, 0xE07BB80C,
0x9DA46F2B, 0x145B24D6, 0x7D020D90, 0xC42AB2E4, 0x3DBAADAD, 0xE14F9B5F, 0x4BBA116D, 0xBB8B4860,
0xFBD7245C, 0xC787A549, 0xA04FE281, 0x63A975DA, 0x5ADEB3C8, 0x9818807E, 0xB31E37FF, 0xB6DE1529,
0xA1404B6B, 0x46FFE0BC, 0x4FC6D385, 0x9EC773BF, 0x6807D5A6, 0xEBA12141, 0xBC5094A1, 0xA2AEB853,
0x692218A3, 0x38C05882, 0xEA53C30F, 0x06D23FFD, 0xFE64336C, 0xD2CF8252, 0x45C037DD, 0x3E60B4DD,
0xC9831838, 0x0481D31B, 0x8D7B4FC3, 0x5808AE40, 0xA20EDC61, 0x6FAFE585, 0xD60C1DAA, 0xF357B98B,
0x2153C6CC, 0x3A3BFD31, 0xD260836A, 0x7A4FFB2F, 0x72CA0680, 0xC13EF5DD, 0xB8BB7C6A, 0xD810F198,
0xCFEB5A3D, 0x178B319D, 0x3E22934E, 0x42CCC19C, 0xF9C9E86B, 0xF4A10A85, 0x5D51C9BC, 0xBEF6356C,
0x1D654666, 0xC6014560, 0xF0293175, 0x6EDF8384, 0xBF6AE2C2, 0x6E6CF958, 0xE35065BC, 0x73FDC61B,
0xC0026A7B, 0xD8548B7A, 0x75106D00, 0xBC138512, 0x3876C161, 0xC45D44A9, 0x25A48AAE, 0xB45826E6,
0x6B75FF9E, 0x63AB03A8, 0x56442D69, 0xD362721D, 0x43313F10, 0x3270858C, 0xABE62F09, 0x53973FB9,
};
} }
/* CxEncryption base branch order /* CxEncryption base branch order

View File

@ -4,6 +4,6 @@
xmlns:fmt="clr-namespace:GameRes.Formats.KiriKiri" xmlns:fmt="clr-namespace:GameRes.Formats.KiriKiri"
xmlns:p="clr-namespace:GameRes.Formats.Properties" xmlns:p="clr-namespace:GameRes.Formats.Properties"
MaxWidth="250"> MaxWidth="250">
<ComboBox Name="Scheme" ItemsSource="{Binding Source={x:Static fmt:Xp3Opener.KnownSchemes}, Path=Keys, Mode=OneWay}" <ComboBox Name="Scheme" ItemsSource="{Binding}"
SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=XP3Scheme, Mode=TwoWay}" Width="180"/> SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=XP3Scheme, Mode=TwoWay}" Width="180"/>
</Grid> </Grid>

View File

@ -1,10 +1,10 @@
using System.Windows; using System.Linq;
using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using GameRes.Formats.KiriKiri; using GameRes.Formats.KiriKiri;
using GameRes.Formats.Properties; using GameRes.Formats.Properties;
using GameRes.Formats.Strings; using GameRes.Formats.Strings;
namespace GameRes.Formats.GUI namespace GameRes.Formats.GUI
{ {
/// <summary> /// <summary>
@ -15,8 +15,10 @@ namespace GameRes.Formats.GUI
public WidgetXP3 () public WidgetXP3 ()
{ {
InitializeComponent(); InitializeComponent();
if (null == Scheme.SelectedItem) var keys = new string[] { arcStrings.ArcNoEncryption };
Scheme.SelectedItem = arcStrings.ArcNoEncryption; Scheme.ItemsSource = keys.Concat (Xp3Opener.KnownSchemes.Keys.OrderBy (x => x));
if (-1 == Scheme.SelectedIndex)
Scheme.SelectedIndex = 0;
} }
public ICrypt GetScheme () public ICrypt GetScheme ()

View File

@ -54,6 +54,7 @@ namespace GameRes.Formats.Lucifen
} }
} }
[Serializable]
public class EncryptionScheme public class EncryptionScheme
{ {
public LpkOpener.Key BaseKey; public LpkOpener.Key BaseKey;
@ -62,6 +63,13 @@ namespace GameRes.Formats.Lucifen
public bool ImportGameInit; public bool ImportGameInit;
} }
[Serializable]
public class LpkScheme : ResourceScheme
{
public Dictionary<string, EncryptionScheme> KnownSchemes;
public Dictionary<string, Dictionary<string, LpkOpener.Key>> KnownKeys;
}
internal class LuciOptions : ResourceOptions internal class LuciOptions : ResourceOptions
{ {
public string Scheme; public string Scheme;
@ -88,6 +96,7 @@ namespace GameRes.Formats.Lucifen
public override bool IsHierarchic { get { return false; } } public override bool IsHierarchic { get { return false; } }
public override bool CanCreate { get { return false; } } public override bool CanCreate { get { return false; } }
[Serializable]
public class Key public class Key
{ {
public uint Key1, Key2; public uint Key1, Key2;
@ -102,63 +111,12 @@ namespace GameRes.Formats.Lucifen
BaseKey = new Key (0xA5B9AC6B, 0x9A639DE5), ContentXor = 0x5d, RotatePattern = 0x31746285, BaseKey = new Key (0xA5B9AC6B, 0x9A639DE5), ContentXor = 0x5d, RotatePattern = 0x31746285,
ImportGameInit = true ImportGameInit = true
}; };
public static readonly Dictionary<string, EncryptionScheme> KnownSchemes = public static Dictionary<string, EncryptionScheme> KnownSchemes = new Dictionary<string, EncryptionScheme>();
new Dictionary<string, EncryptionScheme> { static Dictionary<string, Dictionary<string, Key>> KnownKeys = new Dictionary<string, Dictionary<string, Key>>();
{ "Default", DefaultScheme },
{ "Terios games", new EncryptionScheme {
BaseKey = new Key (0x39A5B67D, 0xD63AB5E9), ContentXor = 0xa6, RotatePattern = 0x36147352,
ImportGameInit = false } },
};
EncryptionScheme CurrentScheme = KnownSchemes["Default"]; EncryptionScheme CurrentScheme = DefaultScheme;
Dictionary<string, Key> CurrentFileMap = new Dictionary<string, Key>(); Dictionary<string, Key> CurrentFileMap = new Dictionary<string, Key>();
static Dictionary<string, Dictionary<string, Key>> KnownKeys =
new Dictionary<string, Dictionary<string, Key>> {
{ "Ne~pon? x Raipon!", new Dictionary<string, Key> {
{ "SYS.LPK", new Key (0x67DB35ED, 0xBE4D6A37) },
{ "CHR.LPK", new Key (0x9E3BAD56, 0x95FE9DC3) },
{ "PIC.LPK", new Key (0xD9B5E6C3, 0xBA53E5D5) },
{ "BGM.LPK", new Key (0xEB6DE3B5, 0xCD571DE9) },
{ "SE.LPK", new Key (0x9AB3AD5E, 0xAD3D4D96) },
{ "VOICE.LPK", new Key (0x75CBD59D, 0x5ED59ACA) },
{ "DATA.LPK", new Key (0xDE6AD53E, 0x9E3B5E3D) },
{ "DESKTOP.LPK",new Key (0xACD5B36D, 0xD56ADB5D) } } },
{ "Doki Doki Rooming", new Dictionary<string, Key> {
{ "SYS.LPK", new Key (0x8030AB96, 0xB9F6638E) },
{ "CHR.LPK", new Key (0xA7B9178B, 0xF79C547C) },
{ "PIC.LPK", new Key (0x34B73229, 0xB690E07D) },
{ "BGM.LPK", new Key (0x41E7505F, 0x1E10C3C5) },
{ "SE.LPK", new Key (0x34DF875E, 0x435603E8) },
{ "VOICE.LPK", new Key (0x30701D73, 0xFB524CE5) },
{ "ANIME.LPK", new Key (0x867ABB47, 0xA25F4248) },
{ "DATA.LPK", new Key (0x5BCB1333, 0x99325DFA) } } },
{ "Shinsetsu Ryouki no Ori Dai 2 Shou", new Dictionary<string, Key> {
{ "SYS.LPK", new Key (0x3986AFC9, 0xFC8C32E7) },
{ "CHR.LPK", new Key (0x1B478946, 0x489E83F9) },
{ "PIC.LPK", new Key (0x3F9D8075, 0xA75CBDA3) },
{ "BGM.LPK", new Key (0xEAB5949C, 0x48ABE813) },
{ "SE.LPK", new Key (0x5A95B36B, 0x249F4BEB) },
{ "VOICE.LPK", new Key (0x6B954634, 0xA1CF23CE) },
{ "DATA.LPK", new Key (0x8395C7CB, 0xE4CF9E3B) } } },
{ "Ore-tachi ni Tsubasa wa Nai", new Dictionary<string, Key> {
{ "SYS.LPK", new Key (0x524657EA, 0x782B5A5C) },
{ "CHR.LPK", new Key (0x8C982BCA, 0x46BC4CDD) },
{ "PIC.LPK", new Key (0xB78C913C, 0x57ECB345) },
{ "BGM.LPK", new Key (0x45E32E7D, 0x4F538CE3) },
{ "SE.LPK", new Key (0x9A5AF6DE, 0xCB1866C7) },
{ "VOICE.LPK", new Key (0x3EB61D34, 0xB451AB16) },
{ "DATA.LPK", new Key (0x7CE5AC6A, 0x49A3A35B) } } },
{ "Shuffle! Essence+", new Dictionary<string, Key> {
{ "SYS.LPK", new Key (0xA3635FC4, 0xA14A4686) },
{ "CHR.LPK", new Key (0x4E34463C, 0xB4D8BD6D) },
{ "PIC.LPK", new Key (0xF592B54B, 0xACCD3A1C) },
{ "BGM.LPK", new Key (0xC50D2FD6, 0xC89DE7A9) },
{ "SE.LPK", new Key (0xE9CD4E1B, 0x98AD9D63) },
{ "VOICE.LPK", new Key (0x865A8D4E, 0x742DA395) },
{ "DATA.LPK", new Key (0xCEA56246, 0xDE46F9A6) } } },
};
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
string name = Path.GetFileName (file.Name).ToUpperInvariant(); string name = Path.GetFileName (file.Name).ToUpperInvariant();
@ -411,6 +369,22 @@ namespace GameRes.Formats.Lucifen
} }
return KnownSchemes[title]; return KnownSchemes[title];
} }
public override ResourceScheme Scheme
{
get { return new LpkScheme { KnownSchemes = KnownSchemes, KnownKeys = KnownKeys }; }
set
{
var scheme = (LpkScheme)value;
KnownSchemes = scheme.KnownSchemes;
KnownKeys = scheme.KnownKeys;
foreach (var key in KnownSchemes.Keys)
{
if (null == KnownSchemes[key])
KnownSchemes[key] = DefaultScheme;
}
}
}
} }
internal class IndexReader internal class IndexReader

View File

@ -51,6 +51,12 @@ namespace GameRes.Formats.Majiro
public string Password; public string Password;
} }
[Serializable]
public class RctScheme : ResourceScheme
{
public Dictionary<string, string> KnownKeys;
}
[Export(typeof(ImageFormat))] [Export(typeof(ImageFormat))]
public class RctFormat : ImageFormat public class RctFormat : ImageFormat
{ {
@ -60,12 +66,13 @@ namespace GameRes.Formats.Majiro
public bool OverlayFrames = true; public bool OverlayFrames = true;
public static readonly Dictionary<string, string> KnownKeys = new Dictionary<string, string> { public static Dictionary<string, string> KnownKeys = new Dictionary<string, string>();
{ "Akatsuki no Goei", "おぬぐり食べる?" },
{ "Amber Quartz", "夕焼け。学校の屋上。そこに伸びる二つの影。" }, public override ResourceScheme Scheme
{ "Nagisa no", "青い空に向かって、溜息を一つこぼす。" }, {
{ "White ~blanche comme la lune~", "たった3枚の紙" }, get { return new RctScheme { KnownKeys = KnownKeys }; }
}; set { KnownKeys = ((RctScheme)value).KnownKeys; }
}
public override ImageMetaData ReadMetaData (Stream stream) public override ImageMetaData ReadMetaData (Stream stream)
{ {

View File

@ -117,6 +117,12 @@ namespace GameRes.Formats.Malie
} }
} }
[Serializable]
public class LibScheme : ResourceScheme
{
public Dictionary<string, uint[]> KnownKeys;
}
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class DatOpener : ArchiveFormat public class DatOpener : ArchiveFormat
{ {
@ -268,44 +274,12 @@ namespace GameRes.Formats.Malie
return Math.Min (length, read-offset_pad); return Math.Min (length, read-offset_pad);
} }
public static readonly IReadOnlyDictionary<string, uint[]> KnownKeys = new Dictionary<string, uint[]>() public static Dictionary<string, uint[]> KnownKeys = new Dictionary<string, uint[]>();
public override ResourceScheme Scheme
{ {
{ "Paradise Lost", new uint[] { get { return new LibScheme { KnownKeys = KnownKeys }; }
0x745A5511, 0xFC188446, 0x6729696A, 0xB7C80D5E, 0x9AA598A4, 0xB8331AAC, 0xBD2B2BA7, 0x28A3BC2C, set { KnownKeys = ((LibScheme)value).KnownKeys; }
0x06AF3A2D, 0x2A88FE0C, 0x42233394, 0xB4B55BE4, 0xDE164D52, 0xCC525C19, 0x8D565E95, 0x95D39451, }
0xCA28EF0B, 0x26A96629, 0x2E0CC6AB, 0x2F4ACAE9, 0x2D2D56F9, 0x01ABCE8B, 0x4AA23F83, 0x1088CCE5,
0x99CA5A5A, 0xADF20357, 0xB3149706, 0x635597A5, 0x2F4ACAE9, 0xCA28EF0B, 0x26A96629, 0x2E0CC6AB,
0x42233394, 0xB4B55BE4, 0x06AF3A2D, 0x2A88FE0C, 0xFC188446, 0x6729696A, 0xB7C80D5E, 0x745A5511,
0xB8331AAC, 0xBD2B2BA7, 0x28A3BC2C, 0x9AA598A4, 0xAA23F831, 0x088CCE52, 0xD2D56F90, 0x1ABCE8B4,
0x31497066, 0x35597A56, 0x574E5147, 0x7859354B,
} },
{ "Kajiri Kamui Kagura Premier Trial", new uint[] { // 神咒神威神楽 超先行 体験版
0x146EB6BB, 0xED25AA5F, 0x289548E2, 0x097772BB, 0xBAABAC37, 0xB3A93919, 0x2335262B, 0x983BB0A0,
0xB95D8A37, 0x5B5DF692, 0xD52F944A, 0xA47104BB, 0xD8505D55, 0xD61BD9D4, 0x9C8C919A, 0x9315CC1D,
0xE60EEC28, 0x2EAAEB0D, 0xECEA4E46, 0x48CD498A, 0xA91C412E, 0xEE57628D, 0xD6D77DA4, 0xB54BE512,
0xCA255238, 0x825DDCAE, 0x7586F675, 0x27232466, 0x48CD498A, 0xE60EEC28, 0x2EAAEB0D, 0xECEA4E46,
0xD52F944A, 0xA47104BB, 0xB95D8A37, 0x5B5DF692, 0xED25AA5F, 0x289548E2, 0x097772BB, 0x146EB6BB,
0xB3A93919, 0x2335262B, 0x983BB0A0, 0xBAABAC37, 0x6D77DA4B, 0x54BE512A, 0x91C412EE, 0xE57628DD,
0x586F6752, 0x7232466A, 0x4C573077, 0x61417557,
} },
{ "Zettai Meikyuu Grimm", new uint[] { // 絶対迷宮グリム・ディレクターズカット版
0x4E7821AE, 0xA80DC2D4, 0x8609511B, 0xF13BF262, 0x2EAD1925, 0x22AB3F33, 0x21AE9614, 0xB5BB16A6,
0xF931273C, 0x10D75406, 0xE16A4304, 0xA88DF89D, 0x8B531756, 0x8C929155, 0x9F9990D7, 0x4B0A5ADD,
0x2D6EC5A9, 0x8BAB4649, 0x48AACFCC, 0xC86BA585, 0x2A237E27, 0x7E4C49CF, 0x0435D501, 0xB85A90C1,
0x21825446, 0xFC4EFC98, 0xA324A455, 0x67E66435, 0xC86BA585, 0x2D6EC5A9, 0x8BAB4649, 0x48AACFCC,
0xE16A4304, 0xA88DF89D, 0xF931273C, 0x10D75406, 0xA80DC2D4, 0x8609511B, 0xF13BF262, 0x4E7821AE,
0x22AB3F33, 0x21AE9614, 0xB5BB16A6, 0x2EAD1925, 0x435D501B, 0x85A90C12, 0xA237E277, 0xE4C49CF0,
0x324A4556, 0x7E66435D, 0x2C296B76, 0x2D4C5D5A,
} },
{ "Dies irae", new uint[] {
0x6F388B64, 0xBB5B3676, 0x2317DD18, 0x7CCD3736, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x9B9B379C, 0x45B25DAD, 0x9B3B118B, 0xEE8C3E66, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFBA30F99, 0xA6E6CDE7, 0x116C976B, 0x66CEC462,
0x88C5F746, 0x1F334DCD, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x9B3B118B, 0xEE8C3E66, 0x9B9B379C, 0x45B25DAD, 0xBB5B3676, 0x2317DD18, 0x7CCD3736, 0x6F388B64,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x16C976B6, 0x6CEC462F, 0xBA30F99A, 0x6E6CDE71,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
} },
};
} }
} }

View File

@ -50,6 +50,12 @@ namespace GameRes.Formats.Marble
} }
} }
[Serializable]
public class MblScheme : ResourceScheme
{
public Dictionary<string, string> KnownKeys;
}
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class MblOpener : ArchiveFormat public class MblOpener : ArchiveFormat
{ {
@ -150,13 +156,13 @@ namespace GameRes.Formats.Marble
} }
} }
public static Dictionary<string, string> KnownKeys = new Dictionary<string, string> { public static Dictionary<string, string> KnownKeys = new Dictionary<string, string>();
{ arcStrings.ArcDefault, "" },
{ "Chikatetsu Fuusa Jiken", "naze" }, // 地下鉄封鎖事件 public override ResourceScheme Scheme
{ "Eien no Owari ni", "eientamasoft" }, // 永遠の終わりに {
{ "Sakura Machizaka Stories", "sakura桜" }, // 桜待坂Stories vol.1/vol.2 get { return new MblScheme { KnownKeys = KnownKeys }; }
{ "Trouble Succubus", "とらぶるサッキュバス-0928-2007" }, // とらぶるサッキュバス set { KnownKeys = ((MblScheme)value).KnownKeys; }
}; }
public override Stream OpenEntry (ArcFile arc, Entry entry) public override Stream OpenEntry (ArcFile arc, Entry entry)
{ {

View File

@ -9,7 +9,7 @@
<RowDefinition/> <RowDefinition/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<ComboBox Name="EncScheme" Grid.Row="0" Margin="0,3,0,0" Width="180" HorizontalAlignment="Right" <ComboBox Name="EncScheme" Grid.Row="0" Margin="0,3,0,0" Width="180" HorizontalAlignment="Right"
ItemsSource="{Binding Source={x:Static m:MblOpener.KnownKeys}, Mode=OneWay}" ItemsSource="{Binding}"
DisplayMemberPath="Key" SelectedValuePath="Value" DisplayMemberPath="Key" SelectedValuePath="Value"
SelectedValue="{Binding ElementName=PassPhrase, Path=Text, Mode=TwoWay}"/> SelectedValue="{Binding ElementName=PassPhrase, Path=Text, Mode=TwoWay}"/>
<TextBox Name="PassPhrase" Grid.Row="1" Margin="0,3,0,3" Width="{Binding ElementName=EncScheme, Path=ActualWidth}" HorizontalAlignment="Right" <TextBox Name="PassPhrase" Grid.Row="1" Margin="0,3,0,3" Width="{Binding ElementName=EncScheme, Path=ActualWidth}" HorizontalAlignment="Right"

View File

@ -1,4 +1,8 @@
using System.Windows.Controls; using GameRes.Formats.Marble;
using GameRes.Formats.Strings;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
namespace GameRes.Formats.GUI namespace GameRes.Formats.GUI
{ {
@ -10,6 +14,10 @@ namespace GameRes.Formats.GUI
public WidgetMBL () public WidgetMBL ()
{ {
InitializeComponent (); InitializeComponent ();
var keys = new[] { new KeyValuePair<string, string> (arcStrings.ArcDefault, "") };
EncScheme.ItemsSource = keys.Concat (MblOpener.KnownKeys);
if (-1 == EncScheme.SelectedIndex)
EncScheme.SelectedIndex = 0;
} }
} }
} }

View File

@ -56,6 +56,12 @@ namespace GameRes.Formats.NScripter
public string Password { get; set; } public string Password { get; set; }
} }
[Serializable]
public class NsaScheme : ResourceScheme
{
public Dictionary<string, string> KnownKeys;
}
public enum Compression public enum Compression
{ {
Unknown = 256, Unknown = 256,
@ -70,19 +76,19 @@ namespace GameRes.Formats.NScripter
{ {
public override string Tag { get { return "NSA"; } } public override string Tag { get { return "NSA"; } }
public static readonly Dictionary<string, string> KnownKeys = new Dictionary<string, string>()
{
{ "Kimi ga Aruji de Shitsuji ga Ore de",
"kopkl;fdsl;kl;mwekopj@pgfd[p;:kl:;,lwret;kl;kolsgfdio@pdsflkl:,rse;:l,;:lpksdfpo" },
{ "Kiss yori Amakute Fukai Mono",
"dfklmdsgkmlkmljklgfnlsdfnklsdfjkl;sdfmkldfskfsdmklsdfjklfdsjklsdfsdfl;" },
};
public NsaOpener () public NsaOpener ()
{ {
Extensions = new string[] { "nsa", "dat" }; Extensions = new string[] { "nsa", "dat" };
} }
public static Dictionary<string, string> KnownKeys = new Dictionary<string, string>();
public override ResourceScheme Scheme
{
get { return new NsaScheme { KnownKeys = KnownKeys }; }
set { KnownKeys = ((NsaScheme)value).KnownKeys; }
}
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
List<Entry> dir = null; List<Entry> dir = null;

View File

@ -41,26 +41,48 @@ namespace GameRes.Formats.NitroPlus
{ {
public byte[] RawName; public byte[] RawName;
public int FolderId; public int FolderId;
public byte[] Order;
} }
internal class NpaArchive : ArcFile internal class NpaArchive : ArcFile
{ {
public NpaTitleId GameId { get; private set; } public EncryptionScheme Scheme { get; private set; }
public int Key { get; private set; } public int Key { get; private set; }
public byte[] KeyTable { get { return m_key_table.Value; } } public byte[] KeyTable { get { return m_key_table.Value; } }
private Lazy<byte[]> m_key_table; private Lazy<byte[]> m_key_table;
public NpaArchive (ArcView arc, ArchiveFormat impl, ICollection<Entry> dir, public NpaArchive (ArcView arc, ArchiveFormat impl, ICollection<Entry> dir,
NpaTitleId game_id, int key) EncryptionScheme scheme, int key)
: base (arc, impl, dir) : base (arc, impl, dir)
{ {
GameId = game_id; Scheme = scheme;
Key = key; Key = key;
m_key_table = new Lazy<byte[]> (() => NpaOpener.GenerateKeyTable (game_id)); m_key_table = new Lazy<byte[]> (() => NpaOpener.GenerateKeyTable (scheme));
} }
} }
[Serializable]
public class EncryptionScheme
{
public NpaTitleId TitleId;
public uint NameKey;
public byte[] Order;
public EncryptionScheme (NpaTitleId id, uint key, byte[] order)
{
TitleId = id;
NameKey = key;
Order = order;
}
}
[Serializable]
public class NpaScheme : ResourceScheme
{
public Dictionary<string, EncryptionScheme> KnownSchemes;
}
public enum NpaTitleId public enum NpaTitleId
{ {
NotEncrypted, NotEncrypted,
@ -71,7 +93,7 @@ namespace GameRes.Formats.NitroPlus
public class NpaOptions : ResourceOptions public class NpaOptions : ResourceOptions
{ {
public NpaTitleId TitleId { get; set; } public EncryptionScheme Scheme { get; set; }
public bool CompressContents { get; set; } public bool CompressContents { get; set; }
public int Key1 { get; set; } public int Key1 { get; set; }
public int Key2 { get; set; } public int Key2 { get; set; }
@ -86,19 +108,13 @@ namespace GameRes.Formats.NitroPlus
public override bool IsHierarchic { get { return true; } } public override bool IsHierarchic { get { return true; } }
public override bool CanCreate { get { return true; } } public override bool CanCreate { get { return true; } }
/// <summary> public static Dictionary<string, EncryptionScheme> KnownSchemes = new Dictionary<string, EncryptionScheme>();
/// Known encryption schemes.
/// Order should match NpaTitleId enumeration. public override ResourceScheme Scheme
/// </summary> {
public static readonly string[] KnownSchemes = new string[] { get { return new NpaScheme { KnownSchemes = KnownSchemes }; }
arcStrings.ArcNoEncryption, set { KnownSchemes = ((NpaScheme)value).KnownSchemes; }
"Chaos;Head", "Chaos;Head Trial 1", "Chaos;Head Trial 2", "Muramasa Trial", "Muramasa", }
"Sumaga", "Zoku Satsuriku no Django", "Zoku Satsuriku no Django Trial", "Lamento",
"Sweet Pool", "Sumaga Special", "Demonbane", "MuramasaAD", "Axanael",
"Kikokugai", "Sonicomi Trial 2", "Sumaga 3% Trial", "Sonicomi Version 1.0",
"Guilty Crown Lost Xmas", "Guilty Crown Lost Xmas Trailer", "DRAMAtical Murder",
"Kimi to Kanojo to Kanojo no Koi", "Phenomeno", "Nekoda -Nyanda-",
};
public const int DefaultKey1 = 0x4147414e; public const int DefaultKey1 = 0x4147414e;
public const int DefaultKey2 = 0x21214f54; public const int DefaultKey2 = 0x21214f54;
@ -118,9 +134,13 @@ namespace GameRes.Formats.NitroPlus
if (dir_size >= file.MaxOffset) if (dir_size >= file.MaxOffset)
return null; return null;
EncryptionScheme enc = null;
var game_id = NpaTitleId.NotEncrypted; var game_id = NpaTitleId.NotEncrypted;
if (encrypted) if (encrypted)
game_id = QueryGameEncryption(); {
enc = QueryGameEncryption();
game_id = enc.TitleId;
}
int key = GetArchiveKey (game_id, key1, key2); int key = GetArchiveKey (game_id, key1, key2);
@ -161,8 +181,8 @@ namespace GameRes.Formats.NitroPlus
} }
cur_offset += 4 + name_size + 17; cur_offset += 4 + name_size + 17;
} }
if (game_id != NpaTitleId.NotEncrypted) if (enc != null)
return new NpaArchive (file, this, dir, game_id, key); return new NpaArchive (file, this, dir, enc, key);
else else
return new ArcFile (file, this, dir); return new ArcFile (file, this, dir);
} }
@ -194,8 +214,8 @@ namespace GameRes.Formats.NitroPlus
entry.Offset = data_offset; entry.Offset = data_offset;
entry.UnpackedSize = (uint)size; entry.UnpackedSize = (uint)size;
Stream destination = output; Stream destination = output;
if (NpaTitleId.NotEncrypted != npa_options.TitleId) if (null != npa_options.Scheme)
destination = new EncryptedStream (output, entry, npa_options.TitleId, index.Key); destination = new EncryptedStream (output, entry, npa_options.Scheme, index.Key);
try try
{ {
if (entry.IsPacked) if (entry.IsPacked)
@ -234,7 +254,7 @@ namespace GameRes.Formats.NitroPlus
header.Write (npa_options.Key1); header.Write (npa_options.Key1);
header.Write (npa_options.Key2); header.Write (npa_options.Key2);
header.Write (npa_options.CompressContents); header.Write (npa_options.CompressContents);
header.Write (npa_options.TitleId != NpaTitleId.NotEncrypted); header.Write (npa_options.Scheme != null);
header.Write (index.TotalCount); header.Write (index.TotalCount);
header.Write (index.FolderCount); header.Write (index.FolderCount);
header.Write (index.FileCount); header.Write (index.FileCount);
@ -300,34 +320,16 @@ namespace GameRes.Formats.NitroPlus
return key1 * key2; return key1 * key2;
} }
internal static byte GetKeyFromEntry (NpaEntry entry, NpaTitleId game_id, int arc_key) internal static byte GetKeyFromEntry (NpaEntry entry, EncryptionScheme scheme, int arc_key)
{ {
int key; int key = (int)scheme.NameKey;
switch (game_id)
{
case NpaTitleId.AXANAEL:
case NpaTitleId.KIKOKUGAI:
case NpaTitleId.SONICOMITR2:
case NpaTitleId.SONICOMI:
case NpaTitleId.LOSTX:
case NpaTitleId.DRAMATICALMURDER:
case NpaTitleId.PHENOMENO:
key = 0x20101118;
break;
case NpaTitleId.TOTONO:
key = 0x12345678;
break;
default:
key = unchecked((int)0x87654321);
break;
}
var name = entry.RawName; var name = entry.RawName;
for (int i = 0; i < name.Length; ++i) for (int i = 0; i < name.Length; ++i)
key -= name[i]; key -= name[i];
key *= name.Length; key *= name.Length;
if (game_id != NpaTitleId.LAMENTO) // if the game is not Lamento if (scheme.TitleId != NpaTitleId.LAMENTO) // if the game is not Lamento
{ {
key += arc_key; key += arc_key;
key *= (int)entry.UnpackedSize; key *= (int)entry.UnpackedSize;
@ -335,13 +337,9 @@ namespace GameRes.Formats.NitroPlus
return (byte)key; return (byte)key;
} }
public static byte[] GenerateKeyTable (NpaTitleId title_id) public static byte[] GenerateKeyTable (EncryptionScheme scheme)
{ {
int index = (int)title_id; byte[] order = scheme.Order;
if (index < 0 || index >= OrderTable.Length)
throw new ArgumentOutOfRangeException ("title_id", "Invalid title id specified");
byte[] order = OrderTable[index];
if (null == order) if (null == order)
throw new ArgumentException ("Encryption key table not defined", "title_id"); throw new ArgumentException ("Encryption key table not defined", "title_id");
@ -363,7 +361,7 @@ namespace GameRes.Formats.NitroPlus
table[ecx] = table[edx]; table[ecx] = table[edx];
table[edx] = tmp; table[edx] = tmp;
} }
if (NpaTitleId.TOTONO == title_id) if (NpaTitleId.TOTONO == scheme.TitleId)
{ {
var totono_table = new byte[256]; var totono_table = new byte[256];
for (int i = 0; i < 256; ++i) for (int i = 0; i < 256; ++i)
@ -381,7 +379,7 @@ namespace GameRes.Formats.NitroPlus
public override ResourceOptions GetDefaultOptions () public override ResourceOptions GetDefaultOptions ()
{ {
return new NpaOptions { return new NpaOptions {
TitleId = GetTitleId (Settings.Default.NPAScheme), Scheme = GetScheme (Settings.Default.NPAScheme),
CompressContents = Settings.Default.NPACompressContents, CompressContents = Settings.Default.NPACompressContents,
Key1 = (int)Settings.Default.NPAKey1, Key1 = (int)Settings.Default.NPAKey1,
Key2 = (int)Settings.Default.NPAKey2, Key2 = (int)Settings.Default.NPAKey2,
@ -398,21 +396,25 @@ namespace GameRes.Formats.NitroPlus
return new GUI.CreateNPAWidget(); return new GUI.CreateNPAWidget();
} }
NpaTitleId QueryGameEncryption () EncryptionScheme QueryGameEncryption ()
{ {
var options = Query<NpaOptions> (arcStrings.ArcEncryptedNotice); var options = Query<NpaOptions> (arcStrings.ArcEncryptedNotice);
return options.TitleId; return options.Scheme;
} }
public static NpaTitleId GetTitleId (string title) public static NpaTitleId GetTitleId (string title)
{ {
Debug.Assert (KnownSchemes.Length == OrderTable.Length, var scheme = GetScheme (title);
"Number of known encryptions schemes does not match available order tables."); return scheme != null ? scheme.TitleId : NpaTitleId.NotEncrypted;
var index = Array.IndexOf (KnownSchemes, title); }
if (index != -1)
return (NpaTitleId)index; public static EncryptionScheme GetScheme (string title)
{
EncryptionScheme scheme;
if (KnownSchemes.TryGetValue (title, out scheme))
return scheme;
else else
return NpaTitleId.NotEncrypted; return null;
} }
static readonly byte[] BaseTable = { static readonly byte[] BaseTable = {
@ -433,60 +435,6 @@ namespace GameRes.Formats.NitroPlus
0x8C,0xE9,0xB5,0xE6,0x31,0x93,0x46,0x5E,0x1D,0x1B,0x4B,0x71,0xD6,0x92,0x3A,0xA6, 0x8C,0xE9,0xB5,0xE6,0x31,0x93,0x46,0x5E,0x1D,0x1B,0x4B,0x71,0xD6,0x92,0x3A,0xA6,
0x2D,0x00,0x9D,0xBB,0x6E,0xF0,0x99,0xCE,0x21,0x0A,0xD0,0xF6,0xFE,0xA2,0x8A,0x96, 0x2D,0x00,0x9D,0xBB,0x6E,0xF0,0x99,0xCE,0x21,0x0A,0xD0,0xF6,0xFE,0xA2,0x8A,0x96,
}; };
static readonly byte[][] OrderTable = {
null, // NotEncrypted
// CHAOSHEAD
new byte[] { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
// CHAOSHEADTR1
new byte[] { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1e,0x4e,0x66,0xb6 },
// CHAOSHEADTR2
new byte[] { 0x05,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00 },
// MURAMASATR
new byte[] { 0x3c,0xe0,0x2e,0x2f,0x20,0x2e,0x2f,0x20,0x8e,0x80,0x80,0xf2,0xf2,0xf2,0xfa,0xfc },
// MURAMASA
new byte[] { 0x35,0x70,0x2e,0x66,0x67,0x65,0x66,0x67,0x85,0x89,0x89,0x3b,0x3b,0x8b,0x81,0x85 },
// SUMAGA
new byte[] { 0x3c,0xe0,0x2e,0x2f,0x2f,0x2f,0x2f,0x20,0x8e,0x8f,0x8f,0xf2,0xf2,0xf2,0xfc,0xfc },
// DJANGO
new byte[] { 0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x1e,0x4e,0x66,0xb6 },
// DJANGOTR
new byte[] { 0xed,0xee,0xee,0xef,0xed,0xee,0xee,0xee,0xfe,0xde,0xee,0xef,0xed,0xee,0xfe,0xdf,0x1e,0x4e,0x66,0xb6 },
// LAMENTO
new byte[] { 0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0xee,0x1e,0x4e,0x66,0xb6 },
// SWEETPOOL
new byte[] { 0x38,0x9c,0x2a,0x8b,0x8b,0x8b,0x8b,0x8c,0x8a,0x8b,0x8b,0xae,0xae,0xae,0xa8,0xa8 },
// SUMAGASP
new byte[] { 0xab,0x6f,0x9d,0x9e,0x9f,0x9d,0x9e,0xaf,0x8d,0xff,0xff,0x71,0x71,0x71,0x79,0x7b },
// DEMONBANE
new byte[] { 0x96,0xb9,0x47,0x48,0x99,0x97,0x9c,0xaa,0x88,0xca,0xea,0x73,0x73,0x7b,0xc9,0xc6 },
// MURAMASAAD
new byte[] { 0x00,0x04,0x04,0x68,0x68,0x68,0x68,0x68,0x6f,0x6f,0x9f,0x96,0x96,0x96,0x96,0x9b },
// AXANAEL
new byte[] { 0x08,0x0c,0x0c,0xc0,0xf0,0xf0,0xf0,0xf0,0xf7,0xf7,0xf7,0xfe,0xfe,0xfe,0xfe,0xf3 },
// KIKOKUGAI
new byte[] { 0x0f,0x07,0x07,0x90,0xf7,0xf7,0xf7,0xf7,0xf2,0x47,0x47,0x49,0xc9,0xc9,0xc9,0xc3 },
// SONICOMITR2
new byte[] { 0x08,0x0a,0x0a,0x40,0xfa,0xfa,0x50,0x50,0x55,0xf7,0xf7,0xf9,0x29,0x2c,0x7c,0x73 },
// SUMAGA3P
new byte[] { 0x0f,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
// SONICOMI
new byte[] { 0x0e,0x0b,0x0e,0x77,0x2e,0x2e,0x80,0x86,0xb9,0x2e,0x2e,0x29,0x89,0x82,0xad,0xaa },
// LOSTX
new byte[] { 0x38,0xba,0x4b,0x5b,0x55,0xae,0xee,0xe0,0x67,0x48,0x08,0x0a,0x6a,0x3d,0x32,0x8d },
// LOSTXTRAILER
new byte[] { 0x34,0x7a,0xbb,0xcb,0x11,0x65,0xea,0x5c,0x27,0x0f,0xcf,0xc6,0x66,0x39,0x39,0xfd },
// DRAMATICALMURDER
new byte[] { 0x05,0x0d,0x0d,0x13,0xb5,0x3d,0x8d,0x2d,0x20,0xc7,0xc7,0xcf,0x1f,0xef,0xef,0x48 },
// TOTONO
new byte[] { 0x6e,0x60,0x90,0xac,0xb3,0xe3,0x83,0xd6,0xde,0x7a,0x7a,0x7f,0xef,0xbf,0xb2,0xd6 },
// some installation npa
//new byte[] { 0xa9,0xd3,0x34,0x84,0xd6,0xea,0xaa,0xdc,0xa0,0x64,0x24,0x26,0xd6,0xae,0xae,0x76 },
// PHENOMENO
new byte[] { 0x30,0x96,0xdb,0x2b,0x3d,0x81,0x02,0x74,0x47,0x2b,0xeb,0xee,0x6e,0x35,0x35,0x5d },
// NEKODA
new byte[] { 0xdc,0xdc,0xec,0xcd,0xdb,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0xdc,0x1e,0x4e,0x66,0xb6 },
};
} }
/// <summary> /// <summary>
@ -512,7 +460,8 @@ namespace GameRes.Formats.NitroPlus
public Indexer (IEnumerable<Entry> source_list, NpaOptions options) public Indexer (IEnumerable<Entry> source_list, NpaOptions options)
{ {
m_entries = new List<NpaEntry> (source_list.Count()); m_entries = new List<NpaEntry> (source_list.Count());
m_key = NpaOpener.GetArchiveKey (options.TitleId, options.Key1, options.Key2); var title_id = null != options.Scheme ? options.Scheme.TitleId : NpaTitleId.NotEncrypted;
m_key = NpaOpener.GetArchiveKey (title_id, options.Key1, options.Key2);
foreach (var entry in source_list) foreach (var entry in source_list)
{ {
@ -610,32 +559,32 @@ namespace GameRes.Formats.NitroPlus
public EncryptedStream (NpaArchive arc, NpaEntry entry) public EncryptedStream (NpaArchive arc, NpaEntry entry)
{ {
m_read_mode = true; m_read_mode = true;
m_encrypted_length = GetEncryptedLength (entry, arc.GameId); m_encrypted_length = GetEncryptedLength (entry, arc.Scheme.TitleId);
if (m_encrypted_length > entry.Size) if (m_encrypted_length > entry.Size)
m_encrypted_length = (int)entry.Size; m_encrypted_length = (int)entry.Size;
int key = NpaOpener.GetKeyFromEntry (entry, arc.GameId, arc.Key); int key = NpaOpener.GetKeyFromEntry (entry, arc.Scheme, arc.Key);
m_stream = arc.File.CreateStream (entry.Offset, entry.Size); m_stream = arc.File.CreateStream (entry.Offset, entry.Size);
m_encrypted = new Lazy<byte[]> (() => InitEncrypted (key, arc.GameId, arc.KeyTable)); m_encrypted = new Lazy<byte[]> (() => InitEncrypted (key, arc.Scheme.TitleId, arc.KeyTable));
m_base_pos = m_stream.Position; m_base_pos = m_stream.Position;
} }
public EncryptedStream (Stream output, NpaEntry entry, NpaTitleId game_id, int arc_key) public EncryptedStream (Stream output, NpaEntry entry, EncryptionScheme scheme, int arc_key)
{ {
m_read_mode = false; m_read_mode = false;
m_encrypted_length = GetEncryptedLength (entry, game_id); m_encrypted_length = GetEncryptedLength (entry, scheme.TitleId);
int key = NpaOpener.GetKeyFromEntry (entry, game_id, arc_key); int key = NpaOpener.GetKeyFromEntry (entry, scheme, arc_key);
m_stream = output; m_stream = output;
m_encrypted = new Lazy<byte[]> (() => new byte[m_encrypted_length]); m_encrypted = new Lazy<byte[]> (() => new byte[m_encrypted_length]);
m_base_pos = m_stream.Position; m_base_pos = m_stream.Position;
byte[] decrypt_table = NpaOpener.GenerateKeyTable (game_id); byte[] decrypt_table = NpaOpener.GenerateKeyTable (scheme);
byte[] encrypt_table = new byte[256]; byte[] encrypt_table = new byte[256];
for (int i = 0; i < 256; ++i) for (int i = 0; i < 256; ++i)
encrypt_table[decrypt_table[i]] = (byte)i; encrypt_table[decrypt_table[i]] = (byte)i;
if (NpaTitleId.LAMENTO == game_id) if (NpaTitleId.LAMENTO == scheme.TitleId)
{ {
Encrypt = (i, x) => encrypt_table[(x + key) & 0xff]; Encrypt = (i, x) => encrypt_table[(x + key) & 0xff];
} }

View File

@ -1,10 +1,9 @@
<Grid x:Class="GameRes.Formats.GUI.WidgetNPA" <Grid x:Class="GameRes.Formats.GUI.WidgetNPA"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fmt="clr-namespace:GameRes.Formats.NitroPlus"
xmlns:p="clr-namespace:GameRes.Formats.Properties" xmlns:p="clr-namespace:GameRes.Formats.Properties"
MaxWidth="250"> MaxWidth="250">
<ComboBox Name="Scheme" Width="180" <ComboBox Name="Scheme" Width="180"
ItemsSource="{Binding Source={x:Static fmt:NpaOpener.KnownSchemes}, Mode=OneWay}" ItemsSource="{Binding}"
SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=NPAScheme, Mode=TwoWay}"/> SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=NPAScheme, Mode=TwoWay}"/>
</Grid> </Grid>

View File

@ -1,8 +1,8 @@
using System.Windows; using System.Windows.Controls;
using System.Windows.Controls;
using System.Linq; using System.Linq;
using GameRes.Formats.Properties; using GameRes.Formats.Properties;
using GameRes.Formats.NitroPlus; using GameRes.Formats.NitroPlus;
using GameRes.Formats.Strings;
namespace GameRes.Formats.GUI namespace GameRes.Formats.GUI
{ {
@ -15,8 +15,8 @@ namespace GameRes.Formats.GUI
{ {
var selected = Settings.Default.NPAScheme; var selected = Settings.Default.NPAScheme;
InitializeComponent(); InitializeComponent();
var sorted = NpaOpener.KnownSchemes.Skip (1).OrderBy (x => x); var keys = new string[] { arcStrings.ArcNoEncryption };
Scheme.ItemsSource = NpaOpener.KnownSchemes.Take(1).Concat (sorted); Scheme.ItemsSource = keys.Concat (NpaOpener.KnownSchemes.Keys.OrderBy (x => x));
if (NpaTitleId.NotEncrypted == NpaOpener.GetTitleId (selected)) if (NpaTitleId.NotEncrypted == NpaOpener.GetTitleId (selected))
Scheme.SelectedIndex = 0; Scheme.SelectedIndex = 0;
else else

View File

@ -55,6 +55,12 @@ namespace GameRes.Formats.Selene
public string PassPhrase { get; set; } public string PassPhrase { get; set; }
} }
[Serializable]
public class KcapScheme : ResourceScheme
{
public Dictionary<string,string> KnownSchemes;
}
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class PackOpener : ArchiveFormat public class PackOpener : ArchiveFormat
{ {
@ -66,17 +72,19 @@ namespace GameRes.Formats.Selene
static private string DefaultPassPhrase = "Selene.Default.Password"; static private string DefaultPassPhrase = "Selene.Default.Password";
public static readonly Dictionary<string,string> KnownSchemes = new Dictionary<string,string> { public static Dictionary<string,string> KnownSchemes = new Dictionary<string,string>();
{ arcStrings.KCAPDefault, "" },
{ "Okaa-san ga Ippai!", "hahadata256pasyamada2zikan" },
{ "Itazura Mahjong", "mjdata999pasyamada2zikan" },
};
public PackOpener () public PackOpener ()
{ {
Extensions = new string[] { "pack" }; Extensions = new string[] { "pack" };
} }
public override ResourceScheme Scheme
{
get { return new KcapScheme { KnownSchemes = KnownSchemes }; }
set { KnownSchemes = ((KcapScheme)value).KnownSchemes; }
}
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
int count = file.View.ReadInt32 (4); int count = file.View.ReadInt32 (4);

View File

@ -4,7 +4,6 @@
xmlns:s="clr-namespace:GameRes.Formats.Strings" xmlns:s="clr-namespace:GameRes.Formats.Strings"
xmlns:p="clr-namespace:GameRes.Formats.Properties" xmlns:p="clr-namespace:GameRes.Formats.Properties"
xmlns:fmt="clr-namespace:GameRes.Formats.Selene" xmlns:fmt="clr-namespace:GameRes.Formats.Selene"
xmlns:local="clr-namespace:GameRes.Formats.GUI"
MaxWidth="260"> MaxWidth="260">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
@ -22,6 +21,6 @@
<Label Content="{x:Static s:arcStrings.LabelScheme}" Target="{Binding ElementName=EncScheme}" <Label Content="{x:Static s:arcStrings.LabelScheme}" Target="{Binding ElementName=EncScheme}"
Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right"/> Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right"/>
<ComboBox Name="EncScheme" Grid.Column="1" Grid.Row="1" Margin="0,3,0,0" <ComboBox Name="EncScheme" Grid.Column="1" Grid.Row="1" Margin="0,3,0,0"
ItemsSource="{Binding Source={x:Static fmt:PackOpener.KnownSchemes}, Path=Keys, Mode=OneWay}" ItemsSource="{Binding}"
SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=KCAPScheme, Mode=TwoWay}" /> SelectedValue="{Binding Source={x:Static p:Settings.Default}, Path=KCAPScheme, Mode=TwoWay}" />
</Grid> </Grid>

View File

@ -1,7 +1,9 @@
using System.Windows; using System.Linq;
using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using GameRes.Formats.Properties; using GameRes.Formats.Properties;
using GameRes.Formats.Selene; using GameRes.Formats.Selene;
using GameRes.Formats.Strings;
namespace GameRes.Formats.GUI namespace GameRes.Formats.GUI
{ {
@ -13,7 +15,9 @@ namespace GameRes.Formats.GUI
public WidgetKCAP () public WidgetKCAP ()
{ {
InitializeComponent (); InitializeComponent ();
if (null == EncScheme.SelectedItem) var keys = new[] { arcStrings.ArcDefault };
EncScheme.ItemsSource = keys.Concat (PackOpener.KnownSchemes.Keys);
if (-1 == EncScheme.SelectedIndex)
EncScheme.SelectedIndex = 0; EncScheme.SelectedIndex = 0;
EncScheme.SelectionChanged += OnSchemeChanged; EncScheme.SelectionChanged += OnSchemeChanged;
} }

View File

@ -60,6 +60,12 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
} }
} }
[Serializable]
public class WarcScheme : ResourceScheme
{
public EncryptionScheme[] KnownSchemes;
}
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class WarOpener : ArchiveFormat public class WarOpener : ArchiveFormat
{ {
@ -69,6 +75,12 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
public override bool IsHierarchic { get { return false; } } public override bool IsHierarchic { get { return false; } }
public override bool CanCreate { get { return false; } } public override bool CanCreate { get { return false; } }
public override ResourceScheme Scheme
{
get { return new WarcScheme { KnownSchemes = Decoder.KnownSchemes }; }
set { Decoder.KnownSchemes = ((WarcScheme)value).KnownSchemes; }
}
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
if (!file.View.AsciiEqual (4, " 1.")) if (!file.View.AsciiEqual (4, " 1."))
@ -542,64 +554,8 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
} }
} }
internal class CachedResource [Serializable]
{ public class EncryptionScheme
Dictionary<string, byte[]> ResourceCache = new Dictionary<string, byte[]>();
Dictionary<string, byte[]> RegionCache = new Dictionary<string, byte[]>();
public static Stream Open (string name)
{
var assembly = typeof(CachedResource).Assembly;
string qualified_name = "GameRes.Formats.Resources." + name;
Stream stream = assembly.GetManifestResourceStream (qualified_name);
if (null != stream)
return stream;
stream = assembly.GetManifestResourceStream (qualified_name + ".z");
if (null != stream)
using (stream)
return ZLibCompressor.DeCompress (stream);
throw new FileNotFoundException ("Resource not found", name);
}
public byte[] Load (string name)
{
byte[] res;
if (!ResourceCache.TryGetValue (name, out res))
{
using (var stream = Open (name))
{
res = new byte[stream.Length];
stream.Read (res, 0, res.Length);
ResourceCache[name] = res;
}
}
return res;
}
// FIXME: this approach disregards possible differences in regions width or height
public byte[] LoadRegion (string name, int width, int height)
{
byte[] region;
if (!RegionCache.TryGetValue (name, out region))
{
using (var png = Open (name))
{
region = new byte[width*height*4];
var decoder = new PngBitmapDecoder (png, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
var bitmap = decoder.Frames[0];
width = Math.Min (width, bitmap.PixelWidth);
height = Math.Min (height, bitmap.PixelHeight);
int stride = bitmap.PixelWidth * bitmap.Format.BitsPerPixel / 8;
Int32Rect rect = new Int32Rect (0, 0, width, height);
bitmap.CopyPixels (rect, region, stride, 0);
RegionCache[name] = region;
}
}
return region;
}
}
internal class EncryptionScheme
{ {
public string Name { get; set; } public string Name { get; set; }
public string OriginalTitle { get; set; } public string OriginalTitle { get; set; }
@ -611,59 +567,6 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
public byte[] Region; public byte[] Region;
public byte[] DecodeBin; public byte[] DecodeBin;
public byte[] DecodeExtra; public byte[] DecodeExtra;
private static CachedResource Resource = new CachedResource();
public static readonly string DefaultCrypt = "Crypt Type 20011002 - Copyright(C) 2000 Y.Yamada/STUDIO よしくん";
public static readonly uint[] ZeroKey = new uint[] { 0, 0, 0, 0, 0 };
public static EncryptionScheme Create (string name, int version, int entry_name_size,
string key1, uint[] key2,
string image, string region_src, string decode_bin = null,
string original_title = "", uint? decode_patch = null)
{
var scheme = new EncryptionScheme
{
Name = name,
Version = version,
OriginalTitle = original_title,
EntryNameSize = entry_name_size,
CryptKey = Encodings.cp932.GetBytes (key1),
HelperKey = key2,
ShiinaImage = Resource.Load (image),
Region = Resource.LoadRegion (region_src, 48, 48),
};
if (null != decode_bin)
{
scheme.DecodeBin = Resource.Load (decode_bin);
if (null != decode_patch)
{
scheme.DecodeBin = scheme.DecodeBin.Clone() as byte[];
LittleEndian.Pack (decode_patch.Value, scheme.DecodeBin, 0x1020);
}
}
if (version >= 2490)
scheme.DecodeExtra = Resource.Load ("ShiinaRio5.png");
return scheme;
}
public static EncryptionScheme Create (int version, string name, string original_title, uint[] key2, uint? decode_patch = null)
{
string decode = version < 2410 ? "DecodeV1.bin"
: version < 2490 ? "DecodeV241.bin"
: "DecodeV249.bin";
string image = version < 2390 ? "ShiinaRio1.png"
: version < 2490 ? "ShiinaRio3.jpg"
: "ShiinaRio4.jpg";
int entry_name_size = version <= 2390 ? 0x10 : 0x20;
return Create (name, version, entry_name_size, DefaultCrypt, key2,
image, "ShiinaRio2.png", decode, original_title, decode_patch);
}
public static EncryptionScheme Create (int version, string name)
{
return Create (version, name, "", ZeroKey);
}
} }
internal class Decoder internal class Decoder
@ -1246,71 +1149,6 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
return (uint)((m_scheme.EntryNameSize + 0x18) * max_index_entries); return (uint)((m_scheme.EntryNameSize + 0x18) * max_index_entries);
} }
public static EncryptionScheme[] KnownSchemes = new EncryptionScheme[] public static EncryptionScheme[] KnownSchemes = new EncryptionScheme[0];
{
EncryptionScheme.Create (2360, "ShiinaRio v2.36 and older"),
EncryptionScheme.Create (2370, "ShiinaRio v2.37", "椎名里緒 v2.37",
new uint[] { 0xF182C682, 0xE882AA82, 0x718E5896, 0x8183CC82, 0xDAC98283 }),
EncryptionScheme.Create (2480, "Bloody Rondo", "BLOODY†RONDO",
new uint[] { 0xFBFBF8F6, 0xFBE6EDF0, 0xFBF0FA, 0, 0 }),
EncryptionScheme.Create (2460, "Chikan Circle", "痴漢サークル",
new uint[] { 0x6B6B6E70, 0x6E724058, 0x587E736B, 0x00003653, 0 }),
EncryptionScheme.Create (2470, "Chikan Circle 2", "痴漢サークル2",
new uint[] { 0x6464617F, 0x617D4F57, 0x57717C64, 0x00003A5C, 0 }, 0x20080108),
EncryptionScheme.Create (2470, "Chikan Circle 3", "痴漢サークル3",
new uint[] { 0x6565607E, 0x607C4E56, 0x56707D65, 0x00003A4A, 0 }, 0x20090706),
EncryptionScheme.Create (2450, "Chuuchuu Nurse", "ちゅうちゅうナース",
new uint[] { 0xB0D1ECD1, 0xECD1F7D1, 0xF7D1B0D1, 0x08D23AD0, 0x13D20BD0 }),
EncryptionScheme.Create (2470, "Damatte Watashi no Muko ni Nare!", "黙って私のムコになれ!",
new uint[] { 0x44075C13, 0x010B4107, 0x05064907, 0x4C07D706, 0x6F074D07 }),
EncryptionScheme.Create (2470, "Hana to Otome ni Shukufuku wo Royal Bouquet", "花と乙女に祝福を ロイヤルブーケ",
new uint[] { 0xE3A7F1AC, 0xB2AA96AC, 0x4FAAECA7, 0xD5A7BAB0, 0x44A754A7 }),
EncryptionScheme.Create (2400, "Helter Skelter", "ヘルタースケルター",
new uint[] { 0x747C887C, 0xA47EA17C, 0xAF7CA77C, 0xA17C747C, 0x0000A47E }),
EncryptionScheme.Create (2390, "Hitozuma Onna Kyoushi Reika", "人妻女教師・麗香",
new uint[] { 0x3772936F, 0x4C746870, 0x12688b71, 0x0A687E72, 0x3A6B4076 }),
EncryptionScheme.Create (2470, "Mahou Shoujo no Taisetsu na Koto", "魔法少女の大切なこと。",
new uint[] { 0x51879387, 0x869EBC9E, 0xF480DD93, 0xD993C981, 0xD793A093 }),
EncryptionScheme.Create (2460, "Mikoko", "みここ",
new uint[] { 0x7DAC51AC, 0x51AC7DAC, 0x7DAC7DAC, 0x7DAC51AC, 0x51AC7DAC }),
EncryptionScheme.Create (2470, "Najimi no Oba-chan", "馴染みのオバちゃん",
new uint[] { 0x6161647A, 0x64784A52, 0x52747961, 0x00004C43, 0 }),
EncryptionScheme.Create (2390, "Nagagutsu wo Haita Deco", "長靴をはいたデコ",
new uint[] { 0x486D887E, 0x0F7DBC73, 0x5D7D327D, 0x997C427D, 0x877EAD7C }),
EncryptionScheme.Create (2470, "Nakadashi Trilogy", "なかだしトリロジー",
new uint[] { 0x928ADB9E, 0xB087BB87, 0x928ADB9E, 0xB087BB87, 0xB087BB87 }),
EncryptionScheme.Create (2470, "Onedari Onapet", "おねだりオナペット",
new uint[] { 0xD59CB69C, 0xF69CA09C, 0x779D579D, 0x7C9D679D, 0x0000799D }),
EncryptionScheme.Create (2480, "Onegan!", "おねガン!",
new uint[] { 0xC881AB81, 0x90804880, 0xAB814A82, 0x4880C881, 0x4A829080 }),
EncryptionScheme.Create (2470, "Oreimo Plus", "俺妹プラス",
new uint[] { 0x24371528, 0x2822D722, 0x1528F922, 0xD7222437, 0xF9222822 }),
EncryptionScheme.Create (2470, "Pure Love!", "ぴゅあらっ!",
new uint[] { 0x31500050, 0x35507250, 0x87821350, 0x9D9E9780, 0x00009784 }),
EncryptionScheme.Create (2470, "Ren'ai Saimin", "恋愛催眠",
new uint[] { 0x6E423C5D, 0x7A5C0947, 0x6E423C5D, 0x7A5C0947, 0x6E423C5D }),
EncryptionScheme.Create (2470, "Ran→Sem", "RAN→SEM白濁デルモ妻のミイラ捕り",
new uint[] { 0x63636678, 0x667A4850, 0x50767B63, 0x00004E5D, 0 }, 0x20100427),
EncryptionScheme.Create (2470, "Rin x Sen", "RIN×SEN白濁女教師と野郎ども",
new uint[] { 0x6666637D, 0x637F4D55, 0x55737E66, 0x00004F58, 0 }),
EncryptionScheme.Create (2480, "Sensei! Shite Ageru", "先生っ! シてあげる",
new uint[] { 0x70562056, 0x87470744, 0x02449045, 0x76446644, 0x8F472F44 }),
EncryptionScheme.Create (2480, "Tanetsuke Mura", "種憑け村",
new uint[] { 0x7C7C7967, 0x7965574F, 0x4F69647C, 0x00005144, 0 }),
EncryptionScheme.Create (2470, "You~Gaku", "よう∽ガク",
new uint[] { 0x4DE2AB4D, 0x98AB5D46, 0x66496349, 0x485D685D, 0x5F4D4C5D }),
EncryptionScheme.Create (2410, "Zansho Omimai Moushiagemasu", "残暑お見舞い申し上げます。",
new uint[] { 0x3A123012, 0x6C3A6C36, 0x3C36323C, 0x6C360F16, 0x369DD012 }),
EncryptionScheme.Create (2490, "Shojo Mama", "処女ママ",
new uint[] { 0x4B535453, 0xA15FA15F, 0, 0, 0 }),
EncryptionScheme.Create ("ShiinaRio v2.49", 2490, 0x20, EncryptionScheme.DefaultCrypt,
new uint[] { 0x4B535453, 0xA15FA15F, 0, 0, 0 },
"ShiinaRio4.jpg", "ShiinaRio2.png", "DecodeV249.bin"),
};
} }
} }

View File

@ -30,6 +30,7 @@ using System.ComponentModel.Composition.Hosting;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using GameRes.Collections; using GameRes.Collections;
using System.Runtime.Serialization.Formatters.Binary;
namespace GameRes namespace GameRes
{ {
@ -59,6 +60,17 @@ namespace GameRes
public IEnumerable<AudioFormat> AudioFormats { get { return m_audio_formats; } } public IEnumerable<AudioFormat> AudioFormats { get { return m_audio_formats; } }
public IEnumerable<ScriptFormat> ScriptFormats { get { return m_script_formats; } } public IEnumerable<ScriptFormat> ScriptFormats { get { return m_script_formats; } }
public IEnumerable<IResource> Formats
{
get
{
return ((IEnumerable<IResource>)ArcFormats).Concat (ImageFormats).Concat (AudioFormats).Concat (ScriptFormats);
}
}
public int CurrentSchemeVersion { get; private set; }
public string SchemeID { get { return "GARbroDB"; } }
public Exception LastError { get; set; } public Exception LastError { get; set; }
public event ParametersRequestEventHandler ParametersRequest; public event ParametersRequestEventHandler ParametersRequest;
@ -173,5 +185,46 @@ namespace GameRes
signature |= (uint)file.ReadByte() << 24; signature |= (uint)file.ReadByte() << 24;
return signature; return signature;
} }
public void DeserializeScheme (Stream input)
{
var bin = new BinaryFormatter();
var db = (SchemeDataBase)bin.Deserialize (input);
if (db.Version <= CurrentSchemeVersion)
return;
foreach (var format in Formats)
{
ResourceScheme scheme;
if (!db.SchemeMap.TryGetValue (format.Tag, out scheme))
continue;
format.Scheme = scheme;
}
CurrentSchemeVersion = db.Version;
}
public void SerializeScheme (Stream output)
{
var db = new SchemeDataBase {
Version = CurrentSchemeVersion,
SchemeMap = new Dictionary<string, ResourceScheme>()
};
foreach (var format in Formats)
{
var scheme = format.Scheme;
if (null != scheme)
db.SchemeMap[format.Tag] = scheme;
}
var bin = new BinaryFormatter();
bin.Serialize (output, db);
}
}
[Serializable]
public class SchemeDataBase
{
public int Version;
public Dictionary<string, ResourceScheme> SchemeMap;
} }
} }

View File

@ -82,6 +82,9 @@ namespace GameRes
/// <summary>Filename extensions peculiar to the resource.</summary> /// <summary>Filename extensions peculiar to the resource.</summary>
public IEnumerable<string> Extensions { get; protected set; } public IEnumerable<string> Extensions { get; protected set; }
/// <summary>Resource settings suitable for serialization.</summary>
public virtual ResourceScheme Scheme { get; set; }
/// <summary> /// <summary>
/// Create empty Entry that corresponds to implemented resource. /// Create empty Entry that corresponds to implemented resource.
/// </summary> /// </summary>
@ -139,6 +142,11 @@ namespace GameRes
{ {
} }
[Serializable]
public class ResourceScheme
{
}
public enum ArchiveOperation public enum ArchiveOperation
{ {
Abort, Abort,