Skip to content

Commit d691a7d

Browse files
authored
Merge pull request #2 from lunal-dev/feat/lunal-upstream-attestation-verify
feat: Lunal upstream attestation verification in privateclaw verify step [4/5] (Phase 1B)
2 parents 21a4bb0 + 18336ce commit d691a7d

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

privateclaw

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)