Skip to content

Commit 3a7e797

Browse files
authored
Merge pull request #270 from contentauth/aca-inspect
Replace Verify with ACA Inspect
2 parents fc65359 + 1ed186e commit 3a7e797

File tree

9 files changed

+430
-14
lines changed

9 files changed

+430
-14
lines changed

docs/community.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Participants are required to follow the [Adobe Code of Conduct](https://github.c
2929

3030
### Verify
3131

32-
The code for the [C2PA Verify website](https://verify.contentauthenticity.org/) is open source. For general information on using it, see [Using the Verify tool](getting-started/verify.mdx).
32+
The code for the [C2PA Verify website](https://verify.contentauthenticity.org/) is open source. However, it currently uses the deprecated [Legacy JavaScript library](https://github.com/contentauth/c2pa-js-legacy).
3333

3434
### Related projects
3535

Lines changed: 388 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,388 @@
1+
---
2+
id: inspect
3+
title: Using the inspect tool on Adobe Content Authenticity (Beta)
4+
---
5+
6+
import aca_inspect from '@site/static/img/aca-inspect.png';
7+
import inspect_actions from '@site/static/img/inspect_actions.png';
8+
import MarkdownCell from '@site/src/components/MarkdownCell';
9+
10+
The [**Inspect tool on Adobe Content Authenticity (Beta)**](https://verify.contentauthenticity.org) (often referred to as "ACA Inspect" or simply "Inspect") is a [C2PA conforming validator product](../conformance.mdx#validator-products) that validates and displays Content Credentials for various asset types.
11+
12+
<img
13+
src={aca_inspect}
14+
style={{
15+
width: '500px',
16+
border: '1px solid #ccc',
17+
}}
18+
/>
19+
20+
For more information, see [Inspect Content Credentials](https://helpx.adobe.com/creative-cloud/apps/adobe-content-authenticity/inspect/inspect-tool.html) on Adobe HelpX.
21+
22+
## How to use Inspect
23+
24+
You can use Inspect to view Content Credentials for an asset in two ways:
25+
26+
- [Upload an asset file](#uploading-an-asset) from your local computer.
27+
- [Use an asset URL](#using-an-asset-url).
28+
29+
Supported asset file types include:
30+
31+
- **Image**: AVIF, DNG, GIF, HEIC, HEIF, JPEG, PNG, SVG, TIFF, and WebP.
32+
- **Video and audio**: AVI, M4A, MOV, MP3, MP4, and WAV.
33+
- **Document**: PDF.
34+
35+
:::tip
36+
When you first load the site and no asset is displayed on the page, Inspect shows the complete current list of supported file types.
37+
:::
38+
39+
### Uploading an asset
40+
41+
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.
42+
43+
### Using an asset URL
44+
45+
You can also display Content Credentials for an asset with a publicly-visible URL by using a URL with the following format:
46+
47+
```
48+
https://inspect.cr?source=<ASSET_URL>
49+
```
50+
51+
where `<ASSET_URL>` is the URL of the asset.
52+
53+
For example: https://inspect.cr?source=https://contentauth.github.io/example-assets/images/car-es-Ps-Cr.jpg
54+
55+
:::note
56+
To use Inspect 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.
57+
:::
58+
59+
## Example assets
60+
61+
The [example-assets](https://contentauth.github.io/example-assets/) repository contains some sample assets that demonstrate Content Credentials, including links to view the corresponding manifest reports generated by [C2PA Tool](../c2patool/readme.md) and to view the Content Credentials using Inspect.
62+
63+
## Information displayed
64+
65+
Once you've uploaded an asset or entered an asset URL, if the asset:
66+
67+
- **Does not** have an associated manifest store, Inspect displays the message **No Content Credential**.
68+
- **Does** have an associated manifest store, Inspect displays information from it in the three vertical panels, for example as shown below.
69+
70+
import verify_sections from '@site/static/img/inspect-sections.png';
71+
72+
<img src={verify_sections} style={{ width: '800px', marginBottom: '20px' }} />
73+
74+
<table>
75+
<thead>
76+
<tr>
77+
<th style={{ width: '260px', backgroundColor: '#ccc' }}>
78+
Left panel &uarr;{' '}
79+
</th>
80+
<th style={{ width: '300px', backgroundColor: '#ccc' }}>
81+
Center panel &uarr;
82+
</th>
83+
<th style={{ width: '250px', backgroundColor: '#ccc' }}>
84+
Right panel &uarr;
85+
</th>
86+
</tr>
87+
</thead>
88+
<tbody>
89+
<tr>
90+
91+
<MarkdownCell valign="top">
92+
This section shows a thumbnail image and the asset name from the `title` property in the active manifest, which may not be the same as the file name. If there's no `title` property, it says "Untitled asset."
93+
94+
Also shows who signed the Content Credentials ("Recorded by").
95+
96+
Adobe products can save manifest stores in the [Adobe Content Credentials Cloud](index.mdx#storing-a-manifest-in-the-cloud). Click **Search for possible matches** to search there for content similar to the asset's ingredients.
97+
98+
</MarkdownCell>
99+
100+
<MarkdownCell valign="top">
101+
Shows all the asset's ingredients in a tree-like layout.
102+
- Click on an ingredient thumbnail to inspect its Content Credentials in the right panel.
103+
- Click **Compare** to compare ingredients either side-by-side or using a slider.
104+
105+
Zoom in and out using the mouse wheel or trackpad and pan by dragging.
106+
107+
NOTE: The example above shows only one ingredient.
108+
109+
</MarkdownCell>
110+
111+
<MarkdownCell valign="top">
112+
Shows information from the asset's manifest store, as described below:
113+
114+
- [Title and signing information](#title-and-signing-information)
115+
- [Contributor details](#contributor-details)
116+
- [Content details](#content-details)
117+
118+
</MarkdownCell>
119+
</tr>
120+
</tbody>
121+
</table>
122+
123+
### Title and signing information
124+
125+
The top of the right panel displays a thumbnail of the image along with the same title and signing information as shown in the left panel.
126+
127+
If the Content Credential was signed by a certificate that is NOT on the [C2PA trust list](conformance.mdx#c2pa-trust-lists), such as one of the SDK's [test certificates](signing/test-certs.md), then Inspect displays "Unrecognized" at the top of this section with this notice:
128+
129+
import verify_unknown_source from '@site/static/img/unknown-source.png';
130+
131+
<img
132+
src={verify_unknown_source}
133+
style={{ width: '283px', display: 'block', margin: '10px auto' }}
134+
/>
135+
136+
However, if the Content Credential was signed by a certificate on the [C2PA trust list list](conformance.mdx#c2pa-trust-lists), 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.
137+
138+
:::note
139+
This section shows the organization name only if the signing certificate includes the "O" or [Organization Name attribute](https://www.alvestrand.no/objectid/2.5.4.10.html) (OID value 2.5.4.10) in the certificate's distinguished name information.
140+
:::
141+
142+
For signers on the C2PA trust 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.
143+
144+
```json
145+
"signature_info": {
146+
"alg": "Ps256",
147+
"issuer": "Adobe Inc.",
148+
"common_name": "Adobe C2PA",
149+
"cert_serial_number": "419323736054358557205556576293173262079519360989",
150+
"time": "2025-10-23T19:22:19+00:00"
151+
},
152+
```
153+
154+
If the issuer string is too long, then the date might be truncated or not shown at all.
155+
156+
<!--
157+
158+
### Validation status
159+
160+
If the manifest has [validation errors](manifest/reading/validation.md), then Inspect displays this notice:
161+
162+
import verify_validation_error from '@site/static/img/verify-validation-error.png';
163+
164+
<img
165+
src={verify_validation_error}
166+
style={{ width: '300px', display: 'block', margin: '10px auto' }}
167+
/>
168+
169+
Inspect displays this warning if the `validation_status` array contains any elements. For example, here is an snippet from the manifest of an image with a hard binding hash mismatch error,
170+
171+
172+
For example, a [this image](https://verify.contentauthenticity.org?source=https://spec.c2pa.org/public-testfiles/image/jpeg/adobe-20220124-E-dat-CA.jpg) with a hard binding hash mismatch error, as shown in [this manifest store](https://spec.c2pa.org/public-testfiles/image/jpeg/manifests/adobe-20220124-E-dat-CA/manifest_store.json):
173+
174+
175+
```
176+
"validation_status": [
177+
{
178+
"code": "assertion.dataHash.mismatch",
179+
"url": "self#jumbf=/c2pa/contentauth:urn:uuid:04cdf4ec-f713-4e47-a8d6-7af56501ce4b/c2pa.assertions/c2pa.hash.data",
180+
"explanation": "asset hash error, name: jumbf manifest, error: hash verification( Hashes do not match )"
181+
}
182+
]
183+
```
184+
185+
Another example that can result in this message is shown in [this image](https://verify.contentauthenticity.org?source=https://spec.c2pa.org/public-testfiles/image/jpeg/adobe-20220124-E-clm-CAICAI.jpg) with a missing referenced claim, as shown in [this manifest store](https://spec.c2pa.org/public-testfiles/image/jpeg/manifests/adobe-20220124-E-clm-CAICAI/manifest_store.json):
186+
187+
188+
Another example that can result in this message is a missing referenced claim, as shown in snippet of manifest data:
189+
190+
```
191+
"validation_status": [
192+
{
193+
"code": "assertion.hashedURI.mismatch",
194+
"url": "self#jumbf=c2pa.assertions/c2pa.ingredient__1",
195+
"explanation": "hash does not match assertion data: self#jumbf=c2pa.assertions/c2pa.ingredient__1"
196+
},
197+
{
198+
"code": "claim.missing",
199+
"url": "self#jumbf=/c2pa/contentbeef:urn:uuid:8bb8ad50-ef2f-4f75-b709-a0e302d58019",
200+
"explanation": "ingredient not found"
201+
}
202+
]
203+
```
204+
205+
-->
206+
207+
### Contributor details
208+
209+
For assets edited and signed with Adobe tools, if the creator has configured [connected social media accounts](https://helpx.adobe.com/creative-cloud/apps/adobe-content-authenticity/connect-accounts.html) such as Instagram, LinkedIn, and Behance, then this section displays that information with links to the creator's profile on the social media platform.
210+
211+
### Content details
212+
213+
The **Content details** section displays information about the asset, divided into the following subsections:
214+
215+
- [App or device used](#app-or-device-used)
216+
- [Recorded by](#recorded-by)
217+
- [Actions](#actions)
218+
- [Ingredients](#ingredients)
219+
220+
Additionally, if the image was created with a generative AI tool, an **AI-generated** note is displayed at the top of the section.
221+
222+
#### App or device used
223+
224+
The value shown for **App or device used** is derived from the `claim_generator` and `claim_generator_info` properties in the active manifest.
225+
226+
#### Recorded by
227+
228+
The organization, device, or individual that signed the Content Credentials, based on the `signature_info` field in the manifest, for example:
229+
230+
```json
231+
"signature_info": {
232+
"alg": "Ps256",
233+
"issuer": "Adobe Inc.",
234+
"common_name": "Adobe C2PA",
235+
"cert_serial_number": "419323736054358557205556576293173262079519360989",
236+
"time": "2025-10-23T19:22:19+00:00"
237+
},
238+
```
239+
240+
#### Actions
241+
242+
<img
243+
src={inspect_actions}
244+
style={{
245+
width: '400px',
246+
float: 'right',
247+
border: '1px solid #ddd',
248+
margin: '10px',
249+
}}
250+
/>
251+
252+
The **Actions** subsection lists [actions](https://opensource.contentauthenticity.org/docs/manifest/assertions-actions#actions) in the active manifest, for example, as shown at right.
253+
254+
The corresponding `actions` array in the asset's manifest is shown below.
255+
256+
<div style={{ clear: 'both', marginBottom: '20px' }} />
257+
258+
<details style={{backgroundColor: 'transparent'}}>
259+
<summary class="code_summary">Show manifest code</summary>
260+
261+
```json
262+
{
263+
"label": "c2pa.actions.v2",
264+
"data": {
265+
"actions": [
266+
{
267+
"action": "c2pa.opened",
268+
"parameters": {
269+
"description": "Opened a pre-existing file",
270+
"com.adobe.tool": "open",
271+
"com.adobe.icon": "https://cai-assertions.adobe.com/icons/import-dark.svg",
272+
"instanceId": "xmp:iid:73f1d577-2d17-46ec-908a-09f2380df77c"
273+
}
274+
},
275+
{
276+
"action": "c2pa.cropped",
277+
"parameters": {
278+
"com.adobe.tool": "crop",
279+
"com.adobe.icon": "https://cai-assertions.adobe.com/icons/crop-dark.svg",
280+
"description": "Used cropping tools, reducing or expanding visible content area"
281+
}
282+
},
283+
{
284+
"action": "c2pa.resized",
285+
"parameters": {
286+
"com.adobe.tool": "image_size",
287+
"description": "Changed dimensions or file size",
288+
"com.adobe.icon": "https://cai-assertions.adobe.com/icons/resize-dark.svg"
289+
}
290+
}
291+
],
292+
...
293+
}
294+
}
295+
```
296+
297+
</details>
298+
299+
#### Ingredients
300+
301+
The **Ingredients** section 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.
302+
303+
<!--
304+
305+
### Camera capture details
306+
307+
If the active manifest includes [Exif metadata assertions](../manifest/writing/assertions-actions.md#cawg-metadata-assertions), then an additional **Camera capture details** section shows information about the device used to create the asset, as illustrated below:
308+
309+
import verify_exif from '@site/static/img/verify-exif.png';
310+
311+
<img src={verify_exif} style={{ width: '500px' }} />
312+
313+
The Exif metadata assertions from the JSON manifest for the above example is shown below:
314+
315+
<details style={{backgroundColor: 'transparent'}}>
316+
<summary class="code_summary">Show manifest code</summary>
317+
318+
```json
319+
"assertions": [
320+
{
321+
"label": "com.truepic.libc2pa",
322+
"data": {
323+
"git_hash": "023bb51",
324+
"lib_name": "Truepic C2PA C++ Library",
325+
"lib_version": "2.5.1",
326+
"target_spec_version": "1.2"
327+
},
328+
"kind": "Json"
329+
},
330+
{
331+
"label": "stds.exif",
332+
"data": {
333+
"@context": {
334+
"EXIF": "http://ns.adobe.com/EXIF/1.0/",
335+
"EXIFEX": "http://cipa.jp/EXIF/2.32/",
336+
"dc": "http://purl.org/dc/elements/1.1/",
337+
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
338+
"tiff": "http://ns.adobe.com/tiff/1.0/",
339+
"xmp": "http://ns.adobe.com/xap/1.0/"
340+
},
341+
"EXIF:GPSAltitude": "123.5",
342+
"EXIF:GPSHorizontalAccuracy": "16.4",
343+
"EXIF:GPSLatitude": "43.152093900000",
344+
"EXIF:GPSLongitude": "-77.580532800000",
345+
"EXIF:GPSTimeStamp": "2023-02-12T18:44:26Z"
346+
},
347+
"kind": "Json"
348+
},
349+
{
350+
"label": "stds.exif",
351+
"data": {
352+
"@context": {
353+
"EXIF": "http://ns.adobe.com/EXIF/1.0/",
354+
"EXIFEX": "http://cipa.jp/EXIF/2.32/",
355+
"dc": "http://purl.org/dc/elements/1.1/",
356+
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
357+
"tiff": "http://ns.adobe.com/tiff/1.0/",
358+
"xmp": "http://ns.adobe.com/xap/1.0/"
359+
},
360+
"EXIF:Make": "Google",
361+
"EXIF:Model": "Pixel 5"
362+
},
363+
"instance": 1,
364+
"kind": "Json"
365+
},
366+
{
367+
"label": "stds.exif",
368+
"data": {
369+
"@context": {
370+
"EXIF": "http://ns.adobe.com/EXIF/1.0/",
371+
"EXIFEX": "http://cipa.jp/EXIF/2.32/",
372+
"dc": "http://purl.org/dc/elements/1.1/",
373+
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
374+
"tiff": "http://ns.adobe.com/tiff/1.0/",
375+
"xmp": "http://ns.adobe.com/xap/1.0/"
376+
},
377+
"EXIF:DateTimeOriginal": "2023-02-12T18:44:26Z"
378+
},
379+
"instance": 2,
380+
"kind": "Json"
381+
},
382+
...
383+
]
384+
```
385+
386+
</details>
387+
388+
-->

0 commit comments

Comments
 (0)