Read, edit, decrypt and encrypt install configuration files (ICFs)
Go to file
beerpsi 70944065e3 Release 0.1.4 2024-03-22 16:16:19 +07:00
.cargo skip serializing unimportant fields 2024-01-02 18:28:33 +07:00
src feat: allow version to be specified as a string 2024-03-22 16:06:06 +07:00
.gitignore feat: allow version to be specified as a string 2024-03-22 16:06:06 +07:00
Cargo.lock Release 0.1.4 2024-03-22 16:16:19 +07:00
Cargo.toml Release 0.1.4 2024-03-22 16:16:19 +07:00
LICENSE Initial commit 2024-01-02 14:06:22 +07:00
README.md feat: allow version to be specified as a string 2024-03-22 16:06:06 +07:00

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:

// Version can also be specified as a string with *exactly* three components:
// - "80.54.01": OK
// - "80.54.01.00": NG
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