Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
aa52999
feat: Allow `Builder::sign_async` future to be spawnable on Tokio run…
ok-nick Feb 10, 2026
e9bd453
fix: change `MaybeSync` to `Sync` for async HTTP resolver methods
ok-nick Feb 10, 2026
1a2804d
fix: return `BoxedAsyncResolver` for `Context::resolver_async`
ok-nick Feb 11, 2026
617bf3a
feat: pass HTTP resolvers to timestamp networking
ok-nick Feb 11, 2026
7a89ba5
refactor: return arc-wrapped resolver from context
ok-nick Feb 12, 2026
fe274bd
docs: add back docs for HTTP resolver types
ok-nick Feb 12, 2026
41f7d8c
Merge branch 'ok-nick/sign-async-send' into ok-nick/send-timestamp-re…
ok-nick Feb 12, 2026
1622beb
fix: use arc for sync resolver and use impls instead of trait objects
ok-nick Feb 12, 2026
59dd42c
refactor: require MaybeSend and MaybeSync on the core HTTP resolver t…
ok-nick Feb 12, 2026
0b2fcdf
refactor: simplify by requiring MaybeSend and MaybeSync bounds on HTT…
ok-nick Feb 12, 2026
4c6b2e4
Merge branch 'main' of github.com:contentauth/c2pa-rs into ok-nick/se…
ok-nick Feb 12, 2026
deb378d
fix: new code to use http resolvers in send_timestamp_request
ok-nick Feb 12, 2026
40eb0ca
docs: fix doc links
ok-nick Feb 12, 2026
82ee8d9
fix: private http module for now in this PR
ok-nick Feb 12, 2026
be355f1
Merge branch 'ok-nick/sign-async-send' into ok-nick/send-timestamp-re…
ok-nick Feb 12, 2026
0811740
docs: link TODO to issue
ok-nick Feb 12, 2026
432670a
docs: clarify note about AsyncRawSignerWrapper timestamping impl
ok-nick Feb 13, 2026
e42aa5e
Merge branch 'main' of github.com:contentauth/c2pa-rs into ok-nick/se…
ok-nick Feb 17, 2026
9e38bda
Merge branch 'main' into ok-nick/send-timestamp-request-respect
ok-nick Feb 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 71 additions & 16 deletions sdk/src/cose_sign.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use crate::{
raw_signature::{AsyncRawSigner, RawSigner, RawSignerError, SigningAlg},
time_stamp::{AsyncTimeStampProvider, TimeStampError, TimeStampProvider},
},
http::{AsyncHttpResolver, SyncHttpResolver},
settings::Settings,
status_tracker::{ErrorBehavior, StatusTracker},
AsyncSigner, Error, Result, Signer,
Expand Down Expand Up @@ -56,12 +57,14 @@ use crate::{
signer: &dyn AsyncSigner,
box_size: usize,
settings: &Settings,
http_resolver: &impl AsyncHttpResolver,
))]
pub fn sign_claim(
claim_bytes: &[u8],
signer: &dyn Signer,
box_size: usize,
settings: &Settings,
http_resolver: &impl SyncHttpResolver,
) -> Result<Vec<u8>> {
// Must be a valid claim.
let label = "dummy_label";
Expand All @@ -74,9 +77,9 @@ pub fn sign_claim(
};

let signed_bytes = if _sync {
cose_sign(signer, claim_bytes, box_size, tss, settings)
cose_sign(signer, claim_bytes, box_size, tss, settings, http_resolver)
} else {
cose_sign_async(signer, claim_bytes, box_size, tss, settings).await
cose_sign_async(signer, claim_bytes, box_size, tss, settings, http_resolver).await
};

match signed_bytes {
Expand Down Expand Up @@ -117,13 +120,15 @@ pub fn sign_claim(
box_size: usize,
time_stamp_storage: TimeStampStorage,
settings: &Settings,
http_resolver: &impl AsyncHttpResolver,
))]
pub(crate) fn cose_sign(
signer: &dyn Signer,
data: &[u8],
box_size: usize,
time_stamp_storage: TimeStampStorage,
settings: &Settings,
http_resolver: &impl SyncHttpResolver,
) -> Result<Vec<u8>> {
// Make sure the signing cert is valid.
let certs = signer.certs()?;
Expand All @@ -135,20 +140,44 @@ pub(crate) fn cose_sign(

if _sync {
match signer.raw_signer() {
Some(raw_signer) => Ok(sign(*raw_signer, data, Some(box_size), time_stamp_storage)?),
Some(raw_signer) => Ok(sign(
*raw_signer,
data,
Some(box_size),
time_stamp_storage,
http_resolver,
)?),
None => {
let wrapper = SignerWrapper(signer);
Ok(sign(&wrapper, data, Some(box_size), time_stamp_storage)?)
Ok(sign(
&wrapper,
data,
Some(box_size),
time_stamp_storage,
http_resolver,
)?)
}
}
} else {
match signer.async_raw_signer() {
Some(raw_signer) => {
Ok(sign_async(*raw_signer, data, Some(box_size), time_stamp_storage).await?)
}
Some(raw_signer) => Ok(sign_async(
*raw_signer,
data,
Some(box_size),
time_stamp_storage,
http_resolver,
)
.await?),
None => {
let wrapper = AsyncSignerWrapper(signer);
Ok(sign_async(&wrapper, data, Some(box_size), time_stamp_storage).await?)
Ok(sign_async(
&wrapper,
data,
Some(box_size),
time_stamp_storage,
http_resolver,
)
.await?)
}
}
}
Expand Down Expand Up @@ -219,10 +248,11 @@ impl TimeStampProvider for SignerWrapper<'_> {

fn send_time_stamp_request(
&self,
http_resolver: &dyn SyncHttpResolver,
message: &[u8],
) -> Option<std::result::Result<Vec<u8>, TimeStampError>> {
self.0
.send_timestamp_request(message)
.send_timestamp_request(http_resolver, message)
.map(|r| r.map_err(|e| e.into()))
}
}
Expand Down Expand Up @@ -273,10 +303,11 @@ impl AsyncTimeStampProvider for AsyncSignerWrapper<'_> {

async fn send_time_stamp_request(
&self,
http_resolver: &dyn AsyncHttpResolver,
message: &[u8],
) -> Option<std::result::Result<Vec<u8>, TimeStampError>> {
self.0
.send_timestamp_request(message)
.send_timestamp_request(http_resolver, message)
.await
.map(|r| r.map_err(|e| e.into()))
}
Expand All @@ -294,6 +325,7 @@ mod tests {
use crate::{
claim::Claim,
crypto::raw_signature::SigningAlg,
http::{AsyncGenericResolver, SyncGenericResolver, SyncHttpResolver},
settings::Settings,
utils::test_signer::{async_test_signer, test_signer},
Result, Signer,
Expand All @@ -317,7 +349,14 @@ mod tests {
let signer = test_signer(SigningAlg::Ps256);
let box_size = Signer::reserve_size(signer.as_ref());

let cose_sign1 = sign_claim(&claim_bytes, signer.as_ref(), box_size, &settings).unwrap();
let cose_sign1 = sign_claim(
&claim_bytes,
signer.as_ref(),
box_size,
&settings,
&SyncGenericResolver::new(),
)
.unwrap();

assert_eq!(cose_sign1.len(), box_size);
}
Expand All @@ -342,9 +381,15 @@ mod tests {
let signer = async_test_signer(SigningAlg::Ps256);
let box_size = signer.reserve_size();

let cose_sign1 = sign_claim_async(&claim_bytes, &signer, box_size, &settings)
.await
.unwrap();
let cose_sign1 = sign_claim_async(
&claim_bytes,
&signer,
box_size,
&settings,
&AsyncGenericResolver::new(),
)
.await
.unwrap();

assert_eq!(cose_sign1.len(), box_size);
}
Expand Down Expand Up @@ -377,7 +422,11 @@ mod tests {
1024
}

fn send_timestamp_request(&self, _message: &[u8]) -> Option<crate::error::Result<Vec<u8>>> {
fn send_timestamp_request(
&self,
_http_resolver: &dyn SyncHttpResolver,
_message: &[u8],
) -> Option<crate::error::Result<Vec<u8>>> {
Some(Ok(Vec::new()))
}
}
Expand All @@ -395,7 +444,13 @@ mod tests {

let signer = BogusSigner::new();

let _cose_sign1 = sign_claim(&claim_bytes, &signer, box_size, &settings);
let _cose_sign1 = sign_claim(
&claim_bytes,
&signer,
box_size,
&settings,
&SyncGenericResolver::new(),
);

assert!(_cose_sign1.is_err());
}
Expand Down
16 changes: 11 additions & 5 deletions sdk/src/cose_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,8 @@ pub mod tests {

use super::*;
use crate::{
crypto::raw_signature::SigningAlg, settings::Settings, status_tracker::StatusTracker,
utils::test_signer::test_signer, Signer,
crypto::raw_signature::SigningAlg, http::SyncGenericResolver, settings::Settings,
status_tracker::StatusTracker, utils::test_signer::test_signer, Signer,
};

#[test]
Expand All @@ -283,9 +283,14 @@ pub mod tests {

let signer = test_signer(SigningAlg::Ps256);

let cose_bytes =
crate::cose_sign::sign_claim(&claim_bytes, signer.as_ref(), box_size, &settings)
.unwrap();
let cose_bytes = crate::cose_sign::sign_claim(
&claim_bytes,
signer.as_ref(),
box_size,
&settings,
&SyncGenericResolver::new(),
)
.unwrap();

let cose_sign1 = parse_cose_sign1(&cose_bytes, &claim_bytes, &mut validation_log).unwrap();

Expand Down Expand Up @@ -361,6 +366,7 @@ pub mod tests {
&ocsp_signer,
ocsp_signer.reserve_size(),
&settings,
&SyncGenericResolver::new(),
)
.unwrap();

Expand Down
Loading
Loading