This page documents the format of NCSD.
Overview
There are two known specialisations of the NCSD container format. The CTR Cart Image (CCI) format and the 3DS' raw NAND format. CCI is the format of game ROM images.
CTR System Update (CSU) is a variant of CCI, where the only difference is in the file extension. This is used with developer System Updates and associated Tools.
NCSD images start with a NCSD header, followed by up to a maximum of 8 NCCH partitions.
For CCI images, the partitions are reserved as follows:
NCCH Index | Reserved Use |
---|---|
0 | Executable Content (CXI) |
1 | E-Manual (CFA) |
2 | Download Play Child container (CFA) |
7 | Update Data (CFA) |
The format of partitions can be determined from the partition FS flags (normally these are zero for CCI/CSU NCSD Images).
NCSD header
Offset | Size | Description |
---|---|---|
0x000 | 0x100 | RSA-2048 SHA-256 signature of the NCSD header |
0x100 | 4 | Magic Number 'NCSD' |
0x104 | 4 | Size of the NCSD image, in media units (1 media unit = 0x200 bytes) |
0x108 | 8 | Media ID |
0x110 | 8 | Partitions FS type (0=None, 1=Normal, 3=FIRM, 4=AGB_FIRM save) |
0x118 | 8 | Partitions crypt type |
0x120 | 0x40=(4+4)*8 | Offset & Length partition table, in media units |
0x160 | 0xA0 | ... |
For carts,
Offset | Size | Description |
---|---|---|
0x160 | 0x20 | Exheader SHA-256 hash |
0x180 | 0x4 | Additional header size |
0x184 | 0x4 | Sector zero offset |
0x188 | 8 | Partition Flags (See Below) |
0x190 | 0x40=8*8 | Partition ID table |
0x1D0 | 0x30 | Reserved |
For NAND,
Offset | Size | Description |
---|---|---|
0x160 | 0x5E | Unknown |
0x1BE | 0x42 | Per-console keys? |
Partition Flags
Byte Index | Description |
---|---|
0 | Backup Write Wait Time (The time to wait to write save to backup after the card is recognized (0-255 seconds)).NATIVE_FIRM loads this flag from the gamecard NCSD header starting with 6.0.0-11. |
3 | Media Card Device (1 = NOR Flash, 2 = None, 3 = BT) (SDK 3.X+) |
4 | Media Platform Index (1 = CTR) |
5 | Media Type Index (0 = Inner Device, 1 = Card1, 2 = Card2, 3 = Extended Device) |
6 | Media Unit Size i.e. u32 MediaUnitSize = 0x200*2^flags[6]; |
7 | Media Card Device (1 = NOR Flash, 2 = None, 3 = BT) (Only SDK 2.X) |
Partition Flags (In Terms of Save Crypto Determination)
Byte Index | Description |
---|---|
1 | Starting with 6.0.0-11 NATIVE_FIRM will use this flag to determine the gamecard savegame keyY method, when flag[3] is set. 0 = 2.0.0-2 hashed keyY, 1 = new keyY method implemented with 6.0.0-11. |
3 | Support for this flag was implemented in NATIVE_FIRM with 2.0.0-2. When this flag is set the hashed gamecard savegame keyY method is used, this likely still uses the repeating-CTR however. With 6.0.0-11 the system will determine the gamecard savegame keyY method via flag[1], instead of just using the hashed keyY via this flag. |
7 | This flag enables using the hashed gamecard savegame keyY method, support for this flag was implemented in NATIVE_FIRM with 2.2.0-4. All games with the NCSD image finalized since 2.2.0-4(and contains 2.2.0-4+ in the system update partition) have this flag set, this flag also enables using new CTR method as well. |
Card Info Header
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x200 | 4 | CARD2: Writable Address In Media Units (For 'On-Chip' Savedata). CARD1: Always 0xFFFFFFFF. |
0x204 | 4 | Card Info Bitmask |
0x208 | 0xDF8 | Reserved1 |
0x1000 | 8 | Media ID (same as first NCCH partitionId) |
0x1008 | 8 | Reserved2 |
0x1010 | 0x30 | Initial Data |
0x1040 | 0xC0 | Reserved |
0x1100 | 0x100 | Copy of first NCCH header (excluding RSA signature) |
Development Card Info Header Extension
OFFSET | SIZE | DESCRIPTION |
---|---|---|
0x1200 | 0x200 | CardDeviceReserved1 |
0x1400 | 0x10 | TitleKey |
0x1410 | 0xF0 | CardDeviceReserved2 |
Tools
ctrtool - (CMD)(Windows/Linux) Parsing NCSD files
3DSExplorer - (GUI)(Windows Only) Parsing NCSD files