kirk_CMD1() public method

Cypher-Block Chaining decoding. Master decryption command, used by firmware modules. Applies CMAC checking.
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
Example #1
0
        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);
            }
        }
Example #2
0
        /// <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;
        }