When a Man-in-the-Middle tries crashing the live streaming party, the C2PA bouncer steps in
Roberto Ramos-Chavez, Mohamad Raad, Adam Goldberg, Arjen Wagenaar
Unified Streaming
February 2-4, 2026
The Cable Center, Denver, CO
MHV '26 February 02--05, 2026,Denver, CO, USA�© 2026 Copyright is held by the owner/author(s).�ACM ISBN 979-8-4007-2466-4/2026/02�https://doi.org/10.1145/3789239.3793271
Background and objective
2
Generation and Validation of C2PA Metadata
3
C2PA metadata generation
C2PA metadata validation
Live C2PA Framework: �Use Cases and Requirements
4
Validation of C2PA metadata
5
Validation requirements of C2PA metadata - MITM in a live stream
Use cases and requirements
6
7
THE BOUNCER
8
9
Core concepts
10
Taking a step back: C2PA and Manifests
11
Manifest structure
12
What is a DASH event?
13
Framework overview
14
Sec. 4
Sec. 4.2
Sec. 5
Sec. 3
Sec. 3.3.4
Two Methods for C2PA Live Video Streaming
2. Verifiable segment Info method:
1. Per-segment C2PA Manifest method:
15
Bitrate
Time
C2PA Manifest
Seg 1
Seg 1
Seg 1
Seg 1
Seg 2
Seg 2
Seg 2
Seg 2
Seg N
Seg N
Seg N
Seg N
…
…
…
…
Init. seg
Init. seg
Init. seg
Init. seg
C2PA Manifest
Bitrate
Time
COSE_Sign1
Seg 1
Seg 1
Seg 1
Seg 1
Seg 2
Seg 2
Seg 2
Seg 2
Seg N
Seg N
Seg N
Seg N
…
…
…
…
Init. seg
Init. seg
Init. seg
Init. seg
Verifiable segment info method - Init. segment
16
16
https://spec.c2pa.org/specifications/specifications/2.3/specs/C2PA_Specification.html#_session_keys
{
"label": "c2pa.session-keys",
"kind": "Cbor",
"data": {
"keys": [
{
"key": {
1: 2, / kty: EC2 /
2: h'6b65795f303031', / kid: "key_001" /
-1: 1, / crv: P-256 /
-2: h'18b4ca7f19bb7ad4e8e5e28a8c9a7fb8e0bb5e5c9e5b8e5d7f4c8a9b7c6d5e4f3', / x /
-3: h'1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f809' / y /
},
"minSequenceNumber": 175,
"createdAt": 0("2025-07-29T10:00:00Z"),
"validityPeriod": 3900,
"signerBinding": 18([
/ protected / h'a10126',
/ unprotected / {},
/ payload / h'',
/ signature / h'3046022100abcd...'
])
}
]
}
}
Example using one single key
Session Keys structure:
Verifiable segment info method [1] - Media segments
emsg box:
17
Payload
Framework Evaluation (Sec. 5.2)
Test content:
Test environment
18
Framework Evaluation (Sec. 5.2)
Avg. size of media segment using Per-segment method (blue) and Session keys method (purple)
Avg. MPD size and initialization segment size per bitrate.
19
C2PA Manifest avg. size in segment:
Total size, including media data �and provenance data
Content size Evaluation Costs
20
Example scenario - Super Bowl-like events
CDN Cost Tier (Enterprise)
Concurrent Viewers | 30M | | CDN Pricing Options: | |
Event Duration (hours) | 3 | | Pay-as-you-go ($/GB) | $0.080 |
Avg. Data per Viewer (GB) | 4.5 | | Enterprise ($/GB) | $0.010 |
Number of renditions | 5 | | | |
Metric | Session Keys (2 KB) | Per Segment Manifest (20 KB) | Difference | % Decrease (20KB ->2KB) |
C2PA per Segment (KB) | 2 | 20 | 18 | 90.0% |
Segments per Viewer | 5,625 | 5,625 | 0 | |
Total C2PA Data (PB) | 1.5 | 15.7 | 14.1 | 90.0% |
C2PA % of Total Bandwidth | 1.16% | 11.64% | 10.48% | 90.0% |
Additional CDN Cost | $15,716 | $157,160 | $141,444 | 90.0% |
C2PA Content Validation (Sec. 4.2)- dash.js v4.7.4
21
Initialization segment
Receives initialization segment blob before it goes into the media buffer.
Extracts JUMBF box (manifest store) from init. segment.
Reads and validates the manifest store using c2pa-js.
Update UI/UX based on C2PA manifest metadata: valid or invalid
Media segment
Receives media segment blob before it goes into the media buffer.
Extract session keys from C2PA manifest and matches KID
Extract COSE_Sign1 from emsg and compute COSE_Sign1 structure for validation
Update UI/UX based on COSE_Sign1 signature: valid or invalid
Note: Player keeps a state of the sequence number to identify if media segments have been swapped by a MITM.
C2PA Content Validation (Sec. 4.2)- dash.js v4.7.4
22
Initialization segment
Receives initialization segment blob before it goes into the media buffer.
Extracts JUMBF box (manifest store) from init. segment.
Reads and validates the manifest store using c2pa-js.
Update UI/UX based on C2PA manifest metadata: valid or invalid
Media segment
Receives media segment blob before it goes into the media buffer.
Extract session keys from C2PA manifest and matches KID
Extract COSE_Sign1 from emsg and compute COSE_Sign1 structure for validation
Update UI/UX based on COSE_Sign1 signature: valid or invalid
Note: Player keeps a state of the sequence number to identify if media segments have been swapped by a MITM.
Observations and assessment
23
Concluding remarks and next steps
24
Thanks
25
To add an image click on the icon or drag an image from your files to this slide.
If you want to change the image in terms of position or cropping click with the right mouse button on the image and click Crop Image. Use the spheres at the edges of the image to adjust the image.
If any text disappears after adding an image, right click on the image and select Move to background.
Add image
26
Get in contact?
Email me -> roberto@unified-streaming.com