Skip to content

Commit 48c0593

Browse files
fix: fail closed python tee attestations
1 parent 5ee6339 commit 48c0593

2 files changed

Lines changed: 71 additions & 8 deletions

File tree

sdk/python/tests/test_tee_attestation.py

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_defaults(self) -> None:
1313

1414
class TestAttestationVerifier:
1515
def test_verify_valid(self) -> None:
16-
verifier = AttestationVerifier()
16+
verifier = AttestationVerifier(signature_verifier=lambda evidence: True)
1717
verifier.register_trusted_hash(TEEPlatform.SGX, "abc123")
1818
evidence = AttestationEvidence(
1919
platform=TEEPlatform.SGX,
@@ -96,7 +96,7 @@ def test_verify_no_trusted_hashes_for_platform(self) -> None:
9696
assert any("No trusted" in e for e in result.errors)
9797

9898
def test_verify_short_signature(self) -> None:
99-
verifier = AttestationVerifier()
99+
verifier = AttestationVerifier(signature_verifier=lambda evidence: True)
100100
verifier.register_trusted_hash(TEEPlatform.SGX, "abc")
101101
evidence = AttestationEvidence(
102102
platform=TEEPlatform.SGX,
@@ -108,8 +108,50 @@ def test_verify_short_signature(self) -> None:
108108
assert result.valid is False
109109
assert any("too short" in e.lower() for e in result.errors)
110110

111-
def test_register_trusted_hash_case_insensitive(self) -> None:
111+
def test_verify_requires_signature_verifier(self) -> None:
112112
verifier = AttestationVerifier()
113+
verifier.register_trusted_hash(TEEPlatform.SGX, "abc")
114+
evidence = AttestationEvidence(
115+
platform=TEEPlatform.SGX,
116+
enclave_hash="abc",
117+
signature="sig123456",
118+
certificates=["cert"],
119+
)
120+
result = verifier.verify(evidence)
121+
assert result.valid is False
122+
assert any("not configured" in e for e in result.errors)
123+
124+
def test_verify_rejects_signature_verifier_failure(self) -> None:
125+
verifier = AttestationVerifier(signature_verifier=lambda evidence: False)
126+
verifier.register_trusted_hash(TEEPlatform.SGX, "abc")
127+
evidence = AttestationEvidence(
128+
platform=TEEPlatform.SGX,
129+
enclave_hash="abc",
130+
signature="sig123456",
131+
certificates=["cert"],
132+
)
133+
result = verifier.verify(evidence)
134+
assert result.valid is False
135+
assert any("signature verification failed" in e.lower() for e in result.errors)
136+
137+
def test_verify_rejects_signature_verifier_exception(self) -> None:
138+
def failing_verifier(evidence: AttestationEvidence) -> bool:
139+
raise ValueError("bad chain")
140+
141+
verifier = AttestationVerifier(signature_verifier=failing_verifier)
142+
verifier.register_trusted_hash(TEEPlatform.SGX, "abc")
143+
evidence = AttestationEvidence(
144+
platform=TEEPlatform.SGX,
145+
enclave_hash="abc",
146+
signature="sig123456",
147+
certificates=["cert"],
148+
)
149+
result = verifier.verify(evidence)
150+
assert result.valid is False
151+
assert any("bad chain" in e for e in result.errors)
152+
153+
def test_register_trusted_hash_case_insensitive(self) -> None:
154+
verifier = AttestationVerifier(signature_verifier=lambda evidence: True)
113155
verifier.register_trusted_hash(TEEPlatform.SGX, "ABC123")
114156
evidence = AttestationEvidence(
115157
platform=TEEPlatform.SGX,
@@ -126,7 +168,7 @@ def test_compute_expected_hash(self) -> None:
126168
assert len(h) == 64 # hex-encoded 32 bytes
127169

128170
def test_register_multiple_hashes(self) -> None:
129-
verifier = AttestationVerifier()
171+
verifier = AttestationVerifier(signature_verifier=lambda evidence: True)
130172
verifier.register_trusted_hash(TEEPlatform.SGX, "hash1")
131173
verifier.register_trusted_hash(TEEPlatform.SGX, "hash2")
132174
e1 = AttestationEvidence(

sdk/python/zeroid/tee/attestation.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
from __future__ import annotations
88

99
from dataclasses import dataclass, field
10+
from typing import Callable
1011

1112
from zeroid.crypto.hashing import keccak256
1213
from zeroid.tee.types import AttestationEvidence, TEEPlatform
1314

15+
SignatureVerifier = Callable[[AttestationEvidence], bool]
16+
1417

1518
@dataclass(frozen=True)
1619
class AttestationResult:
@@ -36,9 +39,16 @@ class AttestationVerifier:
3639
attestation evidence against them.
3740
"""
3841

39-
def __init__(self) -> None:
40-
"""Initialize the verifier with empty trusted measurements."""
42+
def __init__(self, signature_verifier: SignatureVerifier | None = None) -> None:
43+
"""Initialize the verifier with empty trusted measurements.
44+
45+
Args:
46+
signature_verifier: Platform-specific attestation verifier. It must
47+
validate the evidence signature and certificate chain before the
48+
attestation can be accepted.
49+
"""
4150
self._trusted_hashes: dict[TEEPlatform, set[str]] = {}
51+
self._signature_verifier = signature_verifier
4252

4353
def register_trusted_hash(
4454
self, platform: TEEPlatform, enclave_hash: str
@@ -60,7 +70,8 @@ def verify(self, evidence: AttestationEvidence) -> AttestationResult:
6070
- Evidence is complete (hash, signature, certificates)
6171
- Platform is supported (not UNKNOWN)
6272
- Enclave hash is in the trusted set for the platform
63-
- Signature structure is valid (mock check)
73+
- Signature and certificate chain are cryptographically verified by the
74+
configured platform verifier
6475
6576
Args:
6677
evidence: The attestation evidence to verify.
@@ -99,10 +110,20 @@ def verify(self, evidence: AttestationEvidence) -> AttestationResult:
99110
elif evidence.enclave_hash.lower() not in trusted:
100111
errors.append("Enclave hash not in trusted set")
101112

102-
# Mock signature verification
103113
if evidence.signature and len(evidence.signature) < 8:
104114
errors.append("Signature too short")
105115

116+
if self._signature_verifier is None:
117+
errors.append("TEE attestation signature verifier is not configured")
118+
else:
119+
try:
120+
signature_valid = self._signature_verifier(evidence)
121+
except Exception as exc: # pragma: no cover - exact verifier errors vary
122+
errors.append(f"TEE attestation signature verification failed: {exc}")
123+
else:
124+
if not signature_valid:
125+
errors.append("TEE attestation signature verification failed")
126+
106127
return AttestationResult(
107128
valid=len(errors) == 0,
108129
platform=evidence.platform,

0 commit comments

Comments
 (0)