dev.cocore.compute.attestation
Schema Diff
+78 -2
Compatibility Analysis
Breaking Changes Detected
2 breaking changes, 30 non-breaking changes.
Breaking Changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.cocore.compute.attestation:body.appAttest", src: "dev.cocore.compute.attestation:body.appAttest", tgt: "dev.cocore.compute.attestation:body.appAttest.keyId", kind: "prop", name: Some("keyId") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.cocore.compute.attestation:body.appAttest", src: "dev.cocore.compute.attestation:body.appAttest", tgt: "dev.cocore.compute.attestation:body.appAttest.object", kind: "prop", name: Some("object") }
Non-Breaking Changes (30)
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.antiDebug" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.appAttest" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.appAttest.keyId" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.appAttest.object" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.cdHash" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.coreDumpsDisabled" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.engineLibHash" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.envScrubbed" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.getTaskAllow" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.hardenedRuntime" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.inProcessBackend" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.libraryValidation" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.metallibHash" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.teamId" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.tier" }
- AddedVertex AddedVertex { vertex_id: "dev.cocore.compute.defs#tier" }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.antiDebug", kind: "prop", name: Some("antiDebug") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.appAttest", kind: "prop", name: Some("appAttest") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.cdHash", kind: "prop", name: Some("cdHash") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.coreDumpsDisabled", kind: "prop", name: Some("coreDumpsDisabled") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.engineLibHash", kind: "prop", name: Some("engineLibHash") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.envScrubbed", kind: "prop", name: Some("envScrubbed") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.getTaskAllow", kind: "prop", name: Some("getTaskAllow") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.hardenedRuntime", kind: "prop", name: Some("hardenedRuntime") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.inProcessBackend", kind: "prop", name: Some("inProcessBackend") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.libraryValidation", kind: "prop", name: Some("libraryValidation") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.metallibHash", kind: "prop", name: Some("metallibHash") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.teamId", kind: "prop", name: Some("teamId") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.tier", kind: "prop", name: Some("tier") }
- AddedEdge AddedEdge { src: "dev.cocore.compute.attestation:body.tier", tgt: "dev.cocore.compute.defs#tier", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.antiDebug" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.appAttest" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.appAttest.keyId" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.appAttest.object" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.cdHash" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.coreDumpsDisabled" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.engineLibHash" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.envScrubbed" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.getTaskAllow" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.hardenedRuntime" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.inProcessBackend" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.libraryValidation" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.metallibHash" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.teamId" }AddedVertex { vertex_id: "dev.cocore.compute.attestation:body.tier" }AddedVertex { vertex_id: "dev.cocore.compute.defs#tier" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "dev.cocore.compute.attestation:body.appAttest", src: "dev.cocore.compute.attestation:body.appAttest", tgt: "dev.cocore.compute.attestation:body.appAttest.keyId", kind: "prop", name: Some("keyId") }
- Breaking: RequiredEdgeAdded { vertex_id: "dev.cocore.compute.attestation:body.appAttest", src: "dev.cocore.compute.attestation:body.appAttest", tgt: "dev.cocore.compute.attestation:body.appAttest.object", kind: "prop", name: Some("object") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.antiDebug", kind: "prop", name: Some("antiDebug") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.appAttest", kind: "prop", name: Some("appAttest") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.cdHash", kind: "prop", name: Some("cdHash") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.coreDumpsDisabled", kind: "prop", name: Some("coreDumpsDisabled") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.engineLibHash", kind: "prop", name: Some("engineLibHash") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.envScrubbed", kind: "prop", name: Some("envScrubbed") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.getTaskAllow", kind: "prop", name: Some("getTaskAllow") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.hardenedRuntime", kind: "prop", name: Some("hardenedRuntime") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.inProcessBackend", kind: "prop", name: Some("inProcessBackend") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.libraryValidation", kind: "prop", name: Some("libraryValidation") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.metallibHash", kind: "prop", name: Some("metallibHash") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.teamId", kind: "prop", name: Some("teamId") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body", tgt: "dev.cocore.compute.attestation:body.tier", kind: "prop", name: Some("tier") }
- Non-breaking: AddedEdge { src: "dev.cocore.compute.attestation:body.tier", tgt: "dev.cocore.compute.defs#tier", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"record": {
7
7
"properties": {
8
+
"antiDebug": {
9
+
"description": "True iff the process denied debugger attachment at startup (PT_DENY_ATTACH). Required for `attested-confidential`. Optional / additive; absent treated as false.",
10
+
"type": "boolean"
11
+
},
12
+
"appAttest": {
13
+
"description": "Optional Apple App Attest evidence — the second, MDM-free path to trustLevel 'hardware-attested'. The provider's signed helper calls DCAppAttestService with `clientDataHash = sha256(publicKey)` (this record's receipt-signing key), so Apple's attestation commits to the signing key by construction. Verifiers MUST, offline: (1) CBOR-decode `object`, requiring fmt 'apple-appattest'; (2) verify the attStmt x5c chain to the embedded Apple App Attest Root CA; (3) recompute `nonce = sha256(authData || sha256(publicKey))` and require it to equal the credential certificate's nonce extension (OID 1.2.840.113635.100.8.2) — THIS is the binding to the signing key; (4) check authData's rpIdHash == sha256(App ID 'TEAMID.dev.cocore.provider'), the AAGUID is the genuine-hardware appattest value, and credentialId == sha256(attested public key) == `keyId`. A bound, valid App Attest object earns 'hardware-attested' exactly as a bound mdaCertChain does. It proves genuine, un-tampered Apple hardware holds a Secure-Enclave key bound to the signing key; it does NOT by itself prove the signing key is SE-resident nor that the running binary is honest (those are carried by the SE-backed signing identity + hardened-runtime + cdHash known-good gate, same self-measurement ceiling as the MDA path).",
14
+
"properties": {
15
+
"keyId": {
16
+
"description": "The App Attest key identifier (the SHA-256 of the attested public key) DCAppAttestService.generateKey returned. Verifiers cross-check this equals the credentialId in authData.",
17
+
"maxLength": 64,
18
+
"type": "bytes"
19
+
},
20
+
"object": {
21
+
"description": "The CBOR App Attest attestation object returned by DCAppAttestService.attestKey, as produced for `clientDataHash = sha256(publicKey)`. Contains fmt, attStmt (x5c + receipt), and authData.",
22
+
"maxLength": 16384,
23
+
"type": "bytes"
24
+
}
25
+
},
26
+
"required": [
27
+
"object",
28
+
"keyId"
29
+
],
30
+
"type": "object"
31
+
},
8
32
"attestedAt": {
9
33
"format": "datetime",
10
34
"type": "string"
11
35
},
12
36
"authenticatedRootEnabled": {
13
37
"type": "boolean"
14
38
},
15
39
"binaryHash": {
16
-
"description": "SHA-256 hex of the cocore-provider binary that produced this attestation.",
40
+
"description": "SHA-256 hex of the cocore-provider binary that produced this attestation. Back-compat measure of the whole file on disk. For trust decisions `cdHash` supersedes it: the OS enforces the code-signing cdhash, not a whole-file digest, so a verifier deciding `tier` MUST prefer `cdHash` when present and treat `binaryHash` as informational.",
17
41
"maxLength": 64,
18
42
"minLength": 64,
19
43
"type": "string"
20
44
},
45
+
"cdHash": {
46
+
"description": "Lowercase hex of the code-signing directory hash (cdhash) the OS actually enforces for the running cocore-provider binary, read from the live process (SecCodeCopySelf / SecCodeCopySigningInformation, fallback csops CS_OPS_CDHASH). This is the measured identity a confidential-tier verifier checks against the known-good set — unlike `binaryHash` it reflects exactly what library validation and `get-task-allow=false` protect. Optional / additive; absent caps the work at `best-effort`.",
47
+
"maxLength": 64,
48
+
"minLength": 40,
49
+
"type": "string"
50
+
},
21
51
"chipName": {
22
52
"maxLength": 64,
23
53
"type": "string"
24
54
},
55
+
"coreDumpsDisabled": {
56
+
"description": "True iff core dumps were disabled at startup (RLIMIT_CORE=0), so a crash cannot spill plaintext to disk. Required for `attested-confidential`. Optional / additive; absent treated as false.",
57
+
"type": "boolean"
58
+
},
25
59
"encryptionPubKey": {
26
60
"description": "X25519 public key (base64) bound to the same Secure Enclave identity. Proves a single device controls both signing and request-encryption keys.",
27
61
"maxLength": 128,
28
62
"type": "string"
29
63
},
64
+
"engineLibHash": {
65
+
"description": "SHA-256 hex of the dynamic library that runs the in-process inference engine (e.g. `libCoCoreMLX.dylib`). When the engine is a separately-loaded dylib rather than code statically inside the agent binary, the `cdHash` does not cover it, so a confidential verifier pins this too. Enforced library validation already blocks a different team's dylib; this additionally locks the hash within the provider team's own blessed releases. Absent when inference runs in a subprocess or fully inside the measured binary. Optional / additive.",
66
+
"maxLength": 64,
67
+
"minLength": 64,
68
+
"type": "string"
69
+
},
70
+
"envScrubbed": {
71
+
"description": "True iff dynamic-linker injection vectors (DYLD_*) were scrubbed from the environment at startup. Required for `attested-confidential`. Optional / additive; absent treated as false.",
72
+
"type": "boolean"
73
+
},
30
74
"expiresAt": {
31
75
"description": "Receipts that strong-ref this attestation are only considered fresh if completedAt < expiresAt. Default 24h after attestedAt.",
32
76
"format": "datetime",
33
77
"type": "string"
34
78
},
79
+
"getTaskAllow": {
80
+
"description": "Value of the get-task-allow entitlement on the running binary. MUST be false for `attested-confidential` — a true value means another process (even the owner) can attach a debugger and read process memory, defeating confidentiality. Optional / additive; absent treated as true (the unsafe default) so a missing value never silently earns the confidential tier.",
81
+
"type": "boolean"
82
+
},
83
+
"hardenedRuntime": {
84
+
"description": "True iff the running binary is signed with the hardened runtime (CS_RUNTIME). Required for `attested-confidential`. Optional / additive; absent treated as false.",
85
+
"type": "boolean"
86
+
},
35
87
"hardwareModel": {
36
88
"description": "DMI string, e.g. 'Mac15,8'.",
37
89
"maxLength": 64,
38
90
"type": "string"
39
91
},
92
+
"inProcessBackend": {
93
+
"description": "True iff inference runs INSIDE this measured, signed binary (native in-process engine) rather than in an owner-controlled subprocess/interpreter. This is THE load-bearing confidentiality property — if false, the prompt is handed to a process the attestation does not cover, so the work can never be `attested-confidential`. Optional / additive; absent treated as false.",
94
+
"type": "boolean"
95
+
},
96
+
"libraryValidation": {
97
+
"description": "True iff library validation is enforced (the binary will not load libraries signed by a different team / unsigned code). Closes the dylib-injection path. Required for `attested-confidential`. Optional / additive; absent treated as false.",
98
+
"type": "boolean"
99
+
},
40
100
"mdaCertChain": {
41
-
"description": "Optional Apple Managed Device Attestation certificate chain (DER), leaf first. Present when trustLevel is 'hardware-attested'. Verifiers MUST: (1) verify every adjacent link to the embedded Apple Enterprise Attestation Root CA, enforcing BasicConstraints (non-leaf certs are CAs, the leaf is an end-entity); and (2) require the leaf's P-256 public key to EQUAL this record's `publicKey` — i.e. the chain is BOUND to the receipt-signing key. Without (2) a valid Apple chain for one device could be stapled onto an unrelated signing key, so a chain that verifies but isn't bound MUST NOT earn 'hardware-attested'. Producers (the MDA provisioning tool) MUST therefore attest the signing key itself.",
101
+
"description": "Optional Apple Managed Device Attestation certificate chain (DER), leaf first. One of two paths to trustLevel 'hardware-attested' (the other is `appAttest`). Verifiers MUST: (1) verify every adjacent link to the embedded Apple Enterprise Attestation Root CA, enforcing BasicConstraints (non-leaf certs are CAs, the leaf is an end-entity); and (2) BIND the chain to this record's `publicKey` by EITHER the leaf's P-256 public key EQUALLING `publicKey`, OR the Apple freshness extension (OID 1.2.840.113635.100.8.11.1) committing to it as `freshnessCode == sha256(publicKey)`. Without a binding a valid Apple chain for one device could be stapled onto an unrelated signing key, so a chain that verifies but isn't bound MUST NOT earn 'hardware-attested'.",
42
102
"items": {
43
103
"maxLength": 8192,
44
104
"type": "bytes"
45
105
},
46
106
"maxLength": 8,
47
107
"type": "array"
48
108
},
109
+
"metallibHash": {
110
+
"description": "SHA-256 hex of the precompiled Metal shader library (`mlx.metallib` or equivalent) the in-process inference engine loads at runtime. The GPU kernels that touch the plaintext live here, so a confidential verifier pins this to a known-good value alongside `cdHash`. Absent when no native engine is loaded (e.g. the subprocess/best-effort backend). Optional / additive.",
111
+
"maxLength": 64,
112
+
"minLength": 64,
113
+
"type": "string"
114
+
},
49
115
"osVersion": {
50
116
"maxLength": 64,
51
117
"type": "string"
52
118
},
53
119
"publicKey": {
54
120
"description": "P-256 public key (base64). MUST equal the attestationPubKey of the provider record under the signing DID.",
55
121
"maxLength": 256,
56
122
"type": "string"
57
123
},
58
124
"rdmaDisabled": {
59
125
"type": "boolean"
60
126
},
61
127
"secureBootEnabled": {
62
128
"type": "boolean"
63
129
},
64
130
"secureEnclaveAvailable": {
65
131
"type": "boolean"
66
132
},
67
133
"selfSignature": {
68
134
"description": "Secure Enclave P-256 signature (DER) over a sorted-key canonical JSON of every other field in this record. Verifiers MUST reconstruct the canonical JSON byte-for-byte before checking.",
69
135
"maxLength": 256,
70
136
"type": "bytes"
71
137
},
72
138
"serialNumberHash": {
73
139
"description": "SHA-256 hex of (serialNumber || providerDID). Hashed so the public record never leaks raw serials. When an mdaCertChain is present, the serialNumber MUST be the one the verified MDA leaf attests (not a self-reported value), so the hashed device identity is anchored to the chain.",
74
140
"maxLength": 64,
75
141
"minLength": 64,
76
142
"type": "string"
77
143
},
78
144
"sipEnabled": {
79
145
"type": "boolean"
146
+
},
147
+
"teamId": {
148
+
"description": "Apple Developer Team Identifier from the code signature of the running binary. A confidential-tier verifier pins this to the expected cocore signing team so a validly-signed but unrelated binary cannot pass. Optional / additive.",
149
+
"maxLength": 64,
150
+
"type": "string"
151
+
},
152
+
"tier": {
153
+
"description": "The provider's self-asserted confidentiality tier for work done under this attestation. ADVISORY ONLY: a verifier MUST recompute the tier from the evidence in this record (bound mdaCertChain, cdHash ∈ known-good, posture booleans) and the session handshake, and MUST NOT trust this field. Present so consumers can display the provider's claim before verifying. Optional / additive; absent equivalent to `best-effort`.",
154
+
"ref": "dev.cocore.compute.defs#tier",
155
+
"type": "ref"
80
156
}
81
157
},
82
158
"required": [
83
159
"publicKey",
84
160
"encryptionPubKey",
85
161
"chipName",
86
162
"hardwareModel",
87
163
"serialNumberHash",
88
164
"osVersion",
89
165
"binaryHash",
90
166
"sipEnabled",
91
167
"secureBootEnabled",
92
168
"secureEnclaveAvailable",
93
169
"authenticatedRootEnabled",
94
170
"selfSignature",
95
171
"attestedAt",
96
172
"expiresAt"
97
173
],
98
174
"type": "object"
99
175
},
100
176
"type": "record"
101
177
}
102
178
},
103
179
"description": "A snapshot of a provider machine's hardware and software state, signed by its Secure Enclave. Content-addressed: many receipts strong-ref the same attestation record until the underlying state changes (binary upgrade, OS update, key rotation).",
104
180
"id": "dev.cocore.compute.attestation",
105
181
"lexicon": 1
106
182
}