Fixes
- Outer-filesystem mount key: the build path derived the mount key with the wrong hash (SHA-256 instead of SHA3-256). All build and signing paths now use SHA3-256.
- Image key: the IMAGE_KEY entry is now filled with RSA-3072 key wrapping instead of a partial random tail.
- Package layout descriptor (
naps_pkg_layout.dat): two run/flush cadence errors fixed so the descriptor matches the expected on-disk structure. Every raw file opens a run; metadata opens a run on its first block only. - Streaming chunk counts:
playgo-ficm.datandplaygo-hash-table.datnow count all inner file inodes, including the internal tables, not only user files. - Supplemental archive: the general-purpose ZIP writer was replaced with a format-exact writer that the console accepts.
- Reader: a raw file flagged as compressed no longer throws. The reader only decodes a compressed container when the payload actually carries the container magic.
- Reader entry ids: inspection labels corrected to the real writer ids (
param.json, the streaming descriptors,imagedigs, and so on). ProsperoPackageExtractor.ListFiles: now lists files from data-first packages and from compressed inner images. It previously failed on the primary package format even though full extraction of the same package succeeded.- Launch-readiness: a package whose
eboot.binis present but is not a loadable module is no longer reported as ready to launch. - Buffered reader: a read that starts at offset 0 is no longer skipped.
- Package merge: file handles are no longer leaked when one input piece fails to open partway through.
Additions
- Installable finalized image: the builder writes the full container image header (mount and package sizes across the whole finalized image, filesystem flags, region locators, the image seed, and the per-region descriptor digests) and the per-block install-metadata tables.
- Content key wrapping: RSA-3072 wrapping for the container key entries, with deterministic supplemental framing.
- Native library exports: additional C entry points for key availability, a full validation report, launch-readiness issues, and backup conversion with options.
Improvements
- Inner image is always the data-first layout: a raw concatenation of per-file payloads described by a generated
naps_pkg_layout.dat. - Documentation and code comments reduced to accurate technical descriptions. The API overview, implementation status, format notes, and README updated to match the current code.
Optimizations
- Compressor: fixed a quadratic-time hang when compressing the large repetitive metadata region of a small homebrew package. The fix is a lossless early exit; the compressed output is unchanged.
- Inner metadata is compressed once and reused instead of twice, roughly halving the compression work for a homebrew build.
- The inner assembler compresses each file once. It previously compressed every compressible file twice; the output is identical.
Removals and cleanup
- Inner-compression codec selection removed (the enum, the options, and the helper methods). The raw / zlib / Kraken inner paths are gone. The low-level Kraken and PFSC encoders remain, used by the metadata path and the standalone PFSC tool.
- Earlier-generation code removed: legacy key-check and key-derivation routines, RSA-2048 helpers and key sets, the Mersenne Twister generator, and the old keystone keys. The keystone builder is now single-path.
- Dead and legacy code removed: an unused bit reader, an unused shuffle class, unused and incorrect outer-image encrypt/decrypt overloads, and several unused helpers and constants.
Downloads
Two kinds of release archive are available. All builds are self-contained.
GUI application:
win-x64.zipwin-arm64.ziplinux-x64.ziplinux-arm64.ziposx-arm64.zip
Library only:
libprosperopkg-win-x64.ziplibprosperopkg-win-arm64.ziplibprosperopkg-linux-x64.ziplibprosperopkg-linux-arm64.ziplibprosperopkg-osx-arm64.zip
Starting the GUI
Download the archive that matches your system and extract it.
Windows (win-x64.zip or win-arm64.zip):
- Run the
LibProsperoPkg.Guiexecutable from the extracted folder.
Linux (linux-x64.zip or linux-arm64.zip) and macOS (osx-arm64.zip):
-
Open a terminal in the extracted folder.
-
Start the GUI with:
dotnet LibProsperoPkg.Gui.dll
Creating a homebrew package with the GUI
- Start the GUI.
- Open the "Homebrew package" page.
- Fill in the fields:
- Homebrew folder: the folder that holds your compiled main module and, optionally, a
sce_sys/metadata tree (param.json,icon0.png, and so on). - Output folder: where the finished
.pkgis written. - Content id: optional. A 36-character id in the form
XXYYYY-XXXXYYYYY_00-ZZZZZZZZZZZZZZZZ, for exampleUP9000-PPSA00000_00-PROSPERO00000000. Left blank, it is taken fromparam.json, or a default is used. - Title: optional display name.
- Version: the content/master version as
NN.NN(default01.00). - Passcode: 32 characters. Left blank, the all-zero debug passcode is used.
- Main module: the module file name inside the homebrew folder. Defaults to
eboot.bin.
- Homebrew folder: the folder that holds your compiled main module and, optionally, a
- Click "Build".
- The log shows the output package path and a launch-readiness report: whether the main module and
param.jsonare present and whether the package is ready to install on a console, followed by any warnings/messages.
Minimum contents of the homebrew folder:
- The main module (
eboot.binby default). sce_sys/param.json. Anicon0.pngand othersce_sysassets are optional.