@@ -377,6 +377,7 @@ cmd_verify() {
377377
378378 INF_PROVIDER=$( echo " $INF_HEADERS " | grep -i " ^x-inference-provider:" | sed ' s/[^:]*: *//' | tr -d ' \r\n' )
379379 ATTESTATION=$( echo " $INF_HEADERS " | grep -i " ^attestation-report:" | sed ' s/[^:]*: *//' | tr -d ' \r\n' )
380+ UPSTREAM_ATTESTATION=$( echo " $INF_HEADERS " | grep -i " ^x-upstream-attestation-report:" | sed ' s/[^:]*: *//' | tr -d ' \r\n' )
380381
381382 if [ " $INF_PROVIDER " = " redpill" ]; then
382383 echo " Provider: redpill (failover)"
@@ -386,7 +387,7 @@ cmd_verify() {
386387 elif [ -n " $ATTESTATION " ]; then
387388 echo " Provider: ${INF_PROVIDER:- lunal} "
388389
389- # Decode attestation: base64 -> gunzip -> JSON evidence
390+ # --- Orchestrator-side attestation (tee-proxy Attestation-Report) ---
390391 INF_ATTEST_OK=false
391392 INF_EVIDENCE_FILE=$( mktemp /tmp/inference_attestation_XXXXXX.json)
392393 if echo " $ATTESTATION " | base64 -d 2> /dev/null | gunzip > " $INF_EVIDENCE_FILE " 2> /dev/null; then
@@ -399,6 +400,7 @@ cmd_verify() {
399400 echo " Platform: $INF_PLATFORM (via tee-proxy)"
400401 if [ " $INF_SIG_VALID " = " true" ]; then
401402 echo " Attestation: valid (signature verified)"
403+ echo " VCEK Chain: VALID (AMD root CA -> VCEK -> SNP report)"
402404 INF_ATTEST_OK=true
403405 else
404406 echo " Attestation: INVALID (signature verification failed)"
@@ -414,6 +416,42 @@ cmd_verify() {
414416 fi
415417 rm -f " $INF_EVIDENCE_FILE "
416418
419+ # --- Upstream (Lunal) attestation (X-Upstream-Attestation-Report, tee-proxy v0.3.0+) ---
420+ if [ -n " $UPSTREAM_ATTESTATION " ]; then
421+ UPSTREAM_ATTEST_OK=false
422+ UPSTREAM_EVIDENCE_FILE=$( mktemp /tmp/upstream_attestation_XXXXXX.json)
423+ if echo " $UPSTREAM_ATTESTATION " | base64 -d 2> /dev/null | gunzip > " $UPSTREAM_EVIDENCE_FILE " 2> /dev/null; then
424+ if [ -n " $ATTESTATION_CLI " ]; then
425+ UPSTREAM_VERIFY_RESULT=$( $ATTESTATION_CLI verify -e " $UPSTREAM_EVIDENCE_FILE " 2> /dev/null) || true
426+ if [ -n " $UPSTREAM_VERIFY_RESULT " ] && echo " $UPSTREAM_VERIFY_RESULT " | jq -e . & > /dev/null; then
427+ UPSTREAM_SIG_VALID=$( echo " $UPSTREAM_VERIFY_RESULT " | jq -r ' .signature_valid // false' )
428+ if [ " $UPSTREAM_SIG_VALID " = " true" ]; then
429+ echo " Upstream (Lunal) VCEK Chain: VALID"
430+ UPSTREAM_ATTEST_OK=true
431+ else
432+ echo " Upstream (Lunal) Attestation: INVALID (signature verification failed)"
433+ fi
434+ else
435+ echo " Upstream (Lunal) Attestation: present but verification failed"
436+ fi
437+ else
438+ echo " Upstream (Lunal) Attestation: present but no verifier (attestation-cli not found)"
439+ UPSTREAM_ATTEST_OK=true # don't fail if CLI is missing, just note it
440+ fi
441+ else
442+ echo " Upstream (Lunal) Attestation: present but could not decode (base64+gzip)"
443+ fi
444+ rm -f " $UPSTREAM_EVIDENCE_FILE "
445+ # Both layers must pass for step [4/5] to succeed
446+ if [ " $UPSTREAM_ATTEST_OK " != " true" ]; then
447+ INF_ATTEST_OK=false
448+ fi
449+ else
450+ # Upstream header absent — backward-compat WARN (tee-proxy may be pre-v0.3.0, or Lunal not sending)
451+ echo " Upstream (Lunal) Attestation: WARN — header absent (tee-proxy pre-v0.3.0 or Lunal not sending)"
452+ echo " Using orchestrator-only attestation."
453+ fi
454+
417455 if [ " $INF_ATTEST_OK " = " true" ]; then
418456 echo " Status: PASS"
419457 PASS_COUNT=$(( PASS_COUNT + 1 ))
0 commit comments