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