A library that reimplements parts of the Nintendo Switch OS
Find a file
Alex Barney a68426751f Introduce multi-instance, thread-safe streams
Previously multiple streams could share the same base stream. This meant that you couldn't alternate between streams. If you read from one stream, the state of other streams sharing the same base stream would be messed up and would silently return bad data.

This commit introduces a SharedStream class that allows multiple SharedStreams to share the same base class and not interfere with each other.
2018-08-22 15:54:34 -05:00
hactoolnet Introduce multi-instance, thread-safe streams 2018-08-22 15:54:34 -05:00
libhac Introduce multi-instance, thread-safe streams 2018-08-22 15:54:34 -05:00
libhac.Nand Get title keys from a nand dump 2018-07-13 10:25:39 -05:00
NandReader Get title keys from a nand dump 2018-07-13 10:25:39 -05:00
NandReaderGui Add nand reader sample for reading title keys 2018-07-14 15:48:41 -05:00
.gitattributes Add .gitignore and .gitattributes. 2018-06-16 12:11:30 -05:00
.gitignore NAX0 key derivation 2018-06-20 18:19:50 -05:00
KEYS.md Add console keyset example 2018-07-09 13:57:02 -05:00
libhac.sln Add nand reader sample for reading title keys 2018-07-14 15:48:41 -05:00
libhac.sln.DotSettings Add console keyset example 2018-07-09 13:57:02 -05:00
LICENSE Create LICENSE 2018-06-26 09:36:47 -05:00
README.md Read console-unique keys 2018-07-09 11:47:44 -05:00

libhac

libhac is a .NET or .NET Core library for opening, decrypting and extracting common content file formats used by the Nintendo Switch.

All content is imported and exported as .NET streams. This means that reading nested file types and encryptions can easily be done by linking different file readers together.
For example, the files from a title stored on the external SD card can be read or extracted in this way.
NAX0 Reader -> NCA Reader -> RomFS Reader -> Individual Files

hactoolnet

hactoolnet is an example program that uses libhac. It is used in a similar manner to hactool.

Usage

Usage: hactoolnet [options...] <path>
Options:
  -r, --raw            Keep raw data, don't unpack.
  -y, --verify         Verify hashes.
  -k, --keyset         Load keys from an external file.
  -t, --intype=type    Specify input file type [nca, switchfs]
  --titlekeys <file>   Load title keys from an external file.
NCA options:
  --section0 <file>    Specify Section 0 file path.
  --section1 <file>    Specify Section 1 file path.
  --section2 <file>    Specify Section 2 file path.
  --section3 <file>    Specify Section 3 file path.
  --section0dir <dir>  Specify Section 0 directory path.
  --section1dir <dir>  Specify Section 1 directory path.
  --section2dir <dir>  Specify Section 2 directory path.
  --section3dir <dir>  Specify Section 3 directory path.
  --listromfs          List files in RomFS.
  --basenca            Set Base NCA to use with update partitions.
Switch FS options:
  --sdseed <seed>      Set console unique seed for SD card NAX0 encryption.
  --listapps           List application info.
  --listtitles         List title info for all titles.
  --title <title id>   Specify title ID to use.
  --outdir <dir>       Specify directory path to save title to.
  --romfsdir <dir>     Specify RomFS directory path.

Examples

List applications on a Switch SD card or NAND

hactoolnet -t switchfs --sdseed <sd_seed> --listapps <sd_root_path>

Extract a title from an SD card or NAND as NCA files

hactoolnet -t switchfs --sdseed <sd_seed> --title <title_id> --outdir output <sd_root_path>

Extract the RomFS from a title from an SD card or NAND

hactoolnet -t switchfs --sdseed <sd_seed> --title <title_id> --romfsdir romfs <sd_root_path>

Specifying the base title ID will extract the unpatched title.
Specifying the patch title ID will extract the patched title.

External Keys

Keys can be loaded from a text file by specifying a filename with the -k argument. The file should be in the same format read by hactool:
"Keyset files are text files containing one key per line, in the form "key_name = HEXADECIMALKEY". Case shouldn't matter, nor should whitespace."

Console-unique keys can be loaded from a text file by specifying a filename with the --consolekeys argument. The file format is the same as the main keyset file.

Title keys can be loaded from a text file by specifying a filename with the --titlekeys argument. The file should contain one key per line in the form rights_id,HEXADECIMALKEY.

If a keyfile is not set at the command line, hactoolnet will search for and load keyfiles in $HOME/.switch/prod.keys, $HOME/.switch/console.keys and $HOME/.switch/title.keys.