Exemple #1
0
        public void EncryptBootloaderCB(ref byte[] data, byte[] inkey, byte[] oldkey, BlEncryptionTypes type, out byte[] outkey)
        {
            #region Error Handling

            if (inkey == null)
            {
                switch (type)
                {
                case BlEncryptionTypes.Default:
                case BlEncryptionTypes.Cbb:
                    inkey = BlKey;
                    break;

                case BlEncryptionTypes.MfgCbb:
                    inkey = new byte[0x10];     // 00's for key (MFG bootloader)
                    break;

                default:
                    throw new ArgumentNullException("inkey");
                }
            }
            if (inkey.Length != 0x10)
            {
                throw new ArgumentOutOfRangeException("inkey");
            }

            #endregion

            var header = new byte[0x10];
            Array.Copy(data, 0x10, header, 0x0, 0x10);
            switch (type)
            {
            case BlEncryptionTypes.Default:
                break;

            case BlEncryptionTypes.Cbb:
            case BlEncryptionTypes.MfgCbb:
                Buffer.BlockCopy(oldkey, 0x0, header, 0x0, 0x10);
                Buffer.BlockCopy(header, 0x0, data, 0x10, 0x10);
                break;

            case BlEncryptionTypes.CpuKey:
                throw new NotImplementedException("This type is not yet supported...");

            default:
                throw new ArgumentOutOfRangeException("type");
            }
            Buffer.BlockCopy(header, 0, data, 0x10, 0x10);
            outkey = new HMACSHA1(inkey).ComputeHash(header);
            Array.Resize(ref outkey, 0x10);
            var tmp = new byte[data.Length - 0x20];
            Buffer.BlockCopy(data, 0x20, tmp, 0x0, tmp.Length);
            Rc4(ref tmp, outkey);
            Buffer.BlockCopy(tmp, 0x0, data, 0x20, tmp.Length);
        }
Exemple #2
0
        public void DecryptBootloaderCB(ref byte[] data, byte[] inkey, byte[] oldkey, BlEncryptionTypes type, out byte[] outkey)
        {
            #region Error Handling

            if (inkey == null)
            {
                switch (type)
                {
                case BlEncryptionTypes.Default:
                case BlEncryptionTypes.Cbb:
                    inkey = BlKey;
                    break;

                case BlEncryptionTypes.MfgCbb:
                    inkey = new byte[0x10];     // 00's for key (MFG bootloader)
                    break;

                default:
                    throw new ArgumentNullException("inkey");
                }
            }
            if (inkey.Length != 0x10)
            {
                throw new ArgumentOutOfRangeException("inkey");
            }

            #endregion

            var header = new byte[0x10];
            Array.Copy(data, 0x10, header, 0x0, 0x10);
            switch (type)
            {
            case BlEncryptionTypes.Default:
                outkey = new HMACSHA1(inkey).ComputeHash(header);
                break;

            case BlEncryptionTypes.Cbb:
            case BlEncryptionTypes.MfgCbb:
                Array.Resize(ref header, 0x20);
                Array.Copy(inkey, 0x0, header, 0x10, 0x10);
                outkey = new HMACSHA1(oldkey).ComputeHash(header);
                break;

            case BlEncryptionTypes.CpuKey:
                header = new byte[0x30];
                Array.Copy(data, 0x10, header, 0x0, 0x10);
                Array.Copy(inkey, 0x0, header, 0x10, 0x10);
                Array.Copy(oldkey, 0x0, header, 0x20, 0x6);
                Array.Copy(oldkey, 0x8, header, 0x20 + 0x8, 0x8);
                var cbakey = new byte[0x10];
                Array.Copy(oldkey, 0x10, cbakey, 0x0, 0x10);
                outkey = new HMACSHA1(cbakey).ComputeHash(header);
                break;

            default:
                throw new ArgumentOutOfRangeException("type");
            }
            Array.Resize(ref outkey, 0x10);
            var decrypted = new byte[data.Length - 0x20];
            Buffer.BlockCopy(data, 0x20, decrypted, 0x0, decrypted.Length);
            Rc4(ref decrypted, outkey);
            Buffer.BlockCopy(decrypted, 0x0, data, 0x20, decrypted.Length);
        }