casc-lib 0.2.0

Pure Rust library for reading World of Warcraft CASC archives
Documentation

casc-lib

Pure Rust library for reading World of Warcraft CASC (Content Addressable Storage Container) archives.

This crate implements the full CASC extraction pipeline - from parsing .build.info and index files through BLTE decoding and TACT decryption - with no external CASC library dependencies.

Features

  • BLTE container decoding (N/Z/4 compression modes)
  • TACT encryption support (Salsa20 + ARC4)
  • LZ4 sub-block decompression
  • Encoding and root file parsing (Legacy, MFST V1, MFST V2)
  • Parallel extraction with rayon
  • JSONL/CSV metadata index generation
  • Community listfile integration (FDID-to-path mapping)
  • Supports retail, classic, and anniversary WoW installations

Usage

Add to your Cargo.toml:

cargo add casc-lib

Open storage and read a file by FileDataID

use casc_lib::extract::{CascStorage, OpenConfig};
use casc_lib::root::flags::LocaleFlags;

let config = OpenConfig {
    install_dir: "E:\\World of Warcraft".into(),
    product: Some("wow".into()),
    keyfile: None,
    listfile: None,
    output_dir: None,
};
let storage = CascStorage::open(&config)?;

let data = storage.read_by_fdid(136235, LocaleFlags::EN_US)?;
println!("Read {} bytes", data.len());

Iterate root entries

use casc_lib::root::flags::LocaleFlags;

for (fdid, entry) in storage.root.iter_all() {
    if entry.locale_flags.matches(LocaleFlags::EN_US) {
        println!("FDID {} -> CKey {}", fdid, hex::encode(entry.ckey));
    }
}

List files with glob filtering

use casc_lib::extract::list_files;

let files = list_files(&storage, LocaleFlags::EN_US.0, Some("interface/icons/*"));
for (fdid, path) in &files {
    println!("{}\t{}", fdid, path);
}

Documentation

Full API docs are available on docs.rs.

License

Licensed under the MIT License.