c2pa-rs

A fork of https://github.com/contentauth/c2pa-rs/
git clone git://archive.git.mtrnord.blog/mtrnords-photography-manager/c2pa-rs.git
Log | Files | Refs | README

commit 6435f2b4df45140356b445bbd360d6f5575a93b7
parent 0c4b3c07929983f14710033ea072d7815ccb81cb
Author: mauricefisher64 <92736594+mauricefisher64@users.noreply.github.com>
Date:   Mon, 25 Jul 2022 13:09:10 -0400

Fix bad response for case when there is no timestamp (#89)

* Fix bad response for case when there is not timestamp

* Added unit test to test no timestamp case
Diffstat:
Msdk/src/claim.rs | 14+++++++-------
Msdk/src/cose_validator.rs | 57+++++++++++++++++++++++++--------------------------------
2 files changed, 32 insertions(+), 39 deletions(-)

diff --git a/sdk/src/claim.rs b/sdk/src/claim.rs @@ -794,13 +794,13 @@ impl Claim { validation_log.log(log_item, Some(Error::ClaimMissingSignatureBox))?; } - let verified = verify_cose( - sig, - &claim.data()?, - &additional_bytes, - !is_provenance, - validation_log, - ); + let data = if let Some(ref original_bytes) = claim.original_bytes { + original_bytes + } else { + return Err(Error::ClaimDecoding); + }; + + let verified = verify_cose(sig, data, &additional_bytes, !is_provenance, validation_log); Claim::verify_internal(claim, asset_data, is_provenance, verified, validation_log) } diff --git a/sdk/src/cose_validator.rs b/sdk/src/cose_validator.rs @@ -11,8 +11,6 @@ // specific language governing permissions and limitations under // each license. -use std::str::FromStr; - use ciborium::value::Value; use conv::*; use coset::{sig_structure_data, Label, TaggedCborSerializable}; @@ -583,39 +581,12 @@ fn get_sign_certs(sign1: &coset::CoseSign1) -> Result<Vec<Vec<u8>>> { fn get_signing_time( sign1: &coset::CoseSign1, data: &[u8], - validation_log: &mut impl StatusTracker, ) -> Option<chrono::DateTime<chrono::Utc>> { // get timestamp info if available if let Ok(tst_info) = get_timestamp_info(sign1, data) { Some(gt_to_datetime(tst_info.gen_time)) - } else if let Some(t) = &sign1 - .unprotected - .rest - .iter() - .find_map(|x: &(Label, Value)| { - if x.0 == Label::Text("temp_signing_time".to_string()) { - Some(x.1.clone()) - } else { - None - } - }) - { - let time_cbor = serde_cbor::to_vec(t).ok()?; - let dt_string: String = serde_cbor::from_slice(&time_cbor).ok()?; - chrono::DateTime::<chrono::Utc>::from_str(&dt_string).ok() } else { - let log_item = log_item!( - "Cose_Sign1", - "invalid timestamp message imprint", - "get_signing_time" - ) - .error(Error::CoseTimeStampMismatch) - .validation_status(validation_status::TIMESTAMP_MISMATCH); - validation_log - .log(log_item, Some(Error::CoseTimeStampMismatch)) - .ok()?; - None } } @@ -753,7 +724,7 @@ pub async fn verify_cose_async( result.alg = Some(alg); // parse the temp time for now util we have TA - result.date = get_signing_time(&sign1, &data, validation_log); + result.date = get_signing_time(&sign1, &data); } Ok(result) @@ -773,7 +744,7 @@ pub fn get_signing_info( let der_bytes = get_sign_cert(&sign1)?; let _ = X509Certificate::from_der(&der_bytes).map(|(_rem, signcert)| { - date = get_signing_time(&sign1, data, validation_log); + date = get_signing_time(&sign1, data); issuer_org = extract_subject_from_cert(&signcert).ok(); if let Ok(a) = get_signing_alg(&sign1) { alg = Some(a); @@ -883,7 +854,7 @@ pub fn verify_cose( result.alg = Some(alg); // parse the temp time for now util we have TA - result.date = get_signing_time(&sign1, data, validation_log); + result.date = get_signing_time(&sign1, data); } // Note: not adding validation_log entry here since caller will supply claim specific info to log Ok(()) @@ -1095,4 +1066,26 @@ pub mod tests { assert!(check_cert(SigningAlg::Ps256, &der_bytes, &mut validation_log, None).is_ok()); } } + + #[test] + fn test_no_timestamp() { + let mut validation_log = DetailedStatusTracker::new(); + + let mut claim = crate::claim::Claim::new("extern_sign_test", Some("contentauth")); + claim.build().unwrap(); + + let claim_bytes = claim.data().unwrap(); + + let box_size = 10000; + + let signer = crate::utils::test::temp_signer(); + + let cose_bytes = crate::cose_sign::sign_claim(&claim_bytes, &signer, box_size).unwrap(); + + let cose_sign1 = get_cose_sign1(&cose_bytes, &claim_bytes, &mut validation_log).unwrap(); + + let signing_time = get_signing_time(&cose_sign1, &claim_bytes); + + assert_eq!(signing_time, None); + } }