TRACE SDK 0.6.0
Fixed
-
__version__reported the wrong number for four releases. It was a literal that drifted frompyproject.tomlat #36 and was never corrected, so v0.3.0, v0.4.0, v0.5.0 and v0.5.1 each shipped a wheel reporting0.2.0at runtime. Anyone pinning or logging onagentrust_trace.__version__got the wrong answer, and nothing failed. It now derives from installed package metadata, which makes the two unable to disagree, andtests/test_version.pypins the source tree againstpyproject.tomland requires the changelog to carry a section for the declared version before a tag is cut. -
The package description advertised TRACE v0.1. The PyPI summary still named the superseded profile.
Added
-
TraceSandboxAdapter: Trust Records from a sandboxed agent runtime. A kernel sandbox confines one agent on one machine. It does not answer, on its own, which agent on which of two hundred machines took an action, what actually ran rather than what the policy said, or how to say either on a host with no secure hardware. The adapter builds a record from what such a runtime already has at session close: sandbox identity, image digest, the effective policy bundle bytes, and the decision log. No change to the runtime is required.Unlike
TraceAGTAdapter, one code path spans Level 0 and Level 1. Passing aSandboxAttestationmoves the record fromsoftware-onlyto the attested platform and nothing else about the call changes, because a sandbox runs wherever the customer runs it and the deployments that most need evidence often have the least hardware.A caller cannot claim hardware it does not have:
platformis only ever set from a supplied attestation, an attestation may not namesoftware-only, the platform is validated against the enum onRuntimeInforather than a copy of it, and the measurement must be asha256:/sha384:digest. Sandbox identity and image ride the existingsubjectandbuild_provenance.digest, so no schema change was needed.Two defaults differ from the AGT adapter, deliberately.
appraisal.statusis"none", because building a record does not appraise it andaffirmingwould put a verdict in the field a consumer reads to find out whether anybody checked.transparencyisNoneand omitted, which is what an unanchored record should say.tool_transcript.hashis taken over the RFC 8785 canonical form of the decision log rather thanjson.dumps(sort_keys=True). The two agree on ASCII and diverge on non-ASCII strings and number formatting; a decision log carries paths and hostnames, and the signature pre-image already uses JCS. Seedocs/integration/sandbox-runtime.mdandexamples/sandbox-runtime.json. -
verify_record(..., revocation=...)enforces key revocation at verification time (#76). §3.2.1 has always required that "Verifiers MUST consult current revocation status at verification time", butverify_record()checked only signature and freshness, so a record signed by a revoked or compromised key kept verifying. The newrevocationparameter accepts either a container of revoked key identifiers or a callable performing a live CRL, status-endpoint, or SCITT lookup. A listed key is rejected, and a store that cannot answer is also rejected: an unavailable revocation source is not evidence that a key is unrevoked.Keys are identified by RFC 7638 JWK Thumbprint or
kid. The check reads the trusted key rather thanrecord["cnf"]["jwk"], which is attacker-controlled until the signature verifies.Additive and backward compatible:
revocationdefaults toNone, which leaves verification purely offline and unchanged. That mode cannot prove non-revocation, now stated inLIMITATIONS.mdanddocs/verification.md. No normative text, schema, or record field changed. -
jwk_thumbprint(jwk): RFC 7638 JWK Thumbprint (RFC 8037 §2 for OKP), exported so callers can key a revocation list on the same identifier the verifier derives.