Exemplo n.º 1
0
        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?");
        }
Exemplo n.º 2
0
        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?");
        }