private int validateNPD(String filename, byte[] devKLic, NPD[] npdPtr, FileStream i) { i.Seek(0, SeekOrigin.Begin); byte[] npd = new byte[0x80]; i.Read(npd, 0, npd.Length); byte[] extraData = new byte[0x04]; i.Read(extraData, 0, extraData.Length); long flag = ConversionUtils.be32(extraData, 0); if ((flag & FLAG_SDAT) != 0) { Console.WriteLine("INFO: SDAT detected. NPD header is not validated"); } else if (!checkNPDHash1(filename, npd)) { Console.WriteLine("ERROR: Hashing Title ID Name"); return(STATUS_ERROR_HASHTITLEIDNAME); } else if (devKLic == null) { Console.WriteLine("WARNING: Can not validate devklic header"); } else if (!checkNPDHash2(devKLic, npd)) { Console.WriteLine("ERROR: Hashing devklic"); return(STATUS_ERROR_HASHDEVKLIC); } npdPtr[0] = NPD.createNPD(npd); return(STATUS_OK); }
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); }