attenu-guard 0.1.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/CHANGELOG.md +46 -0
- package/LICENSE +202 -0
- package/README.md +200 -0
- package/SECURITY.md +34 -0
- package/bin/attenu-guard.js +4 -0
- package/dist/cjs/adapters/langgraph.d.ts +174 -0
- package/dist/cjs/adapters/langgraph.d.ts.map +1 -0
- package/dist/cjs/adapters/langgraph.js +242 -0
- package/dist/cjs/adapters/langgraph.js.map +1 -0
- package/dist/cjs/audit.d.ts +82 -0
- package/dist/cjs/audit.d.ts.map +1 -0
- package/dist/cjs/audit.js +195 -0
- package/dist/cjs/audit.js.map +1 -0
- package/dist/cjs/authority.d.ts +114 -0
- package/dist/cjs/authority.d.ts.map +1 -0
- package/dist/cjs/authority.js +238 -0
- package/dist/cjs/authority.js.map +1 -0
- package/dist/cjs/canonical.d.ts +91 -0
- package/dist/cjs/canonical.d.ts.map +1 -0
- package/dist/cjs/canonical.js +372 -0
- package/dist/cjs/canonical.js.map +1 -0
- package/dist/cjs/ceilings.d.ts +211 -0
- package/dist/cjs/ceilings.d.ts.map +1 -0
- package/dist/cjs/ceilings.js +476 -0
- package/dist/cjs/ceilings.js.map +1 -0
- package/dist/cjs/chain.d.ts +106 -0
- package/dist/cjs/chain.d.ts.map +1 -0
- package/dist/cjs/chain.js +0 -0
- package/dist/cjs/chain.js.map +1 -0
- package/dist/cjs/cli.d.ts +16 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +100 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/evidence.d.ts +163 -0
- package/dist/cjs/evidence.d.ts.map +1 -0
- package/dist/cjs/evidence.js +409 -0
- package/dist/cjs/evidence.js.map +1 -0
- package/dist/cjs/guard.d.ts +186 -0
- package/dist/cjs/guard.d.ts.map +1 -0
- package/dist/cjs/guard.js +432 -0
- package/dist/cjs/guard.js.map +1 -0
- package/dist/cjs/index.d.ts +52 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +99 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/reasons.d.ts +93 -0
- package/dist/cjs/reasons.d.ts.map +1 -0
- package/dist/cjs/reasons.js +139 -0
- package/dist/cjs/reasons.js.map +1 -0
- package/dist/cjs/strikes.d.ts +24 -0
- package/dist/cjs/strikes.d.ts.map +1 -0
- package/dist/cjs/strikes.js +30 -0
- package/dist/cjs/strikes.js.map +1 -0
- package/dist/cjs/wire.d.ts +83 -0
- package/dist/cjs/wire.d.ts.map +1 -0
- package/dist/cjs/wire.js +165 -0
- package/dist/cjs/wire.js.map +1 -0
- package/dist/esm/adapters/langgraph.d.ts +174 -0
- package/dist/esm/adapters/langgraph.d.ts.map +1 -0
- package/dist/esm/adapters/langgraph.js +199 -0
- package/dist/esm/adapters/langgraph.js.map +1 -0
- package/dist/esm/audit.d.ts +82 -0
- package/dist/esm/audit.d.ts.map +1 -0
- package/dist/esm/audit.js +189 -0
- package/dist/esm/audit.js.map +1 -0
- package/dist/esm/authority.d.ts +114 -0
- package/dist/esm/authority.d.ts.map +1 -0
- package/dist/esm/authority.js +233 -0
- package/dist/esm/authority.js.map +1 -0
- package/dist/esm/canonical.d.ts +91 -0
- package/dist/esm/canonical.d.ts.map +1 -0
- package/dist/esm/canonical.js +359 -0
- package/dist/esm/canonical.js.map +1 -0
- package/dist/esm/ceilings.d.ts +211 -0
- package/dist/esm/ceilings.d.ts.map +1 -0
- package/dist/esm/ceilings.js +460 -0
- package/dist/esm/ceilings.js.map +1 -0
- package/dist/esm/chain.d.ts +106 -0
- package/dist/esm/chain.d.ts.map +1 -0
- package/dist/esm/chain.js +0 -0
- package/dist/esm/chain.js.map +1 -0
- package/dist/esm/cli.d.ts +16 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +97 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/evidence.d.ts +163 -0
- package/dist/esm/evidence.d.ts.map +1 -0
- package/dist/esm/evidence.js +398 -0
- package/dist/esm/evidence.js.map +1 -0
- package/dist/esm/guard.d.ts +186 -0
- package/dist/esm/guard.d.ts.map +1 -0
- package/dist/esm/guard.js +427 -0
- package/dist/esm/guard.js.map +1 -0
- package/dist/esm/index.d.ts +52 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +42 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/reasons.d.ts +93 -0
- package/dist/esm/reasons.d.ts.map +1 -0
- package/dist/esm/reasons.js +134 -0
- package/dist/esm/reasons.js.map +1 -0
- package/dist/esm/strikes.d.ts +24 -0
- package/dist/esm/strikes.d.ts.map +1 -0
- package/dist/esm/strikes.js +26 -0
- package/dist/esm/strikes.js.map +1 -0
- package/dist/esm/wire.d.ts +83 -0
- package/dist/esm/wire.d.ts.map +1 -0
- package/dist/esm/wire.js +159 -0
- package/dist/esm/wire.js.map +1 -0
- package/package.json +89 -0
package/dist/esm/wire.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wire.ts — the signing and verification backends.
|
|
3
|
+
*
|
|
4
|
+
* Anchors and delegation tokens are signed over canonical JSON bytes. Two
|
|
5
|
+
* backends ship, matching the Python library's `attenu_guard.wire`:
|
|
6
|
+
*
|
|
7
|
+
* `HS256TestSigner` stdlib HMAC-SHA256, for tests, examples and local dev;
|
|
8
|
+
* `Ed25519Signer` the production signer the Internet-Draft requires, with
|
|
9
|
+
* `Ed25519Verifier` for anyone holding only the public half.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is built on Node's own `node:crypto`, so the package keeps
|
|
12
|
+
* zero runtime dependencies. Ed25519 keys are wrapped in the fixed DER prefixes
|
|
13
|
+
* below rather than pulled from a library.
|
|
14
|
+
*/
|
|
15
|
+
import { createHmac, createPrivateKey, createPublicKey, generateKeyPairSync, sign as cryptoSign, timingSafeEqual, verify as cryptoVerify, } from "node:crypto";
|
|
16
|
+
/**
|
|
17
|
+
* stdlib HMAC-SHA256 signer — the default for tests, examples and local dev,
|
|
18
|
+
* because it needs no key management at all.
|
|
19
|
+
*
|
|
20
|
+
* NOT FOR PRODUCTION. HMAC is symmetric: `sign` and `verify` use the identical
|
|
21
|
+
* secret, so anyone able to verify a bundle is also able to forge one. That
|
|
22
|
+
* precludes the property the draft is built around — public offline
|
|
23
|
+
* verification at an untrusted enforcement point — because every verifier would
|
|
24
|
+
* have to hold the minting secret. Use `Ed25519Signer` in production; this
|
|
25
|
+
* class exists so the wire format and the interop fixtures can be exercised
|
|
26
|
+
* with no key distribution.
|
|
27
|
+
*/
|
|
28
|
+
export class HS256TestSigner {
|
|
29
|
+
secret;
|
|
30
|
+
alg = "HS256";
|
|
31
|
+
kid;
|
|
32
|
+
constructor(secret, kid = "test") {
|
|
33
|
+
this.secret = secret;
|
|
34
|
+
this.kid = kid;
|
|
35
|
+
}
|
|
36
|
+
sign(signingInput) {
|
|
37
|
+
return createHmac("sha256", this.secret).update(signingInput).digest();
|
|
38
|
+
}
|
|
39
|
+
verify(signingInput, sig, _keyId) {
|
|
40
|
+
// `keyId` is accepted for parity with multi-key signers but not used for
|
|
41
|
+
// key selection: this signer holds exactly one secret. The comparison is
|
|
42
|
+
// constant-time to avoid a signature-forgery timing oracle.
|
|
43
|
+
const expected = this.sign(signingInput);
|
|
44
|
+
return expected.length === sig.length && timingSafeEqual(expected, sig);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Fixed DER wrappers for raw Ed25519 keys (RFC 8410). A raw 32-byte public key
|
|
48
|
+
// becomes a SubjectPublicKeyInfo by prefixing the first; a raw 32-byte private
|
|
49
|
+
// key becomes a PKCS#8 PrivateKeyInfo by prefixing the second.
|
|
50
|
+
const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
|
|
51
|
+
const ED25519_PKCS8_PREFIX = Buffer.from("302e020100300506032b657004220420", "hex");
|
|
52
|
+
function publicKeyFromRaw(raw) {
|
|
53
|
+
if (raw.length !== 32) {
|
|
54
|
+
throw new Error(`an Ed25519 public key is 32 bytes, got ${raw.length}`);
|
|
55
|
+
}
|
|
56
|
+
return createPublicKey({
|
|
57
|
+
key: Buffer.concat([ED25519_SPKI_PREFIX, raw]),
|
|
58
|
+
format: "der",
|
|
59
|
+
type: "spki",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function privateKeyFromRaw(raw) {
|
|
63
|
+
if (raw.length !== 32) {
|
|
64
|
+
throw new Error(`an Ed25519 private key is 32 bytes, got ${raw.length}`);
|
|
65
|
+
}
|
|
66
|
+
return createPrivateKey({
|
|
67
|
+
key: Buffer.concat([ED25519_PKCS8_PREFIX, raw]),
|
|
68
|
+
format: "der",
|
|
69
|
+
type: "pkcs8",
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function rawPublicBytes(key) {
|
|
73
|
+
const der = key.export({ format: "der", type: "spki" });
|
|
74
|
+
return Buffer.from(der.subarray(der.length - 32));
|
|
75
|
+
}
|
|
76
|
+
function rawPrivateBytes(key) {
|
|
77
|
+
const der = key.export({ format: "der", type: "pkcs8" });
|
|
78
|
+
return Buffer.from(der.subarray(der.length - 32));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The production signer the draft requires ("Implementations MUST support
|
|
82
|
+
* Ed25519"); JOSE alg "EdDSA". Public-key, so — unlike `HS256TestSigner` — a
|
|
83
|
+
* verifier never needs the signing secret, which is exactly what offline
|
|
84
|
+
* verification at an untrusted edge depends on.
|
|
85
|
+
*/
|
|
86
|
+
export class Ed25519Signer {
|
|
87
|
+
alg = "EdDSA";
|
|
88
|
+
kid;
|
|
89
|
+
privateKey;
|
|
90
|
+
publicKey;
|
|
91
|
+
constructor(privateKey, kid = "ed25519-1") {
|
|
92
|
+
if (privateKey === undefined) {
|
|
93
|
+
const pair = generateKeyPairSync("ed25519");
|
|
94
|
+
this.privateKey = pair.privateKey;
|
|
95
|
+
this.publicKey = pair.publicKey;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.privateKey = privateKey;
|
|
99
|
+
this.publicKey = createPublicKey(privateKey);
|
|
100
|
+
}
|
|
101
|
+
this.kid = kid;
|
|
102
|
+
}
|
|
103
|
+
/** A signer wrapping a freshly generated keypair. */
|
|
104
|
+
static generate(kid = "ed25519-1") {
|
|
105
|
+
return new Ed25519Signer(undefined, kid);
|
|
106
|
+
}
|
|
107
|
+
/** Rebuild a signer from the 32 raw bytes `privateBytesRaw` produced. */
|
|
108
|
+
static fromPrivateBytes(raw, kid = "ed25519-1") {
|
|
109
|
+
return new Ed25519Signer(privateKeyFromRaw(raw), kid);
|
|
110
|
+
}
|
|
111
|
+
sign(signingInput) {
|
|
112
|
+
return cryptoSign(null, signingInput, this.privateKey);
|
|
113
|
+
}
|
|
114
|
+
verify(signingInput, sig, _keyId) {
|
|
115
|
+
try {
|
|
116
|
+
return cryptoVerify(null, signingInput, this.publicKey, sig);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** The 32-byte raw public key — a trust anchor to distribute out of band. */
|
|
123
|
+
publicBytesRaw() {
|
|
124
|
+
return rawPublicBytes(this.publicKey);
|
|
125
|
+
}
|
|
126
|
+
/** The 32-byte raw private key — what a key FILE stores, never a repo. */
|
|
127
|
+
privateBytesRaw() {
|
|
128
|
+
return rawPrivateBytes(this.privateKey);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The public-key-only counterpart of `Ed25519Signer` — what a console, an
|
|
133
|
+
* auditor or an ingest server holds. It verifies anchors signed by the matching
|
|
134
|
+
* private key and can never sign: `sign` throws.
|
|
135
|
+
*/
|
|
136
|
+
export class Ed25519Verifier {
|
|
137
|
+
alg = "EdDSA";
|
|
138
|
+
kid;
|
|
139
|
+
publicKey;
|
|
140
|
+
constructor(publicBytesRaw, kid = "ed25519-1") {
|
|
141
|
+
this.publicKey = publicKeyFromRaw(publicBytesRaw);
|
|
142
|
+
this.kid = kid;
|
|
143
|
+
}
|
|
144
|
+
sign(_signingInput) {
|
|
145
|
+
throw new Error("Ed25519Verifier holds no private key and cannot sign");
|
|
146
|
+
}
|
|
147
|
+
verify(signingInput, sig, _keyId) {
|
|
148
|
+
try {
|
|
149
|
+
return cryptoVerify(null, signingInput, this.publicKey, sig);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
publicBytesRaw() {
|
|
156
|
+
return rawPublicBytes(this.publicKey);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/wire.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "attenu-guard",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Attenu Guard for TypeScript: enforces per-agent permissions on every tool call and sub-agent handoff — a sub-agent never holds more than its parent — and writes a hash-chained audit log you verify offline. Same bundle format as the Python library.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Attenu",
|
|
7
|
+
"homepage": "https://attenu.io",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/attenu-io/attenu-guard-ts.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/attenu-io/attenu-guard-ts/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"ai",
|
|
17
|
+
"agents",
|
|
18
|
+
"security",
|
|
19
|
+
"authorization",
|
|
20
|
+
"least-privilege",
|
|
21
|
+
"delegation",
|
|
22
|
+
"sub-agents",
|
|
23
|
+
"audit-log",
|
|
24
|
+
"mcp",
|
|
25
|
+
"a2a",
|
|
26
|
+
"owasp",
|
|
27
|
+
"langgraph",
|
|
28
|
+
"langchain",
|
|
29
|
+
"langgraphjs",
|
|
30
|
+
"typescript"
|
|
31
|
+
],
|
|
32
|
+
"type": "commonjs",
|
|
33
|
+
"main": "./dist/cjs/index.js",
|
|
34
|
+
"module": "./dist/esm/index.js",
|
|
35
|
+
"types": "./dist/cjs/index.d.ts",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/esm/index.d.ts",
|
|
40
|
+
"default": "./dist/esm/index.js"
|
|
41
|
+
},
|
|
42
|
+
"require": {
|
|
43
|
+
"types": "./dist/cjs/index.d.ts",
|
|
44
|
+
"default": "./dist/cjs/index.js"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"./adapters/langgraph": {
|
|
48
|
+
"import": {
|
|
49
|
+
"types": "./dist/esm/adapters/langgraph.d.ts",
|
|
50
|
+
"default": "./dist/esm/adapters/langgraph.js"
|
|
51
|
+
},
|
|
52
|
+
"require": {
|
|
53
|
+
"types": "./dist/cjs/adapters/langgraph.d.ts",
|
|
54
|
+
"default": "./dist/cjs/adapters/langgraph.js"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"./package.json": "./package.json"
|
|
58
|
+
},
|
|
59
|
+
"bin": {
|
|
60
|
+
"attenu-guard": "bin/attenu-guard.js"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist",
|
|
64
|
+
"bin",
|
|
65
|
+
"README.md",
|
|
66
|
+
"LICENSE",
|
|
67
|
+
"CHANGELOG.md",
|
|
68
|
+
"SECURITY.md"
|
|
69
|
+
],
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=20"
|
|
72
|
+
},
|
|
73
|
+
"sideEffects": false,
|
|
74
|
+
"scripts": {
|
|
75
|
+
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true});require('node:fs').rmSync('build',{recursive:true,force:true})\"",
|
|
76
|
+
"build": "npm run clean && tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json && node scripts/write-module-markers.js",
|
|
77
|
+
"build:tests": "tsc -p tsconfig.test.json",
|
|
78
|
+
"pretest": "npm run build && npm run build:tests",
|
|
79
|
+
"test": "node --test build/test/*.test.js",
|
|
80
|
+
"fixtures": "python3 tools/gen_fixtures.py"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@langchain/core": "^1.2.9",
|
|
84
|
+
"@langchain/langgraph": "^1.4.13",
|
|
85
|
+
"@types/node": "^22.20.1",
|
|
86
|
+
"typescript": "^5.9.3",
|
|
87
|
+
"zod": "^4.4.3"
|
|
88
|
+
}
|
|
89
|
+
}
|