Read, edit, decrypt and encrypt install configuration files (ICFs)
Go to file
2024-01-03 00:41:09 +07:00
.cargo skip serializing unimportant fields 2024-01-02 18:28:33 +07:00
src fix: remove debugging code 2024-01-03 00:41:09 +07:00
.gitignore Refactor + allow creating ICFs from JSON 2024-01-02 17:40:16 +07:00
Cargo.lock fix: remove debugging code 2024-01-03 00:41:09 +07:00
Cargo.toml fix: remove debugging code 2024-01-03 00:41:09 +07:00
LICENSE Initial commit 2024-01-02 14:06:22 +07:00
README.md feat: Add support for prerelease entries 2024-01-03 00:34:18 +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
    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