private int FindKeyGeneration(Keyset keyset, Stream stream) { var counter = new byte[0x10]; var decBuffer = new byte[0x10]; stream.Position = 0x100; stream.Read(counter, 0, 0x10); for (int i = 0; i < 0x20; i++) { var dec = new Aes128CtrStream(stream, keyset.Package2Keys[i], 0x100, 0x100, counter); dec.Position = 0x50; dec.Read(decBuffer, 0, 0x10); if (BitConverter.ToUInt32(decBuffer, 0) == Pk21Magic) { stream.Position = 0; return(i); } } throw new InvalidDataException("Failed to decrypt package2! Is the correct key present?"); }
public Package1(Keyset keyset, Stream stream) { StreamSource = new SharedStreamSource(stream); var reader = new BinaryReader(stream); BuildHash = reader.ReadBytes(0x10); BuildDate = reader.ReadAscii(0xE); Field1E = reader.ReadUInt16(); reader.BaseStream.Position = 0x3FE0; Pk11Size = reader.ReadInt32(); reader.BaseStream.Position += 0xC; Counter = reader.ReadBytes(0x10); // Try decrypting the PK11 blob with all known package1 keys Stream encStream = StreamSource.CreateStream(0x4000, Pk11Size); var decBuffer = new byte[0x10]; for (int i = 0; i < 0x20; i++) { var dec = new Aes128CtrStream(encStream, keyset.Package1Keys[i], Counter); dec.Read(decBuffer, 0, 0x10); if (BitConverter.ToUInt32(decBuffer, 0) == Pk11Magic) { KeyRevision = i; dec.Position = 0; Pk11 = new Pk11(new RandomAccessSectorStream(dec)); return; } } throw new InvalidDataException("Failed to decrypt PK11! Is the correct key present?"); }