Read, edit, decrypt and encrypt install configuration files (ICFs)
.cargo | ||
src | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
LICENSE | ||
README.md |
icf-reader
Tools for decoding, decrypting and encrypting ICFs
Usage
Usage: icf-reader.exe <COMMAND>
Commands:
encrypt Fixes some common ICF errors, then encrypt the given ICF
decrypt Decrypts the given ICF
decode Decodes the given ICF (optionally to a JSON file)
encode Encodes a JSON file from the decode subcommand to an ICF
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
Encrypting the ICF will also correct CRC checksums, so worrying about the correct checksum is not needed.
Creating an ICF file from JSON
The JSON file is an array of IcfData
, which follows the format below:
interface Version {
major: number;
minor: number;
build: number;
}
interface IcfInnerData {
type: "System" | "App",
id: string, // Must be 3 characters for "System" and 4 characters for "App"
version: Version,
required_system_version: Version,
datetime: string, // ISO8601 string yyyy-MM-dd'T'HH:mm:ss
is_prerelease: boolean,
}
interface IcfOptionData {
type: "Option",
option_id: string, // Must be 4 characters
datetime: string, // ISO8601 string yyyy-MM-dd'T'HH:mm:ss
is_prerelease: boolean,
}
interface IcfPatchData {
type: "Patch",
sequence_number: number, // Incremented for every patch, starting from 1
source_version: Version,
source_datetime: string, // ISO8601 string yyyy-MM-dd'T'HH:mm:ss
source_required_system_version: Version,
target_version: Version,
target_datetime: string, // ISO8601 string yyyy-MM-dd'T'HH:mm:ss
target_required_system_version: Version,
is_prerelease: boolean,
}
type IcfData = IcfInnerData | IcfOptionData | IcfPatchData;
At least one entry of type System
and App
must be specified.
When done, create your ICF using icf-reader.exe encode input.json output.icf
.
Building
ICF_KEY=<key> ICF_IV=<iv> cargo build --release
ls target/release/icf-reader.exe