Skip to main content

JUMBF Box Structure

Detailed reference for the JUMBF (JPEG Universal Metadata Box Format) structure used by C2PA.

Box Hierarchy

JPEG APP11 Segment

└─► JUMBF Superbox (type: 'jumb')

├─► JUMD Description Box (type: 'jumd')
│ │
│ ├─► UUID Type (16 bytes)
│ ├─► Flags (1 byte)
│ ├─► Label (null-terminated)
│ ├─► Optional: ID (4 bytes)
│ └─► Optional: Signature (32 bytes)

├─► CBOR Payload Box (type: 'cbor')
│ └─► CBOR data (manifest, claim, etc.)

└─► Nested JUMBF Superbox (type: 'jumb')
└─► ... (recursive)

JUMD Box Detail

UUID Types (First 4 bytes ASCII)

UUID PrefixFull UUIDPurpose
c2pa63327061-0010-0010-8000-00AA00389B71Main manifest
c2ma63326D61-0010-0010-8000-00AA00389B71Manifest
c2as63326173-0010-0010-8000-00AA00389B71Assertions
cbor63626F72-0010-0010-8000-00AA00389B71CBOR payload
c2cl6332636C-0010-0010-8000-00AA00389B71Claim
c2cs63326373-0010-0010-8000-00AA00389B71Claim signature

Flags Byte

BitValueMeaning
00x01Has ID
10x02Has Label
20x04Reserved
30x08Has Signature
4-7-Reserved

Example JUMD Box

Offset Size Description
0 16 UUID: 63 32 70 61 00 10 00 10 80 00 00 AA 00 38 9B 71 ("c2pa...")
16 1 Flags: 0x03 (Label + ID)
17 5 Label: "c2pa\0"
22 4 ID: 0x00000001
26 32 Signature: (32 bytes)

CBOR Payload Structure

The cbor box contains a CBOR-encoded C2PA manifest:

CBOR Map
├─► 1: "c2pa" (magic)
├─► 2: Claim Generator Info
│ ├─► name: "Adobe Photoshop"
│ ├─► version: "25.5.1"
│ └─► com.adobe.build: "20240302.r.408..."
├─► 3: Assertions (array)
│ ├─► 0: Actions
│ │ ├─► action: "c2pa.edited"
│ │ ├─► softwareAgent: "Adobe Firefly"
│ │ ├─► digitalSourceType: "trainedAlgorithmicMedia"
│ │ └─► when: "2024-01-15T14:30:22Z"
│ ├─► 1: Exclusions
│ │ └─► ranges: [{start: 57, length: 11443}]
│ └─► 2: Claim
│ ├─► title: "Generated Image"
│ ├─► format: "image/jpeg"
│ ├─► instanceId: "xmp.iid:..."
│ └─► claimGenerator: "Adobe Photoshop/25.5.1..."
└─► 4: Signature (COSE Sign1)
├─► protected: {alg: -7} (ES256)
├─► unprotected: {}
├─► payload: (bytes)
└─► signature: (bytes)

Nested JUMBF Boxes

For large manifests, JUMBF boxes can nest:

jumb (superbox)
├─► jumd (label: "c2pa")
├─► cbor (manifest)
└─► jumb (nested - large assertion)
├─► jumd (label: "c2pa.actions")
└─► cbor (actions detail)

PNG caBX Chunk

PNG stores C2PA in caBX chunks:

PNG Signature
IHDR
caBX (C2PA JUMBF data)
└─► Same JUMBF structure as JPEG
IDAT
IEND

QuickTime/HEIC UUID Box

QuickTime/HEIC uses a UUID atom:

'moov' or 'meta'
└─► 'uuid' (C2PA UUID: D8FEC3D6-1B0E-483C-9297-5828877EC481)
└─► JUMBF structure

Byte Order

All multi-byte values in JUMBF boxes are big-endian (network byte order), except:

  • UUID follows Microsoft GUID byte order (mixed endianness)
  • CBOR data follows CBOR spec (big-endian for integers)

ExifTool Parity

exiftool JUMBF parser matches ExifTool 13.55+ byte-for-byte:

  • ✅ 16-byte UUID parsing
  • ✅ 1-byte flags
  • ✅ Null-terminated labels
  • ✅ Optional 4-byte ID
  • ✅ Optional 32-byte signature
  • ✅ Recursive jumb container walking
  • ✅ Label-gated CBOR payload association