Skip to content

Commit 7cb9c4a

Browse files
committed
add args to override specific KELF header data
1 parent 0af19e0 commit 7cb9c4a

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

src/kelf.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ void xor_bit(const void *a, const void *b, void *Result, size_t Length)
8484
}
8585
}
8686

87+
extern uint8_t GSystemtype;
88+
extern uint8_t GMGZones;
89+
extern uint16_t GFlags;
90+
extern uint8_t GApplicationType;
91+
8792
int Kelf::LoadKelf(const std::string &filename)
8893
{
8994
FILE *f = fopen(filename.c_str(), "rb");
@@ -390,11 +395,11 @@ int Kelf::SaveKelf(const std::string &filename, int headerid)
390395
memcpy(header.UserDefined, USER_HEADER, 16);
391396
header.ContentSize = Content.size(); // sometimes zero
392397
header.HeaderSize = bitTable.HeaderSize; // header + header signature + kbit + kc + bittable + bittable signature + root signature
393-
header.SystemType = SYSTEM_TYPE_PS2; // same for COH (arcade)
394-
header.ApplicationType = 1; // 1 = xosdmain, 5 = dvdplayer kirx 7 = dvdplayer kelf 0xB - ?? 0x00 - ??
398+
header.SystemType = GSystemtype; // same for COH (arcade)
399+
header.ApplicationType = GApplicationType; // 1 = xosdmain, 5 = dvdplayer kirx 7 = dvdplayer kelf 0xB - ?? 0x00 - ??
395400
// TODO: implement and check 3DES/1DES difference based on header.Flags. In both - encryption and decryption.
396-
header.Flags = HDR_PREDEF_KELF; // ?? 00000010 00101100 binary, 0x021C for kirx
397-
header.MGZones = 0xFF; // region bit, 1 - allowed
401+
header.Flags = GFlags; // ?? 00000010 00101100 binary, 0x021C for kirx
402+
header.MGZones = GMGZones; // region bit, 1 - allowed
398403
header.BitCount = 0;
399404
// ?? balika, wisi: strange value, represents number of blacklisted iLinkID, ConsoleID
400405
// iLinkID (8 bytes), consoleID (8 bytes) placed between header.MGZones and HeaderSignature

src/kelftool.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
#include "keystore.h"
2121
#include "kelf.h"
2222

23+
uint8_t GSystemtype = SYSTEM_TYPE_PS2;
24+
uint8_t GMGZones = REGION_ALL_ALLOWED;
25+
uint16_t GFlags = HDR_PREDEF_KELF;
26+
uint8_t GApplicationType = KELFTYPE_XOSDMAIN;
27+
2328
// TODO: implement load/save kelf header configuration for byte-perfect encryption, decryption
2429

2530
std::string getKeyStorePath()
@@ -89,6 +94,41 @@ int encrypt(int argc, char **argv)
8994
if (!strncmp("--keys=", argv[x], strlen("--keys="))) {
9095
printf("- Custom keyset %s\n", &argv[x][7]);
9196
KeyStoreEntry = &argv[x][7];
97+
} else if (!strncmp("--systemtype=", argv[x], strlen("--systemtype="))) {
98+
const char* a = &argv[x][13];
99+
long t;
100+
if (!strcmp(a, "PS2")) {
101+
GSystemtype = SYSTEM_TYPE_PS2;
102+
} else if (!strcmp(a, "PSX")) {
103+
GSystemtype = SYSTEM_TYPE_PSX;
104+
} else if ((t = strtoul(a, NULL, 10)) <= std::numeric_limits<std::uint8_t>::max()) {
105+
GSystemtype = (uint8_t)t;
106+
}
107+
} else if (!strncmp("--kflags=", argv[x], strlen("--kflags="))) {
108+
const char* a = &argv[x][9];
109+
unsigned long t;
110+
if (!strcmp(a, "KELF")) {
111+
GFlags = HDR_PREDEF_KELF;
112+
} else if (!strcmp(a, "KIRX")) {
113+
GFlags = HDR_PREDEF_KIRX;
114+
} else if ((t = strtoul(a, NULL, 16)) <= std::numeric_limits<std::uint16_t>::max()) {
115+
GFlags = (uint16_t)t;
116+
if ((GFlags & HDR_FLAG4_1DES) && (GFlags & HDR_FLAG4_3DES)) {
117+
printf("WARNING: 0x%x specifies both Single and Triple DES. only one should be defined\n", GFlags);
118+
}
119+
}
120+
} else if (!strncmp("--mgzone=", argv[x], strlen("--mgzone="))) {
121+
const char* a = &argv[x][9];
122+
long t;
123+
if ((t = strtoul(a, NULL, 16))<std::numeric_limits<std::uint8_t>::max()) {
124+
GMGZones = (uint8_t)t;
125+
}
126+
} else if (!strncmp("--apptype=", argv[x], strlen("--apptype="))) {
127+
const char* a = &argv[x][10];
128+
long t;
129+
if ((t = strtoul(a, NULL, 16)) <= std::numeric_limits<std::uint8_t>::max()) {
130+
GApplicationType = (uint8_t)t;
131+
}
92132
}
93133
}
94134

0 commit comments

Comments
 (0)