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:
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);
+ }
}