From bd1c6f8b51be11a45eff2f4f12884481a7897ff1 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 8 Apr 2019 20:28:14 -0700 Subject: [PATCH] Processing in right files --- 3DSDecrypt/Headers/NCCHHeader.cs | 39 ++++++++++++++++++++++++++++---- 3DSDecrypt/Headers/NCSDHeader.cs | 23 ++----------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/3DSDecrypt/Headers/NCCHHeader.cs b/3DSDecrypt/Headers/NCCHHeader.cs index 8764a06..0023031 100644 --- a/3DSDecrypt/Headers/NCCHHeader.cs +++ b/3DSDecrypt/Headers/NCCHHeader.cs @@ -247,13 +247,42 @@ namespace ThreeDS.Headers } } + /// + /// Process a single partition + /// + /// BinaryReader representing the input stream + /// BinaryWriter representing the output stream + /// NCSD header representing the 3DS file + /// True if we want to encrypt the partitions, false otherwise + /// True if development keys should be used, false otherwise + public void ProcessPartition(BinaryReader reader, BinaryWriter writer, NCSDHeader header, bool encrypt, bool development) + { + // Check if the 'NoCrypto' bit is set + if (Flags.PossblyDecrypted ^ encrypt) + { + Console.WriteLine($"Partition {PartitionNumber}: Already " + (encrypt ? "Encrypted" : "Decrypted") + "?..."); + return; + } + + // Determine the Keys to be used + SetEncryptionKeys(header.BackupHeader.Flags, encrypt, development); + + // Process each of the pieces if they exist + ProcessExtendedHeader(reader, writer, header.MediaUnitSize, encrypt); + ProcessExeFS(reader, writer, header.MediaUnitSize, encrypt); + ProcessRomFS(reader, writer, header.MediaUnitSize, header.BackupHeader.Flags, encrypt, development); + + // Write out new CryptoMethod and BitMask flags + UpdateCryptoAndMasks(reader, writer, header, encrypt); + } + /// /// Determine the set of keys to be used for encryption or decryption /// /// File backup flags for encryption /// True if we're encrypting the file, false otherwise /// True if development keys should be used, false otherwise - public void SetEncryptionKeys(NCCHHeaderFlags backupFlags, bool encrypt, bool development) + private void SetEncryptionKeys(NCCHHeaderFlags backupFlags, bool encrypt, bool development) { KeyX = 0; KeyX2C = (development ? Constants.DevKeyX0x2C : Constants.KeyX0x2C); @@ -321,7 +350,7 @@ namespace ThreeDS.Headers /// BinaryWriter representing the output stream /// Number of bytes per media unit /// True if we want to encrypt the extended header, false otherwise - public bool ProcessExtendedHeader(BinaryReader reader, BinaryWriter writer, uint mediaUnitSize, bool encrypt) + private bool ProcessExtendedHeader(BinaryReader reader, BinaryWriter writer, uint mediaUnitSize, bool encrypt) { if (ExtendedHeaderSizeInBytes > 0) { @@ -349,7 +378,7 @@ namespace ThreeDS.Headers /// BinaryWriter representing the output stream /// Number of bytes per media unit /// True if we want to encrypt the extended header, false otherwise - public void ProcessExeFS(BinaryReader reader, BinaryWriter writer, uint mediaUnitSize, bool encrypt) + private void ProcessExeFS(BinaryReader reader, BinaryWriter writer, uint mediaUnitSize, bool encrypt) { if (ExeFSSizeInMediaUnits > 0) { @@ -469,7 +498,7 @@ namespace ThreeDS.Headers /// File backup flags for encryption /// True if we want to encrypt the extended header, false otherwise /// True if development keys should be used, false otherwise - public void ProcessRomFS(BinaryReader reader, BinaryWriter writer, uint mediaUnitSize, NCCHHeaderFlags backupFlags, bool encrypt, bool development) + private void ProcessRomFS(BinaryReader reader, BinaryWriter writer, uint mediaUnitSize, NCCHHeaderFlags backupFlags, bool encrypt, bool development) { if (RomFSOffsetInMediaUnits != 0) { @@ -531,7 +560,7 @@ namespace ThreeDS.Headers /// BinaryWriter representing the output stream /// NCSD header for the 3DS file /// True if we're writing encrypted values, false otherwise - public void UpdateCryptoAndMasks(BinaryReader reader, BinaryWriter writer, NCSDHeader header, bool encrypt) + private void UpdateCryptoAndMasks(BinaryReader reader, BinaryWriter writer, NCSDHeader header, bool encrypt) { // Write the new CryptoMethod writer.BaseStream.Seek((Entry.Offset * header.MediaUnitSize) + 0x18B, SeekOrigin.Begin); diff --git a/3DSDecrypt/Headers/NCSDHeader.cs b/3DSDecrypt/Headers/NCSDHeader.cs index c54d70a..aac24f9 100644 --- a/3DSDecrypt/Headers/NCSDHeader.cs +++ b/3DSDecrypt/Headers/NCSDHeader.cs @@ -330,8 +330,7 @@ namespace ThreeDS.Headers /// BinaryWriter representing the output stream /// True if we want to encrypt the partitions, false otherwise /// True if development keys should be used, false otherwise - /// - public bool ProcessAllPartitions(BinaryReader reader, BinaryWriter writer, bool encrypt, bool development) + public void ProcessAllPartitions(BinaryReader reader, BinaryWriter writer, bool encrypt, bool development) { // Iterate over all 8 NCCH partitions for (int p = 0; p < 8; p++) @@ -340,26 +339,8 @@ namespace ThreeDS.Headers if (partitionHeader == null) continue; - // Check if the 'NoCrypto' bit is set - if (partitionHeader.Flags.PossblyDecrypted ^ encrypt) - { - Console.WriteLine($"Partition {p}: Already " + (encrypt ? "Encrypted" : "Decrypted") + "?..."); - continue; - } - - // Determine the Keys to be used - partitionHeader.SetEncryptionKeys(BackupHeader.Flags, encrypt, development); - - // Process each of the pieces if they exist - partitionHeader.ProcessExtendedHeader(reader, writer, MediaUnitSize, encrypt); - partitionHeader.ProcessExeFS(reader, writer, MediaUnitSize, encrypt); - partitionHeader.ProcessRomFS(reader, writer, MediaUnitSize, BackupHeader.Flags, encrypt, development); - - // Write out new CryptoMethod and BitMask flags - partitionHeader.UpdateCryptoAndMasks(reader, writer, this, encrypt); + partitionHeader.ProcessPartition(reader, writer, this, encrypt, development); } - - return true; } ///