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
//
// Copyright (C) 2014 by morkt
// Copyright (C) 2014-2015 by morkt
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
@ -23,15 +23,12 @@
using System;
using System.IO;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Threading;
using System.Reflection;
using System.Diagnostics;
using GARbro.GUI.Strings;
using GARbro.GUI.Properties;
using GameRes;
using GameRes.Compression;
namespace GARbro.GUI
{
@ -51,9 +48,9 @@ namespace GARbro.GUI
void ApplicationStartup (object sender, StartupEventArgs e)
{
string exe_dir = Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly().Location);
#if DEBUG
string trace_dir = Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly().Location);
Trace.Listeners.Add (new TextWriterTraceListener (Path.Combine (trace_dir, "trace.log")));
Trace.Listeners.Add (new TextWriterTraceListener (Path.Combine (exe_dir, "trace.log")));
Trace.AutoFlush = true;
#endif
Trace.WriteLine ("ApplicationStartup --------------------------------", "GARbro.GUI.App");
@ -80,11 +77,36 @@ namespace GARbro.GUI
if (string.IsNullOrEmpty (InitPath))
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)
{
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))]
public class DatOpener : ArchiveFormat
{
@ -177,19 +191,13 @@ namespace GameRes.Formats.AVC
return dir;
}
internal class Scheme
{
public string Password;
public int KeyOffset;
public int HeaderOffset;
};
internal static ArchiveScheme[] KnownSchemes = new ArchiveScheme[0];
}
private static readonly Scheme[] KnownSchemes = new Scheme[] {
new Scheme { Password="SETSUEI-", KeyOffset=0x08, HeaderOffset=0x10 }, // Setsuei
new Scheme { Password="CHOKOPAI", KeyOffset=0x35, HeaderOffset=0x51 }, // Chokotto*Vampire!
new Scheme { Password="ClOVeRrE", KeyOffset=0x11, HeaderOffset=0x46 }, // Clover Point
new Scheme { Password="-AYASEKE", KeyOffset=0x0c, HeaderOffset=0x15 }, // Ayase Ke no Onna
};
public override ResourceScheme Scheme
{
get { return new AvcScheme { KnownSchemes = AdvReader.KnownSchemes }; }
set { AdvReader.KnownSchemes = ((AvcScheme)value).KnownSchemes; }
}
}
}

View File

@ -323,12 +323,6 @@
<Name>GameRes</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\ShiinaRio4.jpg" />
<EmbeddedResource Include="Resources\ShiinaRio1.png" />
<EmbeddedResource Include="Resources\ShiinaRio2.png" />
<EmbeddedResource Include="Resources\ShiinaRio3.jpg" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
@ -336,9 +330,6 @@
<Generator>PublicSettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<EmbeddedResource Include="Resources\DecodeV1.bin" />
<EmbeddedResource Include="Resources\DecodeV241.bin" />
<EmbeddedResource Include="Resources\DecodeV249.bin" />
</ItemGroup>
<ItemGroup>
<Page Include="Amaterasu\CreateAMIWidget.xaml">
@ -441,9 +432,6 @@
</EmbeddedResource>
<EmbeddedResource Include="Strings\arcStrings.ru-RU.resx" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\ShiinaRio5.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<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 uint? Key { get; set; }
@ -62,7 +75,7 @@ namespace GameRes.Formats.CatSystem
if (!string.IsNullOrEmpty (Scheme))
{
IntOpener.KeyData keydata;
KeyData keydata;
if (IntOpener.KnownSchemes.TryGetValue (Scheme, out keydata))
return keydata.Key;
}
@ -298,18 +311,13 @@ namespace GameRes.Formats.CatSystem
return key;
}
public struct KeyData
{
public uint Key;
public string Passphrase;
}
public static Dictionary<string, KeyData> KnownSchemes = new Dictionary<string, KeyData>();
public static readonly Dictionary<string, KeyData> KnownSchemes = new Dictionary<string, KeyData> {
{ "Grisaia no Kajitsu", new KeyData { Key=0x1DAD9120, Passphrase="FW-6JD55162" }},
{ "Shukufuku no Campanella", new KeyData { Key=0x4260E643, Passphrase="CAMPANELLA" }},
{ "Makai Tenshi Djibril -Episode 4-", new KeyData { Key=0xA5A166AA, Passphrase="FW_MAKAI-TENSHI_DJIBRIL4" }},
{ "Sengoku Tenshi Djibril (trial)", new KeyData { Key=0xef870610, Passphrase="FW-8O9B6WDS" }},
};
public override ResourceScheme Scheme
{
get { return new IntScheme { KnownKeys = KnownSchemes }; }
set { KnownSchemes = ((IntScheme)value).KnownKeys; }
}
public override ResourceOptions GetDefaultOptions ()
{

View File

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

View File

@ -40,6 +40,7 @@ namespace GameRes.Formats.Dac
public uint Key2;
}
[Serializable]
public class DpkScheme
{
public uint Key1 { get; set; }
@ -48,6 +49,12 @@ namespace GameRes.Formats.Dac
public string OriginalTitle { get; set; }
}
[Serializable]
public class ArchiveScheme : ResourceScheme
{
public DpkScheme[] KnownSchemes;
}
internal class DpkEntry : Entry
{
public uint Hash;
@ -75,27 +82,7 @@ namespace GameRes.Formats.Dac
public override bool IsHierarchic { get { return true; } }
public override bool CanCreate { get { return false; } }
public static readonly DpkScheme[] KnownSchemes = new DpkScheme[]
{
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 static DpkScheme[] KnownSchemes = new DpkScheme[0];
public override ArcFile TryOpen (ArcView file)
{
@ -229,5 +216,22 @@ namespace GameRes.Formats.Dac
{
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))]
public class NoaOpener : ArchiveFormat
{
@ -73,30 +79,8 @@ namespace GameRes.Formats.Entis
Extensions = new string[] { "noa", "dat" };
}
public static readonly Dictionary<string, Dictionary<string, string>> KnownKeys =
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 static Dictionary<string, Dictionary<string, string>> KnownKeys =
new Dictionary<string, Dictionary<string, string>>();
public override ArcFile TryOpen (ArcView file)
{
@ -299,6 +283,12 @@ namespace GameRes.Formats.Entis
return true;
}
}
public override ResourceScheme Scheme
{
get { return new NoaScheme { KnownKeys = KnownKeys }; }
set { KnownKeys = ((NoaScheme)value).KnownKeys; }
}
}
internal abstract class ERISADecodeContext

View File

@ -4,7 +4,7 @@
xmlns:entis="clr-namespace:GameRes.Formats.Entis"
xmlns:p="clr-namespace:GameRes.Formats.Properties"
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}"
Width="200"/>
</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
{
@ -10,6 +13,8 @@ namespace GameRes.Formats.GUI
public WidgetNOA ()
{
InitializeComponent ();
var keys = new string[] { arcStrings.NOAIgnoreEncryption };
Scheme.ItemsSource = keys.Concat (NoaOpener.KnownKeys.Keys.OrderBy (x => x));
// select first scheme as default
if (-1 == Scheme.SelectedIndex)
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
{
public byte[] Secret;
@ -171,11 +177,11 @@ namespace GameRes.Formats.Ikura
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);
bool encoded = arc.File.View.AsciiEqual (entry.Offset+entry.Size-0x10, "SECRETFILTER100a");
uint entry_size = entry.Size;
var isf = arc as IsfArchive;
if (encoded)
{
entry_size -= 0x10;
@ -211,7 +217,7 @@ namespace GameRes.Formats.Ikura
public override ResourceOptions GetDefaultOptions ()
{
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]);
}
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] },
{ "Anata no Osanazuma", Encoding.ASCII.GetBytes("UOB0GMVM8K812GZP1VJCADNP2LX543R3BPOSMRU6BAKIVYB6W2JRRQFHN3YC5NSV5AITT6OXIDOW0YROTRT7MFJ45R1VYFF71MGI4XIOUZC511R0HAJC6WZU0EZEUUH0K7AT0U749KIOVLF5FA4C3BFXM2T4G8F57SW5EG64LU9GXRKZ2O0YGN7QA4QRUMALDFFJJ6NHLTVYYHKHRMWERQ8K782KITVCCH2G65C2WRQ85HINSMLHW06TIBADAGLEDK9YDARS47ET2A6JAF4I8WAW7K1FIXISKJKNNC0KP1MSO5Y6C2JBEFIA7G5NTECMXMNLYSTC0D9SF6VNXW7ALIGEBRJFDUGZE9FILWM4BMDY25N3YHKCAUBSBJBMMZX0T7XHAQHXUF3ZUROO5P6WGU2YU3RPICFVXGAA646TOTT2DEXK9RTXFQ8IE1BNC7ARDCW4TP2US01YN84ZV1FYWJ10HAJZUPKYQF7R5V654IEX39K6HC1Z32C3FZ6Q5NVNELWIJT9VG6QRK89FJLXLKUPFJL4GROK7TZQ7QHM6J3ZU9NU0B5GV8A9PXUFAO9KW80Q6WNABYMA1VVNC2J5GHHWNPQ9U7LK3TF0CMSYGAFYPGZLPXNPH3D41VL1A3NU6N6S3V9XXYFESEUCKYK0NAM1MBZ9BJ6AMQKKF25719V8RN54C1Q27LRI8SSK62RKSZ4VTYAE2J87LFAVI2U1V21YQ13ULOQW86PH9RDUEVA7UEJ6JTU7X1GJYNC1VR66F2EAC3TFGC4AKOVAZW137EW0V6AAU201X7ND3YTUNX2QBR24DXXC1BWTEZUXVTXNB63W5RD9GIQV9IP6CDDPAEW2IGADTKBW7DPANCAOBU18Z84PHLF6EQ2H7S7A2DHC75Q1AX4NSN7JQNGJGXHTAOBHI5DDMME5ZQPT856DEIMM6VM8XI8WE4E4JKYMY5W7ABEH82LSRX4GKFAYNHLUSBT4C0A215KZTVX1K49EHAO8O7YJCUS8YVVU2B3XG8QOBQMUJBJ3IH1XWH6FM29OLYS9DHMZ83PJVRM0M7JH7RAQDV9DS4FJ2IF27CCVZZBVX18AHEQDI8486Y3NETMBG3LBF41FTGMVXNC7R914HXOHFQYQ4EDUKJ4VJJWGIE63H12VG3361832LZO6KFAHMEFPZK6BAJ643VJWZT4Z4QS3JAUM5P5394MS2GDVP9IJ727D6831GDB9NYONACW2ITF51S2LTUQ05XJ18WJUSABOJ51W9QODRH9R1D1CZB175ZEWTAIZRLIGFSVFCIHNBUJB0Z5LWDTNGW5505H1K8CROH1YGNFC4CW760NK9TWIWX9M6QFLZZKFCSP7RCEJ5DT854MJ6T55ODQ98NQB5MKFQYXM44D5ZYX0RMHPWKTHJVUEFA9WBQVLLZT0DR7P4XXQPQTMU0CC9C3VFYI0L5390P887CXEFY5MJYBGUUWLK123ANOE220DLPK5B7SU6GMXR3UV6K931FJ0I6JVLWLBADZO6Z381MZXR8E2IFVS4AH0Z5N72DV3GV9QAMDB5EJYUQ6RVHTN9OY50W378H67U4SAY9AAXM9C67I7SKWLQW7W9MOSQIUMNVNCGEN0CRRIXMV62AGPRLNBU8VT41HYGMNXZTHQO6CU15X121MYGOTZAFR8WVT98M33KJVBOZXRI9FMG03HUAF0IQ4ZF6P5EZ4X6V45E14R4RDBA59DVWD2UED1ZB6SRJDKREO4F05CMOV1465RCANAZHLHR0FVHV86126OODW2MB67UNGS1GGD3UHBV7TL8GRWQZBTHCZHQBPUSUJPKO5LQ4HM95UOZGL0FL30LXL6CK2FOTEQIK6PTNMJVE5G7U3PONIA6WMSV7YZLHO4CZ8ZPOL7JRJOOD79U5T7RVKYJQB54GR5E23964QRYA1POKM19EEWC6MFIU5Y75J5Y9QXER3HQFQEURNB7XTYAZMWWJO25SPI7AAVX3BKERW6817IQMRKD533O6ANRDIL840HSGRAG9ZX9AX1XK1DRE6URAGE5NWT0") },
{ "Kohitsuji-tachi no Rakuen", Encoding.ASCII.GetBytes("UOB0GMVM8K812GZP1VJCADNP2LX543R3BPOSMRU6BAKIVYB6W2JRRQFHN3YC5NSV5AITT6OXIDOW0YROTRT7MFJ45R1VYFF71MGI4XIOUZC511R0HAJC6WZU0EZEUUH0K7AT0U749KIOVLF5FA4C3BFXM2T4G8F57SW5EG64LU9GXRKZ2O0YGN7QA4QRUMALDFFJJ6NHLTVYYHKHRMWERQ8K782KITVCCH2G65C2WRQ85HINSMLHW06TIBADAGLEDK9YDARS47ET2A6JAF4I8WAW7K1FIXISKJKNNC0KP1MSO5Y6C2JBEFIA7G5NTECMXMNLYSTC0D9SF6VNXW7ALIGEBRJFDUGZE9FILWM4BMDY25N3YHKCAUBSBJBMMZX0T7XHAQHXUF3ZUROO5P6WGU2YU3RPICFVXGAA646TOTT2DEXK9RTXFQ8IE1BNC7ARDCW4TP2US01YN84ZV1FYWJ10HAJZUPKYQF7R5V654IEX39K6HC1Z32C3FZ6Q5NVNELWIJT9VG6QRK89FJLXLKUPFJL4GROK7TZQ7QHM6J3ZU9NU0B5GV8A9PXUFAO9KW80Q6WNABYMA1VVNC2J5GHHWNPQ9U7LK3TF0CMSYGAFYPGZLPXNPH3D41VL1A3NU6N6S3V9XXYFESEUCKYK0NAM1MBZ9BJ6AMQKKF25719V8RN54C1Q27LRI8SSK62RKSZ4VTYAE2J87LFAVI2U1V21YQ13ULOQW86PH9RDUEVA7UEJ6JTU7X1GJYNC1VR66F2EAC3TFGC4AKOVAZW137EW0V6AAU201X7ND3YTUNX2QBR24DXXC1BWTEZUXVTXNB63W5RD9GIQV9IP6CDDPAEW2IGADTKBW7DPANCAOBU18Z84PHLF6EQ2H7S7A2DHC75Q1AX4NSN7JQNGJGXHTAOBHI5DDMME5ZQPT856DEIMM6VM8XI8WE4E4JKYMY5W7ABEH82LSRX4GKFAYNHLUSBT4C0A215KZTVX1K49EHAO8O7YJCUS8YVVU2B3XG8QOBWX2M9EU89MDEKNJM6CZZOTMX6W2Z80U2YOMI98N2N48BFS9KYULOD622RBHZ6MWRH6MR27KWXBTG0LLXZC5URNW4LXA1M9O1SLX2T3J7V5H6HUIYNVOO77EF06EIGC3HCYO962958KT0INSLCHGOQ7NX9E116QSFI6ADEQ7KVCMMCMYHK0ZESHJAPTQERP8RT6FK73NVN62UQPDURB6LD7PSON8GPXL2QN45XJL9DOKOYB4MG23520LELWMA4IWMZEZEU0Z833SR1YZG2F0BBBV3MP6F4HB0JNCMRC6WINVVTJ19JC1RM9500IOB52ALK78X4JSOTVW0NZC84TOE7YM6GIVFJ89TIDEHSHWKYAH8TH8TKOCLE7BUQAZ5W51R1E5EQMHZYZGB8IR7I5KZENM6EEJBYWGZTJ7XFS9YV2X8FTQ9PD5FYBO41C7XX0ANKTHHU9P6TGA0COPGVF4XBNB79K34NFXL0A8NIN63X07XKO1YR8XN9JAMPCG9CHPBYVX5J1OOCIMC6VWM5P5U68083XXSXWLY7DDVHV4MAMRTQP7VWMS1VDRJ2ECBPTFBMINVH14AYX61F1NWVLZTR2JQFTVNMSSV1X3B6T3NLWNXV3RFWA9YRS6NW4ZQ3S3PD6BKSV7EJX8F9KQXY5DECF8QA5CO26HLJOA50BIS2BBRDHPJYKE8G845HNZO1PW0KT5Q3NPUJAJ8FCFYWVOONZYO9A662K1ZETE4URC6BWSC81KLTAS6YPPSLMIROBGA2USAJXS1U8BQ3UHKPXN9YY1LD3R3YZEANZDD2X3DK6K7VFEKORGMSNHTK544IYX288GPSU6SXKBPYW70USN614AX5ZYTJ0WCXFNOK7OJF3LD9ROVBTZXX2KY5UZFODYFWETXXY3IMHRF8YCWAKG25N3OMS585NHECT47RGL937FBURHFXQEWXEIGOVOSPUPXG91FLE80ERFMLW7GHTEY1A9CDX5QMFJBHB9OHZSN7H03JJBN8CAVRMG1VTDVO6SL") },
{ "Natsu no Hitoshizuku", Encoding.ASCII.GetBytes("UOB0GMVM8K812GZP1VJCADNP2LX543R3BPOSMRU6BAKIVYB6W2JRRQFHN3YC5NSV5AITT6OXIDOW0YROTRT7MFJ45R1VYFF71MGI4XIOUZC511R0HAJC6WZU0EZEUUH0K7AT0U749KIOVLF5FA4C3BFXM2T4G8F57SW5EG64LU9GXRKZ2O0YGN7QA4QRUMALDFFJJ6NHLTVYYHKHRMWERQ8K782KITVCCH2G65C2WRQ85HINSMLHW06TIBADAGLEDK9YDARS47ET2A6JAF4I8WAW7K1FIXISKJKNNC0KP1MSO5Y6C2JBEFIA7G5NTECMXMNLYSTC0D9SF6VNXW7ALIGEBRJFDUGZE9FILWM4BMDY25N3YHKCAUBSBJBMMZX0T7XHAQHXUF3ZUROO5P6WGU2YU3RPICFVXGAA646TOTT2DEXK9RTXFQ8IE1BNC7ARDCW4TP2US01YN84ZV1FYWJ10HAJZUPKYQF7R5V654IEX39K6HC1Z32C3FZ6Q5NVNELWIJT9VG6QRK89FJLXLKUPFJL4GROK7TZQ7QHM6J3ZU9NU0B5GV8A9PXUFAO9KW80Q6WNABYMA1VVNC2J5GHHWNPQ9U7LK3TF0CMSYGAFYPGZLPXNPH3D41VL1A3NU6N6S3V9XXYFESEUCKYK0NAM1MBZ9BJ6AMQKKF25719V8RN54C1Q27LRI8SSK62RKSZ4VTYAE2J87LFAVI2U1V21YQ13ULOQW86PH9RDUEVA7UEJ6JTU7X1GJYNC1VR66F2EAC3TFGC4AKOVAZW137EW0V6AAU201X7ND3YTUNX2QBR24DXXC1BWTEZUXVTXNB63W5RD9GIQV9IP6CDDPAEW2IGADTKBW7DPANCAOBU18Z84PHLF6EQ2H7S7A2DHC75Q1AX4NSN7JQNGJGXHTAOBHI5DDMME5ZQPT856DEIMM6VM8XI8WE4E4JKYMY5W7ABEH82LSRX4GKFAYNHLUSBT4C0A215KZTVX1K49EHAO8O7YJCUS8YVVU2B3XG8QOBM6XHYQDK2X06ZJTDP4IN5K6GU2NKNS0CK9C2A21LZ1288LBBSEEHQ45NO1585NGFB91OSXUZYE7IBBC6L014RMNBWDZH755CN1PJ3UG8UKZK1KJBCF5LHHMXCSC0TILZBP6F453SHE5DK0637FNELXL0S8I6DTV6VQFM9YO6KZMIJ27WA2LM5ZV1W00PPVRVUSLYA4SYQRH0YY95HQ8UOEBM7LF00AQZOVYSGDNOICWI9OLBQZX61SHB7VLYXFUIZEW8GYPZLBVW15T1VB7BCJC5DL1UR71H5FDXTORFG62M3GFEB9RAWJHNS23V1E7U4ASMGZRS8603KFRDXYFY8YPLT1S8JWWQPW6J1VYPRKZBL0YE5J8J1EGCJRX26HP8UOMNRXUW3EWLO4L3D3CS9BIMWH4WMHYHEADJ8HM661ZNOGW4WX1070E9VO3QXXON5OT9JQ4BX6HVUFO5YMS1NG9195O8JOLWQ2IE4JR42OV4UBHVN199QIWSSYZHDE0GR043ROOGBTTQR5G11D6JZRSD3G66OHYMO9K1SKP8810P1QGF20KDDL0QPALG451MXXTETJ9CC5HFMNYUJPFN94CS2DR2TDNTSC2WYLGR068XRA238G2WFC8HJVD99VOJF5NUML0GJGKP6RL2TJW50ZRUDA7TD9S50B1ZQ5DF5MUTY11MTHHYNHOWRD92ES84IZWNKMLQZKNTMTFQQ6IDA6COQ5OT4MYTUN0OT8FG1GPV3LLCXQV2C4UBAYRHMMLRW3CHKX8O8RUKPNXGOJM5M5VVAEWYGFBGCDZZCE0LG83361H26AXBBWTKKCRNJJ3FVS8L17JADWO5NM17JY5S0SOJRY2K76G8ZZHAYN31P0WZNZY0QSSBS041IOR78BNH6SCMVTP1Y79D5JAKOCH51IIAC9WLQRHTRFJLUJ1JMCELHHQ16D23L2TKMOPAA4KV1CXSHHEV2K5HFRNKZ0IIP6O7P8KEUP0D68MBO2TBIAGE542EOMX807FJSH1JTOP1") },
};
get { return new IsfScheme { KnownSecrets = KnownSecrets }; }
set { KnownSecrets = ((IsfScheme)value).KnownSecrets; }
}
}
internal class IsfDecoder

View File

@ -1,10 +1,9 @@
<StackPanel x:Class="GameRes.Formats.GUI.WidgetISF"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fmt="clr-namespace:GameRes.Formats.Ikura"
xmlns:p="clr-namespace:GameRes.Formats.Properties"
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}"
Width="200" Grid.Row="0"/>
</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
{
@ -10,8 +13,10 @@ namespace GameRes.Formats.GUI
public WidgetISF ()
{
InitializeComponent ();
var keys = new string[] { arcStrings.ISFIgnoreEncryption};
Scheme.ItemsSource = keys.Concat (MpxOpener.KnownSecrets.Keys.OrderBy (x => x));
if (-1 == Scheme.SelectedIndex)
Scheme.SelectedIndex = 0;
}
}
}
}

View File

@ -69,6 +69,12 @@ namespace GameRes.Formats.KiriKiri
public bool RetainDirs { get; set; }
}
[Serializable]
public class Xp3Scheme : ResourceScheme
{
public Dictionary<string, ICrypt> KnownSchemes;
}
// Archive version 1: encrypt file first, then calculate checksum
// version 2: calculate checksum, then encrypt
@ -86,27 +92,17 @@ namespace GameRes.Formats.KiriKiri
Signatures = new uint[] { 0x0d335058, 0 };
}
public override ResourceScheme Scheme
{
get { return new Xp3Scheme { KnownSchemes = KnownSchemes }; }
set { KnownSchemes = ((Xp3Scheme)value).KnownSchemes; }
}
public bool ForceEncryptionQuery = true;
private static readonly ICrypt NoCryptAlgorithm = new NoCrypt();
public static readonly 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 static Dictionary<string, ICrypt> KnownSchemes = new Dictionary<string, ICrypt>();
public override ArcFile TryOpen (ArcView file)
{
@ -756,6 +752,7 @@ NextEntry:
#endregion
}
[Serializable]
public abstract class ICrypt
{
/// <summary>
@ -778,6 +775,7 @@ NextEntry:
}
}
[Serializable]
public class NoCrypt : ICrypt
{
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; } }
@ -830,7 +829,8 @@ NextEntry:
}
}
internal class HashCrypt : ICrypt
[Serializable]
public class HashCrypt : ICrypt
{
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;
@ -886,7 +887,8 @@ NextEntry:
}
}
internal class SwanSongCrypt : ICrypt
[Serializable]
public class SwanSongCrypt : ICrypt
{
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)
{
@ -1001,7 +1004,8 @@ NextEntry:
}
}
internal class OkibaCrypt : ICrypt
[Serializable]
public class OkibaCrypt : ICrypt
{
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)
{
@ -1098,7 +1103,8 @@ NextEntry:
}
}
internal class DameganeCrypt : ICrypt
[Serializable]
public class DameganeCrypt : ICrypt
{
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_offset;
protected byte[] PrologOrder { get; set; }
protected byte[] OddBranchOrder { get; set; }
protected byte[] EvenBranchOrder { get; set; }
protected byte[] PrologOrder;
protected byte[] OddBranchOrder;
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_offset = offset;
m_mask = scheme.Mask;
m_offset = scheme.Offset;
PrologOrder = new byte[] { 0, 1, 2 };
OddBranchOrder = new byte[] { 0, 1, 2, 3, 4, 5 };
EvenBranchOrder = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
PrologOrder = scheme.PrologOrder;
OddBranchOrder = scheme.OddBranchOrder;
EvenBranchOrder = scheme.EvenBranchOrder;
ControlBlock = scheme.ControlBlock;
}
uint GetBaseOffset (uint hash)
@ -122,8 +141,6 @@ namespace GameRes.Formats.KiriKiri
Decrypt (entry, offset, values, pos, count);
}
CxProgram[] m_program_list = new CxProgram[0x80];
Tuple<uint, uint> ExecuteXCode (uint hash)
{
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

View File

@ -4,6 +4,6 @@
xmlns:fmt="clr-namespace:GameRes.Formats.KiriKiri"
xmlns:p="clr-namespace:GameRes.Formats.Properties"
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"/>
</Grid>

View File

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

View File

@ -54,6 +54,7 @@ namespace GameRes.Formats.Lucifen
}
}
[Serializable]
public class EncryptionScheme
{
public LpkOpener.Key BaseKey;
@ -62,6 +63,13 @@ namespace GameRes.Formats.Lucifen
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
{
public string Scheme;
@ -88,6 +96,7 @@ namespace GameRes.Formats.Lucifen
public override bool IsHierarchic { get { return false; } }
public override bool CanCreate { get { return false; } }
[Serializable]
public class Key
{
public uint Key1, Key2;
@ -102,63 +111,12 @@ namespace GameRes.Formats.Lucifen
BaseKey = new Key (0xA5B9AC6B, 0x9A639DE5), ContentXor = 0x5d, RotatePattern = 0x31746285,
ImportGameInit = true
};
public static readonly Dictionary<string, EncryptionScheme> KnownSchemes =
new Dictionary<string, EncryptionScheme> {
{ "Default", DefaultScheme },
{ "Terios games", new EncryptionScheme {
BaseKey = new Key (0x39A5B67D, 0xD63AB5E9), ContentXor = 0xa6, RotatePattern = 0x36147352,
ImportGameInit = false } },
};
public static Dictionary<string, EncryptionScheme> KnownSchemes = new Dictionary<string, EncryptionScheme>();
static Dictionary<string, Dictionary<string, Key>> KnownKeys = new Dictionary<string, Dictionary<string, Key>>();
EncryptionScheme CurrentScheme = KnownSchemes["Default"];
EncryptionScheme CurrentScheme = DefaultScheme;
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)
{
string name = Path.GetFileName (file.Name).ToUpperInvariant();
@ -411,6 +369,22 @@ namespace GameRes.Formats.Lucifen
}
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

View File

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

View File

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

View File

@ -9,7 +9,7 @@
<RowDefinition/>
</Grid.RowDefinitions>
<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"
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"

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
{
@ -10,6 +14,10 @@ namespace GameRes.Formats.GUI
public WidgetMBL ()
{
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; }
}
[Serializable]
public class NsaScheme : ResourceScheme
{
public Dictionary<string, string> KnownKeys;
}
public enum Compression
{
Unknown = 256,
@ -70,19 +76,19 @@ namespace GameRes.Formats.NScripter
{
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 ()
{
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)
{
List<Entry> dir = null;

View File

@ -41,26 +41,48 @@ namespace GameRes.Formats.NitroPlus
{
public byte[] RawName;
public int FolderId;
public byte[] Order;
}
internal class NpaArchive : ArcFile
{
public NpaTitleId GameId { get; private set; }
public int Key { get; private set; }
public byte[] KeyTable { get { return m_key_table.Value; } }
public EncryptionScheme Scheme { get; private set; }
public int Key { get; private set; }
public byte[] KeyTable { get { return m_key_table.Value; } }
private Lazy<byte[]> m_key_table;
public NpaArchive (ArcView arc, ArchiveFormat impl, ICollection<Entry> dir,
NpaTitleId game_id, int key)
EncryptionScheme scheme, int key)
: base (arc, impl, dir)
{
GameId = game_id;
Scheme = scheme;
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
{
NotEncrypted,
@ -71,7 +93,7 @@ namespace GameRes.Formats.NitroPlus
public class NpaOptions : ResourceOptions
{
public NpaTitleId TitleId { get; set; }
public EncryptionScheme Scheme { get; set; }
public bool CompressContents { get; set; }
public int Key1 { 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 CanCreate { get { return true; } }
/// <summary>
/// Known encryption schemes.
/// Order should match NpaTitleId enumeration.
/// </summary>
public static readonly string[] KnownSchemes = new string[] {
arcStrings.ArcNoEncryption,
"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 static Dictionary<string, EncryptionScheme> KnownSchemes = new Dictionary<string, EncryptionScheme>();
public override ResourceScheme Scheme
{
get { return new NpaScheme { KnownSchemes = KnownSchemes }; }
set { KnownSchemes = ((NpaScheme)value).KnownSchemes; }
}
public const int DefaultKey1 = 0x4147414e;
public const int DefaultKey2 = 0x21214f54;
@ -118,9 +134,13 @@ namespace GameRes.Formats.NitroPlus
if (dir_size >= file.MaxOffset)
return null;
EncryptionScheme enc = null;
var game_id = NpaTitleId.NotEncrypted;
if (encrypted)
game_id = QueryGameEncryption();
{
enc = QueryGameEncryption();
game_id = enc.TitleId;
}
int key = GetArchiveKey (game_id, key1, key2);
@ -161,8 +181,8 @@ namespace GameRes.Formats.NitroPlus
}
cur_offset += 4 + name_size + 17;
}
if (game_id != NpaTitleId.NotEncrypted)
return new NpaArchive (file, this, dir, game_id, key);
if (enc != null)
return new NpaArchive (file, this, dir, enc, key);
else
return new ArcFile (file, this, dir);
}
@ -194,8 +214,8 @@ namespace GameRes.Formats.NitroPlus
entry.Offset = data_offset;
entry.UnpackedSize = (uint)size;
Stream destination = output;
if (NpaTitleId.NotEncrypted != npa_options.TitleId)
destination = new EncryptedStream (output, entry, npa_options.TitleId, index.Key);
if (null != npa_options.Scheme)
destination = new EncryptedStream (output, entry, npa_options.Scheme, index.Key);
try
{
if (entry.IsPacked)
@ -234,7 +254,7 @@ namespace GameRes.Formats.NitroPlus
header.Write (npa_options.Key1);
header.Write (npa_options.Key2);
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.FolderCount);
header.Write (index.FileCount);
@ -300,34 +320,16 @@ namespace GameRes.Formats.NitroPlus
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;
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;
}
int key = (int)scheme.NameKey;
var name = entry.RawName;
for (int i = 0; i < name.Length; ++i)
key -= name[i];
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 *= (int)entry.UnpackedSize;
@ -335,13 +337,9 @@ namespace GameRes.Formats.NitroPlus
return (byte)key;
}
public static byte[] GenerateKeyTable (NpaTitleId title_id)
public static byte[] GenerateKeyTable (EncryptionScheme scheme)
{
int index = (int)title_id;
if (index < 0 || index >= OrderTable.Length)
throw new ArgumentOutOfRangeException ("title_id", "Invalid title id specified");
byte[] order = OrderTable[index];
byte[] order = scheme.Order;
if (null == order)
throw new ArgumentException ("Encryption key table not defined", "title_id");
@ -363,7 +361,7 @@ namespace GameRes.Formats.NitroPlus
table[ecx] = table[edx];
table[edx] = tmp;
}
if (NpaTitleId.TOTONO == title_id)
if (NpaTitleId.TOTONO == scheme.TitleId)
{
var totono_table = new byte[256];
for (int i = 0; i < 256; ++i)
@ -381,7 +379,7 @@ namespace GameRes.Formats.NitroPlus
public override ResourceOptions GetDefaultOptions ()
{
return new NpaOptions {
TitleId = GetTitleId (Settings.Default.NPAScheme),
Scheme = GetScheme (Settings.Default.NPAScheme),
CompressContents = Settings.Default.NPACompressContents,
Key1 = (int)Settings.Default.NPAKey1,
Key2 = (int)Settings.Default.NPAKey2,
@ -398,21 +396,25 @@ namespace GameRes.Formats.NitroPlus
return new GUI.CreateNPAWidget();
}
NpaTitleId QueryGameEncryption ()
EncryptionScheme QueryGameEncryption ()
{
var options = Query<NpaOptions> (arcStrings.ArcEncryptedNotice);
return options.TitleId;
return options.Scheme;
}
public static NpaTitleId GetTitleId (string title)
{
Debug.Assert (KnownSchemes.Length == OrderTable.Length,
"Number of known encryptions schemes does not match available order tables.");
var index = Array.IndexOf (KnownSchemes, title);
if (index != -1)
return (NpaTitleId)index;
var scheme = GetScheme (title);
return scheme != null ? scheme.TitleId : NpaTitleId.NotEncrypted;
}
public static EncryptionScheme GetScheme (string title)
{
EncryptionScheme scheme;
if (KnownSchemes.TryGetValue (title, out scheme))
return scheme;
else
return NpaTitleId.NotEncrypted;
return null;
}
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,
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>
@ -512,7 +460,8 @@ namespace GameRes.Formats.NitroPlus
public Indexer (IEnumerable<Entry> source_list, NpaOptions options)
{
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)
{
@ -610,32 +559,32 @@ namespace GameRes.Formats.NitroPlus
public EncryptedStream (NpaArchive arc, NpaEntry entry)
{
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)
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_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;
}
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_encrypted_length = GetEncryptedLength (entry, game_id);
int key = NpaOpener.GetKeyFromEntry (entry, game_id, arc_key);
m_encrypted_length = GetEncryptedLength (entry, scheme.TitleId);
int key = NpaOpener.GetKeyFromEntry (entry, scheme, arc_key);
m_stream = output;
m_encrypted = new Lazy<byte[]> (() => new byte[m_encrypted_length]);
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];
for (int i = 0; i < 256; ++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];
}

View File

@ -1,10 +1,9 @@
<Grid x:Class="GameRes.Formats.GUI.WidgetNPA"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fmt="clr-namespace:GameRes.Formats.NitroPlus"
xmlns:p="clr-namespace:GameRes.Formats.Properties"
MaxWidth="250">
<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}"/>
</Grid>

View File

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

View File

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

View File

@ -4,7 +4,6 @@
xmlns:s="clr-namespace:GameRes.Formats.Strings"
xmlns:p="clr-namespace:GameRes.Formats.Properties"
xmlns:fmt="clr-namespace:GameRes.Formats.Selene"
xmlns:local="clr-namespace:GameRes.Formats.GUI"
MaxWidth="260">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
@ -22,6 +21,6 @@
<Label Content="{x:Static s:arcStrings.LabelScheme}" Target="{Binding ElementName=EncScheme}"
Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right"/>
<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}" />
</Grid>

View File

@ -1,7 +1,9 @@
using System.Windows;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using GameRes.Formats.Properties;
using GameRes.Formats.Selene;
using GameRes.Formats.Strings;
namespace GameRes.Formats.GUI
{
@ -13,7 +15,9 @@ namespace GameRes.Formats.GUI
public WidgetKCAP ()
{
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.SelectionChanged += OnSchemeChanged;
}

View File

@ -60,6 +60,12 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
}
}
[Serializable]
public class WarcScheme : ResourceScheme
{
public EncryptionScheme[] KnownSchemes;
}
[Export(typeof(ArchiveFormat))]
public class WarOpener : ArchiveFormat
{
@ -69,6 +75,12 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
public override bool IsHierarchic { 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)
{
if (!file.View.AsciiEqual (4, " 1."))
@ -542,64 +554,8 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
}
}
internal class CachedResource
{
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
[Serializable]
public class EncryptionScheme
{
public string Name { get; set; }
public string OriginalTitle { get; set; }
@ -611,59 +567,6 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
public byte[] Region;
public byte[] DecodeBin;
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
@ -1246,71 +1149,6 @@ namespace GameRes.Formats.ShiinaRio // 椎名里緒
return (uint)((m_scheme.EntryNameSize + 0x18) * max_index_entries);
}
public static EncryptionScheme[] KnownSchemes = new EncryptionScheme[]
{
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"),
};
public static EncryptionScheme[] KnownSchemes = new EncryptionScheme[0];
}
}

View File

@ -30,6 +30,7 @@ using System.ComponentModel.Composition.Hosting;
using System.IO;
using System.Linq;
using GameRes.Collections;
using System.Runtime.Serialization.Formatters.Binary;
namespace GameRes
{
@ -59,6 +60,17 @@ namespace GameRes
public IEnumerable<AudioFormat> AudioFormats { get { return m_audio_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 event ParametersRequestEventHandler ParametersRequest;
@ -173,5 +185,46 @@ namespace GameRes
signature |= (uint)file.ReadByte() << 24;
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>
public IEnumerable<string> Extensions { get; protected set; }
/// <summary>Resource settings suitable for serialization.</summary>
public virtual ResourceScheme Scheme { get; set; }
/// <summary>
/// Create empty Entry that corresponds to implemented resource.
/// </summary>
@ -139,6 +142,11 @@ namespace GameRes
{
}
[Serializable]
public class ResourceScheme
{
}
public enum ArchiveOperation
{
Abort,