Skip to content

Commit fb366c8

Browse files
authored
Merge branch 'main' into add-learn
2 parents 0dc89a0 + 661b590 commit fb366c8

File tree

18 files changed

+15941
-22145
lines changed

18 files changed

+15941
-22145
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
name: Update schemas to latest
2+
on:
3+
repository_dispatch:
4+
types: [c2pa-rs-release]
5+
workflow_dispatch:
6+
7+
permissions:
8+
contents: write
9+
pull-requests: write
10+
11+
jobs:
12+
update-schemas:
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- name: Checkout repository
17+
uses: actions/checkout@v5
18+
19+
- name: Checkout json-manifest-reference repository
20+
uses: actions/checkout@v5
21+
with:
22+
repository: contentauth/json-manifest-reference
23+
path: ./json-manifest-reference
24+
25+
- name: Checkout c2pa-rs repository
26+
uses: actions/checkout@v5
27+
with:
28+
repository: contentauth/c2pa-rs
29+
path: ./c2pa-rs
30+
fetch-depth: 0
31+
32+
- name: Get latest c2pa-rs version
33+
working-directory: ./c2pa-rs
34+
run: |
35+
latest_tag=$(git tag -l "c2pa-v*" --sort=-v:refname | head -n 1)
36+
echo "latest_tag=$latest_tag" >> $GITHUB_ENV
37+
echo "$latest_tag"
38+
39+
- name: Install Rust toolchain
40+
uses: dtolnay/rust-toolchain@stable
41+
42+
- name: Cache Rust dependencies
43+
uses: Swatinem/rust-cache@v2
44+
45+
- name: Build schemas
46+
working-directory: ./c2pa-rs
47+
run: cargo run --bin export_schema
48+
49+
- name: Move new schemas into ./json-manifest-reference/_data
50+
run: |
51+
# We also rename the schemas to have an underscore in the filename instead of a dot to fix
52+
# compatibility issues with Ruby/Jekyll.
53+
for path in ./c2pa-rs/target/schema/*.schema.json; do
54+
name=$(basename "$path")
55+
new=${name/.schema/_schema}
56+
cp "$path" "./json-manifest-reference/_data/$new"
57+
done
58+
59+
- name: Check schemas for diff
60+
id: diffs
61+
working-directory: ./json-manifest-reference
62+
run: |
63+
if [ -n "$(git status --porcelain -- ./_data/)" ]; then
64+
echo "diff=true" >> "$GITHUB_OUTPUT"
65+
echo "true"
66+
else
67+
echo "diff=false" >> "$GITHUB_OUTPUT"
68+
echo "false"
69+
fi
70+
71+
- name: Install Ruby and build and cache dependencies
72+
if: steps.diffs.outputs.diff == 'true'
73+
uses: ruby/setup-ruby@v1
74+
with:
75+
ruby-version: '2.7.4'
76+
bundler-cache: true
77+
working-directory: ./json-manifest-reference
78+
79+
- name: Build Jekyll
80+
if: steps.diffs.outputs.diff == 'true'
81+
working-directory: ./json-manifest-reference
82+
run: bundle exec jekyll build
83+
84+
- name: Move new built schemas into ./docs/manifest/json-ref
85+
if: steps.diffs.outputs.diff == 'true'
86+
# TODO: ideally we don't hardcode these paths, but we need to sort out a fix in the docs
87+
run: |
88+
cp ./json-manifest-reference/_site/manifest-def.html ./docs/manifest/json-ref
89+
cp ./json-manifest-reference/_site/reader.html ./docs/manifest/json-ref
90+
cp ./json-manifest-reference/_site/settings.html ./docs/manifest/json-ref
91+
92+
- name: Send schema PR
93+
if: steps.diffs.outputs.diff == 'true'
94+
uses: peter-evans/create-pull-request@v7
95+
with:
96+
title: 'docs(schema): update schemas to ${{ env.latest_tag }}'
97+
body: 'Updates schemas to ${{ env.latest_tag }}.'
98+
commit-message: 'docs(schema): update schemas to ${{ env.latest_tag }}'
99+
branch: 'schema-${{ env.latest_tag }}'
100+
add-paths: ./docs/manifest/json-ref/*
101+
base: ${{ github.event.repository.default_branch }}

docs/community.md

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,30 @@ The Content Authenticity Initiative has an active and growing community of devel
77

88
## GitHub
99

10-
All the open-source CAI code is hosted in GitHub in the [CAI GitHub organization](https://github.com/contentauth) and we welcome input in the form of issues and pull requests in the repositories:
10+
All the open-source CAI code is hosted in GitHub in the [CAI GitHub organization](https://github.com/contentauth):
1111

1212
- **Rust Library**: [c2pa-rs](https://github.com/contentauth/c2pa-rs)
1313
- **CLI tool**: [c2patool](https://github.com/contentauth/c2patool)
14-
- **JavaScript library**: [c2pa-js](https://github.com/contentauth/c2pa-js)
15-
- **Prerelease libraries**:
16-
- [c2pa-python](https://github.com/contentauth/c2pa-python)
17-
- [c2pa-node](https://github.com/contentauth/c2pa-node)
18-
- [c2pa-c](https://github.com/contentauth/c2pa-c)
19-
- **JavaScript examples**: [c2pa-js-examples](https://github.com/contentauth/c2pa-js-examples)
14+
- **JavaScript library**: [c2pa-web](https://github.com/contentauth/c2pa-web)
15+
- **Python library**: [c2pa-python](https://github.com/contentauth/c2pa-python)
16+
- **Node.js library**: [c2pa-node](https://github.com/contentauth/c2pa-node-v2)
17+
- **C++ library**: [c2pa-c](https://github.com/contentauth/c2pa-c)
2018

2119
If you think you've found a bug or want to request a feature, please open an issue in the appropriate repository.
2220

2321
:::note
24-
Do not create a public GitHub issue for suspected security vulnerabilities. Instead, please file an issue through [Adobe's HackerOne page](https://hackerone.com/adobe?type=team).
22+
Do not create a public GitHub issue for **suspected security vulnerabilities**. Instead, please file an issue through [Adobe's HackerOne page](https://hackerone.com/adobe?type=team).
2523
For more information on reporting security issues, see [SECURITY.md](https://github.com/contentauth/c2pa-rs/blob/main/SECURITY.md).
2624
:::
2725

2826
We also welcome thoughtful pull requests (PRs) from the community, following the contribution guidelines provided out in each repository. The guidelines are generally the same for all the SDK repositories; for example. see the [c2pa-rs contribution guidelines](https://github.com/contentauth/c2pa-rs/blob/main/CONTRIBUTING.md).
2927

3028
Participants are required to follow the [Adobe Code of Conduct](https://github.com/contentauth/c2pa-rs/blob/main/CODE_OF_CONDUCT.md) to maintain an open and welcoming environment for all.
3129

30+
### Verify
31+
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](verify.mdx).
33+
3234
### Related projects
3335

3436
These related projects may be of interest, but the CAI team doesn't maintain or support them:
@@ -38,6 +40,10 @@ These related projects may be of interest, but the CAI team doesn't maintain or
3840
- [**TrustMark**](https://github.com/adobe/trustmark): Open-source Python implementation of watermarking for encoding, decoding and removing image watermarks. You can use TrustMark as part of providing [durable content credentials](durable-cr/index.md).
3941
- [**C2PA Security Testing Tool**](https://github.com/contentauth/c2pa-attacks): A CLI tool derived from [c2patool](https://github.com/contentauth/c2patool) that performs security testing on a Content Credentials application. This tool is intended for use by software security professionals.
4042

43+
## Browser extension
44+
45+
The free [browser extension for Google Chrome](https://chromewebstore.google.com/detail/c2pa-content-credentials/mjkaocdlpjmphfkjndocehcdhbigaafp?hl=en) enables you to verify and display manifests for images, audio and videos which have C2PA Content Credentials.
46+
4147
## C2PA Foundations video course
4248

4349
For a series of educational videos, see [C2PA Foundations: A Course for Implementers](http://learn.contentauthenticity.org/).

docs/getting-started.mdx

Lines changed: 6 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -90,80 +90,23 @@ In practice, to use a certificate with the CAI SDK, follow this process:
9090
For more information on getting and using certificates, see [Signing and certificates](signing/index.md).
9191
:::
9292

93-
### Verify known certificate list
93+
### Verify trust list
9494

9595
import verify_unknown_source from '../static/img/verify-cc-unknown-source.png';
9696

97-
The C2PA [Verify tool](https://verify.contentauthenticity.org) uses a list of _known certificates_ (sometimes referred to as a "trust list") to determine whether a Content Credential was issued by a known source. The known certificate list applies only to [Verify](https://verify.contentauthenticity.org). For more information, see [Verify tool known certificate list](verify-known-cert-list)
97+
The C2PA [Verify tool](https://verify.contentauthenticity.org) uses a list of _known certificates_ (sometimes referred to as a "trust list") to determine whether a Content Credential was issued by a known source. Currently, it uses the [interim trust list](verify-known-cert-list) but it will be updated soon to use the official [C2PA trust list](conformance.mdx#c2pa-trust-lists).
9898

9999
## Identity
100100

101-
To identify who created or modified an asset, identity needs to be verifiable and bound to an asset and its manifest store. The CAI SDK supports the [W3C verifiable credentials](https://c2pa.org/specifications/specifications/1.4/specs/C2PA_Specification.html#_w3c_verifiable_credentials) standard recommendation (part of the C2PA v1.4 specification), but doesn't currently have a way to validate these credentials or ensure that they properly reflect authorship of the content. An actor can add one or more identities to a manifest using the W3C verifiable credentials data model. Currently, a verifier must trust the manifest signer to properly authenticate the identity.
102-
103-
Identity can be bolstered with other kinds of evidence such as _Adobe connected accounts_. In the future, the identity credentials will be separately verifiable. In the future, these verifiable credentials will be strongly bound to the manifest and media and be independently verifiable.
104-
105-
In addition to simply adding a name and organization, Adobe tools can use the [Connected Accounts service](https://connected-accounts.adobe.com/) to connect social media accounts such as Behance, Instagram, or Twitter to an identity in a manifest. This service uses OAuth, so a user must be able to log in to the account to connect it.
101+
To identify who created or modified an asset, identity needs to be verifiable and bound to an asset and its manifest store.
106102

107103
:::info
108-
The [Creator Assertions Working Group (CAWG)](https://creator-assertions.github.io/) is developing a technical specification for an identity assertion for use in the C2PA ecosystem. CAI expects to adopt and implement this specification in the SDK at some point in the future.
104+
The [Creator Assertions Working Group (CAWG)](https://creator-assertions.github.io/) provides a technical specification for an identity assertion for use in the C2PA ecosystem. For more information, see [Reading CAWG identity assertions](manifest/reading/reading-cawg-id.md).
109105
:::
110106

111-
## How to use the SDK
112-
113-
The CAI open-source SDK consist of:
114-
115-
- **C2PA Tool**, a command-line tool for working with manifests and media. This tool is a wrapper around the Rust SDK and provides most of the same capabilities that it does.
116-
- **Language-specific libraries** in C/C++, Python, Node.js and client JavaScript. NOTE: The C/C++, Python, Node.js libraries are prerelease versions whose APIs are subject to change.
117-
- **The Rust library** enables a desktop, mobile, or embedded application to create and sign manifests, embed manifests in certain file formats, and parse and validate manifests.
118-
119-
Behind the scenes, C2PA Tool and language-specific libraries are built using the Rust library to ensure consistency.
120-
121-
The following diagram provides a high-level view of how to use the open-source CAI SDK.
122-
123-
<img src={cai_open_source} width="800" />
124-
125-
Applications can use the CAI SDK in several different ways:
126-
127-
- Web pages can use the JavaScript library to display Content Credentials.
128-
- Applications can "shell out" to call C2PA Tool directly.
129-
- Applications written in C++, Python, or Node.js can use the APIs of the corresponding language libraries to:
130-
- Create, modify, and sign manifests.
131-
- Embed manifests into media files.
132-
- Parse and validate manifests.
133-
134-
Similarly, applications written in many programming languages can use the Rust Foreign Function Interface to call the Rust API and perform those same functions.
135-
136-
### Native desktop or mobile applications
137-
138-
Applications written in C++, Python, or Node.js can use the corresponding prerelease library APIs. Applications written in any language call C2PA Tool directly, though doing so is not highly scalable.
139-
140-
Alternatively, native applications can use Rust's _Foreign Function Interface_ (FFI) to call functions in the Rust library. The FFI enables interoperability between Rust and code written in other languages.
141-
142-
Although the underlying technology of the Rust library supports all major programming languages, the bindings and APIs to make all of them workable and easy to use are still in development.
143-
144-
A Windows application can use the FFI to call Rust functions from languages such as C++ or C#. For an example, see the [c2c2pa repository](https://github.com/contentauth/c2c2pa).
145-
146-
An Android application can use JNI (Java Native Interface) to call Rust functions from Java or Kotlin code. This requires creating a shared library (a .so file) with Rust code that exposes functions with `#[no_mangle]` attribute and an `extern "C"` keyword. Java and Kotlin code can load and invoke the shared library using `System.loadLibrary()` and native methods.
147-
148-
An iOS application can use the C-ABI (C Application Binary Interface) to call Rust functions from Swift or Objective-C code. This also requires creating a shared library (a .dylib file) with Rust code that exposes functions with `#[no_mangle]` attribute and `extern "C"` keyword. For a simple example, see [`lib.rs` in the c2c2pa repository](https://github.com/contentauth/c2c2pa/blob/main/src/lib.rs). Swift or Objective-C code can link and invoke the shared library using the `@_silgen_name` attribute and unsafe blocks.
149-
150-
### Websites
151-
152-
A website can serve web pages that use the JavaScript library to display manifest data using client JavaScript. The ability to create and sign manifests from JavaScript via [WebAssembly](https://webassembly.org/) is under consideration and may be released in the future.
153-
154-
A server-side web application can create, modify, and sign claims (and view them) by:
155-
156-
- Executing a shell command to invoke C2PA Tool. For an example, see the [c2patool Node.js service example](c2pa-service-example). While this approach works, it is not highly scalable.
157-
- Use the prerelease [Node.js](c2pa-node), [Python](c2pa-python), or [C++/C](c2pa-c) libraries.
158-
- Bind to the Rust library and use it, similarly to native applications.
159-
160-
### Embedded applications
161-
162-
An embedded application can use the Rust FFI (foreign function interface) to call Rust functions from languages such as C or C++, similarly to a native application.
163-
164-
Embedded applications have unique constraints tied to the devices on which they run, including small memory footprint, low-powered hardware, intermittent network access, unique operating systems, or the lack of an operating system OS (running on bare metal). For these reasons, if you want to develop a CAI-enabled embedded application, please contact the CAI team directly.
107+
In addition, Adobe tools can use the [Connected Accounts service](https://connected-accounts.adobe.com/) to connect social media accounts such as Behance, Instagram, or Twitter to an identity in a manifest. This service uses OAuth, so a user must be able to log in to an Adobe account to connect it.
165108

166-
## Attaching and storing the manifest
109+
## Attaching and storing manifest data
167110

168111
Once you've generated a manifest, you must attach it to the asset for it to be useful.
169112

0 commit comments

Comments
 (0)