Editing Playstation Update Package (PUP)

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

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 5: Line 5:
== Location ==
== Location ==


=== PS Vita ===
=== PSVita ===


The PS Vita and PS Vita TV OS can install the update as /PSP2/UPDATE/PSP2UPDAT.PUP or as /PSVITA/UPDATE/PSVUPDAT.PUP.<br />
The PSVita and PSVita TV OS can install the update as /PSP2/UPDATE/PSP2UPDAT.PUP or as /PSVITA/UPDATE/PSVUPDAT.PUP.<br />


The update comes from:
The update comes from:
Line 57: Line 57:
== Revisions ==
== Revisions ==


=== PS Vita ===
=== PSVita ===


See [https://psdevwiki.com/vita/index.php?title=Category:Firmware_revisions].
See [https://playstationdev.wiki/psvitadevwiki/index.php?title=Category:Firmware_revisions].


== Update List ==
== Update List ==
Line 452: Line 452:
== Verification ==
== Verification ==


The PUP Header is signed using HMAC, HMAC-SHA1 for PS3 and HMAC-SHA256 for PS Vita.
The PUP Header is signed using HMAC, HMAC-SHA1 for PS3 and HMAC-SHA256 for PSVita.


On PS Vita, the PUP Header Digest is signed using RSA2048. The PUP Header RSA signature is RSA-signed along with a message into SCEWM file, which is encrypted using AES128CBC.
On PSVita, the PUP Header Digest is signed using RSA2048. The PUP Header RSA signature is RSA-signed along with a message into SCEWM file, which is encrypted using AES128CBC.


The PUP Header embeds HMAC signatures for each PUP segment.
The PUP Header embeds HMAC signatures for each PUP segment.
Line 464: Line 464:
=== PS3 ===
=== PS3 ===


=== PS Vita ===
=== PSVita ===


The PS Vita and PS Vita TV update files can be extracted from .PUP using:
The PSVita and PSVita TV update files can be extracted from .PUP using:
* "[http://www.psdevwiki.com/vita/index.php?title=Tools PS VITA Firmware xTractor]"
* "[http://www.vitadevwiki.com/index.php?title=Tools PS VITA Firmware xTractor]"
* pupunpack from [http://www.psdevwiki.com/vita/index.php?title=Tools#Vitatools vitatools].
* pupunpack from [http://www.vitadevwiki.com/index.php?title=Tools#Vitatools vitatools].


== Decryption ==
== Decryption ==
Line 479: Line 479:


<source lang="C">
<source lang="C">
typedef struct ScePupHeader_v1 { // size is 0x30-bytes
typedef struct {
   uint8_t magic[7];
   uint64_t magic;
   uint8_t format_flag;
   uint8_t format_flag;
   uint64_t package_version;
   uint64_t package_version;
   uint64_t image_version;
   uint64_t image_version;
   uint64_t segment_num;
   uint64_t segment_num;
   uint64_t file_offset;
   uint64_t header_length;
   uint64_t file_size;
   uint64_t data_length;
} ScePupHeader_v1;
} PUPHeader_v1;
</source>
</source>


Line 498: Line 498:
| 0x7 || 0x1 || uint8_t || Format Flag
| 0x7 || 0x1 || uint8_t || Format Flag
|-
|-
| 0x8 || 0x8 || unsigned long || Package Version. ?Might be Format version like on PS Vita?
| 0x8 || 0x8 || unsigned long || Package Version. ?Might be Format version like on PSVita?
|-
|-
| 0x10 || 0x8 || unsigned long || Image Version. ?What is this?
| 0x10 || 0x8 || unsigned long || Image Version. ?what is that?
|-
|-
| 0x18 || 0x8 || unsigned long || Segment Number
| 0x18 || 0x8 || unsigned long || Segment Num
|-
|-
| 0x20 || 0x8 || unsigned long || File Offset. It corresponds to Header Length.
| 0x20 || 0x8 || unsigned long || Header Length
|-
|-
| 0x28 || 0x8 || unsigned long || File Size. It corresponds to Data Length.
| 0x28 || 0x8 || unsigned long || Data Length
|-
|-
| 0x30 || 0x20 * '''segment_num''' || '''Segment Table''' || Segment Table
| 0x30 || 0x20 * '''segment_num''' || '''Segment Table''' || Segment Table
Line 522: Line 522:


<source lang="C">
<source lang="C">
typedef struct ScePupSegmentEntry { // size is 0x20-bytes
typedef struct {
   uint64_t id;
   uint64_t id;
   uint64_t offset;
   uint64_t offset;
   uint64_t size;
   uint64_t size;
   uint32_t sign_algorithm;
   uint32_t sign_algorithm;
   uint32_t padding;
   uint8_t padding[4];
} ScePupSegmentEntry;
} PUPSegmentEntry;
</source>
</source>


Line 553: Line 553:
! Segment Entry ID !! Console !! File name !! Notes
! Segment Entry ID !! Console !! File name !! Notes
|-
|-
| 0x100 || [[version.txt]] || PS3, PS Vita || Version string
| 0x100 || [[version.txt]] || PS3, PSVita || Version string
|-
|-
| 0x101 || [[license.xml]] || PS3, PS Vita || License XML. (?aka: resource.txt?)
| 0x101 || [[license.xml]] || PS3, PSVita || License XML. (?aka: resource.txt?)
|-
|-
| 0x102 || [[promo_flags.txt]] || PS3 || (only on {{SHOP}}) (?aka: shop.txt?)
| 0x102 || [[promo_flags.txt]] || PS3 || (only on {{SHOP}}) (?aka: shop.txt?)
Line 563: Line 563:
| 0x104 || [[patch_build.txt]] || PS3 ||  
| 0x104 || [[patch_build.txt]] || PS3 ||  
|-
|-
| 0x200 || [[ps3swu.self]], [[psp2swu.self]] || PS3, PS Vita || Main updater executable
| 0x200 || [[ps3swu.self]], [[psp2swu.self]] || PS3, PSVita || Main updater executable
|-
|-
| 0x201 || [[vsh.tar]] / [[font_resource.tar]] || PS3 ||  
| 0x201 || [[vsh.tar]] / [[font_resource.tar]] || PS3 ||  
Line 571: Line 571:
| 0x203 || [[patch_data.pkg]] || PS3 ||  
| 0x203 || [[patch_data.pkg]] || PS3 ||  
|-
|-
| 0x204 || [[cui_setupper.self]] || PS Vita || Classical UI updater setupper executable
| 0x204 || [[cui_setupper.self]] || PSVita || Classical UI updater setupper executable
|-
|-
| 0x221 || [[vs0_patch_tar_info.txt]] || PS Vita || vs0 patch tar archive access permission config
| 0x221 || [[vs0_patch_tar_info.txt]] || PSVita || vs0 patch tar archive access permission config
|-
|-
| 0x231 || [[vs0_patch_tar_2_info.txt]] || PS Vita || vs0 patch tar archive 2 access permission config
| 0x231 || [[vs0_patch_tar_2_info.txt]] || PSVita || vs0 patch tar archive 2 access permission config
|-
|-
| 0x300 || [[update_files.tar]] || PS3 ||  
| 0x300 || [[update_files.tar]] || PS3 ||  
|-
|-
| 0x302 ||  || PS Vita || SLB2
| 0x302 ||  || PSVita || SLB2
|-
|-
| 0x303 ||  || PS Vita || os0
| 0x303 ||  || PSVita || os0
|-
|-
| 0x304 ||  || PS Vita || vs0
| 0x304 ||  || PSVita || vs0
|-
|-
| 0x305 ||  || PS Vita ||  
| 0x305 ||  || PSVita ||  
|-
|-
| 0x306 ||  || PS Vita ||  
| 0x306 ||  || PSVita ||  
|-
|-
| 0x307 ||  || PS Vita ||  
| 0x307 ||  || PSVita ||  
|-
|-
| 0x308 ||  || PS Vita ||  
| 0x308 ||  || PSVita ||  
|-
|-
| 0x309 ||  || PS Vita ||  
| 0x309 ||  || PSVita ||  
|-
|-
| 0x30A ||  || PS Vita ||  
| 0x30A ||  || PSVita ||  
|-
|-
| 0x30B ||  || PS Vita ||  
| 0x30B ||  || PSVita ||  
|-
|-
| 0x30C ||  || PS Vita ||  
| 0x30C ||  || PSVita ||  
|-
|-
| 0x30D ||  || PS Vita ||  
| 0x30D ||  || PSVita ||  
|-
|-
| 0x30E ||  || PS Vita ||  
| 0x30E ||  || PSVita ||  
|-
|-
| 0x30F ||  || PS Vita ||  
| 0x30F ||  || PSVita ||  
|-
|-
| 0x310 ||  || PS Vita ||  
| 0x310 ||  || PSVita ||  
|-
|-
| 0x311 ||  || PS Vita || vs0 patch tar archive
| 0x311 ||  || PSVita || vs0 patch tar archive
|-
|-
| 0x312 ||  || PS Vita || vs0 patch tar archive 2
| 0x312 ||  || PSVita || vs0 patch tar archive 2
|-
|-
| 0x313 ||  || PS Vita || Syscon update type 0: 00 24 10 00
| 0x313 ||  || PSVita || Syscon update type 0: 00 24 10 00
|-
|-
| 0x314 ||  || PS Vita || Syscon update type 1: 00 50 31 00, 00 50 40 00
| 0x314 ||  || PSVita || Syscon update type 1: 00 50 31 00, 00 50 40 00
|-
|-
| 0x315 ||  || PS Vita || Syscon update type 2: 00 26 10 00, 00 52 40 00
| 0x315 ||  || PSVita || Syscon update type 2: 00 26 10 00, 00 52 40 00
|-
|-
| 0x316 ||  || PS Vita || Syscon update type 3: 00 52 31 00
| 0x316 ||  || PSVita || Syscon update type 3: 00 52 31 00
|-
|-
| 0x317 ||  || PS Vita || Syscon update type 4:
| 0x317 ||  || PSVita || Syscon update type 4:
|-
|-
| 0x318 ||  || PS Vita || Syscon update type 5:
| 0x318 ||  || PSVita || Syscon update type 5:
|-
|-
| 0x319 ||  || PS Vita || Syscon update type 6:
| 0x319 ||  || PSVita || Syscon update type 6:
|-
|-
| 0x31A ||  || PS Vita || Syscon update type 7:
| 0x31A ||  || PSVita || Syscon update type 7:
|-
|-
| 0x31B ||  || PS Vita || Syscon update type 8:
| 0x31B ||  || PSVita || Syscon update type 8:
|-
|-
| 0x31C ||  || PS Vita || Syscon update type 9: 00 30 70 00
| 0x31C ||  || PSVita || Syscon update type 9: 00 30 70 00
|-
|-
| 0x400 || [[package_scewm.wm]] || PS Vita || SCEWM file
| 0x400 || [[package_scewm.wm]] || PSVita || SCEWM file
|-
|-
| 0x401 || [[package_sceas.as]] || PS Vita || SCEAS file
| 0x401 || [[package_sceas.as]] || PSVita || SCEAS file
|-
|-
| 0x501 || [[spkg_hdr.tar]] || PS3 || (added since FW 3.56)
| 0x501 || [[spkg_hdr.tar]] || PS3 || (added since FW 3.56)
Line 641: Line 641:
| 0x601 || [[ps3swu2.self]] || PS3 || (added since FW 3.56)
| 0x601 || [[ps3swu2.self]] || PS3 || (added since FW 3.56)
|-
|-
| 0x2005 ||  || PS Vita || CP ES1 firmware. In early Tool PUPs only.
| 0x2005 ||  || PSVita || CP ES1 firmware. In early Tool PUPs only.
|-
|-
| 0x2006 ||  || PS Vita || CP ES2 firmware. In recent Tool PUPs only.
| 0x2006 ||  || PSVita || CP ES2 firmware. In recent Tool PUPs only.
|}
|}


Line 651: Line 651:


<source lang="C">
<source lang="C">
typedef struct ScePupDigestEntry_v1 { // size is 0x20-bytes
typedef struct {
   uint64_t segment_index;
   uint64_t segment_index;
   uint8_t digest[0x14];
   uint8_t digest[0x14];
   uint32_t padding;
   uint32_t padding;
} ScePupDigestEntry_v1;
} PUPDigestEntry_v1;
</source>
</source>


Line 677: Line 677:
</source>
</source>


== PS Vita ==
== PSVita ==


=== Differences with PS3 PUPs ===
=== Differences with PS3 PUPs ===


The file structure of the PS Vita PUP is almost identical to the PS3 PUP, although there is a slight difference in the header, the hash algorithm and the signature.
The file structure of the PSVita PUP is almost identical to the PS3 PUP, although there is a slight difference in the header, the hash algorithm and the signature.


* PS Vita PUP is little-endian. PS3 PUP is big-endian.
* PSVita PUP is little endian. PS3 PUP is big-endian.
* PS Vita PUP '''Format Version''' is 2. PS3 PUP '''Format Version''' is 1.
* In PSVita PUP '''Format Version''' is 2. In PS3 PUP it is 1.
* There are 0x50 bytes of extra data in the PS Vita PUP Header compared to PS3 PUP.
* There are 0x50 bytes of extra data in the PSVita PUP Header compared to PS3 PUP.
* PS Vita PUP digests are longer than the ones in PS3 PUP: 0x20 bytes (SHA-256 length) in PS Vita PUP versus 0x14 bytes (SHA-1 length) in PS3 PUP.
* PSVita PUP digests are longer than the ones in PS3 PUP: 0x20 bytes (SHA-256 length) in PSVita PUP versus 0x14 bytes (SHA-1 length) in PS3 PUP.
* PS Vita PUP Header Digest is signed using RSA2048 in the SCEWM file. ?PS3 PUP has a RSA signature?
* PSVita PUP Header Digest is signed using RSA2048 in the SCEWM file. ?PS3 PUP have a RSA signature?


=== Header ===
=== Header ===
<source lang="C">
typedef struct ScePupHeader_v2 { // size is 0x80-bytes
SceUInt8 magic[7];
SceUInt8 format_flag;
SceUInt64 format_version;
SceUInt32 version;
SceUInt32 buildno;
SceUInt64 segment_num;
SceUInt64 file_offset;
SceUInt64 file_size;
SceUInt32 sign_algorithm;
SceUInt32 sign_key_index;
SceUInt8 attribute[4];
SceUInt32 target;
SceUInt32 sub_target;
SceUInt32 support_list;
SceUInt32 base_version;
SceUInt32 base_buildno;
SceUInt8 unk_0x50[0x30];
} ScePupHeader_v2;
</source>


{| class="wikitable"
{| class="wikitable"
Line 732: Line 710:
| 0x28 || 0x8 || uint64_t || Data Length. Equals (PUP file size - PUP Header Length).
| 0x28 || 0x8 || uint64_t || Data Length. Equals (PUP file size - PUP Header Length).
|-
|-
| 0x30 || 0x4 || uint32_t || Sign Algorithm. PS Vita only. (ex: 2)
| 0x30 || 0x4 || uint32_t || Sign Algorithm. PSVita only. (ex: 2)
|-
|-
| 0x34 || 0x4 || uint32_t || Sign Key Index. PS Vita only. (ex: 1)
| 0x34 || 0x4 || uint32_t || Sign Key Index. PSVita only. (ex: 1)
|-
|-
| 0x38 || 0x4 || uint8_t[4] || Attribute. PS Vita only. 0: default, 1: QAF required, 2: manufacturing mode required.
| 0x38 || 0x4 || uint8_t[4] || Attribute. PSVita only. 0: default, 1: QAF required.
|-
|-
| 0x3C || 0x4 || uint32_t || Target. PS Vita only. 1: TOOL, 2: CEX, 4: DEX. cex_for_tool PUPs are set to 1.
| 0x3C || 0x4 || uint32_t || Target. PSVita only. 1: TOOL, 2: CEX, 4: DEX. cex_for_tool PUPs are set to 1.
|-
|-
| 0x40 || 0x4 || uint32_t || Sub Target. PS Vita only. (ex: 0)
| 0x40 || 0x4 || uint32_t || Sub Target. PSVita only. (ex: 0)
|-
|-
| 0x44 || 0x4 || uint32_t || Support List. PS Vita only. (ex: 1, 7, 0xC, 0xF, 0x38, 0x78, 0x3F8, 0xFF8, 0xCFF8)
| 0x44 || 0x4 || uint32_t || Support List. PSVita only. (ex: 1, 7, 0xC, 0xF, 0x38, 0x78, 0x3F8, 0xFF8, 0xCFF8)
|-
|-
| 0x48 || 0x4 || uint32_t || Base Version. PS Vita only. (ex: 0)
| 0x48 || 0x4 || uint32_t || Base Version. PSVita only. (ex: 0)
|-
|-
| 0x4C || 0x4 || uint32_t || Base Build No. PS Vita only. (ex: 0)
| 0x4C || 0x4 || uint32_t || Base Build No. PSVita only. (ex: 0)
|-
|-
| 0x50 || 0x30 || char[0x30] || Unknown. PS Vita only. (ex: 0x2000)
| 0x50 || 0x30 || char[0x30] || Unknown. PSVita only. (ex: 0x2000)
|-
|-
| 0x80 || 0x20 * '''segment_num''' || '''Segment Table''' || Segment Table
| 0x80 || 0x20 * '''segment_num''' || '''Segment Table''' || Segment Table
Line 766: Line 744:


<source lang="C">
<source lang="C">
typedef struct ScePupDigestEntry_v2 { // size is 0x40-bytes
typedef struct {
SceUInt64 segment_index;
  uint64_t segment_index;
SceUInt8 digest[0x20];
  uint8_t digest[0x20];
SceUInt8 padding[0x18];
  uint8_t padding[0x18];
} ScePupDigestEntry_v2;
} PUPDigestEntry_v2;
</source>
</source>


Line 1,068: Line 1,046:
</pre>
</pre>


== PS Vita ==
== PSVita ==


=== preinst - 01.000.000 ===
=== preinst - 01.000.000 ===
Please note that all contributions to PS3 Developer wiki are considered to be released under the GNU Free Documentation License 1.2 (see PS3 Developer wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To protect the wiki against automated edit spam, we kindly ask you to solve the following hCaptcha:

Cancel Editing help (opens in new window)