mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-07-08 18:06:41 +00:00
* Add GCZ, WIA/RVZ, and NintendoDisc (GameCube/Wii) format support
Port of DolphinIsoLib into SabreTools.Serialization architecture:
- Data.Models: GCZ/, WIA/, NintendoDisc/ model subdirectories (15 files)
- Serialization.Readers: GCZ, WIA, NintendoDisc readers
- Serialization.Writers: GCZ, WIA writers (structural metadata; full round-trip TODO)
- Wrappers: NintendoDisc, GCZ, WIA wrappers with Encryption partial class
- Wrappers: WiaRvzCompressionHelper (BZip2/LZMA/LZMA2/Zstd, net462+ guarded)
- WrapperType + WrapperFactory: GCZ, WIA, NintendoDisc entries added
GetInnerWrapper() decompression and NintendoDisc.Extraction FST extraction
are stubbed with TODO comments pending full implementation.
* Implement GetInnerWrapper for GCZ and WIA, full NintendoDisc extraction
* Add GCZ/WIA/RVZ write pipeline and Nintendo disc compression helpers
* Add WIA/RVZ table decompression, NintendoDisc/GCZ printing, NintendoDisc detection for .iso files
* Fix NintendoDisc header layout, GC magic, and add embedded disc header to WIA/GCZ printing
- Fix GCMagicWord: 0xC23D3C1F -> 0xC2339F3D (confirmed from Dolphin DiscUtils.h)
- Fix disc header field layout to match Dolphin's confirmed offsets:
MakerCode is bytes 4-5 of the 6-char GameId (no separate field at 0x006),
DiscNumber at 0x006, DiscVersion at 0x007, unused region is 14 bytes (0x00A-0x017)
- Update NintendoDisc reader: derive MakerCode from GameId[4..5], fix skip count
- Add ParseDiscHeaderOnly() to reader for partial (short) stream parsing
- Guard DisableHash/DisableEnc reads at the 0x080 boundary for 128-byte embedded headers
- Guard DOL/FST skip for streams shorter than full 0x440 boot block
- Fix WrapperFactory: NintendoDisc magic detection now precedes .iso -> ISO9660 fallback
- Add GameId-prefix heuristic in WrapperFactory for GC discs lacking magic word
- Add GameId-prefix platform fallback in reader for GC discs without GCMagicWord
- Add DiscHeader property to WIA wrapper (parsed from Header2.DiscHeader bytes)
- Add DiscHeader property to GCZ wrapper (decompresses first block only)
- Add ReadDiscHeader() helper to GCZ for lightweight first-block decompression
- Print embedded disc header (Game ID, Maker, Disc/Rev, Title) in WIA.Printing.cs and GCZ.Printing.cs
* Fix Wii partition extraction: correct IV, FST size shift, partition naming
- Block decryption: IV is at raw block offset 0x3D0 (still-encrypted),
matching Dolphin/DolphinIsoLib WiiPartitionDecryptor.DecryptBlock exactly.
- FST size field at boot.bin 0x428 is also stored >>2 on Wii; apply <<2
to get true byte size.
- Partition folder naming now matches DolphinIsoLib WiiDiscExtractor exactly:
type 0->GM+n, 1->UP+n, 2->CH+n, printable ASCII unknown->raw 4-char string,
non-printable->P{index}. SSBB VC channels extract as HA8E, HA9E, etc.
- ExtractionTool peek buffer increased from 16 to 32 bytes.
Verified: SSBB GM0 extracts 5524 files, boot.bin/fst.bin byte-identical
to Dolphin reference extraction.
* Fix FST extraction: create zero-byte files instead of skipping them
Files with fileSize=0 in the FST were silently skipped. Now they are
created as empty files, matching Dolphin/DolphinIsoLib behavior.
Verified: SSBB now extracts 5958 files with 0 missing, 0 extra,
0 size mismatches, and 0 hash mismatches vs DolphinIsoLib reference.
* Add GCZ/WIA/RVZ virtual stream extraction via NintendoDisc wrapper
* Address PR #85 review comments (Copilot + mnadareski)
* Address PR #85 review comments
* Replace custom endian helpers and SHA1 with SabreTools.IO equivalents
* Update GCZ.Printing.cs
* Update NintendoDisc.Printing.cs
* Update WIA.Printing.cs
* Add WIA/RVZ Wii partition crypto round-trip support
- Add AesCbc internal helper (BouncyCastle AES-CBC encrypt/decrypt)
- Add NintendoDisc.CommonKeyProvider hook for injectable test keys
- Fix sha1.Terminate() missing in all three ComputeSha1 helpers in WIA.cs
- Fix Wii partition dataOff alignment to 0x8000 boundary
- Add WIA.EncryptWiiGroup (internal) for re-encrypting plaintext groups
- Add WIA.DumpIso to WIA.Writing.cs (WIA/RVZ -> flat ISO conversion)
- Add WiaVirtualStream on-demand group decompression
- Add _preDecryptedReader bypass on NintendoDisc for WIA extraction path
- Add WIATests.cs with Wii crypto round-trip test using synthetic data
- Move DumpIso from WIA.Extraction.cs to WIA.Writing.cs
- Bump DumpIso read buffer from 1 MiB to 2 MiB (aligns to WIA chunk size)
- Add InternalsVisibleTo SabreTools.Wrappers.Test in csproj
* Remove hardcoded Wii common keys from NintendoDisc.Encryption
- Delete the embedded WiiCommonKeyRetail and WiiCommonKeyKorean byte
arrays from NintendoDisc.Encryption.cs.
- Make CommonKeyProvider public so any caller (not just tests) can
inject keys; DecryptTitleKey now returns null when no key is
available for the requested index rather than falling back to
hardcoded values.
- Add NintendoDiscEncryptionTests.cs:
- Argument guard and no-provider tests for DecryptTitleKey.
- Fake-key round-trip test (encrypt then decrypt with injected key).
- Integration test that reads TestData/NintendoDisc/keys.json,
verifies each key against hardcoded SHA256 constants, and skips
silently if the file is absent or the keys do not match.
- LoadKeyProvider helper (named JSON format, index-keyed).
- Add [Collection(NintendoDisc)] to both NintendoDiscEncryptionTests
and WIATests to prevent parallel access to the static
CommonKeyProvider from racing between test classes.
- Add TestData/NintendoDisc/keys.json.example documenting the
expected key file format.
- Add Newtonsoft.Json reference to SabreTools.Wrappers.Test.csproj.
* Didn't actually commit the changes. My bad. Fixed.
* Edited a comment
* Added in XUnit outputs that show up in Test Viewer in VS
---------
Co-authored-by: Matt Nadareski <mnadareski@outlook.com>
352 lines
7.0 KiB
C#
352 lines
7.0 KiB
C#
namespace SabreTools.Wrappers
|
|
{
|
|
/// <summary>
|
|
/// Represents each of the IWrapper implementations
|
|
/// </summary>
|
|
public enum WrapperType
|
|
{
|
|
/// <summary>
|
|
/// Unknown or unsupported
|
|
/// </summary>
|
|
UNKNOWN,
|
|
|
|
/// <summary>
|
|
/// AACS media key block
|
|
/// </summary>
|
|
AACSMediaKeyBlock,
|
|
|
|
/// <summary>
|
|
/// Atari 7800 cart image
|
|
/// </summary>
|
|
Atari7800Cart,
|
|
|
|
/// <summary>
|
|
/// Atari Lynx cart image
|
|
/// </summary>
|
|
AtariLynxCart,
|
|
|
|
/// <summary>
|
|
/// BD+ SVM
|
|
/// </summary>
|
|
BDPlusSVM,
|
|
|
|
/// <summary>
|
|
/// BFPK custom archive
|
|
/// </summary>
|
|
BFPK,
|
|
|
|
/// <summary>
|
|
/// Half-Life Level
|
|
/// </summary>
|
|
BSP,
|
|
|
|
/// <summary>
|
|
/// bzip2 archive
|
|
/// </summary>
|
|
BZip2,
|
|
|
|
/// <summary>
|
|
/// CD-ROM bin file
|
|
/// </summary>
|
|
CDROM,
|
|
|
|
/// <summary>
|
|
/// Compound File Binary
|
|
/// </summary>
|
|
CFB,
|
|
|
|
/// <summary>
|
|
/// MAME Compressed Hunks of Data
|
|
/// </summary>
|
|
CHD,
|
|
|
|
/// <summary>
|
|
/// CTR Importable Archive
|
|
/// </summary>
|
|
CIA,
|
|
|
|
/// <summary>
|
|
/// Executable or library
|
|
/// </summary>
|
|
/// <remarks>Includes MZ, NE, LE/LX, and PE</remarks>
|
|
Executable,
|
|
|
|
/// <summary>
|
|
/// fwNES FDS file
|
|
/// </summary>
|
|
FDS,
|
|
|
|
/// <summary>
|
|
/// Half-Life Game Cache File
|
|
/// </summary>
|
|
GCF,
|
|
|
|
/// <summary>
|
|
/// GCZ compressed GameCube / Wii disc image
|
|
/// </summary>
|
|
GCZ,
|
|
|
|
/// <summary>
|
|
/// gzip archive
|
|
/// </summary>
|
|
GZip,
|
|
|
|
/// <summary>
|
|
/// Key-value pair INI file
|
|
/// </summary>
|
|
/// <remarks>Currently has no IWrapper implementation</remarks>
|
|
IniFile,
|
|
|
|
/// <summary>
|
|
/// InstallShield archive v3
|
|
/// </summary>
|
|
InstallShieldArchiveV3,
|
|
|
|
/// <summary>
|
|
/// InstallShield cabinet file
|
|
/// </summary>
|
|
InstallShieldCAB,
|
|
|
|
/// <summary>
|
|
/// PS3 ISO Rebuild Data
|
|
/// </summary>
|
|
IRD,
|
|
|
|
/// <summary>
|
|
/// ISO 9660 Volume (Disc image)
|
|
/// </summary>
|
|
ISO9660,
|
|
|
|
/// <summary>
|
|
/// Link Data Security encrypted file
|
|
/// </summary>
|
|
LDSCRYPT,
|
|
|
|
/// <summary>
|
|
/// LZ-compressed file, KWAJ variant
|
|
/// </summary>
|
|
LZKWAJ,
|
|
|
|
/// <summary>
|
|
/// LZ-compressed file, QBasic variant
|
|
/// </summary>
|
|
LZQBasic,
|
|
|
|
/// <summary>
|
|
/// LZ-compressed file, SZDD variant
|
|
/// </summary>
|
|
LZSZDD,
|
|
|
|
/// <summary>
|
|
/// Microsoft cabinet file
|
|
/// </summary>
|
|
MicrosoftCAB,
|
|
|
|
/// <summary>
|
|
/// MPQ game data archive
|
|
/// </summary>
|
|
MoPaQ,
|
|
|
|
/// <summary>
|
|
/// Nintendo 3DS cart image
|
|
/// </summary>
|
|
N3DS,
|
|
|
|
/// <summary>
|
|
/// Half-Life No Cache File
|
|
/// </summary>
|
|
NCF,
|
|
|
|
/// <summary>
|
|
/// Nintendo Entertainment System cart image
|
|
/// </summary>
|
|
NESCart,
|
|
|
|
/// <summary>
|
|
/// Nintendo DS/DSi cart image
|
|
/// </summary>
|
|
Nitro,
|
|
|
|
/// <summary>
|
|
/// Nintendo GameCube / Wii disc image
|
|
/// </summary>
|
|
NintendoDisc,
|
|
|
|
/// <summary>
|
|
/// Half-Life Package File
|
|
/// </summary>
|
|
PAK,
|
|
|
|
/// <summary>
|
|
/// NovaLogic Game Archive Format
|
|
/// </summary>
|
|
PFF,
|
|
|
|
/// <summary>
|
|
/// PIC data object
|
|
/// </summary>
|
|
PIC,
|
|
|
|
/// <summary>
|
|
/// PKWARE ZIP archive and derivatives
|
|
/// </summary>
|
|
PKZIP,
|
|
|
|
/// <summary>
|
|
/// PlayJ audio file
|
|
/// </summary>
|
|
PlayJAudioFile,
|
|
|
|
/// <summary>
|
|
/// PlayJ playlist file
|
|
/// </summary>
|
|
PlayJPlaylist,
|
|
|
|
/// <summary>
|
|
/// Quantum archive
|
|
/// </summary>
|
|
Quantum,
|
|
|
|
/// <summary>
|
|
/// Quick Disk Famicom Disk System image
|
|
/// </summary>
|
|
QD,
|
|
|
|
/// <summary>
|
|
/// RAR archive
|
|
/// </summary>
|
|
RAR,
|
|
|
|
/// <summary>
|
|
/// RealArcade Installer
|
|
/// </summary>
|
|
RealArcadeInstaller,
|
|
|
|
/// <summary>
|
|
/// RealArcade Mezzanine
|
|
/// </summary>
|
|
RealArcadeMezzanine,
|
|
|
|
/// <summary>
|
|
/// SecuROM DFA File
|
|
/// </summary>
|
|
SecuROMDFA,
|
|
|
|
/// <summary>
|
|
/// 7-zip archive
|
|
/// </summary>
|
|
SevenZip,
|
|
|
|
/// <summary>
|
|
/// StarForce FileSystem file
|
|
/// </summary>
|
|
SFFS,
|
|
|
|
/// <summary>
|
|
/// SGA
|
|
/// </summary>
|
|
SGA,
|
|
|
|
/// <summary>
|
|
/// Redumper skeleton (Wiped ISO9660 disc image)
|
|
/// </summary>
|
|
Skeleton,
|
|
|
|
/// <summary>
|
|
/// Steam SKU sis file
|
|
/// </summary>
|
|
SkuSis,
|
|
|
|
/// <summary>
|
|
/// Secure Transacted File System
|
|
/// </summary>
|
|
STFS,
|
|
|
|
/// <summary>
|
|
/// Tape archive
|
|
/// </summary>
|
|
TapeArchive,
|
|
|
|
/// <summary>
|
|
/// Various generic textfile formats
|
|
/// </summary>
|
|
/// <remarks>Currently has no IWrapper implementation</remarks>
|
|
Textfile,
|
|
|
|
/// <summary>
|
|
/// Half-Life 2 Level
|
|
/// </summary>
|
|
VBSP,
|
|
|
|
/// <summary>
|
|
/// Valve Package File
|
|
/// </summary>
|
|
VPK,
|
|
|
|
/// <summary>
|
|
/// Half-Life Texture Package File
|
|
/// </summary>
|
|
WAD,
|
|
|
|
/// <summary>
|
|
/// Wise Installer Overlay Header
|
|
/// </summary>
|
|
WiseOverlayHeader,
|
|
|
|
/// <summary>
|
|
/// Wise Installer Script File
|
|
/// </summary>
|
|
WiseScript,
|
|
|
|
/// <summary>
|
|
/// WIA compressed GameCube / Wii disc image
|
|
/// </summary>
|
|
WIA,
|
|
|
|
/// <summary>
|
|
/// RVZ compressed GameCube / Wii disc image
|
|
/// </summary>
|
|
RVZ,
|
|
|
|
/// <summary>
|
|
/// XBox Executable
|
|
/// </summary>
|
|
XboxExecutable,
|
|
|
|
/// <summary>
|
|
/// Xbox DVD Filesystem
|
|
/// </summary>
|
|
XDVDFS,
|
|
|
|
/// <summary>
|
|
/// Xenon (Xbox 360) Executable
|
|
/// </summary>
|
|
XenonExecutable,
|
|
|
|
/// <summary>
|
|
/// Xbox Rebuild/Recovery/Redump Data
|
|
/// </summary>
|
|
XRD,
|
|
|
|
/// <summary>
|
|
/// xz archive
|
|
/// </summary>
|
|
XZ,
|
|
|
|
/// <summary>
|
|
/// Xbox Package File
|
|
/// </summary>
|
|
XZP,
|
|
|
|
/// <summary>
|
|
/// ZArchive archive
|
|
/// </summary>
|
|
ZArchive,
|
|
|
|
/// <summary>
|
|
/// ZStandard compressed file
|
|
/// </summary>
|
|
ZSTD,
|
|
}
|
|
}
|