diff --git a/service/attestation/attestation-agent/agent/src/lib.rs b/service/attestation/attestation-agent/agent/src/lib.rs index 673e71d977734b867b3577b4d2cd3a4531c6b3ae..33164fb93077f7f507b1717b8a2cd2d9bbfda529 100644 --- a/service/attestation/attestation-agent/agent/src/lib.rs +++ b/service/attestation/attestation-agent/agent/src/lib.rs @@ -404,6 +404,37 @@ pub fn get_report(c_challenge: Option<&repr_c::Vec>, c_ima: &repr_c::TaggedO report.into() } +#[cfg(feature = "no_as")] +use verifier::virtcca_parse_evidence; + +#[cfg(feature = "no_as")] +#[ffi_export] +pub fn parse_report(report: Option<&repr_c::Vec>) -> repr_c::String { + let report = match report { + None => { + log::error!("report is null"); + return "".to_string().into(); + }, + Some(report) => report.clone().to_vec(), + }; + let rt = Runtime::new().unwrap(); + let fut = async {virtcca_parse_evidence(&report)}; + let ret = rt.block_on(fut); + + let ret = match ret { + Ok(claim) => { + log::debug!("claim: {:?}", claim); + claim.to_string() + }, + Err(e) =>{ + log::error!("{e}"); + "".to_string() + }, + }; + + return ret.into(); +} + #[ffi_export] pub fn verify_report(c_challenge: Option<&repr_c::Vec>, report: Option<&repr_c::Vec>) -> repr_c::String { let challenge = match c_challenge { diff --git a/service/attestation/attestation-agent/c_header/example.c b/service/attestation/attestation-agent/c_header/example.c index de4cc1db5a3e1afc2b30c62e21ac611665f74b27..8bb939db84d4a0a12b08105e770962b4c0de389f 100644 --- a/service/attestation/attestation-agent/c_header/example.c +++ b/service/attestation/attestation-agent/c_header/example.c @@ -20,7 +20,7 @@ #include #define CHALLENGE_LEN 32 -#define TEST_THREAD_NUM 5 +#define TEST_THREAD_NUM 1 void *thread_proc(void *arg) { @@ -45,6 +45,15 @@ void *thread_proc(void *arg) if (report.len != 0) { report.ptr[report.len] = '\0'; // rust return string has no '\0' printf("get report success, report:%s\n", report.ptr); + + // parse report + Vec_uint8_t claim_no_verify = parse_report(&report); + if (claim_no_verify.len != 0) { + claim_no_verify.ptr[claim_no_verify.len] = '\0'; + printf("parse report success: %s\n", claim_no_verify.ptr); + } + free_rust_vec(claim_no_verify); + // step4: verify report claim = verify_report(&challenge, &report); } @@ -60,7 +69,7 @@ void *thread_proc(void *arg) } int main() { - char *level = "debug"; + char *level = "info"; Vec_uint8_t log_level = { .ptr = (uint8_t *)level, .len = strlen(level), diff --git a/service/attestation/attestation-agent/c_header/rust_attestation_agent.h b/service/attestation/attestation-agent/c_header/rust_attestation_agent.h index 82faf1a0d1d4527d2cff3eafb1083d932afc22da..9c1a18fd53e7c243859da0ef0132caf1ee2c572c 100644 --- a/service/attestation/attestation-agent/c_header/rust_attestation_agent.h +++ b/service/attestation/attestation-agent/c_header/rust_attestation_agent.h @@ -62,6 +62,11 @@ void init_env_logger ( Vec_uint8_t const * c_level); +/** */ +Vec_uint8_t +parse_report ( + Vec_uint8_t const * report); + /** */ Vec_uint8_t verify_report ( diff --git a/service/attestation/attestation-service/verifier/src/lib.rs b/service/attestation/attestation-service/verifier/src/lib.rs index 0b776c291842cadcdb3795a72c743031434d16a7..a0e0b58fb63b81359acaa5db35ad8061012b3d00 100644 --- a/service/attestation/attestation-service/verifier/src/lib.rs +++ b/service/attestation/attestation-service/verifier/src/lib.rs @@ -58,3 +58,10 @@ impl VerifierAPIs for Verifier { } } } + +pub fn virtcca_parse_evidence(evidence: &[u8]) -> Result { + let aa_evidence: Evidence = serde_json::from_slice(evidence)?; + let evidence = aa_evidence.evidence.as_bytes(); + + return virtcca::Evidence::parse_evidence(evidence); +} diff --git a/service/attestation/attestation-service/verifier/src/virtcca/mod.rs b/service/attestation/attestation-service/verifier/src/virtcca/mod.rs index 3de7c9f4999b07604cb257f3bf46dcd024cc44c9..ca3a2ff2d9f30b3b43a9cd4f066c3a5511b14550 100644 --- a/service/attestation/attestation-service/verifier/src/virtcca/mod.rs +++ b/service/attestation/attestation-service/verifier/src/virtcca/mod.rs @@ -114,6 +114,16 @@ impl Evidence { // todo parsed TeeClaim evidence.parse_claim_from_evidence(ima) } + pub fn parse_evidence(evidence: &[u8]) -> Result { + let virtcca_ev: VirtccaEvidence = serde_json::from_slice(evidence)?; + let evidence = virtcca_ev.evidence; + let evidence = Evidence::decode(evidence)?; + + let ima = json!(""); + // parsed TeeClaim + let claim = evidence.parse_claim_from_evidence(ima).unwrap(); + Ok(claim["payload"].clone() as TeeClaim) + } fn parse_claim_from_evidence(&self, ima: serde_json::Value) -> Result { let payload = json!({ "vcca.cvm.challenge": hex::encode(self.cvm_token.challenge.clone()),