Skip to content

Extension: ramp-c2pa-v1

RAMP-C2PA v1 integrates the C2PA (Coalition for Content Provenance and Authenticity) standard into RAMP, enabling agents and Exchanges to:

  • Verify content provenance — who created it, what tools were used, whether it’s been modified
  • Enforce creator-declared training/mining restrictions commercially via RAMP access controls
  • Resolve disputes with stronger evidence using C2PA hard and soft content bindings
  • Filter for provenance-verified content at discovery time

C2PA proves what content IS (provenance). RAMP manages what you can DO with it (commercial access). This profile bridges the two.

Design Principle: Consume Results, Not Structures

Section titled “Design Principle: Consume Results, Not Structures”

RAMP does not re-implement C2PA internals. C2PA has its own container format (JUMBF), its own PKI (X.509 certificates), and its own validation algorithm (COSE Sign1). This profile defines how C2PA validation results are carried in RAMP’s existing attestation mechanism — not how to parse JUMBF or verify COSE signatures.

A C2PA verification vendor (the Exchange itself, or a third party like Truepic or a C2PA Trust List validator) validates the manifest and publishes results as a standard RAMP ResourceAttestation. C2PA-unaware agents benefit from the results without needing C2PA libraries.

  • Exchanges serving content with C2PA credentials (news photos, AI-generated images, medical imaging, legal documents)
  • Verification vendors that validate C2PA manifests and bridge the results into RAMP attestations
  • Agents that need provenance assurance for high-stakes content (medical, legal, financial)
  • Providers that embed C2PA credentials in their content and want RAMP to enforce their training/mining declarations

Implementers must be familiar with:

  • RAMP protocol (proto/ramp/v1/ramp.proto)
  • ResourceIdentity, ResourceAttestation, and AccessRestrictions messages
  • The ext field mechanism (google.protobuf.Struct)
  • C2PA Specification 2.3 (recommended, not required for consumers)

An Exchange declares support by including "ramp-c2pa-v1" in ExchangeManifest.supported_profiles:

{
"ver": "1.0",
"domain": "exchange.example.com",
"supported_profiles": ["ramp-c2pa-v1"],
"accepted_verifiers": ["truepic.com", "contentcredentials.org"]
}

These fields are in the core ramp.proto (Layer 1), not in ext:

FieldTypeDescription
c2pa_manifeststringURI to the C2PA content credentials manifest (sidecar, embedded, or Content Credentials Cloud)
c2pa_statusC2PAStatusSummary validation result: TRUSTED, VALID, INVALID, or ABSENT
soft_bindingstringContent-derived identifier surviving format transcoding (from C2PA soft binding assertion)
soft_binding_methodstringAlgorithm: "phash-v1", "c2pa-watermark", "chromaprint"
ValueC2PA EquivalentMeaning
TRUSTEDWell-formed + valid + trustedSignature verifies AND signer chains to C2PA Trust List
VALIDWell-formed + validSignature verifies, but signer not in C2PA Trust List
INVALIDValidation failedSignature mismatch, malformed manifest, or broken binding
ABSENTNo manifestContent was checked — no C2PA credentials present

When a C2PA verification vendor validates a manifest, it publishes results as a RAMP ResourceAttestation with these standardized claim names:

Claim KeyTypeDescription
c2pa.statusstring"trusted", "valid", "invalid" — mirrors C2PAStatus enum
c2pa.signerstringX.509 subject common name from the signing certificate
c2pa.signer_orgstringOrganization from the signing certificate
c2pa.signer_domainstringDomain extracted from the signer’s certificate (SAN or CN)
c2pa.trust_liststringURI of the trust list used for validation (e.g., "c2pa.org/trust-list-v2")
c2pa.signed_atstringISO 8601 timestamp from the claim signature
c2pa.tsastringTime Stamping Authority domain (if RFC 3161 timestamp present)
c2pa.tsa_timestringISO 8601 authenticated time from TSA (stronger than signed_at)
Claim KeyTypeDescription
c2pa.actionsstring[]Summary of c2pa.actions.v2 history. Values: "c2pa.created", "c2pa.edited", "c2pa.color_adjusted", "c2pa.cropped", "c2pa.redacted", "c2pa.watermarked", etc.
c2pa.source_typestring"human", "ai", "hybrid" — from C2PA sourcetype (0, 1, 2)
c2pa.claim_generatorstringSoftware that generated the manifest (e.g., "Adobe Photoshop 26.0")
c2pa.ingredients_countintegerNumber of c2pa.ingredient.v3 assertions (composition depth)
Claim KeyTypeDescription
c2pa.training_allowedbooleanFrom c2pa.training_mining assertion — whether content may be used for AI/ML training
c2pa.mining_allowedbooleanFrom c2pa.training_mining assertion — whether content may be data-mined
Claim KeyTypeDescription
c2pa.hard_binding_algstringHard binding algorithm: "sha256", "sha384", "sha512"
c2pa.hard_binding_validbooleanWhether the hard binding hash matches current content
c2pa.soft_binding_algstringSoft binding algorithm (if present): "phash-v1", watermark ID
c2pa.soft_binding_hashstringSoft binding value (copied to ResourceIdentity.soft_binding)
{
"verifier": "truepic.com",
"kid": "truepic-2026-Q1",
"attested_at": "2026-03-20T14:00:00Z",
"uri": "https://reuters.com/photos/2026/03/20/climate-summit.jpg",
"claims": {
"c2pa.status": "trusted",
"c2pa.signer": "Reuters News & Media Inc.",
"c2pa.signer_domain": "reuters.com",
"c2pa.trust_list": "c2pa.org/trust-list-v2",
"c2pa.signed_at": "2026-03-20T11:30:00Z",
"c2pa.tsa": "digicert.com",
"c2pa.actions": ["c2pa.created", "c2pa.color_adjusted"],
"c2pa.source_type": "human",
"c2pa.claim_generator": "Reuters IPTC Photo Desk 4.1",
"c2pa.ingredients_count": 0,
"c2pa.training_allowed": false,
"c2pa.mining_allowed": false,
"c2pa.hard_binding_alg": "sha256",
"c2pa.hard_binding_valid": true,
"content_hash": "sha256:a1b2c3d4e5f6...",
"hash_method": "sha256"
},
"signature": "base64-encoded-ed25519-signature"
}

The Exchange SHOULD automatically map C2PA training/mining declarations to RAMP access restrictions:

C2PA AssertionRAMP Mapping
c2pa.training_mining.training_allowed == falseAccessRestrictions.prohibited_functions += "ai_train"
c2pa.training_mining.mining_allowed == falseAccessRestrictions.prohibited_functions += "ai_index"
c2pa.training_mining absentNo restriction inferred (absence is not prohibition)

This creates a two-layer enforcement model:

  1. Declaration layer (C2PA): The content creator embeds their intent in the content itself. This travels with the content, even outside RAMP channels.
  2. Enforcement layer (RAMP): The Exchange reads the C2PA declaration and enforces it commercially — an agent requesting intended_use: "ai_train" will not receive offers for content where training is prohibited.

C2PA content bindings strengthen RAMP’s dispute resolution:

When an agent files DISPUTE_REASON_CONTENT_MISMATCH and the offer carried c2pa_status: TRUSTED, the Exchange can:

  1. Re-validate the C2PA hard binding against the received_content_hash in the dispute
  2. If the C2PA hard binding was sha256 and the agent’s received hash matches the C2PA hash but differs from the offer’s content_hash — the provider modified the content after attestation (provider fault)
  3. Auto-resolve as RESOLUTION_TYPE_CREDIT

When content is legitimately transcoded (image resized, PDF extracted to text) and the hard hash no longer matches:

  1. The agent computes a soft binding hash from received content using soft_binding_method
  2. Compares against ResourceIdentity.soft_binding
  3. If the soft binding matches, the content is substantively the same despite format change — dispute SHOULD be rejected
  4. If the soft binding also mismatches, this is genuine content substitution — dispute SHOULD be upheld

C2PA and RAMP use different PKI:

AspectC2PARAMP
Key formatX.509 certificatesEd25519 JWKS
Trust modelCentrally curated Trust Lists (CA hierarchy)Decentralized (provider ↔ exchange manifests)
Signature formatCOSE Sign1 (RFC 9052)JWS Compact (RFC 7515)
TimestampingRFC 3161 TSA (cryptographic proof)Self-declared attested_at

The verification vendor bridges these worlds:

C2PA World RAMP World
───────────────── ──────────────────
X.509 cert chain Ed25519 JWKS
COSE Sign1 signature ──► JWS EdDSA signature
C2PA Trust List Vendor RAMP accepted_verifiers
JUMBF manifest bridges ResourceAttestation.claims
RFC 3161 TSA attested_at timestamp

The vendor’s Ed25519 key (published at /.well-known/ramp-verifier.json) attests to the results of X.509/COSE validation. RAMP participants trust the vendor; the vendor trusts the C2PA Trust List. One-way bridge, clean separation.


  • Populate ResourceIdentity.c2pa_manifest when content has C2PA credentials
  • Populate c2pa_status with validation result
  • Declare "ramp-c2pa-v1" in ExchangeManifest.supported_profiles

All of Level A, plus:

  • Publish a C2PA-bridged ResourceAttestation with identity and rights claims (c2pa.status, c2pa.signer, c2pa.training_allowed, c2pa.mining_allowed)
  • Map c2pa.training_mining to AccessRestrictions.prohibited_functions
  • Extract content_hash from C2PA hard binding into attestation claims

All of Level B, plus:

  • Include provenance claims (c2pa.actions, c2pa.source_type, c2pa.ingredients_count)
  • Extract and populate soft_binding / soft_binding_method from C2PA soft binding assertions
  • Use soft binding evidence in dispute resolution
  • Support TSA-grade temporal claims (c2pa.tsa, c2pa.tsa_time)

Both C2PA and RAMP support Ed25519/EdDSA. A verification vendor that holds both an X.509 certificate (for C2PA signing) and an Ed25519 key (for RAMP attestation signing) can participate in both ecosystems.

AlgorithmC2PA SupportRAMP Support
Ed25519Yes (EdDSA via COSE)Yes (EdDSA via JWS)
ECDSA P-256YesNo
RSAYesNo
SHA-256Yes (hard binding)Yes (content_hash)
SHA-384/512YesYes (hash_method field)

  • ramp-news-v1: News photos with C2PA credentials benefit from both profiles. The news profile tracks editorial metadata (corrections, retractions); the C2PA profile tracks content provenance (camera, edits, creator identity). They compose — an offer can carry both news.* and c2pa.* claims.
  • ramp-comp-v1: CoMP’s Video.c2pa, Image.c2pa, and Audio.c2pa fields carry C2PA manifest URIs at the media asset level. This profile operates at the RAMP resource level — the ResourceIdentity.c2pa_manifest is the canonical pointer, independent of CoMP.