Skip to content

The HD DVD Format (and its AACS layer)

HD DVD is a disc format; AACS is the encryption layered on top of it. The two are independent, exactly as they are for Blu-ray and 4K UHD: the format is the physical medium, the filesystem, and the stream layout; AACS is the key hierarchy and the content cipher. This page documents the format first, then the AACS layer, cross-referencing the shared key hierarchy on the AACS reference rather than repeating it.

Every HD DVD-Video disc uses UDF 2.5 as its filesystem, with 2048-byte logical sectors inherited from DVD. At the disc root sit two directories:

/ (UDF 2.5, 2048-byte sectors)
├── HVDVD_TS/ Standard Content — the "DVD-Video on steroids" tree (.EVO .MAP .VTI/.IFO)
└── ADV_OBJ/ Advanced Content — the interactive layer (.XPL playlists, markup, script)

HD DVD defines two ways to author a title, and many discs ship both:

  • Standard Content — DVD-Video’s data structures scaled up: a Video Manager (VMG), one or more Video Title Sets (VTS), Program Chains (PGC), chapters (PTT), cells, and in-stream navigation/highlights (PCI + HLI). It lives entirely in HVDVD_TS and was cheap to author because it reused DVD tooling.
  • Advanced Content — an interactive runtime layer (XML markup + ECMAScript with a DOM-like player API, network access, persistent storage, and a multi-plane compositor — the HD DVD counterpart to Blu-ray’s Java layer). Playing Advanced Content is mandatory in every conformant HD DVD player. It spans both ADV_OBJ (playlists, markup, script) and HVDVD_TS (the actual A/V it plays).

The signature of an Advanced-Content-driven disc is a Primary Video Set with no First-Play domain and no VMG-menu domain — navigation is handled by the application layer, not by in-stream DVD commands.

The Primary Video Set (PRMVS) is the umbrella object in HVDVD_TS: a VMG, one or more Standard VTSs, and one Advanced VTS (the title-set the interactive engine plays).

The A/V objects are Enhanced Video Objects (.EVO, also written EVOB) — an extension of the DVD VOB. An EVO is an MPEG-2 Program Stream: a run of 2048-byte packs, each beginning with a 00 00 01 BA pack-start code — one pack per logical sector. Confirmed on real discs. Packs are grouped into EVOB Units (EVOBU), each led by a Navigation Pack (NV_PCK), directly analogous to DVD’s VOBU + NV_PCK. The pack types:

PackContents
NV_PCKNavigation (PCI + DSI), on private_stream_2 (0xBF) — never encrypted
VM_PCK / VS_PCKMain / sub video
AM_PCK / AS_PCKMain / sub audio
SP_PCKSub-picture (bitmap subtitles)
ADV_PCKAdvanced-Content files multiplexed inline — never encrypted

Clip filenames follow a fixed HVnnnTnn.EVO pattern, though retail discs also carry human-named clips (FEATURE_1.EVO, MAINMENU.EVO, MENULOOP.EVO, …).

  • .MAP — a time map (the VTS_TMAP data) pairing chapter/timestamp to EVO pack, enabling seek. Playlists reference the .MAP, not the .EVO directly.
  • .VTI — Video Title Information, the Advanced-VTS control block that references the EVOBs; the HD DVD analogue of DVD’s VTS_xx_0.IFO. Example name HVA00001.VTI.
  • .IFO / .BUP — some discs use a DVD-style IFO/BUP navigation instead: HV000I01.IFO as the VMG analogue, HV0nnI01.IFO as per-VTS. AVC-video EVOs cannot play standalone; they depend on the IFO pair, exactly as DVD VOBs depend on their IFO.

The DVD → HD DVD analogue map: VIDEO_TS/HVDVD_TS/; VIDEO_TS.IFO(VMG)→HV000I01.IFO or VPLST000.XPL; VTS_xx_0.IFO.VTI/HV0nnI01.IFO; VTS_xx_n.VOB.EVO; plus the new .MAP time map (no DVD equivalent).

ADV_OBJ holds the interactive layer:

  • VPLST%%%.XPL — the playlist(s), an XML document in the HDDVDVideo/Playlist namespace. It is a <Playlist><Configuration><TitleSet><Title>, each <Title> naming its <PrimaryAudioVideoClip> clips (referenced by file:///dvddisc/HVDVD_TS/…MAP URIs, i.e. the .MAP sidecar) in playback order with titleTimeBegin/titleTimeEnd, a titleDuration, a displayName, and a <ChapterList>. The TitleSet carries tickBase (the timecode frequency).
  • DISCID.DAT — disc identification/configuration.
  • .ACA — a packaged resource container.
  • Loose interactive resources when not packed into an ACA: .xmu markup, .js ECMAScript, .xas subtitles, plus images/fonts.

A feature spanning the disc’s layer break (single-layer 15 GB / dual-layer 30 GB) is authored as multiple EVO segments — commonly FEATURE_1.EVO + FEATURE_2.EVO — with the playlist stitching them into one seamless title via ordered <PrimaryAudioVideoClip> entries; the segments are concatenated in playlist order. The naming variants FEATURE_1/FEATURE_2 and feature/feature_Divide both appear in the wild.

HD DVD-Video mandates three video codecs — VC-1, H.264/AVC, and MPEG-2 — all decodable by every player; in practice the great majority of releases are VC-1. Inside the EVO program stream they are routed by stream_id:

  • VC-1 rides the extended stream-id 0xFD with stream_id_extension = 0x55 — composite 0xFD55.

  • H.264 and MPEG-2 video use ordinary video stream-ids 0xE00xEF (the payload is probed to tell them apart).

  • Audio rides private_stream_1 (0xBD), keyed by the first payload byte (sub-stream id):

    sub-stream idCodec
    0x800x87AC-3 (Dolby Digital)
    0x880x8F, 0x980x9FDTS / DTS-HD
    0xA00xAFLinear PCM or MLP
    0xB00xBFDolby TrueHD (MLP)
    0xC00xCFDolby Digital Plus (E-AC-3) — and AC-3 in EVOB
  • Navigation rides private_stream_2 (0xBF) — PCI + DSI, as in VOB.

One divergence from Blu-ray worth noting for a muxer: Dolby TrueHD was mandatory on HD DVD (optional on Blu-ray), so a TrueHD track is always player-decodable; DTS-HD MA/HR were optional (the DTS core is always present).

HD DVD used first-generation AACS — the same generation and the same core crypto as Blu-ray AACS 1.0 (AES-128, a subset-difference-tree MKB, and the AES-G derivation of the Volume Unique Key). AACS 2.0 / 2.1 are 4K-UHD-only and never touched HD DVD. The shared key hierarchy is documented on the AACS page; this section covers only what HD DVD does differently — which is entirely at the file and container layer, not the cipher.

The AACS directory: nominal versus observed

Section titled “The AACS directory: nominal versus observed”

Nominally the AACS key material lives in a directory named AACS with a parallel AACS_BAK backup, and the boot paths are /AACS/MKBROM.AACS and the like.

Real retail discs deviate. Observed AACS directories: ANY! and AAC!, each with a <name>!_BAK mirror. The trailing ! and the per-authoring-house token are observed on disc, not part of the published format. The consequence for any implementation is concrete: the AACS directory must be found by discovery — scan the root for the directory that contains MKBROM.AACS, ignoring the !_BAK mirror — because the nominal /AACS/ path does not exist on these discs.

Every file lives in the AACS directory above.

FileRole
MKBROM.AACSThe one and only Media Key Block for this pressed disc. Device Keys → Processing Key → applied here → Media Key (Km).
MKBRECORDABLE.AACSA read/write MKB used by recording devices to update recordable media — not used to play this disc. The only component not mirrored into the backup.
VTKF%%%.AACSTitle Key File (Video). Holds the encrypted title keys. Magic DVD_HD_V_TKF. Bound to one playlist (see below).
VTUF%%%.AACSTitle Usage File (Video). Holds usage rules (copy-control), indexed from each EVOB’s CPI. Magic DVD_HD_V_TUF. Optional.
DKF.AACSDirectory Key File — decrypts a content provider’s directory name in persistent storage. Magic DVD_HD_V_DKF. Not a disc/media key; ignored on Standard-Content discs.
CONTENT_CERT.AACSContent Certificate — the signed root of the on-disc integrity chain.
CONTENT_HASH_TABLE1.AACSHashes of the A/V hash units (the EVOB data).
CONTENT_HASH_TABLE2.AACSHashes of the navigation data (markup/script) plus the TKF/TUF/DKF/DISCID files.
CONTENT_REVOCATION_LIST.AACSThe content revocation list (distinct from the host/drive revocation lists carried inside the MKB).

The VTKF is where HD DVD diverges most visibly from Blu-ray (which keeps all title keys in one Unit_Key_RO.inf indexed by CPS unit). On HD DVD:

  • The %%% suffix is the playlist index, not a CPS-unit number. Each VPLST%%%.XPL is accompanied by a VTKF%%%.AACS — each Title Key File is bound to exactly one Advanced-Content playlist (a Category 2 disc). A bare VTKF.AACS with no suffix denotes a Category 1 disc (Standard Content, no playlist). So a disc’s VTKF090 + VTKF100 correspond to playlists VPLST090 + VPLST100; a disc with four VTKFs simply has four playlists.
  • The correct file is selected by name-match, not by trial. The TKF header carries a 12-byte PLAYLIST_NAME; a player compares it to the currently active playlist and, unless the names are identical, the title keys in that TKF must not be used. (For Standard Content, PLAYLIST_NAME is all 0xFF.)
  • Structure — a fixed 2480-byte file, verified byte-exact on real discs:
    • a 128-byte header: magic DVD_HD_V_TKF (bytes 0–11), HD_VTKF_SIZE=2480 (12–15), PLAYLIST_NAME (16–27), version (32–33);
    • 64 title-key entries of 36 bytes each, starting at byte 128 — each entry is 1 byte BIFO + 3 reserved + a 16-byte encrypted title key + a 16-byte binding MAC. Entry #1’s key is at offset 132; entry #2 begins at 164; and so on. BIFO bit 7 (AV_FLG) set = the slot holds a key; the entry index (1-based) is the CPS unit number;
    • a trailing 16-byte TKF MAC (bytes 2464–2479), a CMAC over the file keyed by the Volume Unique Key — which lets an implementation verify a candidate key is correct.
    • For pre-recorded discs the binding type is “Volume-ID only” and the 16-byte binding MAC is filled with 0xFF.
  • The SHA-1 of the whole VTKF file is the per-disc DiscID used to index a key database.
  • VTUF (DVD_HD_V_TUF) carries the usage rules: a set of Usage Rule Sets that each EVOB’s CPI points into via a Usage Rule Pointer. Same %%% playlist convention as the VTKF; optional; MAC-protected under the Volume Unique Key.
  • DKF (DVD_HD_V_DKF) is a 64-byte file holding one encrypted Directory Key; a player derives PROVIDER_DIR = AES-G(K_DIR, PROVIDER_ID), the provider’s directory name in persistent storage, so one title’s saved data cannot reach another’s. No Blu-ray analogue.
  • CONTENT_CERT is the signed root of trust. Byte 0 is the Certificate Type (0x00)not an AACS version field; there is no version byte in the HD DVD content certificate. It carries an Applicant ID + Content Sequence Number (together the content ID), a Minimum CRL Version floor, hash-table digests, and the signature. The integrity chain runs: verify the certificate signature → check each hash table against the digest in the certificate → check the content against the tables.

Content encryption — per-pack, not per-aligned-unit

Section titled “Content encryption — per-pack, not per-aligned-unit”

This is the second major divergence from Blu-ray, and the one that most affects a decryptor.

Blu-ray encrypts a 6144-byte aligned unit (three sectors): the first 16 bytes are a clear seed, and bytes 16–6144 are AES-128-CBC encrypted under a per-unit block key, with a fresh CBC chain per unit.

HD DVD does not use that model. Content is MPEG-2 Program Stream in 2048-byte packs, and encryption is per-pack, CSS-style:

  • The pack header and PES header stay in the clear; only the PES payload is encrypted. (Directly observable on a decrypted rip: the pack header 00 00 01 BA … and the clear PES header — e.g. 00 00 01 FD … 55 for VC-1 — are intact, and only the elementary-stream payload is opaque.)
  • Whether a pack is encrypted is signaled by the MPEG-2 PES_scrambling_control field — the 2-bit field in the first PES-flags byte, at offset 20 of the pack (14-byte pack header + 4-byte PES start code + 2-byte PES length). The value 01 (byte[20] & 0x30 == 0x10) marks an encrypted pack.
  • Pack-type overrides: NV_PCK (navigation) and ADV_PCK (advanced) are never encrypted; HL_PCK (highlight) must be decrypted even when the scrambling flag is clear.
  • Each encrypted pack derives a per-pack Content Key: Kc = AES-G(Kt, D_tk ‖ CPI_lsb96), where Kt is the title key from the VTKF, D_tk is 32-bit Title Key Data, and CPI_lsb96 is the low 96 bits of the CPI carried in the pack’s control information. The payload is then AES-128-CBC decrypted under Kc with a fixed, format-constant IV. Interleaved (ILVU) packs use a Sequence Key in place of Kt.
AreaStatus
UDF 2.5, 2048-byte packs, HVDVD_TS + ADV_OBJ layoutConfirmed. Every disc
EVO = MPEG-2 Program Stream; stream-id routing (VC-1 0xFD/0x55, video 0xE0–0xEF, audio 0xBD)Confirmed. Muxes end to end
First-generation AACS, crypto identical to Blu-ray AACS 1.0Confirmed
.AACS file inventory and each file’s role; VTKF↔playlist bindingConfirmed
VTKF layout: 2480-byte file, 128-byte header, 64 × 36-byte entries, trailing MACConfirmed. Verified byte-exact on real discs
Per-2048-pack CBC, clear headers, PES_scrambling_control flag, Kc = AES-G(Kt, …), constant IVWorking model. Not yet verified against an encrypted disc
The ANY! / AAC! directory name and the trailing !Observed on real discs. The reason for the naming is unconfirmed
When Kc derivation is mandatory vs when plain Kt suffices; exact in-pack clear/encrypted boundaryOpen