diff --git a/sdk/src/cose_validator.rs b/sdk/src/cose_validator.rs index 6e6986d0c..842fe7a36 100644 --- a/sdk/src/cose_validator.rs +++ b/sdk/src/cose_validator.rs @@ -23,7 +23,7 @@ use c2pa_crypto::{ time_stamp::TimeStampError, SigningAlg, }; -use c2pa_status_tracker::{log_item, StatusTracker}; +use c2pa_status_tracker::{log_item, validation_codes::*, StatusTracker}; use ciborium::value::Value; use conv::*; use coset::{ @@ -43,12 +43,11 @@ use crate::openssl::verify_trust; // Eric to investigate use crate::wasm::webpki_trust_handler::verify_trust_async; // Eric to investigate use crate::{ // c2pa-crypto migration plans (2024-12-05) - error::{Error, Result}, // DON'T MOVE - settings::get_settings_value, // DON'T MOVE + error::{Error, Result}, // DON'T MOVE + settings::get_settings_value, // DON'T MOVE time_stamp::gt_to_datetime, // already moved (duplicated?) to c2pa-crypto trust_handler::{has_allowed_oid, TrustHandlerConfig}, // Eli to move to c2pa-crypto - validation_status, // Eric to move to c2pa-crypto - validator::ValidationInfo, // Eli to move to c2pa-status-tracker + validator::ValidationInfo, // Eli to move to c2pa-status-tracker }; pub(crate) const RSA_OID: Oid<'static> = oid!(1.2.840 .113549 .1 .1 .1); @@ -100,7 +99,7 @@ fn get_cose_sign1( "could not deserialize signature", "get_cose_sign1" ) - .validation_status(validation_status::CLAIM_SIGNATURE_MISMATCH) + .validation_status(CLAIM_SIGNATURE_MISMATCH) .failure_no_throw(validation_log, Error::InvalidCoseSignature { coset_error }); Err(Error::CoseSignature) @@ -121,7 +120,7 @@ pub(crate) fn check_cert( "certificate could not be parsed", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); Error::CoseInvalidCert @@ -134,7 +133,7 @@ pub(crate) fn check_cert( "certificate version incorrect", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -149,7 +148,7 @@ pub(crate) fn check_cert( .map_err(|_| Error::CoseInvalidCert)?, ) { log_item!("Cose_Sign1", "certificate expired", "check_cert_alg") - .validation_status(validation_status::SIGNING_CREDENTIAL_EXPIRED) + .validation_status(SIGNING_CREDENTIAL_EXPIRED) .failure_no_throw(validation_log, Error::CoseCertExpiration); return Err(Error::CoseCertExpiration); @@ -166,7 +165,7 @@ pub(crate) fn check_cert( x509_parser::time::ASN1Time::from_timestamp(now).map_err(|_| Error::CoseInvalidCert)?, ) { log_item!("Cose_Sign1", "certificate expired", "check_cert_alg") - .validation_status(validation_status::SIGNING_CREDENTIAL_EXPIRED) + .validation_status(SIGNING_CREDENTIAL_EXPIRED) .failure_no_throw(validation_log, Error::CoseCertExpiration); return Err(Error::CoseCertExpiration); @@ -192,7 +191,7 @@ pub(crate) fn check_cert( "certificate algorithm not supported", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -249,7 +248,7 @@ pub(crate) fn check_cert( "certificate algorithm error", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -265,7 +264,7 @@ pub(crate) fn check_cert( "certificate hash algorithm not supported", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -276,7 +275,7 @@ pub(crate) fn check_cert( "certificate missing algorithm parameters", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -301,7 +300,7 @@ pub(crate) fn check_cert( "certificate unsupported EC curve", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -331,7 +330,7 @@ pub(crate) fn check_cert( "certificate key length too short", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -350,7 +349,7 @@ pub(crate) fn check_cert( "certificate issuer and subject cannot be the same {self-signed disallowed}", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -363,7 +362,7 @@ pub(crate) fn check_cert( "certificate issuer/subject unique ids are not allowed", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -384,7 +383,7 @@ pub(crate) fn check_cert( "certificate 'any' EKU not allowed", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -396,7 +395,7 @@ pub(crate) fn check_cert( "certificate missing required EKU", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -416,7 +415,7 @@ pub(crate) fn check_cert( "certificate invalid set of EKUs", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -444,7 +443,7 @@ pub(crate) fn check_cert( "certificate missing digitalSignature EKU", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); return Err(Error::CoseInvalidCert); @@ -498,7 +497,7 @@ pub(crate) fn check_cert( "certificate params incorrect", "check_cert_alg" ) - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseInvalidCert); Err(Error::CoseInvalidCert) @@ -883,13 +882,13 @@ fn check_trust( Ok(trusted) => { if trusted { log_item!("Cose_Sign1", "signing certificate trusted", "verify_cose") - .validation_status(validation_status::SIGNING_CREDENTIAL_TRUSTED) + .validation_status(SIGNING_CREDENTIAL_TRUSTED) .success(validation_log); Ok(()) } else { log_item!("Cose_Sign1", "signing certificate untrusted", "verify_cose") - .validation_status(validation_status::SIGNING_CREDENTIAL_UNTRUSTED) + .validation_status(SIGNING_CREDENTIAL_UNTRUSTED) .failure_no_throw(validation_log, Error::CoseCertUntrusted); Err(Error::CoseCertUntrusted) @@ -897,7 +896,7 @@ fn check_trust( } Err(e) => { log_item!("Cose_Sign1", "signing certificate untrusted", "verify_cose") - .validation_status(validation_status::SIGNING_CREDENTIAL_UNTRUSTED) + .validation_status(SIGNING_CREDENTIAL_UNTRUSTED) .failure_no_throw(validation_log, &e); // TO REVIEW: Mixed message: Are we using CoseCertUntrusted in log or &e from above? @@ -977,7 +976,7 @@ pub(crate) async fn verify_cose_async( "unsupported or missing Cose algorithm", "verify_cose_async" ) - .validation_status(validation_status::ALGORITHM_UNSUPPORTED) + .validation_status(ALGORITHM_UNSUPPORTED) .failure_no_throw(validation_log, Error::CoseSignatureAlgorithmNotSupported); // one of these must exist @@ -1012,13 +1011,13 @@ pub(crate) async fn verify_cose_async( "timestamp message imprint did not match", "verify_cose" ) - .validation_status(validation_status::TIMESTAMP_MISMATCH) + .validation_status(TIMESTAMP_MISMATCH) .failure(validation_log, Error::CoseTimeStampMismatch)?; } Error::CoseTimeStampValidity => { log_item!("Cose_Sign1", "timestamp outside of validity", "verify_cose") - .validation_status(validation_status::TIMESTAMP_OUTSIDE_VALIDITY) + .validation_status(TIMESTAMP_OUTSIDE_VALIDITY) .failure(validation_log, Error::CoseTimeStampValidity)?; } @@ -1058,7 +1057,7 @@ pub(crate) async fn verify_cose_async( // check signature format if let Err(_e) = check_sig(&sign1.signature, alg) { log_item!("Cose_Sign1", "unsupported signature format", "verify_cose") - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, Error::CoseSignatureAlgorithmNotSupported); // TO REVIEW: This could return e if OneShotStatusTracker is used. Hmmm. @@ -1180,7 +1179,7 @@ pub(crate) fn verify_cose( "unsupported or missing Cose algorithm", "verify_cose" ) - .validation_status(validation_status::ALGORITHM_UNSUPPORTED) + .validation_status(ALGORITHM_UNSUPPORTED) .failure_no_throw(validation_log, Error::CoseSignatureAlgorithmNotSupported); return Err(Error::CoseSignatureAlgorithmNotSupported); @@ -1217,7 +1216,7 @@ pub(crate) fn verify_cose( "timestamp did not match signed data", "verify_cose" ) - .validation_status(validation_status::TIMESTAMP_MISMATCH) + .validation_status(TIMESTAMP_MISMATCH) .failure_no_throw(validation_log, Error::CoseTimeStampMismatch); return Err(Error::CoseTimeStampMismatch); @@ -1229,7 +1228,7 @@ pub(crate) fn verify_cose( "timestamp certificate outside of validity", "verify_cose" ) - .validation_status(validation_status::TIMESTAMP_OUTSIDE_VALIDITY) + .validation_status(TIMESTAMP_OUTSIDE_VALIDITY) .failure_no_throw(validation_log, Error::CoseTimeStampValidity); return Err(Error::CoseTimeStampValidity); @@ -1260,7 +1259,7 @@ pub(crate) fn verify_cose( // check signature format if let Err(e) = check_sig(&sign1.signature, alg) { log_item!("Cose_Sign1", "unsupported signature format", "verify_cose") - .validation_status(validation_status::SIGNING_CREDENTIAL_INVALID) + .validation_status(SIGNING_CREDENTIAL_INVALID) .failure_no_throw(validation_log, e); return Err(Error::CoseSignatureAlgorithmNotSupported); @@ -1382,7 +1381,7 @@ pub mod tests { assert_eq!( validation_log.logged_items()[0].validation_status, - Some(validation_status::SIGNING_CREDENTIAL_EXPIRED.into()) + Some(SIGNING_CREDENTIAL_EXPIRED.into()) ); } }