More tests for encrypted RomFs
This commit is contained in:
		
							parent
							
								
									5e5cab0729
								
							
						
					
					
						commit
						0cc5d41aef
					
				
					 2 changed files with 128 additions and 5 deletions
				
			
		| 
						 | 
					@ -37,7 +37,7 @@ public class Pfs0EncryptedTest {
 | 
				
			||||||
    private static KeyChainHolder keyChainHolder;
 | 
					    private static KeyChainHolder keyChainHolder;
 | 
				
			||||||
    private static NCAProvider ncaProvider;
 | 
					    private static NCAProvider ncaProvider;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Disabled
 | 
				
			||||||
    @DisplayName("PFS0 Encrypted test")
 | 
					    @DisplayName("PFS0 Encrypted test")
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    void pfs0test() throws Exception{
 | 
					    void pfs0test() throws Exception{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,15 +18,17 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
package libKonogonka.RomFsDecrypted;
 | 
					package libKonogonka.RomFsDecrypted;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import libKonogonka.ctraes.AesCtrBufferedInputStream;
 | 
				
			||||||
import libKonogonka.KeyChainHolder;
 | 
					import libKonogonka.KeyChainHolder;
 | 
				
			||||||
import libKonogonka.Tools.NCA.NCAHeaderTableEntry;
 | 
					import libKonogonka.RainbowDump;
 | 
				
			||||||
import libKonogonka.Tools.NCA.NCAProvider;
 | 
					import libKonogonka.Tools.NCA.NCAProvider;
 | 
				
			||||||
import libKonogonka.Tools.NCA.NCASectionTableBlock.NcaFsHeader;
 | 
					import libKonogonka.Tools.NCA.NCASectionTableBlock.NcaFsHeader;
 | 
				
			||||||
 | 
					import libKonogonka.Tools.RomFs.FileSystemEntry;
 | 
				
			||||||
 | 
					import libKonogonka.ctraes.AesCtrDecryptSimple;
 | 
				
			||||||
import org.junit.jupiter.api.*;
 | 
					import org.junit.jupiter.api.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.BufferedReader;
 | 
					import java.io.*;
 | 
				
			||||||
import java.io.File;
 | 
					import java.nio.file.Files;
 | 
				
			||||||
import java.io.FileReader;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 | 
					@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 | 
				
			||||||
public class RomFsEncryptedTest {
 | 
					public class RomFsEncryptedTest {
 | 
				
			||||||
| 
						 | 
					@ -66,6 +68,7 @@ public class RomFsEncryptedTest {
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    void romFsValidation() throws Exception{
 | 
					    void romFsValidation() throws Exception{
 | 
				
			||||||
        for (byte i = 0; i < 4; i++){
 | 
					        for (byte i = 0; i < 4; i++){
 | 
				
			||||||
 | 
					            System.out.println("..:: TEST SECTION #"+i+" ::..");
 | 
				
			||||||
            if (ncaProvider.getSectionBlock(i).getFsType() == 0 && ncaProvider.getSectionBlock(i).getCryptoType() != 0){
 | 
					            if (ncaProvider.getSectionBlock(i).getFsType() == 0 && ncaProvider.getSectionBlock(i).getCryptoType() != 0){
 | 
				
			||||||
                ncaProvider.getNCAContentProvider(i).getRomfs().printDebug();
 | 
					                ncaProvider.getNCAContentProvider(i).getRomfs().printDebug();
 | 
				
			||||||
                ncaProvider.getSectionBlock(i).printDebug();
 | 
					                ncaProvider.getSectionBlock(i).printDebug();
 | 
				
			||||||
| 
						 | 
					@ -86,8 +89,128 @@ public class RomFsEncryptedTest {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private AesCtrDecryptSimple decryptSimple;
 | 
				
			||||||
 | 
					    long ACBISoffsetPosition;
 | 
				
			||||||
 | 
					    long ACBISmediaStartOffset;
 | 
				
			||||||
 | 
					    long ACBISmediaEndOffset;
 | 
				
			||||||
    @Disabled
 | 
					    @Disabled
 | 
				
			||||||
    @Order(5)
 | 
					    @Order(5)
 | 
				
			||||||
 | 
					    @DisplayName("AesCtrBufferedInputStream: RomFs AES-CTR dump validation")
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void AesCtrBufferedInputStreamTest() throws Exception {
 | 
				
			||||||
 | 
					        File nca = new File(ncaFileLocation);
 | 
				
			||||||
 | 
					        System.out.println("NCA SIZE: "+RainbowDump.formatDecHexString(nca.length()));
 | 
				
			||||||
 | 
					        System.out.println(ncaProvider.getSectionBlock1().getSuperBlockIVFC().getLvl6Offset());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        FileSystemEntry entry = ncaProvider.getNCAContentProvider(1).getRomfs().getRootEntry();
 | 
				
			||||||
 | 
					        System.out.println(" entry.getFileOffset(): " + entry.getOffset());
 | 
				
			||||||
 | 
					        System.out.println(" entry.getFileSize():    " + entry.getSize());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ACBISoffsetPosition = 0;
 | 
				
			||||||
 | 
					        ACBISmediaStartOffset = ncaProvider.getTableEntry1().getMediaStartOffset();
 | 
				
			||||||
 | 
					        ACBISmediaEndOffset = ncaProvider.getTableEntry1().getMediaEndOffset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        decryptSimple = new AesCtrDecryptSimple(
 | 
				
			||||||
 | 
					                ncaProvider.getDecryptedKey2(),
 | 
				
			||||||
 | 
					                ncaProvider.getSectionBlock1().getSectionCTR(),
 | 
				
			||||||
 | 
					                ncaProvider.getTableEntry1().getMediaStartOffset()*0x200);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        exportFolderContent(entry, "/tmp/brandnew");
 | 
				
			||||||
 | 
					        //----------------------------------------------------------------------
 | 
				
			||||||
 | 
					        exportFolderContentLegacy(entry, "/tmp/legacy");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void exportFolderContent(FileSystemEntry entry, String saveToLocation) throws Exception{
 | 
				
			||||||
 | 
					        File contentFile = new File(saveToLocation + entry.getName());
 | 
				
			||||||
 | 
					        contentFile.mkdirs();
 | 
				
			||||||
 | 
					        String currentDirPath = saveToLocation + entry.getName() + File.separator;
 | 
				
			||||||
 | 
					        for (FileSystemEntry fse : entry.getContent()){
 | 
				
			||||||
 | 
					            if (fse.isDirectory())
 | 
				
			||||||
 | 
					                exportFolderContent(fse, currentDirPath);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                exportSingleFile(fse, currentDirPath);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    private void exportSingleFile(FileSystemEntry entry, String saveToLocation) throws Exception {
 | 
				
			||||||
 | 
					        File contentFile = new File(saveToLocation + entry.getName());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        BufferedOutputStream extractedFileBOS = new BufferedOutputStream(Files.newOutputStream(contentFile.toPath()));
 | 
				
			||||||
 | 
					        //---
 | 
				
			||||||
 | 
					        InputStream is = Files.newInputStream(new File(ncaFileLocation).toPath());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AesCtrBufferedInputStream aesCtrBufferedInputStream = new AesCtrBufferedInputStream(
 | 
				
			||||||
 | 
					                decryptSimple,
 | 
				
			||||||
 | 
					                ACBISoffsetPosition,
 | 
				
			||||||
 | 
					                ACBISmediaStartOffset,
 | 
				
			||||||
 | 
					                ACBISmediaEndOffset,
 | 
				
			||||||
 | 
					                is);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        long skipBytes = entry.getOffset()
 | 
				
			||||||
 | 
					                +ncaProvider.getTableEntry1().getMediaStartOffset()*0x200
 | 
				
			||||||
 | 
					                +ncaProvider.getNCAContentProvider(1).getRomfs().getHeader().getFileDataOffset()
 | 
				
			||||||
 | 
					                +ncaProvider.getSectionBlock1().getSuperBlockIVFC().getLvl6Offset();
 | 
				
			||||||
 | 
					        System.out.println("SUM: "+(entry.getOffset()
 | 
				
			||||||
 | 
					                + ncaProvider.getTableEntry1().getMediaStartOffset()*0x200
 | 
				
			||||||
 | 
					                +ncaProvider.getNCAContentProvider(1).getRomfs().getHeader().getFileDataOffset()
 | 
				
			||||||
 | 
					                +ncaProvider.getSectionBlock1().getSuperBlockIVFC().getLvl6Offset()));
 | 
				
			||||||
 | 
					        if (skipBytes != aesCtrBufferedInputStream.skip(skipBytes))
 | 
				
			||||||
 | 
					            throw new Exception("Can't skip");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int blockSize = 0x200;
 | 
				
			||||||
 | 
					        if (entry.getSize() < 0x200)
 | 
				
			||||||
 | 
					            blockSize = (int) entry.getSize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        long i = 0;
 | 
				
			||||||
 | 
					        byte[] block = new byte[blockSize];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int actuallyRead;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while (true) {
 | 
				
			||||||
 | 
					            if ((actuallyRead = aesCtrBufferedInputStream.read(block)) != blockSize)
 | 
				
			||||||
 | 
					                throw new Exception("Read failure. Block Size: "+blockSize+", actuallyRead: "+actuallyRead);
 | 
				
			||||||
 | 
					            extractedFileBOS.write(block);
 | 
				
			||||||
 | 
					            i += blockSize;
 | 
				
			||||||
 | 
					            if ((i + blockSize) > entry.getSize()) {
 | 
				
			||||||
 | 
					                blockSize = (int) (entry.getSize() - i);
 | 
				
			||||||
 | 
					                if (blockSize == 0)
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                block = new byte[blockSize];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //---
 | 
				
			||||||
 | 
					        extractedFileBOS.close();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void exportFolderContentLegacy(FileSystemEntry entry, String saveToLocation) throws Exception{
 | 
				
			||||||
 | 
					        File contentFile = new File(saveToLocation + entry.getName());
 | 
				
			||||||
 | 
					        contentFile.mkdirs();
 | 
				
			||||||
 | 
					        String currentDirPath = saveToLocation + entry.getName() + File.separator;
 | 
				
			||||||
 | 
					        for (FileSystemEntry fse : entry.getContent()){
 | 
				
			||||||
 | 
					            if (fse.isDirectory())
 | 
				
			||||||
 | 
					                exportFolderContentLegacy(fse, currentDirPath);
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                exportSingleFileLegacy(fse, currentDirPath);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    private void exportSingleFileLegacy(FileSystemEntry entry, String saveToLocation) throws Exception {
 | 
				
			||||||
 | 
					        File contentFile = new File(saveToLocation + entry.getName());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        BufferedOutputStream extractedFileBOS = new BufferedOutputStream(new FileOutputStream(contentFile));
 | 
				
			||||||
 | 
					        PipedInputStream pis = ncaProvider.getNCAContentProvider(1).getRomfs().getContent(entry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        byte[] readBuf = new byte[0x200]; // 8mb NOTE: consider switching to 1mb 1048576
 | 
				
			||||||
 | 
					        int readSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while ((readSize = pis.read(readBuf)) > -1) {
 | 
				
			||||||
 | 
					            extractedFileBOS.write(readBuf, 0, readSize);
 | 
				
			||||||
 | 
					            readBuf = new byte[0x200];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        extractedFileBOS.close();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Disabled
 | 
				
			||||||
 | 
					    @Order(6)
 | 
				
			||||||
    @DisplayName("RomFsEncryptedProvider: PFS test")
 | 
					    @DisplayName("RomFsEncryptedProvider: PFS test")
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    void pfsValidation(){
 | 
					    void pfsValidation(){
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue