public kirk_CMD1 ( byte outbuff, byte inbuff, int size, bool do_check = true ) : void | ||
outbuff | byte | |
inbuff | byte | |
size | int | |
do_check | bool | |
return | void |
public void TestCmd1() { var Kirk = new Kirk(); Kirk.kirk_init(); var _src = new byte[0x100]; var _dst = new byte[0x10]; var ExpectedOutput = new byte[] { 0xE3, 0x17, 0x49, 0x84, 0xAE, 0xB9, 0xB5, 0xAF, 0x7D, 0x9F, 0x73, 0xAD, 0x93, 0x66, 0x62, 0xD5 }; fixed (byte* src = _src) fixed (byte* dst = _dst) { *(uint*)(&src[0x60]) = 1; // Mode *(uint*)(&src[0x70]) = 0x10; // DataSize *(uint*)(&src[0x74]) = 0; // DataOffset Kirk.kirk_CMD1(dst, src, 0x100, false); //Console.WriteLine(BitConverter.ToString(_src)); //Console.WriteLine(BitConverter.ToString(_dst)); CollectionAssert.AreEqual(ExpectedOutput, _dst); } }
/// <summary> /// /// </summary> /// <param name="IplData"></param> /// <param name="OutputStream"></param> /// <param name="ToMemoryAddress"></param> /// <returns></returns> 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; }