Read, edit, decrypt and encrypt install configuration files (ICFs)
Go to file
2024-01-02 17:40:16 +07:00
src Refactor + allow creating ICFs from JSON 2024-01-02 17:40:16 +07:00
.gitignore Refactor + allow creating ICFs from JSON 2024-01-02 17:40:16 +07:00
Cargo.lock Refactor + allow creating ICFs from JSON 2024-01-02 17:40:16 +07:00
Cargo.toml Refactor + allow creating ICFs from JSON 2024-01-02 17:40:16 +07:00
LICENSE Initial commit 2024-01-02 14:06:22 +07:00
README.md Refactor + allow creating ICFs from JSON 2024-01-02 17:40:16 +07:00

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
}

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=<key> ICF_IV=<iv> cargo build --release

ls target/release/icf-reader.exe