icf-reader/README.md
2024-01-03 00:34:18 +07:00

77 lines
2.0 KiB
Markdown

# icf-reader
Tools for decoding, decrypting and encrypting ICFs
## Usage
```shell
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:
```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
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
```