Using the Verify tool
The C2PA Verify tool (often referred to as simply "Verify") is useful both for consumers and for CAI application developers.
How to use Verify
You can use Verify to inspect a digital asset file in two ways:
- Upload an asset file from your local computer.
- Use an asset URL.
Supported asset file types include:
- Image: AVIF, DNG, HEIC, HEIF, JPEG, PNG, SVG, TIFF, and WebP.
- Video and audio: AVI, M4A, MOV, MP3, MP4, and WAV.
- Document: PDF.
Verify shows the complete current list of supported file types (when no asset is displayed on the page).
Uploading an asset
Click Select a file from your device then use the native picker or drag and drop a file to upload it and display information from the associated Content Credentials (if any) such as the author, the tools used to create the asset, and so on.
Using an asset URL
You can also display Content Credentials for an asset with a publicly-visible URL by using a URL with the following format:
https://contentcredentials.org/verify?source=<ASSET_URL>
where <ASSET_URL>
is the URL of the asset.
For example: https://contentcredentials.org/verify?source=https://c2pa.org/public-testfiles/image/jpeg/adobe-20220124-CICA.jpg
To use Verify on an asset URL, the URL must not require any authentication and the hosting server must allow cross-origin resource sharing (CORS) in the Access-Control-Allow-Origin
HTTP response header.
C2PA test files
The C2PA public-testfiles repository contains image files that demonstrate Content Credentials, including multiple ingredients, Exif metadata, and various error conditions, along with links to inspect the assets using Verify and to view the corresponding manifest reports from the C2PA Tool.
Currently, most of the asset files in the repository are JPEG images, but a few PDF and video test files are also available.
Information displayed
Once you've uploaded an asset or entered an asset URL, if the asset:
- Does not have an associated manifest store, Verify displays the message No Content Credential.
- Does have an associated manifest store, Verify displays information from it in the three vertical panels, for example as shown below.
Left panel ↑ | Center panel ↑ | Right panel ↑ |
---|---|---|
Shows the asset name from the title property in the active manifest (may not be the same as the file name) and a thumbnail image.Cick Search for possible matches to search the Adobe Content Credentials Cloud for similar content; see Searching for matching Content Credentials for more information. | Shows all the asset's ingredients in a tree-like layout.
NOTE: The example above shows only one ingredient. | Shows information from the asset's manifest store, as described below: |
Title and signing information
The top of the right panel displays a thumbnail of the image with the title of the asset from the title
property in the active manifest. The value of this property might not be the same as the file name.
For example, suppose you downloaded a file from Adobe Stock and renamed it my_stock_download.jpeg
. In Verify it would appear as shown at right when the manifest store contains the title
property shown in the snippet below.
"manifests": {
"adobe:urn:uuid:f2513d23-8ca4-4135-82e8-15344e800ca6": {
"claim_generator": "Adobe_Stock c2pa-rs/0.4.2",
"title": "AdobeStock_135017891.jpeg",
...
}
}
Signing information
If the Content Credential was signed by a certificate that is NOT on the known certificate list, such as the CAI test certificate in the SDK, then Verify displays "Unrecognized" at the top of this section with this notice:
However, if the Content Credential was signed by a certificate on the known certificate list, then this section displays the name of the issuer of the claim signature from the signature_info.issuer
property in the active manifest, as shown in the example snippet below. It shows the organization name only if the signing certificate includes the "O" or Organization Name attribute (OID value 2.5.4.10) in the certificate's distinguished name information.
For signers on the known certificate list, this section also displays the time of the claim signature from the signature_info.time
property in the active manifest, as shown in the example snippet below. The date is converted from UTC to the local time zone.
"signature_info": {
"issuer": "Adobe Inc.",
"cert_serial_number": "121561926467332750920512530884092488196",
"time": "2022-10-26T16:46:46+00:00"
},
If the issuer string is too long, then the date might be truncated or not shown at all. If so, refer to the About this Content Credential section for the full date.
Validation status
If the manifest has validation errors, then Verify displays this notice:
Verify displays this warning if the validation_status
array contains any elements. For example, a this image with a hard binding hash mismatch error, as shown in this manifest store:
"validation_status": [
{
"code": "assertion.dataHash.mismatch",
"url": "self#jumbf=/c2pa/contentauth:urn:uuid:04cdf4ec-f713-4e47-a8d6-7af56501ce4b/c2pa.assertions/c2pa.hash.data",
"explanation": "asset hash error, name: jumbf manifest, error: hash verification( Hashes do not match )"
}
]
Another example that can result in this message is shown in this image with a missing referenced claim, as shown in this manifest store:
"validation_status": [
{
"code": "assertion.hashedURI.mismatch",
"url": "self#jumbf=c2pa.assertions/c2pa.ingredient__1",
"explanation": "hash does not match assertion data: self#jumbf=c2pa.assertions/c2pa.ingredient__1"
},
{
"code": "claim.missing",
"url": "self#jumbf=/c2pa/contentbeef:urn:uuid:8bb8ad50-ef2f-4f75-b709-a0e302d58019",
"explanation": "ingredient not found"
}
]
Credit and usage
The Credit and usage section displays information about the asset's author and usage rights, divided into these subsections:
- Produced by
- Social media accounts
- AI model usage (if the active manifest contains a do not train assertion)
Produced by
The Produced by subsection shows information derived from the CreativeWork assertion in the active manifest.
If the associated data
object has an author
property, then the name
property is shown under Produced by. If there is a url
or license
property, then it says Website with a link to the site. For example:
The above example shows the following CreativeWork assertion from the active manifest. The url
property is the URL of the asset on the Adobe Stock site:
"assertions": [
{
"label": "stds.schema-org.CreativeWork",
"data": {
"@context": "https://schema.org",
"@type": "CreativeWork",
"url": "https://stock.adobe.com/135017891"
},
"kind": "Json"
},
...]
Social media accounts
If the asset was created with Adobe Photoshop or Adobe Lightroom and the asset's creator has connected social media accounts, then the Credit and usage section shows the information added for any connected accounts, which can include Behance, Instagram, LinkedIn, and X (Twitter).
For more information, see:
- Content Credentials (Beta) in Photoshop - Connect accounts for creative attribution
- Content Credentials (Beta) in Lightroom
For example:
The CreativeWork assertion from the JSON manifest for the above example is shown below.
Show manifest code
{
"label": "stds.schema-org.CreativeWork",
"data": {
"@context": "https://schema.org",
"@type": "CreativeWork",
"author": [
{
"@type": "Person",
"credential": [
{
"alg": "sha256",
"hash": "IcZeS318070nuvDYmPqfQdZmOI7jGumMjHTxNshA2ao=",
"url": "self#jumbf=/c2pa/adobe:urn:uuid:4fd5a284-6fe9-479c-a8af-9bcbbf851d92/c2pa.credentials/did:adobe:ff76b2edfcdb600facacd7a165172c2aecc07718233798ed61bd3a9f4eba0969e"
}
],
"identifier": "did:adobe:ff76b2edfcdb600facacd7a165172c2aecc07718233798ed61bd3a9f4eba0969e",
"name": "obidigbo nzeribe"
},
{
"@id": "https://www.instagram.com/obidinzeribe",
"@type": "Person",
"credential": [
{
"alg": "sha256",
"hash": "IcZeS318070nuvDYmPqfQdZmOI7jGumMjHTxNshA2ao=",
"url": "self#jumbf=/c2pa/adobe:urn:uuid:4fd5a284-6fe9-479c-a8af-9bcbbf851d92/c2pa.credentials/did:adobe:ff76b2edfcdb600facacd7a165172c2aecc07718233798ed61bd3a9f4eba0969e"
}
],
"identifier": "did:adobe:ff76b2edfcdb600facacd7a165172c2aecc07718233798ed61bd3a9f4eba0969e",
"name": "obidinzeribe"
},
{
"@id": "https://www.behance.net/obidigbonzeribe",
"@type": "Person",
"credential": [
{
"alg": "sha256",
"hash": "IcZeS318070nuvDYmPqfQdZmOI7jGumMjHTxNshA2ao=",
"url": "self#jumbf=/c2pa/adobe:urn:uuid:4fd5a284-6fe9-479c-a8af-9bcbbf851d92/c2pa.credentials/did:adobe:ff76b2edfcdb600facacd7a165172c2aecc07718233798ed61bd3a9f4eba0969e"
}
],
"identifier": "did:adobe:ff76b2edfcdb600facacd7a165172c2aecc07718233798ed61bd3a9f4eba0969e",
"name": "obidigbo nzeribe"
}
]
},
"kind": "Json"
}
AI model usage
If the active manifest contains a do not train assertion, then the Credit and usage section displays the following message:
Do not use my content to train AI models
Process
The Process section displays information about the process used to create the asset, divided into the following subsections:
- App or device used
- Actions
- Ingredients
- AI-generated content (if the active manifest includes a generative AI action)
For example:
See the above example yourself, based on a C2PA test image:
App or device used
The value shown for App or device used is derived from the claim_generator
property in the active manifest. The string is truncated at the first space character and then underscore and slash characters are converted to spaces. In the above example, "claim_generator": "make_test_images/0.16.1 c2pa-rs/0.16.1"
is displayed as make test images 0.16.1.
Actions
The Actions subsection lists actions in the active manifest. For example, here is the actions
array for the above example:
Show manifest code
"actions": [
{
"action": "c2pa.opened",
"instanceId": "xmp.iid:813ee422-9736-4cdc-9be6-4e35ed8e41cb",
"parameters": {
"ingredient": {
"hash": "tTBD4/E0R0AjLUdJFpsVz3lE/KJUq22Vz0UGqzhEpVs=",
"url": "self#jumbf=c2pa.assertions/c2pa.ingredient"
}
}
},
{
"action": "c2pa.color_adjustments",
"parameters": {
"name": "brightnesscontrast"
}
},
{
"action": "c2pa.placed",
"instanceId": "xmp.iid:8a00de7a-e694-43b2-a7e6-ed950421a21a",
"parameters": {
"ingredient": {
"hash": "EMeeY5a+lvy1msl+9i5DOcOoeQowrqD7NyV0d8fwAX0=",
"url": "self#jumbf=c2pa.assertions/c2pa.ingredient__1"
}
}
},
{
"action": "c2pa.resized"
}
]
Ingredients
Ingredients shows the resources used to create the asset, derived from the ingredients
array in the active manifest. A thumbnail image is shown for each ingredient, if applicable. If an ingredient itself had Content Credentials, the "cr" icon is shown next to the thumbnail. In the above example, the asset was created by combining two ingredients, CAI.jpg
and A.jpg
, the first of which had Content Credentials.
AI-generated content
If one or more of the asset's ingredients was generated by artificial intelligence, as specified by the generative AI action, then a Content summary is shown and the Process section will also show the AI tool used, as shown in the example above.
About this Content Credential
This section displays the same information as described in Title and singing information.
Camera capture details
If the active manifest includes Exif metadata assertions, then an additional Camera capture details section shows information about the device used to create the asset, as illustrated below:
The Exif metadata assertions from the JSON manifest for the above example is shown below:
Show manifest code
"assertions": [
{
"label": "com.truepic.libc2pa",
"data": {
"git_hash": "023bb51",
"lib_name": "Truepic C2PA C++ Library",
"lib_version": "2.5.1",
"target_spec_version": "1.2"
},
"kind": "Json"
},
{
"label": "stds.exif",
"data": {
"@context": {
"EXIF": "http://ns.adobe.com/EXIF/1.0/",
"EXIFEX": "http://cipa.jp/EXIF/2.32/",
"dc": "http://purl.org/dc/elements/1.1/",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"tiff": "http://ns.adobe.com/tiff/1.0/",
"xmp": "http://ns.adobe.com/xap/1.0/"
},
"EXIF:GPSAltitude": "123.5",
"EXIF:GPSHorizontalAccuracy": "16.4",
"EXIF:GPSLatitude": "43.152093900000",
"EXIF:GPSLongitude": "-77.580532800000",
"EXIF:GPSTimeStamp": "2023-02-12T18:44:26Z"
},
"kind": "Json"
},
{
"label": "stds.exif",
"data": {
"@context": {
"EXIF": "http://ns.adobe.com/EXIF/1.0/",
"EXIFEX": "http://cipa.jp/EXIF/2.32/",
"dc": "http://purl.org/dc/elements/1.1/",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"tiff": "http://ns.adobe.com/tiff/1.0/",
"xmp": "http://ns.adobe.com/xap/1.0/"
},
"EXIF:Make": "Google",
"EXIF:Model": "Pixel 5"
},
"instance": 1,
"kind": "Json"
},
{
"label": "stds.exif",
"data": {
"@context": {
"EXIF": "http://ns.adobe.com/EXIF/1.0/",
"EXIFEX": "http://cipa.jp/EXIF/2.32/",
"dc": "http://purl.org/dc/elements/1.1/",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"tiff": "http://ns.adobe.com/tiff/1.0/",
"xmp": "http://ns.adobe.com/xap/1.0/"
},
"EXIF:DateTimeOriginal": "2023-02-12T18:44:26Z"
},
"instance": 2,
"kind": "Json"
},
...
]
See the above example yourself, based on a C2PA test image:
Searching for matching Content Credentials
Adobe products can save manifest stores in the Adobe Content Credentials Cloud. Click Search for possible matches to search the Adobe Content Credentials Cloud for content similar to the asset's ingredients, as described in the Ingredients section above.