private byte[] writeValidNPD(string filename, byte[] devKLic, NPD[] npdPtr, FileStream fin, byte[] contentID, byte[] flags, byte[] version, byte[] type) { int num; byte[] dest = new byte[0x80]; dest[0] = 0x4e; dest[1] = 80; dest[2] = 0x44; dest[3] = 0; dest[4] = 0; dest[5] = 0; dest[6] = 0; dest[7] = version[0]; dest[8] = 0; dest[9] = 0; dest[10] = 0; dest[11] = 3; dest[12] = 0; dest[13] = 0; dest[14] = 0; dest[15] = type[0]; for (num = 0; num < 0x30; num++) { dest[0x10 + num] = contentID[num]; } ConversionUtils.arraycopy(ConversionUtils.charsToByte("FixedLicenseEDAT".ToCharArray()), 0, dest, 0x40L, 0x10); ConversionUtils.arraycopy(this.createNPDHash1(filename, dest), 0, dest, 80L, 0x10); ConversionUtils.arraycopy(this.createNPDHash2(devKLic, dest), 0, dest, 0x60L, 0x10); for (num = 0; num < 0x10; num++) { dest[0x70 + num] = 0; } npdPtr[0] = NPD.createNPD(dest); return(dest); }
private byte[] createNPDHash1(string filename, byte[] npd) { byte[] src = ConversionUtils.charsToByte(filename.ToCharArray()); byte[] dest = new byte[0x30 + src.Length]; ConversionUtils.arraycopy(npd, 0x10, dest, 0L, 0x30); ConversionUtils.arraycopy(src, 0, dest, 0x30L, src.Length); byte[] buffer3 = ToolsImpl.CMAC128(EDATKeys.npdrm_omac_key3, dest, 0, dest.Length); ConversionUtils.arraycopy(buffer3, 0, npd, 80L, 0x10); if (this.compareBytes(buffer3, 0, npd, 80, 0x10)) { return(buffer3); } return(null); }
private bool checkNPDHash1(String filename, byte[] npd) { byte[] fileBytes = ConversionUtils.charsToByte(filename.ToCharArray()); byte[] data1 = new byte[0x30 + fileBytes.Length]; ConversionUtils.arraycopy(npd, 0x10, data1, 0, 0x30); ConversionUtils.arraycopy(fileBytes, 0x00, data1, 0x30, fileBytes.Length); byte[] hash1 = ToolsImpl.CMAC128(EDATKeys.npdrm_omac_key3, data1, 0, data1.Length); bool result1 = compareBytes(hash1, 0, npd, 0x50, 0x10); if (result1) { Console.WriteLine("NPD hash 1 is valid (" + ConversionUtils.getHexString(hash1) + ")"); } return(result1); }
private bool checkNPDHash1(string filename, byte[] npd) { byte[] src = ConversionUtils.charsToByte(filename.ToCharArray()); byte[] dest = new byte[0x30 + src.Length]; ConversionUtils.arraycopy(npd, 0x10, dest, 0L, 0x30); ConversionUtils.arraycopy(src, 0, dest, 0x30L, src.Length); byte[] buffer3 = ToolsImpl.CMAC128(EDATKeys.npdrm_omac_key3, dest, 0, dest.Length); bool flag = this.compareBytes(buffer3, 0, npd, 80, 0x10); if (flag) { Console.WriteLine("NPD hash 1 is valid (" + ConversionUtils.getHexString(buffer3) + ")"); } return(flag); }
private byte[] createNPDHash1(String filename, byte[] npd) { byte[] fileBytes = ConversionUtils.charsToByte(filename.ToCharArray()); byte[] data1 = new byte[0x30 + fileBytes.Length]; ConversionUtils.arraycopy(npd, 0x10, data1, 0, 0x30); ConversionUtils.arraycopy(fileBytes, 0x00, data1, 0x30, fileBytes.Length); byte[] hash1 = ToolsImpl.CMAC128(EDATKeys.npdrm_omac_key3, data1, 0, data1.Length); ConversionUtils.arraycopy(hash1, 0, npd, 0x50, 0x10); bool result1 = compareBytes(hash1, 0, npd, 0x50, 0x10); if (result1) { return(hash1); } return(null); }
private byte[] writeValidNPD(String filename, byte[] devKLic, NPD[] npdPtr, FileStream fin, byte[] contentID, byte[] flags, byte[] version, byte[] type) { byte[] npd = new byte[0x80]; //NPD Magic //ConversionUtils.arraycopy(npd, 0, result.magic, 0, 4); npd[0] = 0x4E; npd[1] = 0x50; npd[2] = 0x44; npd[3] = 0x00; //Version 3 //result.version = ConversionUtils.be32(npd, 4); npd[4] = 0x00; npd[5] = 0x00; npd[6] = 0x00; npd[7] = version[0]; //License 2 ref 3 klic /* 1 network, 2 local, 3 free */ //result.license = ConversionUtils.be32(npd, 8); npd[8] = 0x00; npd[9] = 0x00; npd[10] = 0x00; npd[11] = 0x03; //Type /* 1 exec, 21 update */ //result.type = ConversionUtils.be32(npd, 0xC); npd[12] = 0x00; npd[13] = 0x00; npd[14] = 0x00; npd[15] = type[0]; //No Idea where I get the content_id //ConversionUtils.arraycopy(npd, 0x10, result.content_id, 0, 0x30 for (int i = 0; i < 0x30; i++) { npd[0x10 + i] = contentID[i]; } //Used to create IV //ConversionUtils.arraycopy(npd, 0x40, result.digest, 0, 0x10); byte[] iv = ConversionUtils.charsToByte(("FixedLicenseEDAT").ToCharArray()); ConversionUtils.arraycopy(iv, 0, npd, 0x40, 0x10); //I guess it's a full file hash //ConversionUtils.arraycopy(npd, 0x50, result.titleHash, 0, 0x10); byte[] hash = createNPDHash1(filename, npd); ConversionUtils.arraycopy(hash, 0x00, npd, 0x50, 0x10); //Used to create Blockkey //ConversionUtils.arraycopy(npd, 0x60, result.devHash, 0, 0x10); byte[] devHash = createNPDHash2(devKLic, npd); ConversionUtils.arraycopy(devHash, 0, npd, 0x60, 0x10); //NPD EOF?!?!?! //result.unknown3 = ConversionUtils.be64(npd, 0x70); //result.unknown4 = ConversionUtils.be64(npd, 0x78); for (int i = 0; i < 16; i++) { npd[0x70 + i] = 0x00; } npdPtr[0] = NPD.createNPD(npd); return(npd); }