@hathbanger/tap-core 1.0.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/README.md +280 -0
- package/dist/agent.d.ts +13 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +32 -0
- package/dist/agent.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/jwks.d.ts +14 -0
- package/dist/jwks.d.ts.map +1 -0
- package/dist/jwks.js +31 -0
- package/dist/jwks.js.map +1 -0
- package/dist/keys.d.ts +12 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +65 -0
- package/dist/keys.js.map +1 -0
- package/dist/nonce.d.ts +10 -0
- package/dist/nonce.d.ts.map +1 -0
- package/dist/nonce.js +26 -0
- package/dist/nonce.js.map +1 -0
- package/dist/payment.d.ts +19 -0
- package/dist/payment.d.ts.map +1 -0
- package/dist/payment.js +89 -0
- package/dist/payment.js.map +1 -0
- package/dist/sign.d.ts +35 -0
- package/dist/sign.d.ts.map +1 -0
- package/dist/sign.js +83 -0
- package/dist/sign.js.map +1 -0
- package/dist/tokens.d.ts +22 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +55 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +54 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +189 -0
- package/dist/verify.js.map +1 -0
- package/package.json +54 -0
package/dist/verify.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { webcrypto } from "node:crypto";
|
|
2
|
+
import { importPublicKey, base64urlDecode } from "./keys.js";
|
|
3
|
+
import { buildSignatureBase } from "./sign.js";
|
|
4
|
+
import { validateTimestamps } from "./nonce.js";
|
|
5
|
+
const subtle = webcrypto.subtle;
|
|
6
|
+
/**
|
|
7
|
+
* Parses a Signature-Input header value into structured params + covered component list.
|
|
8
|
+
* Expected format: sig1=("@method" "@authority" "@path");created=...;expires=...;nonce=...;keyid=...;alg=...;tag=...
|
|
9
|
+
*/
|
|
10
|
+
export function parseSignatureInput(header) {
|
|
11
|
+
const eqIdx = header.indexOf("=");
|
|
12
|
+
const raw = header.slice(eqIdx + 1);
|
|
13
|
+
const listMatch = raw.match(/^\(([^)]*)\)/);
|
|
14
|
+
const components = listMatch?.[1]
|
|
15
|
+
? listMatch[1].trim().split(/\s+/).filter(Boolean).map((s) => s.replace(/^"|"$/g, ""))
|
|
16
|
+
: [];
|
|
17
|
+
const attrsStr = raw.slice(raw.indexOf(";") + 1);
|
|
18
|
+
const attrs = Object.fromEntries(attrsStr.split(";").map((part) => {
|
|
19
|
+
const [k, ...rest] = part.split("=");
|
|
20
|
+
return [k.trim(), rest.join("=").replace(/^"|"$/g, "")];
|
|
21
|
+
}));
|
|
22
|
+
return {
|
|
23
|
+
raw,
|
|
24
|
+
components,
|
|
25
|
+
params: {
|
|
26
|
+
created: Number(attrs["created"]),
|
|
27
|
+
expires: Number(attrs["expires"]),
|
|
28
|
+
nonce: attrs["nonce"] ?? "",
|
|
29
|
+
keyId: attrs["keyid"] ?? "",
|
|
30
|
+
alg: (attrs["alg"] ?? "ed25519"),
|
|
31
|
+
tag: (attrs["tag"] ?? ""),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Extracts the raw base64url signature value from the Signature header.
|
|
37
|
+
* Expected format: sig1=:[base64url]:
|
|
38
|
+
*/
|
|
39
|
+
export function parseSignatureHeader(header) {
|
|
40
|
+
const match = header.match(/sig\d+=:([^:]+):/);
|
|
41
|
+
if (!match?.[1])
|
|
42
|
+
throw new Error("Invalid Signature header format");
|
|
43
|
+
return match[1];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Core TAP agent recognition signature verification (RFC 9421).
|
|
47
|
+
*
|
|
48
|
+
* Pass a map of all available component values from the incoming request
|
|
49
|
+
* (e.g. { '@method': 'POST', '@authority': 'api.example.com', '@path': '/v1/pay' }).
|
|
50
|
+
* The verifier reads the covered component list from the Signature-Input header
|
|
51
|
+
* and reconstructs the signature base using only those components in order.
|
|
52
|
+
*
|
|
53
|
+
* Steps per spec:
|
|
54
|
+
* 1. Parse Signature-Input and extract covered component list
|
|
55
|
+
* 2. Validate timestamps (created < now < expires, gap ≤ 8min)
|
|
56
|
+
* 3. Confirm tag is valid
|
|
57
|
+
* 4. Fetch public key by keyid
|
|
58
|
+
* 5. Reconstruct signature base from parsed component list + provided values
|
|
59
|
+
* 6. Verify Ed25519 signature
|
|
60
|
+
*/
|
|
61
|
+
export async function verifyAgentSignature(componentValues, signatureInputHeader, signatureHeader, fetchPublicKey) {
|
|
62
|
+
let parsed;
|
|
63
|
+
try {
|
|
64
|
+
parsed = parseSignatureInput(signatureInputHeader);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { valid: false, failureReason: "malformed_signature_input" };
|
|
68
|
+
}
|
|
69
|
+
const { params, components } = parsed;
|
|
70
|
+
if (!params.tag || !["agent-browser-auth", "agent-payer-auth", "agent-payee-auth"].includes(params.tag)) {
|
|
71
|
+
return { valid: false, failureReason: "invalid_tag" };
|
|
72
|
+
}
|
|
73
|
+
if (!params.keyId || !params.nonce || !params.created || !params.expires) {
|
|
74
|
+
return { valid: false, failureReason: "missing_required_fields" };
|
|
75
|
+
}
|
|
76
|
+
if (!validateTimestamps(params.created, params.expires)) {
|
|
77
|
+
return { valid: false, failureReason: "invalid_timestamps" };
|
|
78
|
+
}
|
|
79
|
+
const publicJwk = await fetchPublicKey(params.keyId);
|
|
80
|
+
if (!publicJwk) {
|
|
81
|
+
return { valid: false, failureReason: "unknown_key_id", agentKeyId: params.keyId };
|
|
82
|
+
}
|
|
83
|
+
let rawSig;
|
|
84
|
+
try {
|
|
85
|
+
rawSig = parseSignatureHeader(signatureHeader);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { valid: false, failureReason: "malformed_signature" };
|
|
89
|
+
}
|
|
90
|
+
const coveredComponents = [];
|
|
91
|
+
for (const name of components) {
|
|
92
|
+
const value = componentValues[name];
|
|
93
|
+
if (value === undefined) {
|
|
94
|
+
return { valid: false, failureReason: `missing_component_value:${name}`, agentKeyId: params.keyId };
|
|
95
|
+
}
|
|
96
|
+
coveredComponents.push([name, value]);
|
|
97
|
+
}
|
|
98
|
+
const signatureBase = buildSignatureBase(coveredComponents, params);
|
|
99
|
+
const encoded = new TextEncoder().encode(signatureBase);
|
|
100
|
+
const signatureBytes = base64urlDecode(rawSig);
|
|
101
|
+
let publicKey;
|
|
102
|
+
try {
|
|
103
|
+
publicKey = await importPublicKey(publicJwk);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return { valid: false, failureReason: "invalid_public_key" };
|
|
107
|
+
}
|
|
108
|
+
const valid = await subtle.verify("Ed25519", publicKey, signatureBytes, encoded);
|
|
109
|
+
if (!valid) {
|
|
110
|
+
return { valid: false, failureReason: "signature_mismatch", agentKeyId: params.keyId };
|
|
111
|
+
}
|
|
112
|
+
return { valid: true, agentKeyId: params.keyId, tag: params.tag };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Verifies an AgentPayeeObject — the proposed TAP primitive for A2A payments.
|
|
116
|
+
*
|
|
117
|
+
* Steps:
|
|
118
|
+
* 1. Confirm payment request is not expired
|
|
119
|
+
* 2. Fetch the payer's public key by kid
|
|
120
|
+
* 3. Reconstruct canonical payload (sans signature)
|
|
121
|
+
* 4. Verify Ed25519 signature
|
|
122
|
+
*/
|
|
123
|
+
export async function verifyAgentPayeeObject(payment, fetchPublicKey) {
|
|
124
|
+
const now = Math.floor(Date.now() / 1000);
|
|
125
|
+
if (payment.paymentRequest.expiresAt < now) {
|
|
126
|
+
return { valid: false, failureReason: "payment_request_expired" };
|
|
127
|
+
}
|
|
128
|
+
const publicJwk = await fetchPublicKey(payment.kid);
|
|
129
|
+
if (!publicJwk) {
|
|
130
|
+
return { valid: false, failureReason: "unknown_payer_key", payerKeyId: payment.kid };
|
|
131
|
+
}
|
|
132
|
+
let publicKey;
|
|
133
|
+
try {
|
|
134
|
+
publicKey = await importPublicKey(publicJwk);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { valid: false, failureReason: "invalid_public_key" };
|
|
138
|
+
}
|
|
139
|
+
const { signature, ...unsigned } = payment;
|
|
140
|
+
const canonical = JSON.stringify(unsigned, Object.keys(unsigned).sort());
|
|
141
|
+
const encoded = new TextEncoder().encode(canonical);
|
|
142
|
+
const signatureBytes = base64urlDecode(signature);
|
|
143
|
+
const valid = await subtle.verify("Ed25519", publicKey, signatureBytes, encoded);
|
|
144
|
+
if (!valid) {
|
|
145
|
+
return { valid: false, failureReason: "signature_mismatch", payerKeyId: payment.kid };
|
|
146
|
+
}
|
|
147
|
+
return { valid: true, payerKeyId: payment.payerKeyId };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Verifies the Consumer Recognition Object signature.
|
|
151
|
+
* The nonce must match the agent signature nonce.
|
|
152
|
+
*/
|
|
153
|
+
export async function verifyConsumerRecognition(obj, expectedNonce, fetchPublicKey) {
|
|
154
|
+
if (obj.nonce !== expectedNonce) {
|
|
155
|
+
return { valid: false, failureReason: "nonce_mismatch" };
|
|
156
|
+
}
|
|
157
|
+
const publicJwk = await fetchPublicKey(obj.kid);
|
|
158
|
+
if (!publicJwk) {
|
|
159
|
+
return { valid: false, failureReason: "unknown_key_id" };
|
|
160
|
+
}
|
|
161
|
+
const { signature, ...payload } = obj;
|
|
162
|
+
const canonical = JSON.stringify(payload, Object.keys(payload).sort());
|
|
163
|
+
const encoded = new TextEncoder().encode(canonical);
|
|
164
|
+
const signatureBytes = base64urlDecode(signature);
|
|
165
|
+
const publicKey = await importPublicKey(publicJwk);
|
|
166
|
+
const valid = await subtle.verify("Ed25519", publicKey, signatureBytes, encoded);
|
|
167
|
+
return valid ? { valid: true } : { valid: false, failureReason: "signature_mismatch" };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Verifies the Payment Container Object signature.
|
|
171
|
+
* The nonce must match the agent signature nonce if present.
|
|
172
|
+
*/
|
|
173
|
+
export async function verifyPaymentContainer(obj, expectedNonce, fetchPublicKey) {
|
|
174
|
+
if (obj.nonce !== expectedNonce) {
|
|
175
|
+
return { valid: false, failureReason: "nonce_mismatch" };
|
|
176
|
+
}
|
|
177
|
+
const publicJwk = await fetchPublicKey(obj.kid);
|
|
178
|
+
if (!publicJwk) {
|
|
179
|
+
return { valid: false, failureReason: "unknown_key_id" };
|
|
180
|
+
}
|
|
181
|
+
const { signature, ...payload } = obj;
|
|
182
|
+
const canonical = JSON.stringify(payload, Object.keys(payload).sort());
|
|
183
|
+
const encoded = new TextEncoder().encode(canonical);
|
|
184
|
+
const signatureBytes = base64urlDecode(signature);
|
|
185
|
+
const publicKey = await importPublicKey(publicJwk);
|
|
186
|
+
const valid = await subtle.verify("Ed25519", publicKey, signatureBytes, encoded);
|
|
187
|
+
return valid ? { valid: true } : { valid: false, failureReason: "signature_mismatch" };
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hathbanger/tap-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "RFC 9421 HTTP Message Signatures for AI agents — crypto primitives for Visa Trusted Agent Protocol (TAP)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"rfc9421",
|
|
20
|
+
"http-message-signatures",
|
|
21
|
+
"ed25519",
|
|
22
|
+
"tap",
|
|
23
|
+
"trusted-agent-protocol",
|
|
24
|
+
"visa",
|
|
25
|
+
"agent",
|
|
26
|
+
"payment",
|
|
27
|
+
"crypto",
|
|
28
|
+
"jwk",
|
|
29
|
+
"jwks"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/hathbanger/tap-stack.git",
|
|
35
|
+
"directory": "packages/tap-core"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/hathbanger/tap-stack/tree/main/packages/tap-core#readme",
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc -p tsconfig.json",
|
|
43
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
44
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
45
|
+
"test": "node --experimental-vm-modules node_modules/.bin/jest"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^22.0.0",
|
|
49
|
+
"typescript": "^5.5.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"jose": "^5.10.0"
|
|
53
|
+
}
|
|
54
|
+
}
|