public static IplInfo DecryptIplToMemory(byte[] IplData, Stream OutputStream, bool ToMemoryAddress = true)
{
var buffer = new byte[0x1000];
var IplInfo = default(IplInfo);
//ArrayUtils.HexDump(IplData);
fixed (byte* IplPtr = IplData)
fixed (byte* bufferPtr = buffer)
{
for (int n = 0; n < IplData.Length; n += 0x1000)
{
var Ptr = IplPtr + n;
var Header = *(Kirk.AES128CMACHeader*)Ptr;
//Console.WriteLine(Header.DataSize);
var Kirk = new Kirk();
Kirk.kirk_init();
Kirk.kirk_CMD1(bufferPtr, Ptr, 0x1000, do_check: false);
var IplBlock = *(IplBlock*)bufferPtr;
//Console.WriteLine(IplBlock.ToStringDefault());
if (ToMemoryAddress)
{
OutputStream.Position = IplBlock.LoadAddress;
Console.WriteLine("IplBlock.LoadAddress: 0x{0:X8}", IplBlock.LoadAddress);
}
OutputStream.WriteBytes(PointerUtils.PointerToByteArray(&IplBlock.BlockData, (int)IplBlock.BlockSize));
if (IplBlock.EntryFunction != 0)
{
IplInfo.EntryFunction = IplBlock.EntryFunction;
}
}
}
return IplInfo;
}