Context

Struct Context 

Source
pub struct Context { /* private fields */ }
Expand description

Context holds the configuration and dependencies for C2PA operations.

Context replaces the global Settings pattern with a more flexible, thread-safe approach. It encapsulates:

  • Settings: Configuration options for C2PA operations
  • HTTP Resolvers: Customizable sync and async HTTP resolvers for fetching remote manifests
  • Signer: The cryptographic signer used to sign manifests

§Creating a Signer

There are two ways to provide a signer to a Context:

  1. From Settings (recommended): Configure signer settings in your configuration, and the Context will create the signer automatically when you call signer():
[signer.local]
alg = "ps256"
sign_cert = "path/to/cert.pem"
private_key = "path/to/key.pem"
let context = Context::new()
    .with_settings(include_str!("config.toml"))?;

let builder = Builder::from_context(context);

// Signer is created automatically from context's settings
let signer = builder.context().signer()?;
  1. Custom Signer: Use with_signer() to provide a custom signer directly. This is useful for HSMs, remote signing services, or custom signing logic.

§Usage with Builder and Reader

Both Builder and Reader can be created with a Context:

// Create a Context with settings
let context = Context::new()
    .with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?;

// Use with Builder
let builder = Builder::from_context(context);

// Get signer from context (created automatically from settings)
let signer = builder.context().signer()?;

§Examples

§Basic usage with default settings

let context = Context::new();

§Configure with JSON settings

let context = Context::new().with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?;

§Configure with TOML settings

let toml = r#"
    [verify]
    verify_after_sign = true
"#;
let context = Context::new().with_settings(toml)?;

Implementations§

Source§

impl Context

Source

pub fn new() -> Self

Creates a new Context with default settings.

The default Context will load settings from environment variables or configuration files if available, and use default HTTP resolvers.

§Examples
let context = Context::new();
Source

pub fn into_shared(self) -> Arc<Self>

Consume this context and wrap it in an Arc for sharing between components.

This is equivalent to Arc::new(self) or Arc::from(self), but more discoverable and chainable with the builder pattern.

§Examples
let context = Context::new()
    .with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?
    .into_shared();

// Now context is Arc<Context> and can be shared
let builder = c2pa::Builder::from_shared_context(&context);
let reader = c2pa::Reader::from_shared_context(&context);
Source

pub fn with_settings<S: IntoSettings>(self, settings: S) -> Result<Self>

Configure this Context with the provided settings.

Settings can be provided as a Settings struct, JSON string, TOML string, or serde_json::Value.

§Arguments
  • settings - Any type that implements IntoSettings
§Examples
// From JSON string
let context = Context::new().with_settings(r#"{"verify": {"verify_after_sign": true}}"#)?;
Source

pub fn settings(&self) -> &Settings

Returns a reference to the settings.

§Examples
let context = Context::new();
let settings = context.settings();
Source

pub fn settings_mut(&mut self) -> &mut Settings

Returns a mutable reference to the settings.

§Examples
let mut context = Context::new();
context.settings_mut().verify.verify_after_sign = true;
Source

pub fn with_resolver<T: SyncHttpResolver + Send + Sync + 'static>( self, resolver: T, ) -> Self

Available on non-WebAssembly only.

Configure this Context with a custom synchronous HTTP resolver.

Custom resolvers can be used to add authentication, caching, logging, or mock network calls in tests.

§Arguments
  • resolver - Any type implementing SyncHttpResolver
Source

pub fn with_resolver_async<T: AsyncHttpResolver + Send + Sync + 'static>( self, resolver: T, ) -> Self

Available on non-WebAssembly only.

Configure this Context with a custom asynchronous HTTP resolver.

Async resolvers are used for asynchronous operations like fetching remote manifests.

§Arguments
  • resolver - Any type implementing AsyncHttpResolver
Source

pub fn resolver(&self) -> &dyn SyncHttpResolver

Returns a reference to the sync resolver.

The default resolver is a SyncGenericResolver wrapped with RestrictedResolver to apply host filtering from the settings.

Source

pub fn resolver_async(&self) -> &dyn AsyncHttpResolver

Returns a reference to the async resolver.

The default resolver is an AsyncGenericResolver wrapped with RestrictedResolver to apply host filtering from the settings.

Source

pub fn with_signer<T: Signer + Send + Sync + 'static>(self, signer: T) -> Self

Available on non-WebAssembly only.

Configure this Context with a custom cryptographic signer.

Note: In most cases, you don’t need to call this method. Instead, configure signer settings in your configuration file, and the Context will create the signer automatically from those settings when you call signer().

Use this method when you need custom control over signer creation, such as:

  • Using a hardware security module (HSM)
  • Implementing custom signing logic
  • Using a remote signing service with custom authentication
§Arguments
  • signer - Any type implementing Signer
§Examples
// Explicitly create and set a signer
let signer = create_signer::from_files(
    "path/to/cert.pem",
    "path/to/key.pem",
    SigningAlg::Ps256,
    None
)?;

let context = Context::new().with_signer(signer);
Source

pub fn signer(&self) -> Result<&dyn Signer>

Returns a reference to the signer.

If a signer was explicitly set via with_signer(), returns that signer. Otherwise, creates a signer from this Context’s settings on first access (lazy initialization).

The signer is created from the signer field in this Context’s Settings, which should contain either local signer configuration (certificate and private key) or remote signer configuration (URL and certificate).

§Returns

A reference to the signer.

§Errors

Returns Error::MissingSignerSettings if:

  • No signer was explicitly set with with_signer()
  • No signer configuration is present in this Context’s settings
  • The signer configuration in settings is invalid
§Examples
let toml = r#"
    [signer.local]
    alg = "ps256"
    sign_cert = "path/to/cert.pem"
    private_key = "path/to/key.pem"
"#;

let context = Context::new().with_settings(toml)?;

// Signer is created automatically from context's settings
let signer = context.signer()?;
§Using a custom signer
let signer = create_signer::from_files(
    "path/to/cert.pem",
    "path/to/key.pem",
    SigningAlg::Ps256,
    None
)?;

let context = Context::new().with_signer(signer);
let signer_ref = context.signer()?;
Source

pub fn async_signer(&self) -> Result<&dyn AsyncSigner>

Returns a reference to the async signer.

If a custom async signer was set with Context::with_async_signer, it will be returned. Otherwise, the async signer will be created from the context’s settings on first access and cached for future use.

§Errors

Returns an error if no async signer is configured in settings and no custom signer was provided.

§Examples
let context = Context::new();
let async_signer = context.async_signer()?;
let signature = async_signer.sign(vec![1, 2, 3]).await?;
Source

pub fn with_async_signer( self, signer: impl AsyncSigner + Send + Sync + 'static, ) -> Self

Available on non-WebAssembly only.

Sets a custom async signer for this Context.

This replaces any existing async signer (whether from settings or previously set).

§Arguments
  • signer - An async signer that implements the AsyncSigner trait
§Examples
let context = Context::new()
    .with_async_signer(MyAsyncSigner);

Trait Implementations§

Source§

impl Debug for Context

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Context

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more