@crawlcheck/sdk 1.9.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/verify.js +4 -1
- package/package.json +1 -1
- package/test/fixtures/key-policy.json +390 -221
package/README.md
CHANGED
|
@@ -18,6 +18,8 @@ const { proceed, receipt } = await cc.guard("example.com", "read", { agent: "MyA
|
|
|
18
18
|
|
|
19
19
|
Every verification returns `integrity_valid`, `issuer_trusted` and `accepted`. Act on `accepted`: it needs the signing key to be one CrawlCheck publishes, so a document someone signed with their own key is `verified` offline but never `accepted`. The client methods (`verifyDocument`, `verifyOffline`, `verifyReceiptOffline`, `guard`) check the published key directory for you.
|
|
20
20
|
|
|
21
|
+
Since 1.9.1 a key the rotation record lists as retired still counts for its own signing window when the expected purpose is worked out: after a decision-key rotation, receipts the old decision key signed inside its window verify, and no other key may sign a decision made while that key was live (key-policy suite cases retired-decision-key-*).
|
|
22
|
+
|
|
21
23
|
Since 1.9.0 `logCheck` reads the chain of signed heads 200 per request (`/api/v1/log/sths`) instead of one per batch, so a first check on a client holding no heads takes one or two requests; an older server is still walked one head per request.
|
|
22
24
|
|
|
23
25
|
Since 1.8.0 an MCP connect decision names the server and, with a lockfile, its approved `tools_sha256` (`preflight(domain, "connect", { mcp: { url, tools_sha256 } })`; `withPreflight` sends it for you). CrawlCheck reads the live tools from its own network: a changed tool list comes back as `block`, and the signed receipt's `assessed` block says exactly which endpoint and tool state it covered.
|
package/dist/verify.js
CHANGED
|
@@ -775,7 +775,7 @@ export async function keyPolicyFrom(directory, rotation) {
|
|
|
775
775
|
}
|
|
776
776
|
for (const r of (rotation && rotation.retired) || [])
|
|
777
777
|
if (r && r.thumbprint)
|
|
778
|
-
retired[r.thumbprint] = { purpose: kpPurpose(r.purpose), stopped: kpMs(r.stopped_signing_at) ?? kpMs(r.retired_at) };
|
|
778
|
+
retired[r.thumbprint] = { purpose: kpPurpose(r.purpose), start: kpMs(r.crawlcheck_signs_from) ?? kpMs(r.not_before) ?? kpMs(KEY_POLICY.starts[kpPurpose(r.purpose)]), stopped: kpMs(r.stopped_signing_at) ?? kpMs(r.retired_at) }; // conf3: a retired key keeps its signing window
|
|
779
779
|
for (const c of (rotation && rotation.compromised) || [])
|
|
780
780
|
if (c && c.thumbprint)
|
|
781
781
|
compromised[c.thumbprint] = kpMs(c.compromised_since) ?? 0;
|
|
@@ -823,6 +823,9 @@ function kpExpected(objPurpose, t, kp) {
|
|
|
823
823
|
return p;
|
|
824
824
|
if (Object.keys(kp.keys).some((kid) => kp.keys[kid].purpose === p && kp.compromised[kid] === undefined && (t === null || kp.keys[kid].start === null || kp.keys[kid].start <= t)))
|
|
825
825
|
return p;
|
|
826
|
+
// conf3: a key retired since still covered its own signing window: a decision made while a decision key was live expects that purpose
|
|
827
|
+
if (t !== null && Object.keys(kp.retired || {}).some((kid) => { const r = kp.retired[kid]; return r.purpose === p && kp.compromised[kid] === undefined && (r.start === null || r.start === undefined || r.start <= t) && r.stopped !== null && t <= r.stopped; }))
|
|
828
|
+
return p;
|
|
826
829
|
}
|
|
827
830
|
return "requests";
|
|
828
831
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crawlcheck/sdk",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"description": "Typed client for the CrawlCheck API (generated from its OpenAPI document) and the zero-dependency offline verifier for evidence bundles and remediation receipts.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|