diff --git a/NDecrypt.Nitro/DSTool.cs b/NDecrypt.Nitro/DSTool.cs
index f1665f4..86c889f 100644
--- a/NDecrypt.Nitro/DSTool.cs
+++ b/NDecrypt.Nitro/DSTool.cs
@@ -1,8 +1,10 @@
using System;
+using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using NDecrypt.Core;
using NDecrypt.Nitro.Headers;
+using SabreTools.Models.Nitro;
namespace NDecrypt.Nitro
{
@@ -42,15 +44,15 @@ namespace NDecrypt.Nitro
using (BinaryReader reader = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
using (BinaryWriter writer = new BinaryWriter(File.Open(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)))
{
- NDSHeader? header = NDSHeader.Read(reader);
- if (header == null)
+ Cart? cart = NDSHeader.Read(reader);
+ if (cart == null)
{
Console.WriteLine("Error: Not a DS or DSi Rom!");
return false;
}
// Process the secure area
- ProcessSecureArea(header, reader, writer);
+ ProcessSecureArea(cart, reader, writer);
}
return true;
@@ -66,10 +68,10 @@ namespace NDecrypt.Nitro
///
/// Process secure area in the DS/DSi file
///
- /// NDS header representing the DS file
+ /// Cart representing the DS file
/// BinaryReader representing the input stream
/// BinaryWriter representing the output stream
- private void ProcessSecureArea(NDSHeader ndsHeader, BinaryReader reader, BinaryWriter writer)
+ private void ProcessSecureArea(Cart cart, BinaryReader reader, BinaryWriter writer)
{
// If we're forcing the operation, tell the user
if (decryptArgs.Force)
@@ -79,7 +81,7 @@ namespace NDecrypt.Nitro
// If we're not forcing the operation, check to see if we should be proceeding
else
{
- bool? isDecrypted = DSTool.CheckIfDecrypted(reader);
+ bool? isDecrypted = CheckIfDecrypted(reader);
if (isDecrypted == null)
{
Console.WriteLine("File has an empty secure area, cannot proceed");
@@ -92,7 +94,7 @@ namespace NDecrypt.Nitro
}
}
- ProcessARM9(ndsHeader, reader, writer);
+ ProcessARM9(cart.CommonHeader!, reader, writer);
Console.WriteLine("File has been " + (decryptArgs.Encrypt ? "encrypted" : "decrypted"));
}
@@ -159,10 +161,10 @@ namespace NDecrypt.Nitro
///
/// Process the secure ARM9 region of the file, if possible
///
- /// NDS header representing the DS file
+ /// CommonHeader representing the DS header
/// BinaryReader representing the input stream
/// BinaryWriter representing the output stream
- private void ProcessARM9(NDSHeader ndsHeader, BinaryReader reader, BinaryWriter writer)
+ private void ProcessARM9(CommonHeader commonHeader, BinaryReader reader, BinaryWriter writer)
{
// Seek to the beginning of the secure area
reader.BaseStream.Seek(0x4000, SeekOrigin.Begin);
@@ -173,7 +175,7 @@ namespace NDecrypt.Nitro
uint p1 = reader.ReadUInt32();
// Perform the initialization steps
- Init1(ndsHeader);
+ Init1(commonHeader);
if (!decryptArgs.Encrypt) Decrypt(ref p1, ref p0);
_arg2[1] <<= 1;
_arg2[2] >>= 1;
@@ -231,7 +233,7 @@ namespace NDecrypt.Nitro
}
Encrypt(ref p1, ref p0);
- Init1(ndsHeader);
+ Init1(commonHeader);
Encrypt(ref p1, ref p0);
writer.Write(p0);
@@ -242,11 +244,11 @@ namespace NDecrypt.Nitro
///
/// First common initialization step
///
- /// NDS header representing the DS file
- private void Init1(NDSHeader ndsHeader)
+ /// CommonHeader representing the DS file
+ private void Init1(CommonHeader commonHeader)
{
Buffer.BlockCopy(Constants.NDSEncryptionData, 0, _cardHash, 0, 4 * (1024 + 18));
- _arg2 = [ndsHeader.Gamecode, ndsHeader.Gamecode >> 1, ndsHeader.Gamecode << 1];
+ _arg2 = [commonHeader.GameCode, commonHeader.GameCode >> 1, commonHeader.GameCode << 1];
Init2();
Init2();
}
diff --git a/NDecrypt.Nitro/Headers/NDSHeader.cs b/NDecrypt.Nitro/Headers/NDSHeader.cs
index 3e62ddd..d46bd0a 100644
--- a/NDecrypt.Nitro/Headers/NDSHeader.cs
+++ b/NDecrypt.Nitro/Headers/NDSHeader.cs
@@ -1,578 +1,145 @@
using System.IO;
+using System.Text;
+using SabreTools.Models.Nitro;
namespace NDecrypt.Nitro.Headers
{
- internal class NDSHeader
+ internal static class NDSHeader
{
- #region Common
-
///
- /// Game Title
- ///
- public char[]? GameTitle { get; private set; }
-
- ///
- /// Gamecode
- ///
- public uint Gamecode { get; private set; }
-
- ///
- /// Makercode
- ///
- public char[]? Makercode { get; private set; }
-
- ///
- /// Unitcode
- ///
- public NDSUnitcode Unitcode { get; private set; }
-
- ///
- /// Encryption seed select (device code. 0 = normal)
- ///
- public byte EncryptionSeedSelect { get; private set; }
-
- ///
- /// Devicecapacity
- ///
- public byte Devicecapacity { get; private set; }
- public int DeviceCapacityInBytes { get { return (1 << Devicecapacity) * (1024 * 1024); } }
-
- ///
- /// Reserved
- ///
- public byte[]? Reserved1 { get; private set; }
-
- ///
- /// Game Revision (used by DSi titles)
- ///
- public ushort GameRevision { get; private set; }
-
- ///
- /// ROM Version
- ///
- public byte RomVersion { get; private set; }
-
- ///
- /// Internal flags, (Bit2: Autostart)
- ///
- public byte InternalFlags { get; private set; }
-
- ///
- /// ARM9 rom offset
- ///
- public uint ARM9RomOffset { get; private set; }
-
- ///
- /// ARM9 entry address
- ///
- public uint ARM9EntryAddress { get; private set; }
-
- ///
- /// ARM9 load address
- ///
- public uint ARM9LoadAddress { get; private set; }
-
- ///
- /// ARM9 size
- ///
- public uint ARM9Size { get; private set; }
-
- ///
- /// ARM7 rom offset
- ///
- public uint ARM7RomOffset { get; private set; }
-
- ///
- /// ARM7 entry address
- ///
- public uint ARM7EntryAddress { get; private set; }
-
- ///
- /// ARM7 load address
- ///
- public uint ARM7LoadAddress { get; private set; }
-
- ///
- /// ARM7 size
- ///
- public uint ARM7Size { get; private set; }
-
- ///
- /// File Name Table (FNT) offset
- ///
- public uint FileNameTableOffset { get; private set; }
-
- ///
- /// File Name Table (FNT) length
- ///
- public uint FileNameTableLength { get; private set; }
-
- ///
- /// File Allocation Table (FNT) offset
- ///
- public uint FileAllocationTableOffset { get; private set; }
-
- ///
- /// File Allocation Table (FNT) length
- ///
- public uint FileAllocationTableLength { get; private set; }
-
- ///
- /// File Name Table (FNT) offset
- ///
- public uint ARM9OverlayOffset { get; private set; }
-
- ///
- /// File Name Table (FNT) length
- ///
- public uint ARM9OverlayLength { get; private set; }
-
- ///
- /// File Name Table (FNT) offset
- ///
- public uint ARM7OverlayOffset { get; private set; }
-
- ///
- /// File Name Table (FNT) length
- ///
- public uint ARM7OverlayLength { get; private set; }
-
- ///
- /// Normal card control register settings (0x00416657 for OneTimePROM)
- ///
- public byte[]? NormalCardControlRegisterSettings { get; private set; }
-
- ///
- /// Secure card control register settings (0x081808F8 for OneTimePROM)
- ///
- public byte[]? SecureCardControlRegisterSettings { get; private set; }
-
- ///
- /// Icon Banner offset (NDSi same as NDS, but with new extra entries)
- ///
- public uint IconBannerOffset { get; private set; }
-
- ///
- /// Secure area (2K) CRC
- ///
- public ushort SecureAreaCRC { get; private set; }
-
- ///
- /// Secure transfer timeout (0x0D7E for OneTimePROM)
- ///
- public ushort SecureTransferTimeout { get; private set; }
-
- ///
- /// ARM9 autoload
- ///
- public byte[]? ARM9Autoload { get; private set; }
-
- ///
- /// ARM7 autoload
- ///
- public byte[]? ARM7Autoload { get; private set; }
-
- ///
- /// Secure disable
- ///
- public byte[]? SecureDisable { get; private set; }
-
- ///
- /// NTR region ROM size (excluding DSi area)
- ///
- public uint NTRRegionRomSize { get; private set; }
-
- ///
- /// Header size
- ///
- public uint HeaderSize { get; private set; }
-
- ///
- ///Reserved (0x88, 0x8C, 0x90 = Unknown, used by DSi)
- ///
- public byte[]? Reserved2 { get; private set; }
-
- ///
- /// Nintendo Logo
- ///
- public byte[]? NintendoLogo { get; private set; }
-
- ///
- /// Nintendo Logo CRC
- ///
- public ushort NintendoLogoCRC { get; private set; }
-
- ///
- /// Header CRC
- ///
- public ushort HeaderCRC { get; private set; }
-
- ///
- /// Debugger reserved
- ///
- public byte[]? DebuggerReserved { get; private set; }
-
- #endregion
-
- #region Extended DSi
-
- ///
- /// Global MBK1..MBK5 Settings
- ///
- public byte[]? GlobalMBK15Settings { get; private set; }
-
- ///
- /// Local MBK6..MBK8 Settings for ARM9
- ///
- public byte[]? LocalMBK68SettingsARM9 { get; private set; }
-
- ///
- /// Local MBK6..MBK8 Settings for ARM7
- ///
- public byte[]? LocalMBK68SettingsARM7 { get; private set; }
-
- ///
- /// Global MBK9 Setting
- ///
- public byte[]? GlobalMBK9Setting { get; private set; }
-
- ///
- ///
- ///
- public byte[]? RegionFlags { get; private set; }
-
- ///
- /// Access control
- ///
- public byte[]? AccessControl { get; private set; }
-
- ///
- /// ARM7 SCFG EXT mask (controls which devices to enable)
- ///
- public byte[]? ARM7SCFGEXTMask { get; private set; }
-
- ///
- /// Reserved/flags? When bit2 of byte 0x1bf is set, usage of banner.sav from the title data dir is enabled.(additional banner data)
- ///
- public byte[]? ReservedFlags { get; private set; }
-
- ///
- /// ARM9i rom offset
- ///
- public uint ARM9iRomOffset { get; private set; }
-
- ///
- /// Reserved
- ///
- public byte[]? Reserved3 { get; private set; }
-
- ///
- /// ARM9i load address
- ///
- public uint ARM9iLoadAddress { get; private set; }
-
- ///
- /// ARM9i size;
- ///
- public uint ARM9iSize { get; private set; }
-
- ///
- /// ARM7i rom offset
- ///
- public uint ARM7iRomOffset { get; private set; }
-
- ///
- /// Pointer to base address where various structures and parameters are passed to the title - what is that???
- ///
- public byte[]? Reserved4 { get; private set; }
-
- ///
- /// ARM7i load address
- ///
- public uint ARM7iLoadAddress { get; private set; }
-
- ///
- /// ARM7i size;
- ///
- public uint ARM7iSize { get; private set; }
-
- ///
- /// Digest NTR region offset
- ///
- public uint DigestNTRRegionOffset { get; private set; }
-
- ///
- /// Digest NTR region length
- ///
- public uint DigestNTRRegionLength { get; private set; }
-
- //
- /// Digest TWL region offset
- ///
- public uint DigestTWLRegionOffset { get; private set; }
-
- ///
- /// Digest TWL region length
- ///
- public uint DigestTWLRegionLength { get; private set; }
-
- //
- /// Digest Sector Hashtable region offset
- ///
- public uint DigestSectorHashtableRegionOffset { get; private set; }
-
- ///
- /// Digest Sector Hashtable region length
- ///
- public uint DigestSectorHashtableRegionLength { get; private set; }
-
- //
- /// Digest Block Hashtable region offset
- ///
- public uint DigestBlockHashtableRegionOffset { get; private set; }
-
- ///
- /// Digest Block Hashtable region length
- ///
- public uint DigestBlockHashtableRegionLength { get; private set; }
-
- ///
- /// Digest Sector size
- ///
- public uint DigestSectorSize { get; private set; }
-
- ///
- /// Digeset Block Sectorount
- ///
- public uint DigestBlockSectorCount { get; private set; }
-
- ///
- /// Icon Banner Size (usually 0x23C0)
- ///
- public uint IconBannerSize { get; private set; }
-
- ///
- /// Unknown (used by DSi)
- ///
- public byte[]? Unknown1 { get; private set; }
-
- ///
- /// NTR+TWL region ROM size (total size including DSi area)
- ///
- public uint NTRTWLRegionRomSize { get; private set; }
-
- ///
- /// Unknown (used by DSi)
- ///
- public byte[]? Unknown2 { get; private set; }
-
- ///
- /// Modcrypt area 1 offset
- ///
- public uint ModcryptArea1Offset { get; private set; }
-
- ///
- /// Modcrypt area 1 size
- ///
- public uint ModcryptArea1Size { get; private set; }
-
- ///
- /// Modcrypt area 2 offset
- ///
- public uint ModcryptArea2Offset { get; private set; }
-
- ///
- /// Modcrypt area 2 size
- ///
- public uint ModcryptArea2Size { get; private set; }
-
- ///
- /// Title ID
- ///
- public byte[]? TitleID { get; private set; }
-
- ///
- /// DSiWare: "public.sav" size
- ///
- public uint DSiWarePublicSavSize { get; private set; }
-
- ///
- /// DSiWare: "private.sav" size
- ///
- public uint DSiWarePrivateSavSize { get; private set; }
-
- ///
- /// Reserved (zero)
- ///
- public byte[]? ReservedZero { get; private set; }
-
- ///
- /// Unknown (used by DSi)
- ///
- public byte[]? Unknown3 { get; private set; }
-
- ///
- /// ARM9 (with encrypted secure area) SHA1 HMAC hash
- ///
- public byte[]? ARM9WithSecureAreaSHA1HMACHash { get; private set; }
-
- ///
- /// ARM7 SHA1 HMAC hash
- ///
- public byte[]? ARM7SHA1HMACHash { get; private set; }
-
- ///
- /// Digest master SHA1 HMAC hash
- ///
- public byte[]? DigestMasterSHA1HMACHash { get; private set; }
-
- ///
- /// Banner SHA1 HMAC hash
- ///
- public byte[]? BannerSHA1HMACHash { get; private set; }
-
- ///
- /// ARM9i (decrypted) SHA1 HMAC hash
- ///
- public byte[]? ARM9iDecryptedSHA1HMACHash { get; private set; }
-
- ///
- /// ARM7i (decrypted) SHA1 HMAC hash
- ///
- public byte[]? ARM7iDecryptedSHA1HMACHash { get; private set; }
-
- ///
- /// Reserved
- ///
- public byte[]? Reserved5 { get; private set; }
-
- ///
- /// ARM9 (without secure area) SHA1 HMAC hash
- ///
- public byte[]? ARM9NoSecureAreaSHA1HMACHash { get; private set; }
-
- ///
- /// Reserved
- ///
- public byte[]? Reserved6 { get; private set; }
-
- ///
- /// Reserved and unchecked region, always zero. Used for passing arguments in debug environment.
- ///
- public byte[]? ReservedAndUnchecked { get; private set; }
-
- ///
- /// RSA signature (the first 0xE00 bytes of the header are signed with an 1024-bit RSA signature).
- ///
- public byte[]? RSASignature { get; private set; }
-
- #endregion
-
- ///
- /// Read from a stream and get an NDS/NDSi header, if possible
+ /// Read from a stream and get an NDS/NDSi Cart, if possible
///
/// BinaryReader representing the input stream
- /// NDS/NDSi header object, null on error
- public static NDSHeader? Read(BinaryReader reader)
+ /// NDS/NDSi Cart object, null on error
+ public static Cart? Read(BinaryReader reader)
{
- var header = new NDSHeader();
+ var cart = new Cart();
try
{
- header.GameTitle = reader.ReadChars(0xC);
- header.Gamecode = reader.ReadUInt32();
- header.Makercode = reader.ReadChars(2);
- header.Unitcode = (NDSUnitcode)reader.ReadByte();
- header.EncryptionSeedSelect = reader.ReadByte();
- header.Devicecapacity = reader.ReadByte();
- header.Reserved1 = reader.ReadBytes(7);
- header.GameRevision = reader.ReadUInt16();
- header.RomVersion = reader.ReadByte();
- header.InternalFlags = reader.ReadByte();
- header.ARM9RomOffset = reader.ReadUInt32();
- header.ARM9EntryAddress = reader.ReadUInt32();
- header.ARM9LoadAddress = reader.ReadUInt32();
- header.ARM9Size = reader.ReadUInt32();
- header.ARM7RomOffset = reader.ReadUInt32();
- header.ARM7EntryAddress = reader.ReadUInt32();
- header.ARM7LoadAddress = reader.ReadUInt32();
- header.ARM7Size = reader.ReadUInt32();
- header.FileNameTableOffset = reader.ReadUInt32();
- header.FileNameTableLength = reader.ReadUInt32();
- header.FileAllocationTableOffset = reader.ReadUInt32();
- header.FileAllocationTableLength = reader.ReadUInt32();
- header.ARM9OverlayOffset = reader.ReadUInt32();
- header.ARM9OverlayLength = reader.ReadUInt32();
- header.ARM7OverlayOffset = reader.ReadUInt32();
- header.ARM7OverlayLength = reader.ReadUInt32();
- header.SecureDisable = reader.ReadBytes(8);
- header.NTRRegionRomSize = reader.ReadUInt32();
- header.HeaderSize = reader.ReadUInt32();
- header.Reserved2 = reader.ReadBytes(56);
- header.NintendoLogo = reader.ReadBytes(156);
- header.NintendoLogoCRC = reader.ReadUInt16();
- header.DebuggerReserved = reader.ReadBytes(0x20);
+ var commonHeader = new CommonHeader();
- // If we have a DSi compatible title
- if (header.Unitcode == NDSUnitcode.NDSPlusDSi
- || header.Unitcode == NDSUnitcode.DSi)
- {
- header.GlobalMBK15Settings = reader.ReadBytes(20);
- header.LocalMBK68SettingsARM9 = reader.ReadBytes(12);
- header.LocalMBK68SettingsARM7 = reader.ReadBytes(12);
- header.GlobalMBK9Setting = reader.ReadBytes(4);
- header.RegionFlags = reader.ReadBytes(4);
- header.AccessControl = reader.ReadBytes(4);
- header.ARM7SCFGEXTMask = reader.ReadBytes(4);
- header.ReservedFlags = reader.ReadBytes(4);
- header.ARM9iRomOffset = reader.ReadUInt32();
- header.Reserved3 = reader.ReadBytes(4);
- header.ARM9iLoadAddress = reader.ReadUInt32();
- header.ARM9iSize = reader.ReadUInt32();
- header.ARM7iRomOffset = reader.ReadUInt32();
- header.Reserved4 = reader.ReadBytes(4);
- header.ARM7iLoadAddress = reader.ReadUInt32();
- header.ARM7iSize = reader.ReadUInt32();
- header.DigestNTRRegionOffset = reader.ReadUInt32();
- header.DigestNTRRegionLength = reader.ReadUInt32();
- header.DigestTWLRegionOffset = reader.ReadUInt32();
- header.DigestTWLRegionLength = reader.ReadUInt32();
- header.DigestSectorHashtableRegionOffset = reader.ReadUInt32();
- header.DigestSectorHashtableRegionLength = reader.ReadUInt32();
- header.DigestBlockHashtableRegionOffset = reader.ReadUInt32();
- header.DigestBlockHashtableRegionLength = reader.ReadUInt32();
- header.DigestSectorSize = reader.ReadUInt32();
- header.DigestBlockSectorCount = reader.ReadUInt32();
- header.IconBannerSize = reader.ReadUInt32();
- header.Unknown1 = reader.ReadBytes(4);
- header.ModcryptArea1Offset = reader.ReadUInt32();
- header.ModcryptArea1Size = reader.ReadUInt32();
- header.ModcryptArea2Offset = reader.ReadUInt32();
- header.ModcryptArea2Size = reader.ReadUInt32();
- header.TitleID = reader.ReadBytes(8);
- header.DSiWarePublicSavSize = reader.ReadUInt32();
- header.DSiWarePrivateSavSize = reader.ReadUInt32();
- header.ReservedZero = reader.ReadBytes(176);
- header.Unknown2 = reader.ReadBytes(0x10);
- header.ARM9WithSecureAreaSHA1HMACHash = reader.ReadBytes(20);
- header.ARM7SHA1HMACHash = reader.ReadBytes(20);
- header.DigestMasterSHA1HMACHash = reader.ReadBytes(20);
- header.BannerSHA1HMACHash = reader.ReadBytes(20);
- header.ARM9iDecryptedSHA1HMACHash = reader.ReadBytes(20);
- header.ARM7iDecryptedSHA1HMACHash = reader.ReadBytes(20);
- header.Reserved5 = reader.ReadBytes(40);
- header.ARM9NoSecureAreaSHA1HMACHash = reader.ReadBytes(20);
- header.Reserved6 = reader.ReadBytes(2636);
- header.ReservedAndUnchecked = reader.ReadBytes(0x180);
- header.RSASignature = reader.ReadBytes(0x80);
- }
+ byte[] gameTitleBytes = reader.ReadBytes(0x0C);
+ commonHeader.GameTitle = Encoding.ASCII.GetString(gameTitleBytes);
+ commonHeader.GameCode = reader.ReadUInt32();
+ byte[] makerCodeBytes = reader.ReadBytes(2);
+ commonHeader.MakerCode = Encoding.ASCII.GetString(makerCodeBytes);
+ commonHeader.UnitCode = (Unitcode)reader.ReadByte();
+ commonHeader.EncryptionSeedSelect = reader.ReadByte();
+ commonHeader.DeviceCapacity = reader.ReadByte();
+ commonHeader.Reserved1 = reader.ReadBytes(7);
+ commonHeader.GameRevision = reader.ReadUInt16();
+ commonHeader.RomVersion = reader.ReadByte();
+ commonHeader.InternalFlags = reader.ReadByte();
+ commonHeader.ARM9RomOffset = reader.ReadUInt32();
+ commonHeader.ARM9EntryAddress = reader.ReadUInt32();
+ commonHeader.ARM9LoadAddress = reader.ReadUInt32();
+ commonHeader.ARM9Size = reader.ReadUInt32();
+ commonHeader.ARM7RomOffset = reader.ReadUInt32();
+ commonHeader.ARM7EntryAddress = reader.ReadUInt32();
+ commonHeader.ARM7LoadAddress = reader.ReadUInt32();
+ commonHeader.ARM7Size = reader.ReadUInt32();
+ commonHeader.FileNameTableOffset = reader.ReadUInt32();
+ commonHeader.FileNameTableLength = reader.ReadUInt32();
+ commonHeader.FileAllocationTableOffset = reader.ReadUInt32();
+ commonHeader.FileAllocationTableLength = reader.ReadUInt32();
+ commonHeader.ARM9OverlayOffset = reader.ReadUInt32();
+ commonHeader.ARM9OverlayLength = reader.ReadUInt32();
+ commonHeader.ARM7OverlayOffset = reader.ReadUInt32();
+ commonHeader.ARM7OverlayLength = reader.ReadUInt32();
+ commonHeader.SecureDisable = reader.ReadBytes(8);
+ commonHeader.NTRRegionRomSize = reader.ReadUInt32();
+ commonHeader.HeaderSize = reader.ReadUInt32();
+ commonHeader.Reserved2 = reader.ReadBytes(56);
+ commonHeader.NintendoLogo = reader.ReadBytes(156);
+ commonHeader.NintendoLogoCRC = reader.ReadUInt16();
+ commonHeader.DebuggerReserved = reader.ReadBytes(0x20);
- return header;
+ cart.CommonHeader = commonHeader;
}
catch
{
return null;
}
+
+ try
+ {
+ // If we have a DSi compatible title
+ if (cart.CommonHeader.UnitCode == Unitcode.NDSPlusDSi
+ || cart.CommonHeader.UnitCode == Unitcode.DSi)
+ {
+ var extendedDsiHeader = new ExtendedDSiHeader();
+
+ extendedDsiHeader.GlobalMBK15Settings = new uint[5];
+ for (int i = 0; i < 5; i++)
+ {
+ extendedDsiHeader.GlobalMBK15Settings[i] = reader.ReadUInt32();
+ }
+ extendedDsiHeader.LocalMBK68SettingsARM9 = new uint[3];
+ for (int i = 0; i < 3; i++)
+ {
+ extendedDsiHeader.LocalMBK68SettingsARM9[i] = reader.ReadUInt32();
+ }
+ extendedDsiHeader.LocalMBK68SettingsARM7 = new uint[3];
+ for (int i = 0; i < 3; i++)
+ {
+ extendedDsiHeader.LocalMBK68SettingsARM7[i] = reader.ReadUInt32();
+ }
+ extendedDsiHeader.GlobalMBK9Setting = reader.ReadUInt32();
+ extendedDsiHeader.RegionFlags = reader.ReadUInt32();
+ extendedDsiHeader.AccessControl = reader.ReadUInt32();
+ extendedDsiHeader.ARM7SCFGEXTMask = reader.ReadUInt32();
+ extendedDsiHeader.ReservedFlags = reader.ReadUInt32();
+ extendedDsiHeader.ARM9iRomOffset = reader.ReadUInt32();
+ extendedDsiHeader.Reserved3 = reader.ReadUInt32();
+ extendedDsiHeader.ARM9iLoadAddress = reader.ReadUInt32();
+ extendedDsiHeader.ARM9iSize = reader.ReadUInt32();
+ extendedDsiHeader.ARM7iRomOffset = reader.ReadUInt32();
+ extendedDsiHeader.Reserved4 = reader.ReadUInt32();
+ extendedDsiHeader.ARM7iLoadAddress = reader.ReadUInt32();
+ extendedDsiHeader.ARM7iSize = reader.ReadUInt32();
+ extendedDsiHeader.DigestNTRRegionOffset = reader.ReadUInt32();
+ extendedDsiHeader.DigestNTRRegionLength = reader.ReadUInt32();
+ extendedDsiHeader.DigestTWLRegionOffset = reader.ReadUInt32();
+ extendedDsiHeader.DigestTWLRegionLength = reader.ReadUInt32();
+ extendedDsiHeader.DigestSectorHashtableRegionOffset = reader.ReadUInt32();
+ extendedDsiHeader.DigestSectorHashtableRegionLength = reader.ReadUInt32();
+ extendedDsiHeader.DigestBlockHashtableRegionOffset = reader.ReadUInt32();
+ extendedDsiHeader.DigestBlockHashtableRegionLength = reader.ReadUInt32();
+ extendedDsiHeader.DigestSectorSize = reader.ReadUInt32();
+ extendedDsiHeader.DigestBlockSectorCount = reader.ReadUInt32();
+ extendedDsiHeader.IconBannerSize = reader.ReadUInt32();
+ extendedDsiHeader.Unknown1 = reader.ReadUInt32();
+ extendedDsiHeader.ModcryptArea1Offset = reader.ReadUInt32();
+ extendedDsiHeader.ModcryptArea1Size = reader.ReadUInt32();
+ extendedDsiHeader.ModcryptArea2Offset = reader.ReadUInt32();
+ extendedDsiHeader.ModcryptArea2Size = reader.ReadUInt32();
+ extendedDsiHeader.TitleID = reader.ReadBytes(8);
+ extendedDsiHeader.DSiWarePublicSavSize = reader.ReadUInt32();
+ extendedDsiHeader.DSiWarePrivateSavSize = reader.ReadUInt32();
+ extendedDsiHeader.ReservedZero = reader.ReadBytes(176);
+ extendedDsiHeader.Unknown2 = reader.ReadBytes(0x10);
+ extendedDsiHeader.ARM9WithSecureAreaSHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.ARM7SHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.DigestMasterSHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.BannerSHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.ARM9iDecryptedSHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.ARM7iDecryptedSHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.Reserved5 = reader.ReadBytes(40);
+ extendedDsiHeader.ARM9NoSecureAreaSHA1HMACHash = reader.ReadBytes(20);
+ extendedDsiHeader.Reserved6 = reader.ReadBytes(2636);
+ extendedDsiHeader.ReservedAndUnchecked = reader.ReadBytes(0x180);
+ extendedDsiHeader.RSASignature = reader.ReadBytes(0x80);
+
+ cart.ExtendedDSiHeader = extendedDsiHeader;
+ }
+ }
+ catch
+ {
+ return null;
+ }
+
+ return cart;
}
}
}
diff --git a/NDecrypt.Nitro/NDecrypt.Nitro.csproj b/NDecrypt.Nitro/NDecrypt.Nitro.csproj
index 65873b8..9b0d750 100644
--- a/NDecrypt.Nitro/NDecrypt.Nitro.csproj
+++ b/NDecrypt.Nitro/NDecrypt.Nitro.csproj
@@ -1,42 +1,46 @@
-
-
- net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0
- false
- false
- latest
- enable
- true
- true
- 0.2.5
+
+
+ net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0
+ false
+ false
+ latest
+ enable
+ true
+ true
+ 0.2.5
-
- Matt Nadareski
- NDS encryption and decryption code
- Copyright (c) Matt Nadareski 2019-2024
- MIT
- https://github.com/SabreTools/
- https://github.com/SabreTools/NDecrypt
- git
-
+
+ Matt Nadareski
+ NDS encryption and decryption code
+ Copyright (c) Matt Nadareski 2019-2024
+ MIT
+ https://github.com/SabreTools/
+ https://github.com/SabreTools/NDecrypt
+ git
+
-
-
- win-x86;win-x64
-
-
- win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64
-
-
- win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64
-
-
- net6.0;net7.0;net8.0
-
+
+
+ win-x86;win-x64
+
+
+ win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64
+
+
+ win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64
+
+
+ net6.0;net7.0;net8.0
+
-
-
-
+
+
+
-
+
+
+
+
+
\ No newline at end of file