udif
Cross-platform Rust library for Apple DMG disk images (aka Universal Disk Image Format)
Read, write, and manipulate Apple DMG files on any platform.
Full LZFSE support — works with modern macOS disk images that other libraries can't read.
Why udif?
udif is the only cross-platform Rust crate that can both read AND write DMGs with modern compression.
| Feature | udif | dmgwiz | apple-dmg | dmg-oxide |
|---|---|---|---|---|
| Read | ✓ | ✓ | ✓ | ✓ |
| Write | ✓ | ❌ | ❌ | ✓ |
| LZFSE | ✓ | ✓ | ❌ | ❌ |
| XZ | ✓ | ❌ | ❌ | ❌ |
| Bzip2 | ✓ | ✓ | ❌ | ❌ |
| Zlib | ✓ | ✓ | ✓ | ✓ |
| Checksum | ✓ | ❌ | ❌ | ❌ |
Example: A typical macOS Kernel Debug Kit DMG uses 100% LZFSE compression. Only udif and dmgwiz can read it — but only udif can write new DMGs with LZFSE.
Features
| List partitions | Parse DMG structure, show partition table |
| Extract data | Decompress partitions to raw disk images |
| Create DMG | Build DMG files with multiple compression options |
| Checksum verification | CRC32 integrity validation on read and write |
| Cross-platform | Works on Windows, Linux, and macOS |
Compression Support
| Format | Read | Write | Description |
|---|---|---|---|
| LZFSE | Apple's native compression | ||
| XZ | XZ (LZMA2) compression | ||
| Zlib | Best compatibility | ||
| Bzip2 | Better ratio, slower | ||
| Raw | No compression |
Quick Start
Read DMG
use DmgArchive;
// Open and list partitions
let mut archive = open?;
for p in archive.partitions
// Extract main HFS+/APFS partition
let data = archive.extract_main_partition?;
write?;
Create DMG
use ;
let disk_data = read?;
new
.compression
.add_partition
.build?;
Checksum Verification
By default, checksums are verified when opening a DMG. To skip verification (e.g., for corrupted files):
use ;
// Default: checksums verified
let archive = open?;
// Skip verification for corrupted/legacy files
let options = DmgReaderOptions ;
let archive = open_with_options?;
Documentation
| Format Specification | DMG binary format details |
| CLI Tool | Command-line tool usage |
| Implementation Notes | Tricky parts and gotchas |
Example Output
$ udif-tool info Kernel_Debug_Kit.dmg
DMG Information: Kernel_Debug_Kit.dmg
============================================================
Header:
Version: 4
Sector count: 2351263
Data fork length: 1023271318 bytes
Segment: 1/1
Size:
Uncompressed: 1203845632 bytes (1148.08 MB)
Compressed: 1023271318 bytes (975.87 MB)
Compression: 15.0%
Partitions: 7
Block types used:
LZFSE: 988 blocks
$ udif-tool list Kernel_Debug_Kit.dmg
Partitions in Kernel_Debug_Kit.dmg:
================================================================================
ID Sectors Size Ratio Name
--------------------------------------------------------------------------------
-1 1 512 B 89.6% Protective Master Boot Record (MBR : 0)
0 1 512 B 78.9% GPT Header (Primary GPT Header : 1)
1 32 16.00 KB 98.7% GPT Partition Data (Primary GPT Table : 2)
2 2089050 1020.04 MB 4.3% Untitled 1 (Apple_HFSX : 3)
3 262144 128.00 MB 100.0% (Apple_Free : 4)
Alternatives
| Crate | Read | Write | LZFSE | XZ | Bzip2 | Zlib | Checksum | Encrypted | Notes |
|---|---|---|---|---|---|---|---|---|---|
| udif | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ❌ | Full featured |
| dmgwiz | ✓ | ❌ | ✓ | ❌ | ✓ | ✓ | ❌ | ✓ | Read-only |
| apple-dmg | ✓ | ❌ | ❌ | ❌ | ❌ | ✓ | ❌ | ❌ | Zlib only |
| dmg-oxide | ✓ | ✓ | ❌ | ❌ | ❌ | ✓ | ❌ | ❌ | Zlib only |
| dmg | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | macOS only (hdiutil) |
Choose udif if you need:
- Write/create DMG support AND modern compression (LZFSE/XZ)
- Cross-platform support (Windows, Linux, macOS)
- XZ compression (no other cross-platform crate supports it)
- Ensure integrity (no other cross-platform crate have checksum generation / validation)
Choose dmgwiz if you need:
- Encrypted DMG support (we don't have this yet)
- Read-only access is sufficient
See Comparison for detailed analysis.
Next Steps
- Encrypted DMG support — FileVault / AES-128 / AES-256 encrypted disk images
- ADC compression — Apple Data Compression for legacy DMGs
- Streaming decompression — decompress partitions without buffering entire output
- Parallel block decompression — decompress blocks across multiple threads
- LZFSE write optimization — tunable compression levels for LZFSE output
- APFS partition detection — identify APFS containers within DMGs
- Partition resizing — create DMGs with custom partition layouts
- Progress callbacks — report compression/decompression progress for UI integration
License
MIT