Example #1
0
        private int encryptData(FileStream ii, FileStream o, NPD npd, EDATData data, byte[] rifkey)
        {
            int num = (int)(((data.getFileLen() + data.getBlockSize()) - 1) / data.getBlockSize());

            byte[] dest    = new byte[num * 0x10];
            byte[] buffer2 = new byte[ii.Length + 15L];
            for (int i = 0; i < num; i++)
            {
                long offset = i * data.getBlockSize();
                ii.Seek(offset, SeekOrigin.Begin);
                int length = (int)data.getBlockSize();
                if (i == (num - 1))
                {
                    length = (int)(data.getFileLen() % new BigInteger(data.getBlockSize()));
                }
                int num5 = length;
                length = (length + 15) & -16;
                byte[] buffer3 = new byte[length];
                byte[] buffer4 = new byte[length];
                for (int j = num5; j > 0; j -= ii.Read(buffer4, num5 - j, j))
                {
                }
                for (int k = num5; k < length; k++)
                {
                    buffer4[k] = 0;
                }
                byte[] buffer5 = new byte[0x10];
                byte[] buffer6 = new byte[0x10];
                byte[] buffer7 = this.calculateBlockKey(i, npd);
                ToolsImpl.aesecbEncrypt(rifkey, buffer7, 0, buffer5, 0, buffer7.Length);
                ConversionUtils.arraycopy(buffer5, 0, buffer6, 0L, buffer5.Length);
                int cryptoFlag                 = 2;
                int hashFlag                   = 2;
                AppLoaderReverse reverse       = new AppLoaderReverse();
                byte[]           iv            = npd.getDigest();
                byte[]           generatedHash = new byte[0x10];
                reverse.doAll(hashFlag, cryptoFlag, buffer4, 0, buffer3, 0, buffer4.Length, buffer5, iv, buffer6, generatedHash, 0);
                ConversionUtils.arraycopy(buffer3, 0, buffer2, offset, length);
                ConversionUtils.arraycopy(generatedHash, 0, dest, (long)(i * 0x10), 0x10);
            }
            byte[] buffer = ConversionUtils.getByteArray("4D6164652062792052325220546F6F6C");
            o.Write(dest, 0, dest.Length);
            o.Write(buffer2, 0, buffer2.Length - 15);
            o.Write(buffer, 0, buffer.Length);
            return(STATUS_OK);
        }
Example #2
0
        private int encryptData(FileStream ii, FileStream o, NPD npd, EDATData data, byte[] rifkey)
        {
            int numBlocks = (int)((data.getFileLen() + data.getBlockSize() - 1) / data.getBlockSize());

            byte[] expectedHashForFile  = new byte[numBlocks * 0x10];
            byte[] encryptedDataForFile = new byte[ii.Length + 0xF];

            // File Format:
            // ALL HASHES
            // Encrypted Data
            for (int i = 0; i < numBlocks; i++)
            {
                long offset;
                int  len;

                offset = i * data.getBlockSize();
                ii.Seek(offset, SeekOrigin.Begin);
                len = (int)(data.getBlockSize());
                if (i == numBlocks - 1)
                {
                    len = (int)(data.getFileLen() % (new BigInteger(data.getBlockSize())));
                }


                int realLen = len;
                len = (int)((uint)(len + 0x0F) & 0xFFFFFFF0);

                byte[] encryptedData = new byte[len];
                byte[] decryptedData = new byte[len];

                int toRead = realLen;
                while (toRead > 0)
                {
                    toRead -= ii.Read(decryptedData, realLen - toRead, toRead);
                }
                for (int ai = realLen; ai < len; ai++)
                {
                    decryptedData[ai] = 0x00;
                }

                byte[] key      = new byte[0x10];
                byte[] hash     = new byte[0x10];
                byte[] blockKey = calculateBlockKey(i, npd);

                ToolsImpl.aesecbEncrypt(rifkey, blockKey, 0, key, 0, blockKey.Length);
                ConversionUtils.arraycopy(key, 0, hash, 0, key.Length);
                int cryptoFlag = 0x2;
                int hashFlag   = 0x02;

                AppLoaderReverse a             = new AppLoaderReverse();
                byte[]           iv            = npd.getDigest();
                byte[]           generatedHash = new byte[0x10];
                a.doAll(hashFlag, cryptoFlag, decryptedData, 0, encryptedData, 0, decryptedData.Length, key, iv, hash, generatedHash, 0);
                ConversionUtils.arraycopy(encryptedData, 0, encryptedDataForFile, offset, len);
                ConversionUtils.arraycopy(generatedHash, 0, expectedHashForFile, i * 0x10, 0x10);
            }
            byte[] EDATAVersion = ConversionUtils.getByteArray("4D6164652062792052325220546F6F6C");
            o.Write(expectedHashForFile, 0, expectedHashForFile.Length);
            o.Write(encryptedDataForFile, 0, encryptedDataForFile.Length - 0xf);
            o.Write(EDATAVersion, 0, EDATAVersion.Length);
            return(STATUS_OK);
        }
Example #3
0
        /* KDSBEST START */
        public int encryptFile(String inFile, String outFile, byte[] devKLic, byte[] keyFromRif, byte[] contentID, byte[] flags, byte[] type, byte[] version)
        {
            FileStream fin = File.Open(inFile, FileMode.Open);

            //  MemoryMappedFile fin1 = MemoryMappedFile.CreateFromFile(inFile, FileMode.Open);
            NPD[]      ptr = new NPD[1]; //Ptr to Ptr
            FileStream o   = File.Open(outFile, FileMode.Create);

            string[] fn  = o.Name.Split('\\');
            byte[]   npd = writeValidNPD(fn[fn.Length - 1], devKLic, ptr, fin, contentID, flags, version, type);
            o.Write(npd, 0, npd.Length);
            byte[] buffer = new byte[4];
            // FLAGS
            buffer[0] = 0x00;
            buffer[1] = 0x00;
            buffer[2] = 0x00;
            buffer[3] = 0x00;
            o.Write(buffer, 0, 4);

            // blocksize 0x00004000
            buffer[2] = 0x40;
            o.Write(buffer, 0, 4);
            long len = fin.Length;

            byte[] lenBuf  = BitConverter.GetBytes(len);
            byte[] rLenBuf = new byte[8];
            for (int i = 0; i < 8; i++)
            {
                rLenBuf[i] = 0x00;
            }
            for (int i = 0; i < lenBuf.Length; i++)
            {
                rLenBuf[7 - i] = lenBuf[i];
            }
            o.Write(rLenBuf, 0, 8);

            // Fill the rest 0x10 bytes with dummy we generate the metasection hash later!
            // the bytes till 0x100 are unknown
            buffer[0] = 0x00;
            while (o.Length < 0x100)
            {
                o.Write(buffer, 0, 1);
            }

            EDATData data = new EDATData();

            data.flags     = 0x00000000;
            data.blockSize = 0x00004000;
            data.fileLen   = new BigInteger(len);
            byte[] rifkey   = getKey(ptr[0], data, devKLic, keyFromRif); //Obtain the key for decryption (result of sc471 or sdatkey)
            int    hashFlag = 0x00000002;


            encryptData(fin, o, ptr[0], data, rifkey);

            o.Seek(0x90, SeekOrigin.Begin);
            AppLoader aa = new AppLoader();

            aa.doInit(hashFlag, 0x00000001, new byte[0x10], new byte[0x10], rifkey);

            int sectionSize = ((data.getFlags() & FLAG_COMPRESSED) != 0) ? 0x20 : 0x010; //BUG??? What about FLAG0x20??
            //Determine the metadatasection total len
            int numBlocks = (int)((data.getFileLen() + data.getBlockSize() - 11) / data.getBlockSize());

            int readed     = 0;
            int baseOffset = 0x100;
            //baseOffset +=  modifier; //There is an unknown offset to add to the metadatasection... value seen 0
            long remaining = sectionSize * numBlocks;

            while (remaining > 0)
            {
                int lenToRead = (HEADER_MAX_BLOCKSIZE > remaining) ? (int)remaining : HEADER_MAX_BLOCKSIZE;
                o.Seek(baseOffset + readed, SeekOrigin.Begin);
                byte[] content = new byte[lenToRead];
                byte[] ooo     = new byte[lenToRead];
                o.Read(content, 0, content.Length);
                aa.doUpdate(content, 0, ooo, 0, lenToRead);
                readed    += lenToRead;
                remaining -= lenToRead;
            }
            byte[] headerHash = new byte[0x10];
            aa.doFinalButGetHash(headerHash);
            o.Seek(0x90, SeekOrigin.Begin);
            o.Write(headerHash, 0, headerHash.Length);

            // Header Complete

            // Generate Header Hash
            o.Seek(0, SeekOrigin.Begin);
            byte[] header       = new byte[0xA0];
            byte[] headerODummy = new byte[0xA0];
            o.Read(header, 0, header.Length);
            AppLoaderReverse a = new AppLoaderReverse();

            byte[] generatedHash = new byte[0x10];
            bool   result        = a.doAll(hashFlag, 0x00000001, header, 0, headerODummy, 0, header.Length, new byte[0x10], new byte[0x10], rifkey, generatedHash, 0);

            o.Seek(0xA0, SeekOrigin.Begin);
            o.Write(generatedHash, 0, generatedHash.Length);


            //KDSBest We don't know the DATA 0xB0 to 0x100!!!

            while (o.Length < 0x100)
            {
                o.Write(buffer, 0, 1);
            }


            o.Close();
            fin.Close();
            return(STATUS_OK);
        }
Example #4
0
 public int encryptFile(string inFile, string outFile, byte[] devKLic, byte[] keyFromRif, byte[] contentID, byte[] flags, byte[] type, byte[] version)
 {
     int num2;
     int num9;
     FileStream fin = File.Open(inFile, FileMode.Open);
     NPD[] npdPtr = new NPD[1];
     FileStream o = File.Open(outFile, FileMode.Create);
     string[] strArray = o.Name.Split(new char[] { '\\' });
     byte[] buffer = this.writeValidNPD(strArray[strArray.Length - 1], devKLic, npdPtr, fin, contentID, flags, version, type);
     o.Write(buffer, 0, buffer.Length);
     byte[] buffer2 = new byte[] { 0, 0, 0, 0 };
     o.Write(buffer2, 0, 4);
     buffer2[2] = 0x40;
     o.Write(buffer2, 0, 4);
     long length = fin.Length;
     byte[] bytes = BitConverter.GetBytes(length);
     byte[] buffer4 = new byte[8];
     for (num2 = 0; num2 < 8; num2++)
     {
         buffer4[num2] = 0;
     }
     for (num2 = 0; num2 < bytes.Length; num2++)
     {
         buffer4[7 - num2] = bytes[num2];
     }
     o.Write(buffer4, 0, 8);
     buffer2[0] = 0;
     while (o.Length < 0x100L)
     {
         o.Write(buffer2, 0, 1);
     }
     EDATData data = new EDATData {
         flags = 0L,
         blockSize = 0x4000L,
         fileLen = new BigInteger(length)
     };
     byte[] rifkey = this.getKey(npdPtr[0], data, devKLic, keyFromRif);
     int hashFlag = 2;
     this.encryptData(fin, o, npdPtr[0], data, rifkey);
     o.Seek(0x90L, SeekOrigin.Begin);
     AppLoader loader = new AppLoader();
     loader.doInit(hashFlag, 1, new byte[0x10], new byte[0x10], rifkey);
     int num4 = ((data.getFlags() & FLAG_COMPRESSED) != 0L) ? 0x20 : 0x10;
     int num5 = (int) (((data.getFileLen() + data.getBlockSize()) - 11) / data.getBlockSize());
     int num6 = 0;
     int num7 = 0x100;
     for (long i = num4 * num5; i > 0L; i -= num9)
     {
         num9 = (HEADER_MAX_BLOCKSIZE > i) ? ((int) i) : HEADER_MAX_BLOCKSIZE;
         o.Seek((long) (num7 + num6), SeekOrigin.Begin);
         byte[] buffer6 = new byte[num9];
         byte[] buffer7 = new byte[num9];
         o.Read(buffer6, 0, buffer6.Length);
         loader.doUpdate(buffer6, 0, buffer7, 0, num9);
         num6 += num9;
     }
     byte[] generatedHash = new byte[0x10];
     loader.doFinalButGetHash(generatedHash);
     o.Seek(0x90L, SeekOrigin.Begin);
     o.Write(generatedHash, 0, generatedHash.Length);
     o.Seek(0L, SeekOrigin.Begin);
     byte[] buffer9 = new byte[160];
     byte[] buffer10 = new byte[160];
     o.Read(buffer9, 0, buffer9.Length);
     AppLoaderReverse reverse = new AppLoaderReverse();
     byte[] buffer11 = new byte[0x10];
     bool flag = reverse.doAll(hashFlag, 1, buffer9, 0, buffer10, 0, buffer9.Length, new byte[0x10], new byte[0x10], rifkey, buffer11, 0);
     o.Seek(160L, SeekOrigin.Begin);
     o.Write(buffer11, 0, buffer11.Length);
     while (o.Length < 0x100L)
     {
         o.Write(buffer2, 0, 1);
     }
     o.Close();
     fin.Close();
     return STATUS_OK;
 }
Example #5
0
 private int encryptData(FileStream ii, FileStream o, NPD npd, EDATData data, byte[] rifkey)
 {
     int num = (int) (((data.getFileLen() + data.getBlockSize()) - 1) / data.getBlockSize());
     byte[] dest = new byte[num * 0x10];
     byte[] buffer2 = new byte[ii.Length + 15L];
     for (int i = 0; i < num; i++)
     {
         long offset = i * data.getBlockSize();
         ii.Seek(offset, SeekOrigin.Begin);
         int length = (int) data.getBlockSize();
         if (i == (num - 1))
         {
             length = (int) (data.getFileLen() % new BigInteger(data.getBlockSize()));
         }
         int num5 = length;
         length = (length + 15) & -16;
         byte[] buffer3 = new byte[length];
         byte[] buffer4 = new byte[length];
         for (int j = num5; j > 0; j -= ii.Read(buffer4, num5 - j, j))
         {
         }
         for (int k = num5; k < length; k++)
         {
             buffer4[k] = 0;
         }
         byte[] buffer5 = new byte[0x10];
         byte[] buffer6 = new byte[0x10];
         byte[] buffer7 = this.calculateBlockKey(i, npd);
         ToolsImpl.aesecbEncrypt(rifkey, buffer7, 0, buffer5, 0, buffer7.Length);
         ConversionUtils.arraycopy(buffer5, 0, buffer6, 0L, buffer5.Length);
         int cryptoFlag = 2;
         int hashFlag = 2;
         AppLoaderReverse reverse = new AppLoaderReverse();
         byte[] iv = npd.getDigest();
         byte[] generatedHash = new byte[0x10];
         reverse.doAll(hashFlag, cryptoFlag, buffer4, 0, buffer3, 0, buffer4.Length, buffer5, iv, buffer6, generatedHash, 0);
         ConversionUtils.arraycopy(buffer3, 0, buffer2, offset, length);
         ConversionUtils.arraycopy(generatedHash, 0, dest, (long) (i * 0x10), 0x10);
     }
     byte[] buffer = ConversionUtils.getByteArray("4D6164652062792052325220546F6F6C");
     o.Write(dest, 0, dest.Length);
     o.Write(buffer2, 0, buffer2.Length - 15);
     o.Write(buffer, 0, buffer.Length);
     return STATUS_OK;
 }
Example #6
0
        public int encryptFile(string inFile, string outFile, byte[] devKLic, byte[] keyFromRif, byte[] contentID, byte[] flags, byte[] type, byte[] version)
        {
            int        num2;
            int        num9;
            FileStream fin = File.Open(inFile, FileMode.Open);

            NPD[]      npdPtr = new NPD[1];
            FileStream o      = File.Open(outFile, FileMode.Create);

            string[] strArray = o.Name.Split(new char[] { '\\' });
            byte[]   buffer   = this.writeValidNPD(strArray[strArray.Length - 1], devKLic, npdPtr, fin, contentID, flags, version, type);
            o.Write(buffer, 0, buffer.Length);
            byte[] buffer2 = new byte[] { 0, 0, 0, 0 };
            o.Write(buffer2, 0, 4);
            buffer2[2] = 0x40;
            o.Write(buffer2, 0, 4);
            long length = fin.Length;

            byte[] bytes   = BitConverter.GetBytes(length);
            byte[] buffer4 = new byte[8];
            for (num2 = 0; num2 < 8; num2++)
            {
                buffer4[num2] = 0;
            }
            for (num2 = 0; num2 < bytes.Length; num2++)
            {
                buffer4[7 - num2] = bytes[num2];
            }
            o.Write(buffer4, 0, 8);
            buffer2[0] = 0;
            while (o.Length < 0x100L)
            {
                o.Write(buffer2, 0, 1);
            }
            EDATData data = new EDATData {
                flags     = 0L,
                blockSize = 0x4000L,
                fileLen   = new BigInteger(length)
            };

            byte[] rifkey   = this.getKey(npdPtr[0], data, devKLic, keyFromRif);
            int    hashFlag = 2;

            this.encryptData(fin, o, npdPtr[0], data, rifkey);
            o.Seek(0x90L, SeekOrigin.Begin);
            AppLoader loader = new AppLoader();

            loader.doInit(hashFlag, 1, new byte[0x10], new byte[0x10], rifkey);
            int num4 = ((data.getFlags() & FLAG_COMPRESSED) != 0L) ? 0x20 : 0x10;
            int num5 = (int)(((data.getFileLen() + data.getBlockSize()) - 11) / data.getBlockSize());
            int num6 = 0;
            int num7 = 0x100;

            for (long i = num4 * num5; i > 0L; i -= num9)
            {
                num9 = (HEADER_MAX_BLOCKSIZE > i) ? ((int)i) : HEADER_MAX_BLOCKSIZE;
                o.Seek((long)(num7 + num6), SeekOrigin.Begin);
                byte[] buffer6 = new byte[num9];
                byte[] buffer7 = new byte[num9];
                o.Read(buffer6, 0, buffer6.Length);
                loader.doUpdate(buffer6, 0, buffer7, 0, num9);
                num6 += num9;
            }
            byte[] generatedHash = new byte[0x10];
            loader.doFinalButGetHash(generatedHash);
            o.Seek(0x90L, SeekOrigin.Begin);
            o.Write(generatedHash, 0, generatedHash.Length);
            o.Seek(0L, SeekOrigin.Begin);
            byte[] buffer9  = new byte[160];
            byte[] buffer10 = new byte[160];
            o.Read(buffer9, 0, buffer9.Length);
            AppLoaderReverse reverse = new AppLoaderReverse();

            byte[] buffer11 = new byte[0x10];
            bool   flag     = reverse.doAll(hashFlag, 1, buffer9, 0, buffer10, 0, buffer9.Length, new byte[0x10], new byte[0x10], rifkey, buffer11, 0);

            o.Seek(160L, SeekOrigin.Begin);
            o.Write(buffer11, 0, buffer11.Length);
            while (o.Length < 0x100L)
            {
                o.Write(buffer2, 0, 1);
            }
            o.Close();
            fin.Close();
            return(STATUS_OK);
        }