The Coalition for Content Provenance and Authenticity (C2PA) addresses the prevalence of misleading information online through the development of technical standards for certifying the source and history (or provenance) of media content. Adobe and other contributors created the C2PA Rust library as part of the Content Authenticity Initiative and released it to open source in June, 2022.
The C2PA Rust library (previously referred to as the "Rust SDK") implements a subset of the C2PA technical specification.
The library enables a desktop, mobile, or embedded application to:
- Create and sign C2PA claims and manifests.
- Embed manifests in certain file formats.
- Parse and validate manifests found in certain file formats.
The library supports several common C2PA assertions and hard bindings.
This is a beta release (version 0.x.x) of the project. The minor version number (0.x.0) is incremented when there are breaking API changes, which may happen frequently.
The library has a new API in development that will eventually replace the existing methods of reading and writing C2PA data. Ultimately, it will support all language bindings and build environments. To use this API, enable the unstable_api
feature; for example:
c2pa = {version="0.33.1", features=["unstable_api"]}
The new API focuses on streaming I/O and supports the following structs:
For some informal development and ussage notes, see 2024_API_NOTES.md.
We welcome contributions to this project. For information on contributing, providing feedback, and about ongoing work, see Contributing.
The library requires Rust version 1.74.0 or newer.
The library has been tested on the following operating systems:
- Windows (Intel only)
- MacOS (Intel and Apple silicon)
- Ubuntu Linux (64-bit Intel and ARM v8)
- WebAssembly (Wasm)
Extensions | MIME type |
---|---|
avi |
video/msvideo , video/x-msvideo , video/avi , application/x-troff-msvideo |
avif |
image/avif |
c2pa |
application/x-c2pa-manifest-store |
dng |
image/x-adobe-dng |
heic |
image/heic |
heif |
image/heif |
jpg , jpeg |
image/jpeg |
m4a |
audio/mp4 |
mp4 |
video/mp4 , application/mp4 |
mov |
video/quicktime |
png |
image/png |
svg |
image/svg+xml |
tif ,tiff |
image/tiff |
wav |
audio/wav |
webp |
image/webp |
mp3 |
audio/mpeg |
gif |
image/gif |
Add this to your Cargo.toml
:
[dependencies]
c2pa = "0.33.3"
If you want to read or write a manifest file, add the file_io
dependency to your Cargo.toml
.
The add_thumbnails
feature will generate thumbnails for JPEG and PNG files.
For example:
c2pa = { version = "0.25.0", features = ["file_io", "add_thumbnails"] }
NOTE: If you are building for WASM, omit the file_io
dependency.
The Rust library crate provides:
file_io
enables manifest generation, signing via OpenSSL, and embedding manifests in various file formats.add_thumbnails
will generate thumbnails automatically for JPEG and PNG files. (no longer included withfile_io
)serialize_thumbnails
includes binary thumbnail data in the Serde serialization output.xmp_write
enables updating XMP on embed with thedcterms:provenance
field. (Requires xmp_toolkit.)no_interleaved_io
forces fully-synchronous I/O; otherwise, the library uses threaded I/O for some operations to improve performance.fetch_remote_manifests
enables the verification step to retrieve externally referenced manifest stores. External manifests are only fetched if there is no embedded manifest store and no locally adjacent .c2pa manifest store file of the same name.json_schema
is used bymake schema
to produce a JSON schema document that represents theManifestStore
data structures.psxxx_ocsp_stapling_experimental
this is an demonstration feature that will attempt to fetch the OCSP data from the OCSP responders listed in the manifest signing certificate. The response becomes part of the manifest and is used to prove the certificate was not revoked at the time of signing. This is only implemented for PS256, PS384 and PS512 signatures and is intended as a demonstration.openssl_ffi_mutex
prevents multiple threads from accessing the C OpenSSL library simultaneously. (This library is not re-entrant.) In a multi-threaded process (such as Cargo's test runner), this can lead to unpredictable behavior.
The sdk/examples directory contains some minimal example code. The client/client.rs is the most instructive and provides and example of reading the contents of a manifest store, recursively displaying nested manifests.
The c2pa
crate is distributed under the terms of both the MIT license and the Apache License (Version 2.0).
Some components and dependent crates are licensed under different terms; please check the license terms for each crate and component for details.
In most cases, you should depend on this crate as published via crates.io.
The Adobe team produces nightly snapshots of this crate via a nightly
branch, which we use for testing the impact of pending changes to upstream dependencies.
You may wish to use these builds for your own testing ahead of our releases, you may include the library via the following Cargo.toml
entry:
c2pa = { git = "https://github.com/contentauth/c2pa-rs.git", branch = "nightly", features = [...]}
Commits in this branch have a modified sdk/Cargo.toml
entry which includes a version number similar to the following:
version = "0.25.3-nightly+2023-08-28-2f33ab3"
Please note that there is no formal support for code from a nightly release, but if you become aware of any issues, we would appreciate a bug report including this version number.
Refer to the CHANGELOG for detailed changes derived from Git commit history.