internal static DatabaseInfo ParseHeader(SpanStream io, byte[] compositeKey) { var header = io.Read <Header>(); if (header.Signature1 != Magic1) { throw MakeInvalidFormatError($"primary file signature is invalid: {header.Signature1:x8}"); } if (!Magic2.Contains(header.Signature2)) { throw MakeInvalidFormatError($"secondary file signature is invalid: {header.Signature2:x8}"); } if (header.MajorVersion != Version4) { throw MakeUnsupportedError($"Version {header.MajorVersion}.{header.MinorVersion}"); } var info = ReadEncryptionInfo(ref io); var headerSize = io.Position; io.Rewind(); var headerBytes = io.ReadBytes(headerSize); var computedHash = Crypto.Sha256(headerBytes); var storedHash = io.ReadBytes(32); if (!Crypto.AreEqual(storedHash, computedHash)) { throw MakeInvalidFormatError("Header hash doesn't match"); } var storedHeaderMac = io.ReadBytes(32); var derivedKey = DeriveMasterKey(compositeKey, info.Kdf); var(encryptionKey, hmacKey) = Util.DeriveDatabaseKeys(derivedKey, info.Seed); var blockHmacKey = Util.ComputeBlockHmacKey(hmacKey, ulong.MaxValue); var computedHeaderMac = Crypto.HmacSha256(blockHmacKey, headerBytes); if (!Crypto.AreEqual(storedHeaderMac, computedHeaderMac)) { throw MakeInvalidFormatError("Header MAC doesn't match"); } return(new DatabaseInfo(headerSize: io.Position, isCompressed: info.IsCompressed, cipher: info.Cipher, encryptionKey: encryptionKey, iv: info.Iv, hmacKey: hmacKey)); }
private static void LoadGameLibraries() { Count = MapLibs.Length + Monsters.Length + Gates.Length + NPCs.Length + CArmours.Length + CHair.Length + CWeapons.Length + CWeaponEffect.Length + AArmours.Length + AHair.Length + AWeaponsL.Length + AWeaponsR.Length + ARArmours.Length + ARHair.Length + ARWeapons.Length + ARWeaponsS.Length + CHumEffect.Length + AHumEffect.Length + ARHumEffect.Length + Mounts.Length + Fishing.Length + Pets.Length + Transform.Length + TransformMounts.Length + TransformEffect.Length + TransformWeaponEffect.Length + 17; Dragon.Initialize(); Progress++; BuffIcon.Initialize(); Progress++; Help.Initialize(); Progress++; MiniMap.Initialize(); Progress++; MagIcon.Initialize(); Progress++; MagIcon2.Initialize(); Progress++; Magic.Initialize(); Progress++; Magic2.Initialize(); Progress++; Magic3.Initialize(); Progress++; MagicC.Initialize(); Progress++; Effect.Initialize(); Progress++; GuildSkill.Initialize(); Progress++; Background.Initialize(); Progress++; Deco.Initialize(); Progress++; Items.Initialize(); Progress++; StateItems.Initialize(); Progress++; FloorItems.Initialize(); Progress++; for (int i = 0; i < MapLibs.Length; i++) { if (MapLibs[i] == null) { MapLibs[i] = new MLibrary(""); } else { MapLibs[i].Initialize(); } Progress++; } for (int i = 0; i < Monsters.Length; i++) { Monsters[i].Initialize(); Progress++; } for (int i = 0; i < Gates.Length; i++) { Gates[i].Initialize(); Progress++; } for (int i = 0; i < NPCs.Length; i++) { NPCs[i].Initialize(); Progress++; } for (int i = 0; i < CArmours.Length; i++) { CArmours[i].Initialize(); Progress++; } for (int i = 0; i < CHair.Length; i++) { CHair[i].Initialize(); Progress++; } for (int i = 0; i < CWeapons.Length; i++) { CWeapons[i].Initialize(); Progress++; } for (int i = 0; i < CWeaponEffect.Length; i++) { CWeaponEffect[i].Initialize(); Progress++; } for (int i = 0; i < AArmours.Length; i++) { AArmours[i].Initialize(); Progress++; } for (int i = 0; i < AHair.Length; i++) { AHair[i].Initialize(); Progress++; } for (int i = 0; i < AWeaponsL.Length; i++) { AWeaponsL[i].Initialize(); Progress++; } for (int i = 0; i < AWeaponsR.Length; i++) { AWeaponsR[i].Initialize(); Progress++; } for (int i = 0; i < ARArmours.Length; i++) { ARArmours[i].Initialize(); Progress++; } for (int i = 0; i < ARHair.Length; i++) { ARHair[i].Initialize(); Progress++; } for (int i = 0; i < ARWeapons.Length; i++) { ARWeapons[i].Initialize(); Progress++; } for (int i = 0; i < ARWeaponsS.Length; i++) { ARWeaponsS[i].Initialize(); Progress++; } for (int i = 0; i < CHumEffect.Length; i++) { CHumEffect[i].Initialize(); Progress++; } for (int i = 0; i < AHumEffect.Length; i++) { AHumEffect[i].Initialize(); Progress++; } for (int i = 0; i < ARHumEffect.Length; i++) { ARHumEffect[i].Initialize(); Progress++; } for (int i = 0; i < Mounts.Length; i++) { Mounts[i].Initialize(); Progress++; } for (int i = 0; i < Fishing.Length; i++) { Fishing[i].Initialize(); Progress++; } for (int i = 0; i < Pets.Length; i++) { Pets[i].Initialize(); Progress++; } for (int i = 0; i < Transform.Length; i++) { Transform[i].Initialize(); Progress++; } for (int i = 0; i < TransformEffect.Length; i++) { TransformEffect[i].Initialize(); Progress++; } for (int i = 0; i < TransformWeaponEffect.Length; i++) { TransformWeaponEffect[i].Initialize(); Progress++; } for (int i = 0; i < TransformMounts.Length; i++) { TransformMounts[i].Initialize(); Progress++; } Loaded = true; }
static void LoadLibraries() { Count = MapLibs.Length + Monsters.Length + NPCs.Length + CArmours.Length + CHair.Length + CWeapons.Length + AArmours.Length + AHair.Length + AWeaponsL.Length + AWeaponsR.Length + ARArmours.Length + ARHair.Length + ARWeapons.Length + ARWeaponsS.Length + CHumEffect.Length + AHumEffect.Length + ARHumEffect.Length + Mounts.Length + Fishing.Length + Pets.Length + 20; Dragon.Initialize(); Progress++; ChrSel.Initialize(); Progress++; Prguse.Initialize(); Progress++; Prguse2.Initialize(); Progress++; BuffIcon.Initialize(); Progress++; Help.Initialize(); Progress++; MiniMap.Initialize(); Progress++; MagIcon.Initialize(); Progress++; MagIcon2.Initialize(); Progress++; Magic.Initialize(); Progress++; Magic2.Initialize(); Progress++; Magic3.Initialize(); Progress++; MagicC.Initialize(); Progress++; Effect.Initialize(); Progress++; CustomEffects.Initialize(); Progress++; Items.Initialize(); Progress++; StateItems.Initialize(); Progress++; FloorItems.Initialize(); Progress++; for (int i = 0; i < MapLibs.Length; i++) { if (MapLibs[i] == null) { MapLibs[i] = new MLibrary(""); } else { MapLibs[i].Initialize(); } Progress++; } for (int i = 0; i < Monsters.Length; i++) { Monsters[i].Initialize(); Progress++; } for (int i = 0; i < NPCs.Length; i++) { NPCs[i].Initialize(); Progress++; } for (int i = 0; i < CArmours.Length; i++) { CArmours[i].Initialize(); Progress++; } for (int i = 0; i < CHair.Length; i++) { CHair[i].Initialize(); Progress++; } for (int i = 0; i < CWeapons.Length; i++) { CWeapons[i].Initialize(); Progress++; } for (int i = 0; i < AArmours.Length; i++) { AArmours[i].Initialize(); Progress++; } for (int i = 0; i < AHair.Length; i++) { AHair[i].Initialize(); Progress++; } for (int i = 0; i < AWeaponsL.Length; i++) { AWeaponsL[i].Initialize(); Progress++; } for (int i = 0; i < AWeaponsR.Length; i++) { AWeaponsR[i].Initialize(); Progress++; } for (int i = 0; i < ARArmours.Length; i++) { ARArmours[i].Initialize(); Progress++; } for (int i = 0; i < ARHair.Length; i++) { ARHair[i].Initialize(); Progress++; } for (int i = 0; i < ARWeapons.Length; i++) { ARWeapons[i].Initialize(); Progress++; } for (int i = 0; i < ARWeaponsS.Length; i++) { ARWeaponsS[i].Initialize(); Progress++; } for (int i = 0; i < CHumEffect.Length; i++) { CHumEffect[i].Initialize(); Progress++; } for (int i = 0; i < AHumEffect.Length; i++) { AHumEffect[i].Initialize(); Progress++; } for (int i = 0; i < ARHumEffect.Length; i++) { ARHumEffect[i].Initialize(); Progress++; } for (int i = 0; i < Mounts.Length; i++) { Mounts[i].Initialize(); Progress++; } for (int i = 0; i < Fishing.Length; i++) { Fishing[i].Initialize(); Progress++; } for (int i = 0; i < Pets.Length; i++) { Pets[i].Initialize(); Progress++; } Loaded = true; }