@izagood/avcs 0.13.0 → 0.14.0
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/dist/api/repo.d.ts +3 -1
- package/dist/api/repo.d.ts.map +1 -1
- package/dist/api/repo.js +35 -3
- package/dist/api/repo.js.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/hub/hubClient.d.ts +8 -1
- package/dist/hub/hubClient.d.ts.map +1 -1
- package/dist/hub/hubClient.js +25 -5
- package/dist/hub/hubClient.js.map +1 -1
- package/dist/hub/hubServer.d.ts +15 -2
- package/dist/hub/hubServer.d.ts.map +1 -1
- package/dist/hub/hubServer.js +57 -5
- package/dist/hub/hubServer.js.map +1 -1
- package/dist/hub/transportAuth.d.ts +73 -0
- package/dist/hub/transportAuth.d.ts.map +1 -0
- package/dist/hub/transportAuth.js +127 -0
- package/dist/hub/transportAuth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Transport-layer authentication for hub requests (SSH-style public-key auth over HTTP).
|
|
2
|
+
//
|
|
3
|
+
// Unlike `authorizePush` in hubServer.ts — which authenticates individual GOVERNANCE
|
|
4
|
+
// OBJECTS (an operation/decision carries an ed25519 signature over its own oid) — this
|
|
5
|
+
// authenticates the REQUEST/CONNECTION, the way `git clone git@host` proves possession
|
|
6
|
+
// of a key before the server speaks. The model mirrors SSH exactly:
|
|
7
|
+
//
|
|
8
|
+
// ~/.ssh/id_ed25519 → the local actor's private key (.avcs/private/<id>.json)
|
|
9
|
+
// authorized_keys → the hub's `member:<keyId>` ref → Membership.publicKey
|
|
10
|
+
// challenge-response nonce → a per-request signature over the request itself
|
|
11
|
+
//
|
|
12
|
+
// No secret is transmitted: the client signs a canonical description of the request with
|
|
13
|
+
// its private key, the server verifies against the registered public key. Replay is
|
|
14
|
+
// bounded by a freshness window on the timestamp plus a seen-nonce cache. The two layers
|
|
15
|
+
// are orthogonal and share one keypair: transport auth answers "are you a registered
|
|
16
|
+
// member at all" (failure → 401); object-level `authorizePush` answers "is THIS object
|
|
17
|
+
// validly signed by a sufficiently-privileged role" (failure → 403).
|
|
18
|
+
import { randomBytes } from "node:crypto";
|
|
19
|
+
import { sha256hex } from "../core/canonical.js";
|
|
20
|
+
import { signMessage, verifyMessage } from "../core/identity.js";
|
|
21
|
+
/** Authorization scheme token. `Authorization: AVCS-Sig keyId="...", ts="...", ...`. */
|
|
22
|
+
export const AUTH_SCHEME = "AVCS-Sig";
|
|
23
|
+
/** Default freshness window for a request signature (ms). A request whose `ts` is more
|
|
24
|
+
* than this far from the server clock (either direction) is rejected as stale/replayed. */
|
|
25
|
+
export const DEFAULT_AUTH_WINDOW_MS = 300_000; // 5 minutes
|
|
26
|
+
/**
|
|
27
|
+
* The exact byte string both sides sign/verify. Binds the signature to the method, the
|
|
28
|
+
* request target, a timestamp (freshness) and a nonce (replay), plus a hash of the body
|
|
29
|
+
* so a captured signature cannot be replayed against different content.
|
|
30
|
+
*/
|
|
31
|
+
export function canonicalRequest(method, path, ts, nonce, body) {
|
|
32
|
+
return `${method.toUpperCase()}\n${path}\n${ts}\n${nonce}\n${sha256hex(body)}`;
|
|
33
|
+
}
|
|
34
|
+
/** Build an `Authorization: AVCS-Sig …` header value, signing the request with the local
|
|
35
|
+
* actor's private key. `body` is the exact request body the client will send (""for none). */
|
|
36
|
+
export function buildAuthHeader(args) {
|
|
37
|
+
const ts = args.ts ?? new Date().toISOString();
|
|
38
|
+
const nonce = args.nonce ?? randomBytes(12).toString("base64url");
|
|
39
|
+
const sig = signMessage(args.privateKey, canonicalRequest(args.method, args.path, ts, nonce, args.body ?? ""));
|
|
40
|
+
return `${AUTH_SCHEME} keyId="${args.keyId}", ts="${ts}", nonce="${nonce}", sig="${sig}"`;
|
|
41
|
+
}
|
|
42
|
+
/** Parse an AVCS-Sig Authorization header. Returns null on any scheme/field mismatch. */
|
|
43
|
+
export function parseAuthHeader(header) {
|
|
44
|
+
if (!header)
|
|
45
|
+
return null;
|
|
46
|
+
const trimmed = header.trim();
|
|
47
|
+
if (!trimmed.startsWith(`${AUTH_SCHEME} `))
|
|
48
|
+
return null;
|
|
49
|
+
const rest = trimmed.slice(AUTH_SCHEME.length + 1);
|
|
50
|
+
const fields = {};
|
|
51
|
+
// key="value" pairs, comma-separated. Values may contain base64url (no quotes/commas).
|
|
52
|
+
const re = /(\w+)="([^"]*)"/g;
|
|
53
|
+
let m;
|
|
54
|
+
while ((m = re.exec(rest)) !== null)
|
|
55
|
+
fields[m[1]] = m[2];
|
|
56
|
+
const { keyId, ts, nonce, sig } = fields;
|
|
57
|
+
if (!keyId || !ts || !nonce || !sig)
|
|
58
|
+
return null;
|
|
59
|
+
return { keyId, ts, nonce, sig };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A bounded seen-nonce cache for replay protection. Entries expire after `ttlMs` (the
|
|
63
|
+
* freshness window — a nonce can only be replayed within it anyway) and the map is
|
|
64
|
+
* capped so a hostile client cannot grow it without bound.
|
|
65
|
+
*/
|
|
66
|
+
export class NonceCache {
|
|
67
|
+
#seen = new Map(); // nonce → expiry epoch ms
|
|
68
|
+
#ttlMs;
|
|
69
|
+
#max;
|
|
70
|
+
constructor(ttlMs = DEFAULT_AUTH_WINDOW_MS, max = 100_000) {
|
|
71
|
+
this.#ttlMs = ttlMs;
|
|
72
|
+
this.#max = max;
|
|
73
|
+
}
|
|
74
|
+
/** Record a nonce; returns false if it was already seen (a replay). */
|
|
75
|
+
check(nonce, now) {
|
|
76
|
+
this.#evict(now);
|
|
77
|
+
if (this.#seen.has(nonce))
|
|
78
|
+
return false;
|
|
79
|
+
if (this.#seen.size >= this.#max) {
|
|
80
|
+
// Hard cap reached even after eviction: drop the oldest insertion to stay bounded.
|
|
81
|
+
const oldest = this.#seen.keys().next().value;
|
|
82
|
+
if (oldest !== undefined)
|
|
83
|
+
this.#seen.delete(oldest);
|
|
84
|
+
}
|
|
85
|
+
this.#seen.set(nonce, now + this.#ttlMs);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
#evict(now) {
|
|
89
|
+
for (const [n, exp] of this.#seen) {
|
|
90
|
+
if (exp <= now)
|
|
91
|
+
this.#seen.delete(n);
|
|
92
|
+
else
|
|
93
|
+
break; // Map preserves insertion order; later entries expire no earlier... see note
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Verify a request's AVCS-Sig credential. Steps, in order:
|
|
99
|
+
* 1. parse the header,
|
|
100
|
+
* 2. reject a stale/future timestamp (outside the freshness window),
|
|
101
|
+
* 3. reject a replayed nonce,
|
|
102
|
+
* 4. resolve the keyId to a public key (unknown key → unauthenticated),
|
|
103
|
+
* 5. verify the signature over the canonical request.
|
|
104
|
+
* Any failure returns `{ ok: false, reason }` for a 401 body. Success returns the keyId.
|
|
105
|
+
*/
|
|
106
|
+
export async function verifyAuth(args) {
|
|
107
|
+
const cred = parseAuthHeader(args.header);
|
|
108
|
+
if (!cred)
|
|
109
|
+
return { ok: false, reason: "missing or malformed AVCS-Sig Authorization header" };
|
|
110
|
+
const window = args.windowMs ?? DEFAULT_AUTH_WINDOW_MS;
|
|
111
|
+
const tsMs = Date.parse(cred.ts);
|
|
112
|
+
if (!Number.isFinite(tsMs))
|
|
113
|
+
return { ok: false, reason: "invalid timestamp" };
|
|
114
|
+
if (Math.abs(args.now - tsMs) > window)
|
|
115
|
+
return { ok: false, reason: "request timestamp outside freshness window" };
|
|
116
|
+
if (args.nonceCache && !args.nonceCache.check(cred.nonce, args.now)) {
|
|
117
|
+
return { ok: false, reason: "nonce already used (replay)" };
|
|
118
|
+
}
|
|
119
|
+
const publicKey = await args.resolvePublicKey(cred.keyId);
|
|
120
|
+
if (!publicKey)
|
|
121
|
+
return { ok: false, reason: `unknown signing key ${cred.keyId}` };
|
|
122
|
+
const msg = canonicalRequest(args.method, args.path, cred.ts, cred.nonce, args.body);
|
|
123
|
+
if (!verifyMessage(publicKey, msg, cred.sig))
|
|
124
|
+
return { ok: false, reason: "request signature does not verify" };
|
|
125
|
+
return { ok: true, keyId: cred.keyId };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=transportAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transportAuth.js","sourceRoot":"","sources":["../../src/hub/transportAuth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,9 @@ export type { FsckReport } from "./store/objectStore.ts";
|
|
|
8
8
|
export { startHub, HUB_PROTOCOL_VERSION } from "./hub/hubServer.ts";
|
|
9
9
|
export type { HubHandle } from "./hub/hubServer.ts";
|
|
10
10
|
export { pushToHub, pullFromHub, finalizeOnHub } from "./hub/hubClient.ts";
|
|
11
|
+
export type { HubSigner } from "./hub/hubClient.ts";
|
|
12
|
+
export { buildAuthHeader, parseAuthHeader, verifyAuth, canonicalRequest, NonceCache, AUTH_SCHEME, DEFAULT_AUTH_WINDOW_MS } from "./hub/transportAuth.ts";
|
|
13
|
+
export type { AuthCredential, AuthResult, PublicKeyResolver } from "./hub/transportAuth.ts";
|
|
11
14
|
export { Keyring, generateKeypair, signMessage, verifyMessage } from "./core/identity.ts";
|
|
12
15
|
export type { Keypair, KeyRecord, Signature } from "./core/identity.ts";
|
|
13
16
|
export { Logger, consoleLogger, silentLogger } from "./observe/logger.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAOrC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC7H,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKjH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGtF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAOrC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC7H,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKjH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGtF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACzJ,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG5F,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGxE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,9 @@ export { ObjectStore, CorruptObjectError } from "./store/objectStore.js";
|
|
|
23
23
|
// Hub (server + client) — the replication / trust boundary avcshub productionizes
|
|
24
24
|
export { startHub, HUB_PROTOCOL_VERSION } from "./hub/hubServer.js";
|
|
25
25
|
export { pushToHub, pullFromHub, finalizeOnHub } from "./hub/hubClient.js";
|
|
26
|
+
// SSH-style transport auth: embedders (e.g. a hosted hub) inject `resolvePublicKey` into
|
|
27
|
+
// startHub({ auth }); these helpers also let a client build/verify the credential directly.
|
|
28
|
+
export { buildAuthHeader, parseAuthHeader, verifyAuth, canonicalRequest, NonceCache, AUTH_SCHEME, DEFAULT_AUTH_WINDOW_MS } from "./hub/transportAuth.js";
|
|
26
29
|
// Cryptographic actor identity (the app-layer authz backbone)
|
|
27
30
|
export { Keyring, generateKeypair, signMessage, verifyMessage } from "./core/identity.js";
|
|
28
31
|
// Observability seams (avcshub wires these to OTel / a real collector)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,EAAE;AACF,mFAAmF;AACnF,yFAAyF;AACzF,wFAAwF;AACxF,iFAAiF;AAEjF,+BAA+B;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,mFAAmF;AACnF,uFAAuF;AACvF,sFAAsF;AACtF,wFAAwF;AACxF,6EAA6E;AAC7E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE1E,uEAAuE;AACvE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG7H,iFAAiF;AACjF,qFAAqF;AACrF,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGzE,kFAAkF;AAClF,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3E,8DAA8D;AAC9D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG1F,uEAAuE;AACvE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,EAAE;AACF,mFAAmF;AACnF,yFAAyF;AACzF,wFAAwF;AACxF,iFAAiF;AAEjF,+BAA+B;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,mFAAmF;AACnF,uFAAuF;AACvF,sFAAsF;AACtF,wFAAwF;AACxF,6EAA6E;AAC7E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE1E,uEAAuE;AACvE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG7H,iFAAiF;AACjF,qFAAqF;AACrF,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGzE,kFAAkF;AAClF,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3E,yFAAyF;AACzF,4FAA4F;AAC5F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGzJ,8DAA8D;AAC9D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG1F,uEAAuE;AACvE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@izagood/avcs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Agentic Version Control System — an AI-native VCS where intent, session, operation, evidence and decision are first-class objects and code is a materialized projection of an operation graph.",
|
|
6
6
|
"license": "Apache-2.0",
|