endpoint-attest 0.1.0 → 0.1.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 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/signing.d.ts +7 -3
- package/dist/signing.d.ts.map +1 -1
- package/dist/signing.js +13 -2
- package/dist/signing.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ capacity-attest answers "did the seller deliver what was paid for". An endpoint
|
|
|
15
15
|
1. **The owner proves control of the endpoint.** Two ACME-style methods, both stateless (no server-side session to manage): a DNS TXT record at `_endpoint-attest.<host>`, or a file at the RFC 8615 well-known path `/.well-known/endpoint-attest.txt`. The token to publish is an HMAC of the endpoint, the owner's address and a shared secret, so it is bound to that exact endpoint and that owner address. It cannot be reused on a different endpoint or claimed under a different owner address. What it proves is control of the host (a TXT record under the host, or a file at the root of the origin), not of one path on it, and the owner address is a label the requester names: nobody proves they hold that address's key. See "What this does not do".
|
|
16
16
|
2. **A distinct attester runs checks and signs.** The attester can never be the owner (`verifyAttestation` rejects that as `attester_is_owner`). It records what it actually checked (`checksPerformed` must be non-empty, so "passed" can never be read as a blanket safety claim), an outcome, and a hash of its findings.
|
|
17
17
|
3. **The attestation is content-addressed and signed.** `computeAttestationId` hashes the canonical JSON of the content (reusing capacity-attest's `canonicalize`), and `signAttestation` produces an EIP-191 signature over that id (reusing capacity-attest's signing primitives). Anyone can recompute the id and the signer independently, without trusting this package's code.
|
|
18
|
-
4. **The attestation always expires.** `expiresAt` is required, must be after `checkedAt` and at most 366 days after it, and the ownership proof may be at most 30 days older than `checkedAt`. There is no way to construct a non-expiring attestation; `verifyAttestation` treats an expired one as failed by default (`ignoreExpiry` exists only for callers who explicitly want to inspect an expired record).
|
|
18
|
+
4. **The attestation always expires.** `expiresAt` is required, must be after `checkedAt` and at most 366 days after it, and the ownership proof may be at most 30 days older than `checkedAt`. An attestation whose `checkedAt` lies more than five minutes in the future is refused, both when it is signed and when it is verified (`checked_in_future`), because the 366 days count from `checkedAt`. There is no way to construct a non-expiring attestation; `verifyAttestation` treats an expired one as failed by default (`ignoreExpiry` exists only for callers who explicitly want to inspect an expired record).
|
|
19
19
|
|
|
20
20
|
## Usage
|
|
21
21
|
|
|
@@ -67,7 +67,7 @@ Full working example with a real local HTTP server proving the whole flow, inclu
|
|
|
67
67
|
|
|
68
68
|
## Status
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
81 tests passing (`npm test`), clean typecheck and build. No independent, external review of this code has been done; see [capacity-attest's own security notes](../capacity-attest/docs/SECURITY-REVIEW-2026-09-11.md) for how that project handles the same honesty requirement, which this package follows too.
|
|
71
71
|
|
|
72
72
|
## Verifying your own implementation
|
|
73
73
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { OWNERSHIP_METHODS, OUTCOMES, ETH_ADDRESS_RE, AttestationContentSchema, EndpointAttestationSchema, OwnershipProofSchema, attestationPreimage, computeAttestationId, isExpired, type OwnershipMethod, type Outcome, type OwnershipProof, type AttestationContent, type EndpointAttestation, } from "./schema.js";
|
|
2
|
-
export { signAttestation, verifyAttestation, type SignedAttestationParts, type VerifyResult, type VerifyReason, type VerifyOptions, } from "./signing.js";
|
|
1
|
+
export { OWNERSHIP_METHODS, OUTCOMES, ETH_ADDRESS_RE, AttestationContentSchema, EndpointAttestationSchema, OwnershipProofSchema, attestationPreimage, computeAttestationId, isExpired, MAX_ATTESTATION_LIFE_DAYS, MAX_OWNERSHIP_PROOF_AGE_DAYS, type OwnershipMethod, type Outcome, type OwnershipProof, type AttestationContent, type EndpointAttestation, } from "./schema.js";
|
|
2
|
+
export { signAttestation, verifyAttestation, MAX_CLOCK_SKEW_MS, type SignedAttestationParts, type VerifyResult, type VerifyReason, type VerifyOptions, } from "./signing.js";
|
|
3
3
|
export { DNS_LABEL, WELL_KNOWN_PATH, ACTIVE_CONSENT_DNS_LABEL, ACTIVE_CONSENT_WELL_KNOWN_PATH, challengeToken, activeTestConsentToken, endpointHost, normalizeEndpoint, proofLocation, consentProofLocation, verifyOwnership, verifyActiveTestConsent, OwnershipError, type OwnershipCheckDeps, type OwnershipResult, } from "./ownership.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,yBAAyB,EACzB,4BAA4B,EAC5B,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// index.ts — public surface of this package.
|
|
2
|
-
export { OWNERSHIP_METHODS, OUTCOMES, ETH_ADDRESS_RE, AttestationContentSchema, EndpointAttestationSchema, OwnershipProofSchema, attestationPreimage, computeAttestationId, isExpired, } from "./schema.js";
|
|
3
|
-
export { signAttestation, verifyAttestation, } from "./signing.js";
|
|
2
|
+
export { OWNERSHIP_METHODS, OUTCOMES, ETH_ADDRESS_RE, AttestationContentSchema, EndpointAttestationSchema, OwnershipProofSchema, attestationPreimage, computeAttestationId, isExpired, MAX_ATTESTATION_LIFE_DAYS, MAX_OWNERSHIP_PROOF_AGE_DAYS, } from "./schema.js";
|
|
3
|
+
export { signAttestation, verifyAttestation, MAX_CLOCK_SKEW_MS, } from "./signing.js";
|
|
4
4
|
export { DNS_LABEL, WELL_KNOWN_PATH, ACTIVE_CONSENT_DNS_LABEL, ACTIVE_CONSENT_WELL_KNOWN_PATH, challengeToken, activeTestConsentToken, endpointHost, normalizeEndpoint, proofLocation, consentProofLocation, verifyOwnership, verifyActiveTestConsent, OwnershipError, } from "./ownership.js";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAE7C,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,yBAAyB,EACzB,4BAA4B,GAM7B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAKlB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,8BAA8B,EAC9B,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,cAAc,GAGf,MAAM,gBAAgB,CAAC"}
|
package/dist/signing.d.ts
CHANGED
|
@@ -4,9 +4,13 @@ export interface SignedAttestationParts {
|
|
|
4
4
|
attestationId: string;
|
|
5
5
|
signature: string;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
export declare
|
|
9
|
-
|
|
7
|
+
/** How far ahead of "now" a checkedAt may be before the attestation is refused. Covers clock differences between machines, nothing more. */
|
|
8
|
+
export declare const MAX_CLOCK_SKEW_MS: number;
|
|
9
|
+
/** Sign an attestation as the attester. Returns the content-addressed id alongside the signature so a caller can assemble a full EndpointAttestation. Refuses a checkedAt in the future, because the 366 day bound counts from checkedAt. */
|
|
10
|
+
export declare function signAttestation(attester: ethers.Signer, content: AttestationContent, opts?: {
|
|
11
|
+
now?: Date;
|
|
12
|
+
}): Promise<SignedAttestationParts>;
|
|
13
|
+
export type VerifyReason = "attestation_id_mismatch" | "signature_recovery_failed" | "signature_does_not_match_attester" | "attester_is_owner" | "checked_in_future" | "expired";
|
|
10
14
|
export type VerifyResult = {
|
|
11
15
|
ok: true;
|
|
12
16
|
} | {
|
package/dist/signing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAGzB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,
|
|
1
|
+
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAGzB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4IAA4I;AAC5I,eAAO,MAAM,iBAAiB,QAAgB,CAAC;AAE/C,6OAA6O;AAC7O,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EACvB,OAAO,EAAE,kBAAkB,EAC3B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAQjC;AAED,MAAM,MAAM,YAAY,GACpB,yBAAyB,GACzB,2BAA2B,GAC3B,mCAAmC,GACnC,mBAAmB,GACnB,mBAAmB,GACnB,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,GAAG,CAAC,EAAE,IAAI,CAAC;IACX;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,mBAAmB,EAAE,IAAI,GAAE,aAAkB,GAAG,YAAY,CAwC1G"}
|
package/dist/signing.js
CHANGED
|
@@ -17,8 +17,14 @@
|
|
|
17
17
|
// rejects an attestation where attester and owner are the same address.
|
|
18
18
|
import { recoverClaimSigner } from "capacity-attest/dist/signing.js";
|
|
19
19
|
import { computeAttestationId, isExpired, } from "./schema.js";
|
|
20
|
-
/**
|
|
21
|
-
export
|
|
20
|
+
/** How far ahead of "now" a checkedAt may be before the attestation is refused. Covers clock differences between machines, nothing more. */
|
|
21
|
+
export const MAX_CLOCK_SKEW_MS = 5 * 60 * 1000;
|
|
22
|
+
/** Sign an attestation as the attester. Returns the content-addressed id alongside the signature so a caller can assemble a full EndpointAttestation. Refuses a checkedAt in the future, because the 366 day bound counts from checkedAt. */
|
|
23
|
+
export async function signAttestation(attester, content, opts = {}) {
|
|
24
|
+
const now = opts.now ?? new Date();
|
|
25
|
+
if (Date.parse(content.checkedAt) > now.getTime() + MAX_CLOCK_SKEW_MS) {
|
|
26
|
+
throw new Error("checkedAt is in the future: the attestation would outlive the 366 day bound that counts from checkedAt");
|
|
27
|
+
}
|
|
22
28
|
const attestationId = computeAttestationId(content);
|
|
23
29
|
const signature = await attester.signMessage(attestationId);
|
|
24
30
|
return { attestationId, signature };
|
|
@@ -62,6 +68,11 @@ export function verifyAttestation(attestation, opts = {}) {
|
|
|
62
68
|
if (attestation.attesterAddress.toLowerCase() === attestation.ownerAddress.toLowerCase()) {
|
|
63
69
|
return { ok: false, reason: "attester_is_owner" };
|
|
64
70
|
}
|
|
71
|
+
// The 366 day bound counts from checkedAt, which the attester writes. Without this a far-future checkedAt would give a far-future expiry.
|
|
72
|
+
// Not skipped by ignoreExpiry: an attestation checked in the future was never valid, however old it is when someone looks at it.
|
|
73
|
+
if (Date.parse(attestation.checkedAt) > (opts.now ?? new Date()).getTime() + MAX_CLOCK_SKEW_MS) {
|
|
74
|
+
return { ok: false, reason: "checked_in_future" };
|
|
75
|
+
}
|
|
65
76
|
if (!opts.ignoreExpiry && isExpired(attestation, opts.now ?? new Date())) {
|
|
66
77
|
return { ok: false, reason: "expired" };
|
|
67
78
|
}
|
package/dist/signing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signing.js","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,oEAAoE;AACpE,8DAA8D;AAC9D,qEAAqE;AACrE,2EAA2E;AAC3E,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,qEAAqE;AACrE,wEAAwE;AACxE,uEAAuE;AACvE,qEAAqE;AACrE,2EAA2E;AAC3E,wEAAwE;AAGxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAGL,oBAAoB,EACpB,SAAS,GACV,MAAM,aAAa,CAAC;AAOrB,
|
|
1
|
+
{"version":3,"file":"signing.js","sourceRoot":"","sources":["../src/signing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "endpoint-attest",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Time-bounded, owner-requested security attestations for a network endpoint: the operator proves control of the endpoint, a check is run, and the outcome is recorded as a signed, content-addressed, expiring attestation. Reuses capacity-attest's canonical hashing and EIP-191 signing rather than reimplementing them. Never a security score, never a claim about a party that did not ask.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"attestation",
|