SD Filesystem: Difference between revisions

3dsguy (talk | contribs)
mNo edit summary
Wwylele (talk | contribs)
No edit summary
 
(2 intermediate revisions by 2 users not shown)
Line 4: Line 4:
  sdmc
  sdmc
  ├── DCIM
  ├── DCIM
  └── Nintendo 3DS
  ├── Nintendo 3DS
    ├── <ID0>
│  ├── <ID0>
    │  └── <ID1>
│  │  └── <ID1>
    │      ├── [[SD Savedata Backups|backups]]
│  │      ├── [[SD Savedata Backups|backups]]
    │      ├── [[Title Database|dbs]]
│  │      ├── [[Title Database|dbs]]
    │      ├── [[extdata]]
│  │      ├── [[extdata]]
    │      ├── [[Title Data Structure|title]]
│  │      ├── [[Title Data Structure|title]]
    │      └── [[DSiWare_Exports|Nintendo DSiWare]]
│  │      └── [[DSiWare_Exports|Nintendo DSiWare]]
    └── [[SD Filesystem#Private|Private]]
│  └── [[SD Filesystem#Private|Private]]
   
└── [[SD Filesystem#Other Private Data|private]]
    └── Nintendo 3DS
        └── app


* Everything stored under sdmc/Nintendo 3DS/<ID0>/<ID1> is encrypted with console-unique [[AES|keyslots]], files stored under [[Flash Filesystem|nand/data/<ID0>]] only use these keyslots for MACs. All CTR files under these directories use the keyslots initialized by [[nand/private/movable.sed]].
 
* Everything stored under sdmc/Nintendo 3DS/<ID0>/<ID1> is encrypted by 128 bit AES-CTR with console-unique [[AES|keyslots]]. The keyslot is initialized by [[nand/private/movable.sed]].
* The crypto IV/CTR for each file is generated as follows: take the UTF-16 path relative to sdmc/Nintendo 3DS/<ID0>/<ID1> (the path it self begins with "/") and hash it with SHA-256, including the null null-terminator. Then calculate CTR as CTRbyte[i] = Hashbyte[i] ^ Hashbyte[16+i] for i = 0 to 15.
* The base CTR is fixed for each file, therefore the CTR never changes after each write. Thus it is possible to obtain some cleartext by XORing one file(like newly created extdata) with a newer file, where the newer file overwrote zeros in the original file with non-zero data.
* Files stored under [[Flash Filesystem|nand/data/<ID0>]] also use the same keyslot, but it is only used for MACs.
* ID0 is the first 0x10-bytes from a SHA256 [[nand/private/movable.sed|hash]].  
* ID0 is the first 0x10-bytes from a SHA256 [[nand/private/movable.sed|hash]].  
* ID1 is the scrambled SD card CID from the SD card which this directory was originally created on. To generate this directory name from the original CID, first the CID is rotated 8-bits to the left. Then, each u16 is moved as described in the below table:
* ID1 is the scrambled SD card CID from the SD card which this directory was originally created on. To generate this directory name from the original CID, first the CID is rotated 8-bits to the left. Then, each u16 is moved as described in the below table:
Line 72: Line 78:
When you want to install and see pictures with 3DS, rename to 8 numbers.mpo and save it on /DCIM.
When you want to install and see pictures with 3DS, rename to 8 numbers.mpo and save it on /DCIM.
Under the sound private dir is: voice/XX/*.m4a. Where XX is 01-10, with sound saved as .m4a.
Under the sound private dir is: voice/XX/*.m4a. Where XX is 01-10, with sound saved as .m4a.
== Other Private Data ==
There is also a directory called "private" on the root of the SD card that contains data, in which would otherwise be completely different from what the Nintendo 3DS normally uses, but known to the application itself.
Some apps, such as Flipnote Studio 3D create a directory called "private" on the root of the SD Card, it contains a Nintendo 3DS directory inside it. Inside the app directory contains a directory with the game code of the application (eg. "JKZP" for Flipnote Studio 3D), then its corresponding data, as shown here:
/private/Nintendo 3DS/app/<Game Code>/
In this case of Flipnote Studio 3D, there are multiple files with an ID, then ending with the .kwz extension. There is also a !!.lst file as well.