A package obSCEne can build, and what is still placeholder

make pkg in obSCEne now produces obscene.pkg end to end: the eboot and a param.json become an app tree, the tree becomes a filesystem image, and the image becomes a package. Nothing in that chain is stubbed any more.

Three defects were closed on the way, and all three were certain rather than probable failures on hardware. That distinction matters: none of them would have shown up in any test here, because the reader this crate ships takes shortcuts a console cannot.

Surprises

The blocker that looked hardest was a public-key operation. Writing the key blobs needs only public halves, and a public key cannot unwrap. The thing that had been described as "material wrapped under keys we take as input" was a wrap this repository could always have performed.

Deterministic padding turned a weak check into a strong one. The RSA filler comes from a seeded Mersenne Twister, so there is exactly one correct answer and it can be compared against real bytes. Had the padding been random, the best available check would have been "it decrypts back", which a self-consistently wrong implementation also passes.

Two tests earned their keep in one session. The derive-against-own-output test caught the block-digest table going stale when the image moved to 0x80000. A new test that keys a package with a non-fake passcode caught the entry encryption still hardcoding the fake one - every other test uses the fake passcode and none of them could have found it. (D055)

A concurrent session had already written the obSCEne half. scripts/build-pkg.sh existed, correct, waiting on a command it named in a comment. It was completed rather than replaced, and its one latent bug - building the image without a content id - was fixed with a note saying why that produces two files which each look fine. (D058)

What is still placeholder, and should be said out loud