From e835af7ff3667005be6893dedcb46a18452450d2 Mon Sep 17 00:00:00 2001 From: houmingyong Date: Mon, 14 Oct 2024 11:35:12 +0800 Subject: [PATCH] add parse report c interface --- .../attestation-agent/agent/src/lib.rs | 31 +++++++++++++++++++ .../attestation-agent/c_header/example.c | 13 ++++++-- .../c_header/rust_attestation_agent.h | 5 +++ .../attestation-service/verifier/src/lib.rs | 7 +++++ .../verifier/src/virtcca/mod.rs | 10 ++++++ 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/service/attestation/attestation-agent/agent/src/lib.rs b/service/attestation/attestation-agent/agent/src/lib.rs index 673e71d..33164fb 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 de4cc1d..8bb939d 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 82faf1a..9c1a18f 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 0b776c2..a0e0b58 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 3de7c9f..ca3a2ff 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()), -- Gitee