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); }
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); }