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