Editing PKG files
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
See also {{talk}} page | See also {{talk}} page | ||
= Firmware Packages = | |||
= | == File Header == | ||
All values are in big endian format. | |||
typedef struct { | |||
u32 0x00, 0x53434500// magic | |||
u32 0x04, 2 // version | |||
u16 0x08, 0 // sdk type? | |||
u16 0x0a, 3 // SCE header type; pkg | |||
u32 0x0c, 0 // meta offset | |||
u64 0x10, // size of sce_hdr + sizeof meta_hdr | |||
u64 0x18, 0x80 // + content_size_real | |||
} | |||
typedef struct | |||
} | |||
= | = Game Packages = | ||
All game packages are signed with the ECDSA signature. The public key for it can be found in '''download_plugin.prx''' or in '''nas_plugin.prx''' (this also applies to NPDRM SELFs). Usually game packages are signed with two signatures - one for the header and the other for the entry table. | |||
The | |||
== File Header == | == File Header == | ||
=== Example from a retail PS3 .pkg === | |||
=== Example from a | |||
*Example: Scott Pilgrim VS. The World Unlock .pkg [http://zeus.dl.playstation.net/cdn/UP0001/NPUB30162_00/bG751I62Aych0U2E7hsxD5vKS28NurYg8CmJln6oQV4LUDAfXGSOyQHE45reFxIuwD5Qjo1xnQleHqulmmx9HmjNnXX8P5O5jcXlD.pkg file]: | *Example: Scott Pilgrim VS. The World Unlock .pkg [http://zeus.dl.playstation.net/cdn/UP0001/NPUB30162_00/bG751I62Aych0U2E7hsxD5vKS28NurYg8CmJln6oQV4LUDAfXGSOyQHE45reFxIuwD5Qjo1xnQleHqulmmx9HmjNnXX8P5O5jcXlD.pkg file]: | ||
Line 181: | Line 39: | ||
'''000000B0''' <span style="background-color:#3f48cc; color:#FFFFFF">CC 02 B4 35 2B 70 47 D6</span> <span style="background-color:#a349a4; color:#FFFFFF;">EC 61 40 39 A6 5B DC BD</span> М.ґ5+pGЦмa@9¦[ЬЅ | '''000000B0''' <span style="background-color:#3f48cc; color:#FFFFFF">CC 02 B4 35 2B 70 47 D6</span> <span style="background-color:#a349a4; color:#FFFFFF;">EC 61 40 39 A6 5B DC BD</span> М.ґ5+pGЦмa@9¦[ЬЅ | ||
=== | === PKG header === | ||
{| class="wikitable" | {| class="wikitable sortable" | ||
|- | |- | ||
| style="background-color:#515243; color:#FFFFFF;" |'''Name''' | |||
| style="background-color:#515243; color:#FFFFFF;" |'''Offset''' | |||
| style="background-color:#515243; color:#FFFFFF;" |'''Size''' | |||
| style="background-color:#515243; color:#FFFFFF;" |'''Example''' | |||
| style="background-color:#515243; color:#FFFFFF;" |'''Remark''' | |||
|- | |- | ||
| <span style="background:#ff0000;">magic || 0x00 || 0x04 || 7F 50 4B 47 || | | <span style="background:#ff0000;">magic || 0x00 || 0x04 || 7F 50 4B 47 || '.PKG' | ||
|- | |- | ||
| <span style="background-color:#008000; color:#FFFFFF;">pkg_revision || 0x04 || 0x02 || 80 00 || 80 00 for finalized | | <span style="background-color:#008000; color:#FFFFFF;">pkg_revision || 0x04 || 0x02 || 80 00 || 80 00 for retail (finalized), 00 00 for debug (non finalized) | ||
|- | |- | ||
| <span style="background-color:#3F48CC; color:#FFFFFF;">pkg_type || 0x06 || 0x02 || 00 01 || 00 01 for PS3, 00 02 for PSP and | | <span style="background-color:#3F48CC; color:#FFFFFF;">pkg_type || 0x06 || 0x02 || 00 01 || 00 01 for PS3, 00 02 for PSP and PSVita | ||
|- | |- | ||
| <span style="background-color:#B5E61D;">pkg_metadata_offset || 0x08 || 0x04 || 00 00 00 C0 || | | <span style="background-color:#B5E61D;">pkg_metadata_offset || 0x08 || 0x04 || 00 00 00 C0 || 0xC0, usually 0x280 for PSP and PSVita | ||
|- | |- | ||
| <span style="background-color:#B97A57;">pkg_metadata_count || 0x0C || 0x04 || 00 00 00 08 || | | <span style="background-color:#B97A57;">pkg_metadata_count || 0x0C || 0x04 || 00 00 00 08 || item count | ||
|- | |- | ||
| <span style="background-color:#ff7f27;">pkg_metadata_size || 0x10 || 0x04 || 00 00 00 C0 || usually 0xC0 for PSP and PS3, usually 0x160 for | | <span style="background-color:#ff7f27;">pkg_metadata_size || 0x10 || 0x04 || 00 00 00 C0 || usually 0xC0 for PSP and PS3, usually 0x160 for PSVita | ||
|- | |- | ||
| <span style="background-color:#fff200;">item_count || 0x14 || 0x04 || 00 00 00 02 || files and folders into the encrypted data | | <span style="background-color:#fff200;">item_count || 0x14 || 0x04 || 00 00 00 02 || files and folders into the encrypted data | ||
Line 215: | Line 75: | ||
| <span style="background-color:#000000; color:#ffffff;">digest || 0x60 || 0x10 || 09 8B A2 CA 2D 30 30 1F 8B 5B 82 79 C6 70 35 F3 || sha1 from debug files and attributes together merged in one block | | <span style="background-color:#000000; color:#ffffff;">digest || 0x60 || 0x10 || 09 8B A2 CA 2D 30 30 1F 8B 5B 82 79 C6 70 35 F3 || sha1 from debug files and attributes together merged in one block | ||
|- | |- | ||
| <span style="background-color:#ed1c24;">pkg_data_riv || 0x70 || 0x10 || D5 FA 15 9E 7F AC 82 70 BB 3E 0C EB 97 3D 30 11 || | | <span style="background-color:#ed1c24;">pkg_data_riv || 0x70 || 0x10 || D5 FA 15 9E 7F AC 82 70 BB 3E 0C EB 97 3D 30 11 || aes-128-ctr iv. Used with gpkg_key to decrypt data. | ||
|- | |- | ||
| <span style="background-color:#808000;"> | | <span style="background-color:#808000;">header_cmac_hash || 0x80 || 0x10 || 48 0D 86 60 9F 26 8E 7F 4F B4 DA A4 33 1E 9A A1 || CMAC OMAC hash from 0x00-0x7F. PS3 gpkg_key used as key. | ||
|- | |||
| <span style="background-color:#3f48cc; color:#FFFFFF;">header_npdrm_signature || 0x90 || 0x28 || || PKG header NPDRM ECDSA (R_sig, S_sig) | |||
|- | |||
| <span style="background-color:#a349a4; color:#FFFFFF;">header_sha1_hash || 0xB8 || 0x08 || EC 61 40 39 A6 5B DC BD || last 8 bytes of sha1 hash of 0x00-0x7F | |||
|} | |} | ||
All values are in big endian format. | |||
typedef struct { | typedef struct { | ||
u32 magic; | u32 magic; | ||
Line 235: | Line 101: | ||
u8 digest[0x10]; | u8 digest[0x10]; | ||
u8 pkg_data_riv[0x10]; | u8 pkg_data_riv[0x10]; | ||
u8 header_cmac_hash[0x10]; | |||
u8 header_npdrm_signature[0x28]; | |||
u8 header_sha1_hash[0x8]; | |||
} PKG_HEADER; | } PKG_HEADER; | ||
=== PKG Metadata === | === PKG Metadata === | ||
typedef struct { | typedef struct { | ||
union { | union{ | ||
u32 packet_identifier; // 0-0x12 | u32 packet_identifier; // 0-0x12 | ||
u32 data_size; | u32 data_size; | ||
{ | { | ||
data | |||
} | } | ||
} ... | } ... | ||
// u8 padding[variable]; | // u8 padding[variable]; | ||
u8 unknown[0x40]; | |||
} PKG_METADATA; | } PKG_METADATA; | ||
{| class="wikitable" | {| class="wikitable" | ||
! Identifier !! | ! Identifier !! category name !! Possible size !! Possible values | ||
|- | |- | ||
|0x1 || | |0x1 || DRM Type || 4 || 0/5/6/7/8/9/0xA/0xB/0xC (unknown), 0x1 (network), 0x2 (local), 0x3 (DRMfree no license), 0x4 (PSP), 0xD (DRMfree with license), 0xE (PSM) | ||
|- | |- | ||
|0x2 | |0x2 || [[PKG_files#ContentType|ContentType]] || 4 || 00 00 00 07 | ||
|- | |- | ||
|0x3 | |0x3 || [[PKG_files#PackageType|PackageType]] / [[PKG_files#PackageFlag|PackageFlag]] / [[PKG_files#StorageType|StorageType]] (PSVita) || 4 || | ||
|- | |- | ||
|0x4 | |0x4 || Package Size || 8 || 00 00 00 00 0E 77 40 00 | ||
|- | |- | ||
|0x5 | |0x5 || make_package_npdrm Revision (2 bytes) + Package Version (2 bytes) || 4 || 09 60 00 00 (960, 0.00), 12 03 00 00 (1203, 0.00), 12 12 00 00 (1212, 0.00), 12 73 01 01 (1273, 1.01), 19 53 01 00 (1953, 1.00), 19 63 01 00, 19 66 01 00, 19 72 01 02 (1972, 1.02) | ||
|- | |- | ||
|0x6 | |0x6 || Version + App Version / [[TitleID]] (on size 0xC) || 0xC || "NPEG00005\0\0\0" | ||
|- | |- | ||
|0x7 | |0x7 || QA Digest (described as "This is a digest of packaged files and attributes.")|| 0x18 || 00 00 00 00 00 00 00 00 B5 76 E1 D9 00 EE 9B BC 8E 24 17 91 5D BC 5A CB | ||
|- | |- | ||
|0x8 | |0x8 || unk (1 byte) + PS3/PSP/PSP2 System Version (3 bytes) + Package Version + App Version || 8 || 00 00 00 00 00 00 00 00, 00 00 00 00 01 00 01 00, 44 01 70 00 01 01 00 00, 81 01 90 00 01 00 01 00, 81 04 75 00 01 02 01 00 (4.7500, 1.02, 1.00) --> 44 maybe PSP and 80/81 PS3 | ||
|- | |- | ||
|0x9 | |0x9 || unk || 8 || either 00 00 00 00 00 00 00 00 or 00 00 00 00 00 24 00 00 | ||
|- | |- | ||
|0xA | |0xA || InstallDirectory || 0x28 || 8 zeroed bytes + directory: ........UCES01264_FANTASY............... | ||
|- | |- | ||
|0xB | |0xB || unk seen in PSP cumulative patch || 0x8 || 00 00 00 00 00 00 00 01 | ||
|- | |- | ||
|0xC | |0xC || unk || || | ||
|- | |- | ||
|0xD || | |0xD || ?ECDSA sig (or hash)? || 0x28 || always 6 zeroed chars at the beginning | ||
00 00 00 00 00 00 05 A0 18 8B B1 8A E5 E8 40 FD EE 71 E2 27 60 55 E6 39 06 94 5B 65 89 04 B2 88 61 DA BB A3 B2 55 C5 C1 | |||
|- | |- | ||
|0xE | |0xE || [[PKG_files#PARAM_SFO_info|PARAM.SFO Info]] || 0x38 || 00 00 0C 10 00 00 05 0C 00 00 00 14 01 67 00 00 00 00 00 00 00 00 00 00 FC 3D 1E 32 FA F7 A6 11 90 46 A6 34 BE 98 9A 78 65 A8 92 25 3C 49 D7 69 73 53 32 E7 8E 06 1E 60 | ||
|- | |- | ||
|0xF | |0xF || [[PKG_files#unknown_data0_info|unknown_data0_info]] || 0x48 || 00 00 05 60 00 00 03 20 00 00 00 00 00 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 27 0F 26 BD 5C 2F 13 95 EB 16 E6 62 07 8D 9A E3 DC 0B AC 25 11 1C 19 39 B9 40 06 4E 82 AF 1E C3 | ||
00 00 06 10 00 00 03 20 00 00 01 F4 00 00 01 F7 00 00 00 00 01 01 01 01 A5 74 D5 71 00 03 00 01 00 00 00 00 00 00 00 00 79 52 B2 3F 78 3B 9D F4 C0 BB 26 C0 EC 14 1B 37 8B 9B 69 71 1C 22 C3 49 57 97 B6 DE 78 0A D0 00 | 00 00 06 10 00 00 03 20 00 00 01 F4 00 00 01 F7 00 00 00 00 01 01 01 01 A5 74 D5 71 00 03 00 01 00 00 00 00 00 00 00 00 79 52 B2 3F 78 3B 9D F4 C0 BB 26 C0 EC 14 1B 37 8B 9B 69 71 1C 22 C3 49 57 97 B6 DE 78 0A D0 00 | ||
|- | |- | ||
|0x10 | |0x10 || [[PKG_files#entirety_info| Entirety Info]] || 0x38 || 00 00 0A 00 00 00 00 A0 D3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 4D AD EB 44 67 51 C1 2D 69 95 46 8C 82 A9 3D 74 AD F4 62 49 90 BD EE F0 75 97 A3 B6 5B 17 48 | ||
00 00 0A B0 00 00 01 60 FF D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D2 7F 9E EF 38 F7 61 6E C1 C5 CC B1 E1 83 12 0C 6F 38 4C 8C 22 84 8B A4 3B 7B 47 57 77 C9 F9 C9 | 00 00 0A B0 00 00 01 60 FF D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D2 7F 9E EF 38 F7 61 6E C1 C5 CC B1 E1 83 12 0C 6F 38 4C 8C 22 84 8B A4 3B 7B 47 57 77 C9 F9 C9 | ||
|- | |- | ||
|0x11 | |0x11 || PublishingTools version (4 Bytes) + PFSBuilder version (4 Bytes) + padding (0x20 Bytes) || 0x28 || 01 60 00 00 00 06 23 47 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
02 07 00 00 00 07 60 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 02 07 00 00 00 07 60 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ||
|- | |- | ||
|0x12 | |0x12 || [[PKG_files#unknown_data2_info|unknown_data2_info]] (points to a 0x10 bytes buffer)|| 0x38 || 00 00 11 20 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CF 74 D5 30 04 99 F0 57 E8 65 20 5C 3D 71 12 36 F1 E4 EF BC 98 EA 52 F1 F0 60 E8 7C 8A 53 B8 A4 | ||
|} | |} | ||
Line 323: | Line 167: | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! content type !! type name !! install path (on ps3) !! notes | ||
|- | |- | ||
| | |0x00000001 || || || | ||
|- | |- | ||
| | |0x00000002 || || || | ||
|- | |- | ||
| | |0x00000003 || || || | ||
|- | |- | ||
| | |0x00000004 || GameData (also patches) || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000005 || GameExec || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000006 || PS1emu || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000007 || PSP & PCEngine || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000008 || || || | ||
|- | |- | ||
| | |0x00000009 || Theme || /dev_hdd0/theme || | ||
|- | |- | ||
| | |0x0000000A || Widget || /dev_hdd0/widget || | ||
|- | |- | ||
| | |0x0000000B || License || /dev_hdd0/home/<current user>/exdata || | ||
|- | |- | ||
| | |0x0000000C || VSHModule || /dev_hdd0/vsh/modules/ || | ||
|- | |- | ||
| | |0x0000000D || PSN Avatar || /dev_hdd0/home/<current user>/psn_avatar || | ||
|- | |- | ||
| | |0x0000000E || PSPgo || /dev_hdd0/game/ || Displayed as Unknown Album: Corrupted Data | ||
|- | |- | ||
| | |0x0000000F || minis || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000010 || NEOGEO || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000011 || VMC || /dev_hdd0/tmp/vmc/ || | ||
|- | |- | ||
| | |0x00000012 || ?PS2Classic? Seen on PS2 classic || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000013 || || || | ||
|- | |- | ||
| | |0x00000014 || Seen on PSP remastered || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x00000015 || PSP2GD (PSVita Game Data) || || | ||
|- | |- | ||
| | |0x00000016 || PSP2AC (PSVita Additional Content) || || | ||
|- | |- | ||
| | |0x00000017 || PSP2LA (PSVita LiveArea) || || | ||
|- | |- | ||
| | |0x00000018 || ?PSM? (PSVita PSM) || || | ||
|- | |- | ||
| | |0x00000019 || WT (Web TV?) || /dev_hdd0/game/ || | ||
|- | |- | ||
| | |0x0000001D || ?PSM? (PSVita PSM) || || | ||
|- | |- | ||
| | |0x0000001F || PSP2Theme (PSVita Theme) || || | ||
|} | |} | ||
Line 385: | Line 229: | ||
! Identifier !! type name !! usage !! notes | ! Identifier !! type name !! usage !! notes | ||
|- | |- | ||
| | | ex: 00 00 20 1E (+VC-MC+Finalized+CumulativePatch) || Patch || for PSP game updates, to use with CumulativePatch, IncrementalPatch, HybridPatch || | ||
|- | |- | ||
| | | unk || DiscGamePatch || for PS3 BD games || | ||
|- | |- | ||
| | | unk || HDDGamePatch || for PS3 HDD games (NPDRM) || | ||
|- | |- | ||
| | | unk || NoEBOOTBIN || || | ||
|- | |- | ||
| | | unk || Demo || || | ||
|- | |- | ||
| | | unk || Key || || | ||
|- | |- | ||
| | | ex: 00 00 30 1E (+VC-MC+Finalized+CumulativePatch+Patch) || Upgradable || || | ||
|} | |} | ||
To class : DiscBinded, NonGame | |||
=== PackageFlag === | === PackageFlag === | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! Identifier !! type name !! usage !! notes | ||
|- | |- | ||
| | | unk || RenameDirectory || || | ||
|- | |||
| unk || NoRenameDirectory || || | |||
|- | |||
| 4rd byte, bit: xxxx 111x, ex: 00 00 00 0E, 00 00 40 0E || Finalized || || | |||
|- | |||
| ex: 00 00 20 1E, 00 00 00 1E || CumulativePatch || Embeds the previous patches || to use with Patch StorageType | |||
|- | |||
| unk || IncrementalPatch || Requires the previous patches to be installed first || to use with Patch StorageType | |||
|- | |||
| unk || HybridPatch || || to use with Patch StorageType | |||
|- | |||
| 3rd byte, bit: x1xx xxxx, ex: 00 00 40 0E || NonGame || used for most of PSVita NPDRM apps || | |||
|} | |||
=== StorageType === | |||
Seams to be PSVita only. | |||
{| class="wikitable" | |||
! Identifier !! type name !! usage !! notes | |||
|- | |- | ||
| | | 3rd byte, bit:xx1x xxxx, ex: 00 00 20 0E, 00 00 20 1E || VC-MC || || | ||
|- | |- | ||
| | | default (when VC-MC flag is not set), ex: 00 00 00 0E, 00 00 00 1E || VC-VC || || | ||
|} | |||
=== package.conf (PS3/PSVita/PSP) === | |||
{| class="wikitable" | |||
! Config name !! usage !! expected value !! example | |||
|- | |- | ||
| | | Content_ID || needed || XXYYYY-XXXXYYYYY_00-XXXXXXXXXXXXXXXX || EP4153-NPEZ00314_00-0000111122223333 | ||
|- | |- | ||
| | | K_licensee (PS3) || needed (can be set to 0x00000...) || 0x00000000000000000000000000000000 || 0x0123456789ABCDEF0123456789ABCDEF | ||
|- | |- | ||
| | | DRMType || needed || Network / Free / Local || Free | ||
|- | |- | ||
| | | ContentType || needed || See [[PKG_files#ContentType]] || minis | ||
|- | |- | ||
| | | PackageVersion || needed || XX.XX || 01.02 | ||
|- | |- | ||
| | | PackageType || || See [[PKG_files#PackageType]] || DiscGamePatch | ||
|- | |- | ||
| | | PackageFlag || || See [[PKG_files#PackageFlag]] || RenameDirectory | ||
|- | |- | ||
| | | StorageType || needed for PSVita gamedata || See [[PKG_files#StorageType]] || VC-MC | ||
|- | |- | ||
| | | TitleID || used only for PSP and PS1 games || XXXXYYYYY || NPEZ00314 | ||
|- | |- | ||
| | | LimitedTimeStart || || YYYY-MM-DDThh:mmTZD || 2018-10-30T11:55T32 | ||
|- | |- | ||
| | | LimitedTimeEnd || || YYYY-MM-DDThh:mmTZD || 2019-10-30T11:55T32 | ||
|- | |- | ||
| | | InstallDirectory || used in PSP patches ?and DLCs? || ? || UCUS98744_LBPPDLCSONYPA002 | ||
|- | |- | ||
| | | ForcedInstallTo || Allows installing packages to any hdd directory (and even flash memory if it's mounted RW). || || | ||
|} | |} | ||
=== | === NPDRM.CONF (PSP) === | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! Config name !! usage !! expected value !! example | ||
|- | |||
| Content-ID || needed || XXYYYY-XXXXYYYYY_00-XXXXXXXXXXXXXXXX || EP4153-NPEZ00314_00-0000111122223333 | |||
|- | |||
| K-Licensee || needed (can be set to 0x00000...) || 0x00000000000000000000000000000000 || 0x0123456789ABCDEF0123456789ABCDEF | |||
|- | |||
| PackageVersion || needed || XX.XX || 01.02 | |||
|- | |||
| ProtectDocument || used in PSP Downloadable Game Package (PSP .pkg) | |||
Game Manual Protection | |||
To use NPDRM to protect the game manual, include the line "ProtectDocument = TRUE" in | |||
the configuration file. Like the downloadable game itself, once protected, the relevant game | |||
manual can only be browsed on a PSP™ that was authenticated with the user account used | |||
to purchase the downloadable game package. If "ProtectDocument = FALSE" is specified or | |||
if no specification is made, the game manual will not be protected by NPDRM. | |||
|| FALSE/TRUE || FALSE | |||
|- | |||
| [[PKG_files#HealthWarning|HealthWarning]] || used in PSP Downloadable Game Package (PSP .pkg) | |||
Startup Warning | |||
You can specify that a startup warning be displayed when the game is started up. Specify | |||
"HealthWarning = " followed by the specification word shown in the following table, which | |||
indicates the region or language where the downloadable game package will be released. | |||
See Chapter 7 for the corresponding text that is displayed. | |||
If "HealthWarning = NONE" is specified or if no specification is made, no startup warning | |||
will be displayed. | |||
|| NONE/[[PKG_files#HealthWarning|specification word]] || NONE | |||
|- | |||
| ZIPThreshold || used in PSP Downloadable Game Package (PSP .pkg) | |||
Compression Rate Specification | |||
During authoring of a downloadable game package, the data in the associated UMD™ | |||
image file is compressed. You can change the compression rate by specifying | |||
"ZIPThreshold=" followed by the compression rate (0 to 100). If there is no "ZIPThreshold=" | |||
specification, the compression rate will default to 80. If "ZIPThreshold=0" is specified, the | |||
data will not be compressed and there will no longer be any load for expanding the | |||
compressed data. However, the file size will increase and it will take longer for the user to | |||
download the package. Unless you specifically need to change the compression rate, do not | |||
include this specification. | |||
|| 0 to 100 || 80 | |||
|- | |||
| OptimizeLevel || used in PSP Downloadable Game Package (PSP .pkg) | |||
The SCE authoring service may change the optimization level to improve processing | |||
performance when the system reads data in a downloadable game. If this change hinders | |||
the behavior of a program that is being developed, you can include the specification | |||
"OptimizeLevel=" followed by the optimization level that was used previously during | |||
authoring. If there is no impediment to program behavior, you should not enter this | |||
specification. | |||
When the authoring service changes, refer to details that are publically available in the | |||
Technical Notes. | |||
|| ?0 to 100? || ?80? | |||
|- | |- | ||
| | | BootablePlatform || used in PSP minis Package (PSP minis .pkg) | ||
When creating a package for minis, in addition to the necessary parameters for downloadable | |||
games, "BootablePlatform = minis" must be set in NPDRM.CONF that is a configuration file | |||
for packaging. | |||
|| minis || minis | |||
|- | |- | ||
| | | BootablePlatformDetails || used in PSP minis Package (PSP minis .pkg) | ||
Game applications created via the Simple Authoring Service(SAS) having the above parameter | |||
specified can be executed on PlayStation®3. When it is required to prohibit a minis game | |||
application from running on the PlayStation®3 execution environment explicitly, set | |||
"BootablePlatformDetails=onlyPSP" to NPDRM.CONF in addition to the setting | |||
"BootablePlatform = minis". | |||
|| onlyPSP || onlyPSP | |||
|} | |} | ||
=== | === PARAM_SFO_info === | ||
typedef struct { // size is 0x38 | typedef struct { // size is 0x38 | ||
u32 param_offset; | u32 param_offset; | ||
u16 param_size; | u16 param_size; | ||
u32 unk_int; // | u32 unk_int; // ex: 0x2, 0x14, 0x4, 0x9 | ||
u32 | u32 PSP2_DISP_VER; // or may be PSP2_SYSTEM_VER | ||
u8 unk[0x8]; | u8 unk[0x8]; | ||
u8 param_digest[0x20]; // SHA256 of param_data. Called ParamDigest: This is sha256 digest of param.sfo. | u8 param_digest[0x20]; // SHA256 of param_data. Called ParamDigest: This is sha256 digest of param.sfo. | ||
} | } PARAM_SFO_info; | ||
=== | === unknown_data0_info === | ||
typedef struct { // size is 0x48 | typedef struct { // size is 0x48 | ||
Line 470: | Line 396: | ||
u8 unk[0x20]; | u8 unk[0x20]; | ||
u8 unknown_data_sha256[0x20]; | u8 unknown_data_sha256[0x20]; | ||
} | } unknown_data0_info; | ||
=== entirety_info === | === entirety_info === | ||
typedef struct { // size is 0x38 | typedef struct { // size is 0x38 | ||
u32 entirety_data_offset; // located just before SFO | u32 entirety_data_offset; // located just before SFO | ||
u32 entirety_data_size; // ex: 0xA0, C0, 0x100, 0x120, 0x160 | u32 entirety_data_size; // ex: 0xA0, C0, 0x100, 0x120, 0x160 | ||
u16 flags; // ex: EE 00, FE 10, FE 78, FE F8, FF 10, FF 90, FF D0, flags indicating which digests it embeds | u16 flags; // ex: EE 00, FE 10, FE 78, FE F8, FF 10, FF 90, FF D0, flags indicating which digests it embeds | ||
u16 unk; | u16 unk; | ||
u32 unk2_int; // ex: 1, 0 | u32 unk2_int; // ex: 1, 0 | ||
u8 unk3[0x8]; | u8 unk3[0x8]; | ||
u8 entirety_digest[0x20]; | u8 entirety_digest[0x20]; // SHA256 of entirety_data. Called EntiretyDigest: This is a digest of above digests. | ||
} entirety_info; | } entirety_info; | ||
{| class="wikitable" | {| class="wikitable" | ||
! Official Name !! Official Description !! Description !! Flags | ! Official Name !! Official Description !! Description !! Flags | ||
|- | |- | ||
| ContentDigest || This is a digest of content unique value. || May be located at offset 0x0 under encrypted form... || | | ContentDigest || This is a digest of content unique value. || May be located at offset 0x0 under encrypted form... || | ||
Line 507: | Line 427: | ||
| HeaderDigest || This is a digest of package header. || || | | HeaderDigest || This is a digest of package header. || || | ||
|- | |- | ||
| | | || || || | ||
|- | |- | ||
| | | || || || | ||
|- | |- | ||
| | | || || || | ||
|- | |- | ||
| | | || || || | ||
|- | |- | ||
| || || || | |||
|} | |} | ||
MISSING : TargetDigest, TargetGameDigest | |||
typedef struct { // size is 0xC0 | typedef struct { // size is 0xC0 | ||
Line 545: | Line 448: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
} entirety_data_C0_EE00; | } entirety_data_C0_EE00; | ||
typedef struct { // size is 0x100 | typedef struct { // size is 0x100 | ||
Line 555: | Line 458: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
u8 others_digest[0x20]; // ?SHA256? of ?? | u8 others_digest[0x20]; // ?SHA256? of ??. Called OthersDigest: This is a digest of sce_sys files except above files. | ||
} | } entirety_data_100_OTH; | ||
typedef struct { // size is 0x120 | typedef struct { // size is 0x120 | ||
u8 | u8 unk_digest[0x20]; | ||
u8 game_digest[0x20]; | u8 game_digest[0x20]; | ||
u8 program_digest[0x20]; | u8 program_digest[0x20]; | ||
Line 566: | Line 469: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
u8 livearea_digest[0x20]; // ?SHA256? of ?? | u8 livearea_digest[0x20]; // ?SHA256? of ??. Called LiveareaDigest: This is a digest of sce_sys/livearea(&retail) files. | ||
u8 others_digest[0x20]; // ?SHA256? of ?? | u8 others_digest[0x20]; // ?SHA256? of ??. Called OthersDigest: This is a digest of sce_sys files except above files. | ||
} entirety_data_120_LA_OTH_FF10; | } entirety_data_120_LA_OTH_FF10; | ||
typedef struct { // size is 0x140 | typedef struct { // size is 0x140 | ||
u8 | u8 unk_digest[0x20]; | ||
u8 game_digest[0x20]; | u8 game_digest[0x20]; | ||
u8 program_digest[0x20]; | u8 program_digest[0x20]; | ||
Line 591: | Line 481: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
u8 livearea_digest[0x20]; // ?SHA256? of ?? | u8 livearea_digest[0x20]; // ?SHA256? of ??. Called LiveareaDigest: This is a digest of sce_sys/livearea(&retail) files. | ||
u8 manual_digest[0x20]; // ?SHA256? of ?? | u8 manual_digest[0x20]; // ?SHA256? of ??. Called ManualDigest: This is a digest of sce_sys/manual files. | ||
u8 others_digest[0x20]; // ?SHA256? of ?? | u8 others_digest[0x20]; // ?SHA256? of ??. Called OthersDigest: This is a digest of sce_sys files except above files. | ||
} entirety_data_140_LA_MAN_OTH_FF90; | } entirety_data_140_LA_MAN_OTH_FF90; | ||
typedef struct { // size is 0x160 | typedef struct { // size is 0x160 | ||
Line 604: | Line 494: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
u8 livearea_digest[0x20]; // ?SHA256? of ?? | u8 livearea_digest[0x20]; // ?SHA256? of ??. Called LiveareaDigest: This is a digest of sce_sys/livearea(&retail) files. | ||
u8 manual_digest[0x20]; // ?SHA256? of ?? | u8 manual_digest[0x20]; // ?SHA256? of ??. Called ManualDigest: This is a digest of sce_sys/manual files. | ||
u8 trophy_digest[0x20]; // ?SHA256? of ?? | u8 trophy_digest[0x20]; // ?SHA256? of ??. Called TrophyDigest: This is a digest of sce_sys/trophy files. | ||
u8 others_digest[0x20]; // ?SHA256? of ?? | u8 others_digest[0x20]; // ?SHA256? of ??. Called OthersDigest: This is a digest of sce_sys files except above files. | ||
} | } entirety_data_160_LA_MAN_TRP_OTH; | ||
typedef struct { // size is 0x160 | typedef struct { // size is 0x160 | ||
u8 | u8 unk_digest[0x20]; | ||
u8 game_digest[0x20]; | u8 game_digest[0x20]; | ||
u8 program_digest[0x20]; | u8 program_digest[0x20]; | ||
Line 618: | Line 508: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
u8 trophy_digest[0x20]; // ?SHA256? of ?? | u8 trophy_digest[0x20]; // ?SHA256? of ??. Called TrophyDigest: This is a digest of sce_sys/trophy files. | ||
u8 change_info_digest[0x20]; // ?SHA256? of ?? | u8 change_info_digest[0x20]; // ?SHA256? of ??. Called ChangeInfoDigest: This is a digest of sce_sys/changeinfo files. | ||
u8 others_digest[0x20]; // ?SHA256? of ?? | u8 others_digest[0x20]; // ?SHA256? of ??. Called OthersDigest: This is a digest of sce_sys files except above files. | ||
u8 enc_origin_digest[0x20]; // ?SHA256? of ??. ENCRYPTED FORM !! | u8 enc_origin_digest[0x20]; // ?SHA256? of ??. ENCRYPTED FORM !! May be: Called OriginDigest: This is the ContentDigest of base game package. | ||
} entirety_data_160_TRP_CHG_OTH_ORI_FE78; | } entirety_data_160_TRP_CHG_OTH_ORI_FE78; | ||
typedef struct { // size is 0x180 | typedef struct { // size is 0x180 | ||
u8 | u8 unk_digest[0x20]; | ||
u8 game_digest[0x20]; | u8 game_digest[0x20]; | ||
u8 program_digest[0x20]; | u8 program_digest[0x20]; | ||
Line 632: | Line 522: | ||
u8 param_digest[0x20]; | u8 param_digest[0x20]; | ||
u8 header_digest[0x20]; | u8 header_digest[0x20]; | ||
u8 manual_digest[0x20]; // ?SHA256? of ?? | u8 manual_digest[0x20]; // ?SHA256? of ??. Called ManualDigest: This is a digest of sce_sys/manual files. | ||
u8 trophy_digest[0x20]; // ?SHA256? of ?? | u8 trophy_digest[0x20]; // ?SHA256? of ??. Called TrophyDigest: This is a digest of sce_sys/trophy files. | ||
u8 change_info_digest[0x20]; // ?SHA256? of ?? | u8 change_info_digest[0x20]; // ?SHA256? of ??. Called ChangeInfoDigest: This is a digest of sce_sys/changeinfo files. | ||
u8 others_digest[0x20]; // ?SHA256? of ?? | u8 others_digest[0x20]; // ?SHA256? of ??. Called OthersDigest: This is a digest of sce_sys files except above files. | ||
u8 enc_origin_digest[0x20]; // ?SHA256? of ??. ENCRYPTED FORM !! | u8 enc_origin_digest[0x20]; // ?SHA256? of ??. ENCRYPTED FORM !! May be: Called OriginDigest: This is the ContentDigest of base game package. | ||
} entirety_data_180_MAN_TRP_CHG_OTH_ORI_FEF8; | } entirety_data_180_MAN_TRP_CHG_OTH_ORI_FEF8; | ||
=== | === unknown_data2_info === | ||
typedef struct { // size is 0x38 | typedef struct { // size is 0x38 | ||
u32 | u32 unknown_data_offset; | ||
u32 | u32 unknown_data_size; // usually 0x10 | ||
u8 unk[0x10]; | u8 unk[0x10]; | ||
u8 | u8 unknown_data_sha256[0x20]; | ||
} | } unknown_data2_info; | ||
=== File Entry === | |||
== File | |||
All values are in big endian format. | All values are in big endian format. | ||
Line 696: | Line 549: | ||
u32 flags; | u32 flags; | ||
u32 padding; | u32 padding; | ||
} | } PKG_FILE_HEADER; | ||
{| class="wikitable" | {| class="wikitable" | ||
Line 709: | Line 562: | ||
| data_size || 0x10 || u64 || | | data_size || 0x10 || u64 || | ||
|- | |- | ||
| flags || 0x18 || u32 || The file type | | flags || 0x18 || u32 || The file type | ||
|- | |- | ||
| padding || 0x1C || u32 || zero | | padding || 0x1C || u32 || zero | ||
|} | |} | ||
=== Misc/Note === | |||
<s> | |||
From FW 4.00, install PKG from root device (but not as "bubble") for PS1 classic if not containing [[EDAT_files|.EDAT files]] license type Free will abort or install directly as bubble according to the cfw. | |||
</s> | |||
== File Footer == | == File Footer == | ||
Line 718: | Line 577: | ||
=== PackageDigest === | === PackageDigest === | ||
This is SHA1 digest of package without last 32 bytes. | |||
The last | The last 0x20 bytes of the package contains a hash (sha1sum) of the package (sha1 of the whole file minus the last 0x20 bytes). Or in other words... to verify the integrity of a package is needed to crop the 0x20 bytes at the end, then calculate the SHA1 of the resulting file, then compare with the SHA1 that was cropped. | ||
It is also used as part of the package identification info inside the '''TITLE_ID-ver.xml''' files in PSN servers that lists the available game patches for each game. See: [[Online_Connections#Game_Updating_Procedure|Game Updating Procedure]] page and the '''sha1sum''' in the .xml examples | It is also used as part of the package identification info inside the '''TITLE_ID-ver.xml''' files in PSN servers that lists the available game patches for each game. See: [[Online_Connections#Game_Updating_Procedure|Game Updating Procedure]] page and the '''sha1sum''' in the .xml examples | ||
*Notes | *Notes | ||
**This footer area is considered part of the package and is included when counting the '''total_size''' of the package (in the header at offset 0x18), and the header is hashed too by '''header_sha1_hash ''' (at offset 0xB8), this is important in the sequence of actions needed when building the package and updating/adding the | **This footer area is considered part of the package and is included when counting the '''total_size''' of the package (in the header at offset 0x18), and the header is hashed too by '''header_sha1_hash ''' (at offset 0xB8), this is important in the sequence of actions needed when building the package and updating/adding the sha1 footer at the end | ||
** | **Homebrew packages (at least some of them) doesnt includes this footer | ||
== Package Tools == | == Package Tools == | ||
Line 732: | Line 591: | ||
=== PKG builder / infos / extractor === | === PKG builder / infos / extractor === | ||
==== | ==== PSP SDK official tool : make_package_npdrm (2006-2014) ==== | ||
* latest version: rev 1642 from 6.60 PSP SDK | |||
==== PSVita SDK official tool : make_pkg (2011-2015) ==== | |||
* latest version: rev 1972 from 3.55 PSVita SDK | |||
==== PS3 SDK official tool : make_package_npdrm (2006-2017) ==== | |||
* latest version: rev 1972 from 4.75 PS3 SDK | |||
* common version: rev 1732 from 3.40 PS3 SDK (also found under patched form) | |||
* latest version: rev | * oldest leaked version: rev 1061 from X.XX PS3 SDK | ||
* | |||
* oldest | |||
==== Make Package Npdrm Patcher (revision 1732) by SubZero Dezigns (2012) ==== | ==== Make Package Npdrm Patcher (revision 1732) by SubZero Dezigns (2012) ==== | ||
Line 1,022: | Line 697: | ||
==== PkgDecrypt by St4rk (2017) ==== | ==== PkgDecrypt by St4rk (2017) ==== | ||
PSVita .pkg | |||
== Package links == | == Package links == | ||
* sqlite3 db of .pkg files (pkg links, file infos, signatures, etc): [https://mega.co.nz/#!f5QhWCTB!EzxEaMNKJ3zJ40c_qfGtZTVD3a1uis645Hffj_W3hpc pkg_harvester_db.7z 6.7 MB] (includes PS3, PSP) - uncompressed pkg_harvester.db: 24.5 MB | |||
several constants used in pkg_harvester.db: | |||
several constants used in pkg_harvester.db: | |||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
enum class ProductEnvironment | enum class ProductEnvironment | ||
Line 1,110: | Line 737: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{File Formats}}<noinclude>[[Category:Main]]</noinclude> | {{File Formats}}<noinclude>[[Category:Main]]</noinclude> |