# icf-reader Tools for decoding, decrypting and encrypting ICFs ## Usage ```shell Usage: icf-reader.exe 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: ```typescript 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 } interface IcfOptionData { type: "Option", app_id: string, // Does not go into the ICF, so can be anything, but must be specified option_id: string, // Must be 4 characters required_system_version: Version, // Can be zeroed out, e.g. { major: 0, minor: 0, build: 0 } datetime: string, // ISO8601 string yyyy-MM-dd'T'HH:mm:ss } interface IcfPatchData { type: "Patch", id: string, // Does not go into the ICF, so can be anything, but must be specified 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, } 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= ICF_IV= cargo build --release ls target/release/icf-reader.exe ```