@agenticprimitives/key-custody 0.1.0-alpha.3 → 1.0.0-alpha.11
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 +22 -5
- package/bin/ap-provision-gcp.mjs +91 -0
- package/dist/account.d.ts +1 -1
- package/dist/account.d.ts.map +1 -1
- package/dist/account.js +1 -1
- package/dist/account.js.map +1 -1
- package/dist/derive-subject.d.ts +1 -1
- package/dist/derive-subject.d.ts.map +1 -1
- package/dist/derive-subject.js +5 -5
- package/dist/derive-subject.js.map +1 -1
- package/dist/factories.d.ts +27 -1
- package/dist/factories.d.ts.map +1 -1
- package/dist/factories.js +29 -5
- package/dist/factories.js.map +1 -1
- package/dist/index.d.ts +12 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -9
- package/dist/index.js.map +1 -1
- package/dist/kms/gcp-transport.d.ts +36 -0
- package/dist/kms/gcp-transport.d.ts.map +1 -0
- package/dist/kms/gcp-transport.js +114 -0
- package/dist/kms/gcp-transport.js.map +1 -0
- package/dist/kms/key-map.d.ts +13 -0
- package/dist/kms/key-map.d.ts.map +1 -0
- package/dist/kms/key-map.js +65 -0
- package/dist/kms/key-map.js.map +1 -0
- package/dist/kms/kms-core.d.ts +4 -0
- package/dist/kms/kms-core.d.ts.map +1 -0
- package/dist/kms/kms-core.js +14 -0
- package/dist/kms/kms-core.js.map +1 -0
- package/dist/kms/provision-gcp.d.ts +89 -0
- package/dist/kms/provision-gcp.d.ts.map +1 -0
- package/dist/kms/provision-gcp.js +229 -0
- package/dist/kms/provision-gcp.js.map +1 -0
- package/dist/kms/secp256k1-core.d.ts +46 -0
- package/dist/kms/secp256k1-core.d.ts.map +1 -0
- package/dist/kms/secp256k1-core.js +209 -0
- package/dist/kms/secp256k1-core.js.map +1 -0
- package/dist/kms-viem-account.d.ts +1 -1
- package/dist/kms-viem-account.d.ts.map +1 -1
- package/dist/providers/aws.d.ts +4 -1
- package/dist/providers/aws.d.ts.map +1 -1
- package/dist/providers/aws.js +17 -7
- package/dist/providers/aws.js.map +1 -1
- package/dist/providers/gcp.d.ts +23 -36
- package/dist/providers/gcp.d.ts.map +1 -1
- package/dist/providers/gcp.js +89 -340
- package/dist/providers/gcp.js.map +1 -1
- package/dist/providers/local.d.ts +4 -4
- package/dist/providers/local.d.ts.map +1 -1
- package/dist/providers/local.js +17 -7
- package/dist/providers/local.js.map +1 -1
- package/dist/relay-only.d.ts +1 -1
- package/dist/relay-only.d.ts.map +1 -1
- package/dist/relay-only.js +1 -1
- package/dist/relay-only.js.map +1 -1
- package/dist/relayer-account.d.ts +44 -0
- package/dist/relayer-account.d.ts.map +1 -0
- package/dist/relayer-account.js +146 -0
- package/dist/relayer-account.js.map +1 -0
- package/dist/spend-capped-account.d.ts +71 -0
- package/dist/spend-capped-account.d.ts.map +1 -0
- package/dist/spend-capped-account.js +181 -0
- package/dist/spend-capped-account.js.map +1 -0
- package/package.json +40 -9
package/dist/providers/gcp.js
CHANGED
|
@@ -1,270 +1,40 @@
|
|
|
1
|
-
// GcpKmsSigner — production GCP Cloud KMS
|
|
1
|
+
// GcpKmsSigner / GcpKmsProvider — production GCP Cloud KMS backends.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// The signing CRYPTO + REST transport now live in the consumer-safe, peer-
|
|
4
|
+
// dependency-free core (`../kms/secp256k1-core`, `../kms/gcp-transport`,
|
|
5
|
+
// barrel `../kms/kms-core`) so external apps can import the primitive instead
|
|
6
|
+
// of inlining it (spec 276). THIS file is the thin, audited, viem-typed
|
|
7
|
+
// wrapper: it adds the `KmsAccountBackend` shape, viem `Address` typing, and
|
|
8
|
+
// the optional audit sink (`key-custody.sign`). One implementation, two
|
|
9
|
+
// surfaces — no second KMS path.
|
|
6
10
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// 2. normalize s to low-s form (EIP-2)
|
|
17
|
-
// 3. search recovery byte by trying v∈{27,28} against the known pubkey
|
|
18
|
-
// (Cloud KMS doesn't return the recovery bit)
|
|
19
|
-
//
|
|
20
|
-
// Public key: GET cryptoKeyVersions/N/publicKey returns PEM SPKI. We parse
|
|
21
|
-
// the trailing 65-byte uncompressed point (0x04||X||Y), compute
|
|
22
|
-
// keccak256(X||Y), take last 20 bytes → Ethereum address. Cached forever.
|
|
23
|
-
//
|
|
24
|
-
// GcpKmsProvider (envelope encryption via GCP KMS Encrypt/Decrypt) remains a
|
|
25
|
-
// stub — that's a separate v0.2 follow-up. The signer covers the production
|
|
26
|
-
// path for the agent's master-key requirement.
|
|
27
|
-
import { secp256k1 } from '@noble/curves/secp256k1';
|
|
28
|
-
import { keccak_256 } from '@noble/hashes/sha3';
|
|
29
|
-
import { bytesToHex } from 'viem';
|
|
11
|
+
// GcpKmsProvider (envelope encryption via GCP KMS Encrypt/Decrypt) is
|
|
12
|
+
// IMPLEMENTED: it wraps/unwraps a per-row 32-byte data key with Cloud KMS
|
|
13
|
+
// :encrypt/:decrypt under the AAD-bound EncryptionContext, and (spec 278 P0)
|
|
14
|
+
// emits a `key-custody.envelope.{wrap,unwrap}` audit row per op (refs/hashes
|
|
15
|
+
// only). It uses a DIFFERENT symmetric KMS key from the signer (master-key
|
|
16
|
+
// separation). Residual per-person-KEK selection + person-SA AAD binding is
|
|
17
|
+
// spec 278 (per-person vault key binding), not a crypto gap.
|
|
18
|
+
import { keccak_256 } from '@noble/hashes/sha3.js';
|
|
19
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
30
20
|
import { buildEvent } from '@agenticprimitives/audit';
|
|
31
|
-
import { canonicalContextBytes } from '../aad';
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const SECP256K1_HALF_N = SECP256K1_N >> 1n;
|
|
21
|
+
import { canonicalContextBytes } from '../aad.js';
|
|
22
|
+
import { bytesToHex, base64Decode, base64Encode, pemToDer, bigIntTo32Bytes, parseDerEcdsa, normalizeLowS, parseSpkiUncompressedSecp256k1PubKey, publicKeyToAddress, findRecoveryByte, } from '../kms/secp256k1-core.js';
|
|
23
|
+
import { fetchAccessToken, callKms, createGcpKmsTransport, } from '../kms/gcp-transport.js';
|
|
24
|
+
import { parseServiceAccountJson } from '../kms/key-map.js';
|
|
25
|
+
// Re-export the consumer-safe helpers under their established names so existing
|
|
26
|
+
// importers (unit tests + any downstream) keep resolving them from this module.
|
|
27
|
+
// New code should prefer the `@agenticprimitives/key-custody/kms-core` subpath.
|
|
28
|
+
export { base64UrlEncode, pemToDer, parseDerEcdsa, normalizeLowS, bigIntTo32Bytes, parseSpkiUncompressedSecp256k1PubKey, publicKeyToAddress, findRecoveryByte, } from '../kms/secp256k1-core.js';
|
|
29
|
+
export { signJwt, fetchAccessToken } from '../kms/gcp-transport.js';
|
|
41
30
|
// ─────────────────────────────────────────────────────────────────────
|
|
42
|
-
//
|
|
43
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
44
|
-
export function base64UrlEncode(bytes) {
|
|
45
|
-
let str = '';
|
|
46
|
-
for (let i = 0; i < bytes.length; i++)
|
|
47
|
-
str += String.fromCharCode(bytes[i]);
|
|
48
|
-
return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
49
|
-
}
|
|
50
|
-
function base64Decode(s) {
|
|
51
|
-
const binary = atob(s);
|
|
52
|
-
const out = new Uint8Array(binary.length);
|
|
53
|
-
for (let i = 0; i < binary.length; i++)
|
|
54
|
-
out[i] = binary.charCodeAt(i);
|
|
55
|
-
return out;
|
|
56
|
-
}
|
|
57
|
-
function base64Encode(bytes) {
|
|
58
|
-
let str = '';
|
|
59
|
-
for (let i = 0; i < bytes.length; i++)
|
|
60
|
-
str += String.fromCharCode(bytes[i]);
|
|
61
|
-
return btoa(str);
|
|
62
|
-
}
|
|
63
|
-
export function pemToDer(pem) {
|
|
64
|
-
const lines = pem
|
|
65
|
-
.split('\n')
|
|
66
|
-
.filter((l) => !l.startsWith('-----') && l.trim().length > 0)
|
|
67
|
-
.join('');
|
|
68
|
-
return base64Decode(lines);
|
|
69
|
-
}
|
|
70
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
71
|
-
// JWT signing + token exchange
|
|
72
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
73
|
-
export async function signJwt(serviceAccount, scope) {
|
|
74
|
-
const now = Math.floor(Date.now() / 1000);
|
|
75
|
-
const header = { alg: 'RS256', typ: 'JWT' };
|
|
76
|
-
const payload = {
|
|
77
|
-
iss: serviceAccount.client_email,
|
|
78
|
-
scope,
|
|
79
|
-
aud: GOOGLE_TOKEN_URL,
|
|
80
|
-
iat: now,
|
|
81
|
-
exp: now + 3600,
|
|
82
|
-
};
|
|
83
|
-
const encoder = new TextEncoder();
|
|
84
|
-
const headerB64 = base64UrlEncode(encoder.encode(JSON.stringify(header)));
|
|
85
|
-
const payloadB64 = base64UrlEncode(encoder.encode(JSON.stringify(payload)));
|
|
86
|
-
const signingInput = `${headerB64}.${payloadB64}`;
|
|
87
|
-
const keyDer = pemToDer(serviceAccount.private_key);
|
|
88
|
-
// Copy into a fresh ArrayBuffer so the typing satisfies BufferSource
|
|
89
|
-
// (TS lib.dom narrowed Uint8Array.buffer to ArrayBufferLike in 5.7).
|
|
90
|
-
const keyBuffer = new ArrayBuffer(keyDer.byteLength);
|
|
91
|
-
new Uint8Array(keyBuffer).set(keyDer);
|
|
92
|
-
const key = await globalThis.crypto.subtle.importKey('pkcs8', keyBuffer, { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, false, ['sign']);
|
|
93
|
-
const signature = await globalThis.crypto.subtle.sign({ name: 'RSASSA-PKCS1-v1_5' }, key, encoder.encode(signingInput));
|
|
94
|
-
return `${signingInput}.${base64UrlEncode(new Uint8Array(signature))}`;
|
|
95
|
-
}
|
|
96
|
-
export async function fetchAccessToken(serviceAccount) {
|
|
97
|
-
const assertion = await signJwt(serviceAccount, CLOUDKMS_SCOPE);
|
|
98
|
-
const body = `grant_type=${encodeURIComponent('urn:ietf:params:oauth:grant-type:jwt-bearer')}&assertion=${encodeURIComponent(assertion)}`;
|
|
99
|
-
const res = await fetch(GOOGLE_TOKEN_URL, {
|
|
100
|
-
method: 'POST',
|
|
101
|
-
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
102
|
-
body,
|
|
103
|
-
});
|
|
104
|
-
if (!res.ok) {
|
|
105
|
-
const text = await res.text();
|
|
106
|
-
throw new Error(`GCP token exchange failed: HTTP ${res.status}: ${text.slice(0, 300)}`);
|
|
107
|
-
}
|
|
108
|
-
const json = (await res.json());
|
|
109
|
-
if (!json.access_token || typeof json.expires_in !== 'number') {
|
|
110
|
-
throw new Error('GCP token exchange: response missing access_token or expires_in');
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
accessToken: json.access_token,
|
|
114
|
-
expiresAt: Math.floor(Date.now() / 1000) + json.expires_in - TOKEN_EXPIRY_BUFFER_SECONDS,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
118
|
-
// Cloud KMS REST calls
|
|
119
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
120
|
-
async function callKms(token, pathRelativeToBase, options = { method: 'GET' }) {
|
|
121
|
-
const url = `${CLOUDKMS_BASE}${pathRelativeToBase}`;
|
|
122
|
-
const init = {
|
|
123
|
-
method: options.method,
|
|
124
|
-
headers: {
|
|
125
|
-
authorization: `Bearer ${token}`,
|
|
126
|
-
...(options.body ? { 'content-type': 'application/json' } : {}),
|
|
127
|
-
},
|
|
128
|
-
};
|
|
129
|
-
if (options.body)
|
|
130
|
-
init.body = JSON.stringify(options.body);
|
|
131
|
-
const res = await fetch(url, init);
|
|
132
|
-
if (!res.ok) {
|
|
133
|
-
const text = await res.text();
|
|
134
|
-
// Don't leak the Authorization header. URL path is safe to include.
|
|
135
|
-
throw new Error(`Cloud KMS API error: HTTP ${res.status} on ${pathRelativeToBase}: ${text.slice(0, 300)}`);
|
|
136
|
-
}
|
|
137
|
-
return (await res.json());
|
|
138
|
-
}
|
|
139
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
140
|
-
// SPKI public-key parsing (uncompressed secp256k1 point extraction)
|
|
141
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
142
|
-
export function parseSpkiUncompressedSecp256k1PubKey(spkiDer) {
|
|
143
|
-
// The SPKI structure ends with a BIT STRING containing the public key.
|
|
144
|
-
// For secp256k1, the public key is 65 bytes: 0x04 || X(32) || Y(32).
|
|
145
|
-
// The BIT STRING wrapping adds a single zero "unused bits" byte before
|
|
146
|
-
// the 0x04 marker. So the last 66 bytes of the DER should be:
|
|
147
|
-
// [0x00 (unused bits)] [0x04 (uncompressed marker)] [X 32 bytes] [Y 32 bytes]
|
|
148
|
-
if (spkiDer.length < 66) {
|
|
149
|
-
throw new Error(`SPKI too short to contain uncompressed secp256k1 pubkey: ${spkiDer.length} bytes`);
|
|
150
|
-
}
|
|
151
|
-
const tail = spkiDer.slice(spkiDer.length - 65);
|
|
152
|
-
const marker = tail[0];
|
|
153
|
-
if (marker !== 0x04) {
|
|
154
|
-
throw new Error(`SPKI does not end with uncompressed point marker (0x04). Wrong key algorithm? ` +
|
|
155
|
-
`Found 0x${(marker ?? 0).toString(16).padStart(2, '0')} at position ${spkiDer.length - 65}.`);
|
|
156
|
-
}
|
|
157
|
-
return tail;
|
|
158
|
-
}
|
|
159
|
-
export function publicKeyToAddress(pubKey65) {
|
|
160
|
-
// pubKey65: 0x04 || X(32) || Y(32). Strip prefix; keccak256 over X||Y; last 20 bytes.
|
|
161
|
-
const raw = pubKey65.slice(1);
|
|
162
|
-
const hash = keccak_256(raw);
|
|
163
|
-
return bytesToHex(hash.slice(12));
|
|
164
|
-
}
|
|
165
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
166
|
-
// DER signature parsing + low-s + recovery byte search
|
|
167
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
168
|
-
export function parseDerEcdsa(der) {
|
|
169
|
-
const at = (idx) => {
|
|
170
|
-
const b = der[idx];
|
|
171
|
-
if (b === undefined)
|
|
172
|
-
throw new Error(`DER: unexpected end of buffer at offset ${idx}`);
|
|
173
|
-
return b;
|
|
174
|
-
};
|
|
175
|
-
let i = 0;
|
|
176
|
-
if (at(i++) !== 0x30)
|
|
177
|
-
throw new Error('DER: expected SEQUENCE tag (0x30)');
|
|
178
|
-
// Skip length. Handle short and long form.
|
|
179
|
-
const lenByte = at(i++);
|
|
180
|
-
if (lenByte & 0x80) {
|
|
181
|
-
const lenBytes = lenByte & 0x7f;
|
|
182
|
-
i += lenBytes;
|
|
183
|
-
}
|
|
184
|
-
if (at(i++) !== 0x02)
|
|
185
|
-
throw new Error('DER: expected INTEGER tag for r');
|
|
186
|
-
const rLen = at(i++);
|
|
187
|
-
const rBytes = der.slice(i, i + rLen);
|
|
188
|
-
i += rLen;
|
|
189
|
-
if (at(i++) !== 0x02)
|
|
190
|
-
throw new Error('DER: expected INTEGER tag for s');
|
|
191
|
-
const sLen = at(i++);
|
|
192
|
-
const sBytes = der.slice(i, i + sLen);
|
|
193
|
-
const r = bytesToBigInt(rBytes);
|
|
194
|
-
const s = bytesToBigInt(sBytes);
|
|
195
|
-
// Range-validate (audit F-7): a malformed/compromised KMS response with
|
|
196
|
-
// r/s = 0 or ≥ n is never a valid ECDSA signature — fail closed here
|
|
197
|
-
// rather than letting a degenerate value flow into recovery.
|
|
198
|
-
if (r <= 0n || r >= SECP256K1_N || s <= 0n || s >= SECP256K1_N) {
|
|
199
|
-
throw new Error('DER: r/s out of range (require 0 < r,s < n)');
|
|
200
|
-
}
|
|
201
|
-
return { r, s };
|
|
202
|
-
}
|
|
203
|
-
function bytesToBigInt(bytes) {
|
|
204
|
-
let n = 0n;
|
|
205
|
-
for (const b of bytes)
|
|
206
|
-
n = (n << 8n) | BigInt(b);
|
|
207
|
-
return n;
|
|
208
|
-
}
|
|
209
|
-
export function bigIntTo32Bytes(n) {
|
|
210
|
-
const out = new Uint8Array(32);
|
|
211
|
-
let v = n;
|
|
212
|
-
for (let i = 31; i >= 0; i--) {
|
|
213
|
-
out[i] = Number(v & 0xffn);
|
|
214
|
-
v >>= 8n;
|
|
215
|
-
}
|
|
216
|
-
return out;
|
|
217
|
-
}
|
|
218
|
-
export function normalizeLowS(s) {
|
|
219
|
-
return s > SECP256K1_HALF_N ? SECP256K1_N - s : s;
|
|
220
|
-
}
|
|
221
|
-
function bytesEqual(a, b) {
|
|
222
|
-
if (a.length !== b.length)
|
|
223
|
-
return false;
|
|
224
|
-
for (let i = 0; i < a.length; i++)
|
|
225
|
-
if (a[i] !== b[i])
|
|
226
|
-
return false;
|
|
227
|
-
return true;
|
|
228
|
-
}
|
|
229
|
-
export function findRecoveryByte(r, s, digest, knownPubKey65) {
|
|
230
|
-
const rBytes = bigIntTo32Bytes(r);
|
|
231
|
-
const sBytes = bigIntTo32Bytes(s);
|
|
232
|
-
const compact = new Uint8Array(64);
|
|
233
|
-
compact.set(rBytes, 0);
|
|
234
|
-
compact.set(sBytes, 32);
|
|
235
|
-
const attempts = [];
|
|
236
|
-
for (let recovery = 0; recovery < 2; recovery++) {
|
|
237
|
-
try {
|
|
238
|
-
const sig = secp256k1.Signature.fromCompact(compact).addRecoveryBit(recovery);
|
|
239
|
-
const recovered = sig.recoverPublicKey(digest).toRawBytes(false);
|
|
240
|
-
attempts.push(`v=${recovery + 27} recovered=${bytesToHex(recovered)}`);
|
|
241
|
-
if (bytesEqual(recovered, knownPubKey65))
|
|
242
|
-
return recovery + 27;
|
|
243
|
-
}
|
|
244
|
-
catch (e) {
|
|
245
|
-
attempts.push(`v=${recovery + 27} threw ${e instanceof Error ? e.message : String(e)}`);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
// eslint-disable-next-line no-console
|
|
249
|
-
console.error('[gcp-kms findRecoveryByte] mismatch:', {
|
|
250
|
-
digest: bytesToHex(digest),
|
|
251
|
-
r: bytesToHex(rBytes),
|
|
252
|
-
s: bytesToHex(sBytes),
|
|
253
|
-
knownPubKey: bytesToHex(knownPubKey65),
|
|
254
|
-
attempts,
|
|
255
|
-
});
|
|
256
|
-
throw new Error('Recovery byte search failed: neither v=27 nor v=28 recovers the known public key. ' +
|
|
257
|
-
attempts.join(' | '));
|
|
258
|
-
}
|
|
259
|
-
// ─────────────────────────────────────────────────────────────────────
|
|
260
|
-
// GcpKmsSigner — the public class
|
|
31
|
+
// GcpKmsSigner — the public class (thin wrapper over the kms-core)
|
|
261
32
|
// ─────────────────────────────────────────────────────────────────────
|
|
262
33
|
export class GcpKmsSigner {
|
|
263
34
|
provider = 'gcp-kms';
|
|
264
35
|
keyName;
|
|
265
|
-
|
|
36
|
+
transport;
|
|
266
37
|
auditSink;
|
|
267
|
-
cachedToken;
|
|
268
38
|
cachedPubKey65;
|
|
269
39
|
cachedAddress;
|
|
270
40
|
constructor(opts) {
|
|
@@ -277,47 +47,28 @@ export class GcpKmsSigner {
|
|
|
277
47
|
if (!jsonStr) {
|
|
278
48
|
throw new Error('GcpKmsSigner: GCP_SERVICE_ACCOUNT_JSON (service-account JSON string) is required.');
|
|
279
49
|
}
|
|
50
|
+
// Backlog B4: accept the SAME formats parseServiceAccountJson does (single-line JSON OR
|
|
51
|
+
// base64-encoded JSON) so one secret value satisfies both the kms-core validator and this
|
|
52
|
+
// backend — base64 dodges the literal-newline paste hazard (B5).
|
|
280
53
|
let parsed;
|
|
281
54
|
try {
|
|
282
|
-
parsed =
|
|
55
|
+
parsed = parseServiceAccountJson(jsonStr);
|
|
283
56
|
}
|
|
284
|
-
catch {
|
|
285
|
-
throw new Error(
|
|
57
|
+
catch (e) {
|
|
58
|
+
throw new Error(`GcpKmsSigner: GCP_SERVICE_ACCOUNT_JSON invalid — ${e instanceof Error ? e.message : String(e)}`);
|
|
286
59
|
}
|
|
287
60
|
if (!parsed.client_email || !parsed.private_key) {
|
|
288
61
|
throw new Error('GcpKmsSigner: service-account JSON missing client_email or private_key.');
|
|
289
62
|
}
|
|
290
63
|
this.keyName = keyName;
|
|
291
|
-
this.
|
|
292
|
-
}
|
|
293
|
-
async getAccessToken() {
|
|
294
|
-
const now = Math.floor(Date.now() / 1000);
|
|
295
|
-
if (this.cachedToken && this.cachedToken.expiresAt > now) {
|
|
296
|
-
return this.cachedToken.accessToken;
|
|
297
|
-
}
|
|
298
|
-
this.cachedToken = await fetchAccessToken(this.serviceAccount);
|
|
299
|
-
return this.cachedToken.accessToken;
|
|
64
|
+
this.transport = createGcpKmsTransport(parsed);
|
|
300
65
|
}
|
|
301
66
|
async getPublicKeyBytes() {
|
|
302
67
|
if (this.cachedPubKey65)
|
|
303
68
|
return this.cachedPubKey65;
|
|
304
|
-
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
// recover to an Ethereum-compatible pubkey. Catch the mistake at first
|
|
308
|
-
// pubkey fetch instead of producing nonsense signatures later.
|
|
309
|
-
if (res.algorithm !== 'EC_SIGN_SECP256K1_SHA256') {
|
|
310
|
-
throw new Error(`GcpKmsSigner: key ${this.keyName} has algorithm "${res.algorithm}", but ` +
|
|
311
|
-
`EC_SIGN_SECP256K1_SHA256 is required for Ethereum-compatible signing. ` +
|
|
312
|
-
`Recreate with: gcloud kms keys create <NAME> --purpose=asymmetric-signing ` +
|
|
313
|
-
`--default-algorithm=ec-sign-secp256k1-sha256 --protection-level=hsm. ` +
|
|
314
|
-
`Note: secp256k1 in GCP requires --protection-level=hsm; Software is not ` +
|
|
315
|
-
`supported. The Console dropdown greys out secp256k1 when Software is ` +
|
|
316
|
-
`selected. GCP doesn't allow changing the algorithm or protection level ` +
|
|
317
|
-
`of an existing key.`);
|
|
318
|
-
}
|
|
319
|
-
const spkiDer = pemToDer(res.pem);
|
|
320
|
-
this.cachedPubKey65 = parseSpkiUncompressedSecp256k1PubKey(spkiDer);
|
|
69
|
+
// The transport asserts the EC_SIGN_SECP256K1_SHA256 algorithm at fetch time.
|
|
70
|
+
const pem = await this.transport.getPublicKeyPem(this.keyName);
|
|
71
|
+
this.cachedPubKey65 = parseSpkiUncompressedSecp256k1PubKey(pemToDer(pem));
|
|
321
72
|
return this.cachedPubKey65;
|
|
322
73
|
}
|
|
323
74
|
async getSignerAddress() {
|
|
@@ -331,13 +82,9 @@ export class GcpKmsSigner {
|
|
|
331
82
|
if (input.digest.length !== 32) {
|
|
332
83
|
throw new Error(`GcpKmsSigner.signA2AAction expects a 32-byte digest; got ${input.digest.length}.`);
|
|
333
84
|
}
|
|
334
|
-
const
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
body: { digest: { sha256: base64Encode(input.digest) } },
|
|
338
|
-
});
|
|
339
|
-
const derBytes = base64Decode(res.signature);
|
|
340
|
-
const parsed = parseDerEcdsa(derBytes);
|
|
85
|
+
const pubKey = await this.getPublicKeyBytes();
|
|
86
|
+
const der = await this.transport.asymmetricSign(this.keyName, input.digest);
|
|
87
|
+
const parsed = parseDerEcdsa(der);
|
|
341
88
|
const s = normalizeLowS(parsed.s);
|
|
342
89
|
const v = findRecoveryByte(parsed.r, s, input.digest, pubKey);
|
|
343
90
|
const sig65 = new Uint8Array(65);
|
|
@@ -345,8 +92,7 @@ export class GcpKmsSigner {
|
|
|
345
92
|
sig65.set(bigIntTo32Bytes(s), 32);
|
|
346
93
|
sig65[64] = v;
|
|
347
94
|
const signerAddress = await this.getSignerAddress();
|
|
348
|
-
// Audit emit. Per key-custody CLAUDE.md invariant:
|
|
349
|
-
// raw sessionId MUST NEVER be logged — hash it.
|
|
95
|
+
// Audit emit. Per key-custody CLAUDE.md invariant: raw sessionId MUST NEVER be logged — hash it.
|
|
350
96
|
if (this.auditSink) {
|
|
351
97
|
const ctx = input.auditContext ?? {};
|
|
352
98
|
try {
|
|
@@ -370,28 +116,14 @@ export class GcpKmsSigner {
|
|
|
370
116
|
/* fail-soft */
|
|
371
117
|
}
|
|
372
118
|
}
|
|
373
|
-
return {
|
|
374
|
-
signature: sig65,
|
|
375
|
-
keyId: this.keyName,
|
|
376
|
-
signerAddress,
|
|
377
|
-
};
|
|
119
|
+
return { signature: sig65, keyId: this.keyName, signerAddress };
|
|
378
120
|
}
|
|
379
121
|
}
|
|
380
122
|
/**
|
|
381
|
-
* H7-F.4 / PKG-KEY-CUSTODY-008
|
|
382
|
-
*
|
|
383
|
-
*
|
|
384
|
-
*
|
|
385
|
-
* The version suffix is what GCP uses to identify the actual key version
|
|
386
|
-
* that encrypted the ciphertext.
|
|
387
|
-
*
|
|
388
|
-
* Previously this class returned `'gcp-kms:v1'` regardless of the actual
|
|
389
|
-
* rotation state — so on a GCP key rotation (under the same cryptoKey
|
|
390
|
-
* NAME, different VERSION), any encrypted payload was still tagged with
|
|
391
|
-
* the meaningless `'gcp-kms:v1'` marker. The `decryptSessionDataKey`
|
|
392
|
-
* equality check then incorrectly accepted ciphertext from BOTH the old
|
|
393
|
-
* and the new key version as if they were the same, with no audit trail
|
|
394
|
-
* of which version produced which.
|
|
123
|
+
* H7-F.4 / PKG-KEY-CUSTODY-008 — derive `keyVersion` from the GCP encrypt
|
|
124
|
+
* response (`name` = the full versioned resource path) instead of a hardcoded
|
|
125
|
+
* string, so a GCP key rotation is reflected in the marker rather than being
|
|
126
|
+
* silently conflated with the old version.
|
|
395
127
|
*/
|
|
396
128
|
function parseCryptoKeyVersion(responseName) {
|
|
397
129
|
if (!responseName)
|
|
@@ -400,14 +132,11 @@ function parseCryptoKeyVersion(responseName) {
|
|
|
400
132
|
return m ? `gcp-kms:v${m[1]}` : null;
|
|
401
133
|
}
|
|
402
134
|
export class GcpKmsProvider {
|
|
403
|
-
/**
|
|
404
|
-
* H7-F.4: this default is now ONLY used when the GCP encrypt response
|
|
405
|
-
* doesn't carry a `name` field (test fixtures + offline mocks). Real
|
|
406
|
-
* runs derive `keyVersion` from the response per call.
|
|
407
|
-
*/
|
|
135
|
+
/** Only used when the GCP encrypt response doesn't carry a `name` (test fixtures). */
|
|
408
136
|
keyVersion = 'gcp-kms:unknown';
|
|
409
137
|
keyName;
|
|
410
138
|
serviceAccount;
|
|
139
|
+
auditSink;
|
|
411
140
|
cachedToken;
|
|
412
141
|
constructor(opts) {
|
|
413
142
|
const keyName = opts?.cryptoKeyName ?? process.env.GCP_KMS_ENCRYPT_KEY_NAME;
|
|
@@ -418,18 +147,47 @@ export class GcpKmsProvider {
|
|
|
418
147
|
if (!jsonStr) {
|
|
419
148
|
throw new Error('GcpKmsProvider: GCP_SERVICE_ACCOUNT_JSON (service-account JSON string) is required.');
|
|
420
149
|
}
|
|
150
|
+
// Backlog B4: accept single-line JSON OR base64-encoded JSON (parseServiceAccountJson), so the
|
|
151
|
+
// SAME GCP_SERVICE_ACCOUNT_JSON secret satisfies the signer, this envelope provider, and the
|
|
152
|
+
// kms-core validator — base64 dodges the literal-newline paste hazard (B5).
|
|
421
153
|
let parsed;
|
|
422
154
|
try {
|
|
423
|
-
parsed =
|
|
155
|
+
parsed = parseServiceAccountJson(jsonStr);
|
|
424
156
|
}
|
|
425
|
-
catch {
|
|
426
|
-
throw new Error(
|
|
157
|
+
catch (e) {
|
|
158
|
+
throw new Error(`GcpKmsProvider: GCP_SERVICE_ACCOUNT_JSON invalid — ${e instanceof Error ? e.message : String(e)}`);
|
|
427
159
|
}
|
|
428
160
|
if (!parsed.client_email || !parsed.private_key) {
|
|
429
161
|
throw new Error('GcpKmsProvider: service-account JSON missing client_email or private_key.');
|
|
430
162
|
}
|
|
431
163
|
this.keyName = keyName;
|
|
432
164
|
this.serviceAccount = parsed;
|
|
165
|
+
this.auditSink = opts?.auditSink;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Emit an envelope-op audit row (spec 278 P0). Refs/hashes ONLY — the AAD is
|
|
169
|
+
* hashed (never logged raw, since it can carry owner/resource identifiers),
|
|
170
|
+
* and the data key / plaintext never appear. Fail-soft.
|
|
171
|
+
*/
|
|
172
|
+
async emitEnvelopeAudit(action, aadBytes, keyVersion) {
|
|
173
|
+
if (!this.auditSink)
|
|
174
|
+
return;
|
|
175
|
+
try {
|
|
176
|
+
await this.auditSink.write(buildEvent({
|
|
177
|
+
action,
|
|
178
|
+
outcome: 'success',
|
|
179
|
+
actor: { type: 'system', id: 'gcp-kms-provider' },
|
|
180
|
+
subject: { type: 'vault-data-key', id: keyVersion },
|
|
181
|
+
context: {
|
|
182
|
+
keyId: this.keyName,
|
|
183
|
+
keyVersion,
|
|
184
|
+
aadHash: bytesToHex(sha256(aadBytes)),
|
|
185
|
+
},
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
/* fail-soft — an audit failure must not break the crypto op */
|
|
190
|
+
}
|
|
433
191
|
}
|
|
434
192
|
async getAccessToken() {
|
|
435
193
|
const now = Math.floor(Date.now() / 1000);
|
|
@@ -452,25 +210,14 @@ export class GcpKmsProvider {
|
|
|
452
210
|
},
|
|
453
211
|
});
|
|
454
212
|
const encryptedDataKey = base64Decode(res.ciphertext);
|
|
455
|
-
// H7-F.4: derive keyVersion from the response. GCP returns the full
|
|
456
|
-
// versioned cryptoKeyVersions/<N> resource path in `name`. When
|
|
457
|
-
// absent (test fixtures), fall back to the legacy 'gcp-kms:unknown'
|
|
458
|
-
// marker so callers can spot misconfigured mocks.
|
|
459
213
|
const keyVersion = parseCryptoKeyVersion(res.name) ?? this.keyVersion;
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
encryptedDataKey,
|
|
463
|
-
keyId: this.keyName,
|
|
464
|
-
keyVersion,
|
|
465
|
-
};
|
|
214
|
+
await this.emitEnvelopeAudit('key-custody.envelope.wrap', aadBytes, keyVersion);
|
|
215
|
+
return { plaintextDataKey, encryptedDataKey, keyId: this.keyName, keyVersion };
|
|
466
216
|
}
|
|
467
217
|
async decryptSessionDataKey(input) {
|
|
468
|
-
//
|
|
469
|
-
//
|
|
470
|
-
//
|
|
471
|
-
// so the marker is operational ("which version produced this
|
|
472
|
-
// payload?") rather than a security gate. A null / arbitrary string
|
|
473
|
-
// here is a signal of cross-backend confusion — fail fast.
|
|
218
|
+
// The marker is operational ("which version produced this payload?"), not a
|
|
219
|
+
// security gate (GCP resolves the version from the ciphertext). A null /
|
|
220
|
+
// arbitrary value signals cross-backend confusion — fail fast.
|
|
474
221
|
if (!/^gcp-kms:(v\d+|unknown)$/.test(input.keyVersion)) {
|
|
475
222
|
throw new Error(`GcpKmsProvider: input.keyVersion "${input.keyVersion}" doesn't match the expected ` +
|
|
476
223
|
`'gcp-kms:v<N>' or 'gcp-kms:unknown' shape (H7-F.4).`);
|
|
@@ -484,7 +231,9 @@ export class GcpKmsProvider {
|
|
|
484
231
|
additionalAuthenticatedData: base64Encode(aadBytes),
|
|
485
232
|
},
|
|
486
233
|
});
|
|
487
|
-
|
|
234
|
+
const plaintextDataKey = base64Decode(res.plaintext);
|
|
235
|
+
await this.emitEnvelopeAudit('key-custody.envelope.unwrap', aadBytes, input.keyVersion);
|
|
236
|
+
return plaintextDataKey;
|
|
488
237
|
}
|
|
489
238
|
}
|
|
490
239
|
//# sourceMappingURL=gcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcp.js","sourceRoot":"","sources":["../../src/providers/gcp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gcp.js","sourceRoot":"","sources":["../../src/providers/gcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { hexToBytes, bytesToHex, toHex, type Address, type Hex } from 'viem';
|
|
2
|
-
import type { A2AKeyProvider, KmsAccountBackend } from '../types';
|
|
2
|
+
import type { A2AKeyProvider, KmsAccountBackend } from '../types.js';
|
|
3
3
|
import { type AuditSink } from '@agenticprimitives/audit';
|
|
4
4
|
export declare class LocalAesProvider implements A2AKeyProvider {
|
|
5
5
|
readonly keyVersion = "local-v1";
|
|
@@ -10,7 +10,7 @@ export declare class LocalAesProvider implements A2AKeyProvider {
|
|
|
10
10
|
generateSessionDataKey(input: {
|
|
11
11
|
aadContext: Record<string, string>;
|
|
12
12
|
}): Promise<{
|
|
13
|
-
plaintextDataKey: Uint8Array<ArrayBufferLike>;
|
|
13
|
+
plaintextDataKey: Uint8Array<ArrayBufferLike> & Uint8Array<ArrayBuffer>;
|
|
14
14
|
encryptedDataKey: Uint8Array<ArrayBufferLike>;
|
|
15
15
|
keyId: string;
|
|
16
16
|
keyVersion: string;
|
|
@@ -20,13 +20,13 @@ export declare class LocalAesProvider implements A2AKeyProvider {
|
|
|
20
20
|
aadContext: Record<string, string>;
|
|
21
21
|
keyId: string;
|
|
22
22
|
keyVersion: string;
|
|
23
|
-
}): Promise<Uint8Array<ArrayBufferLike>>;
|
|
23
|
+
}): Promise<Uint8Array<ArrayBufferLike> & Uint8Array<ArrayBuffer>>;
|
|
24
24
|
generateMac(input: {
|
|
25
25
|
canonicalMessage: Uint8Array;
|
|
26
26
|
service: string;
|
|
27
27
|
audience: string;
|
|
28
28
|
}): Promise<{
|
|
29
|
-
mac: Uint8Array<ArrayBufferLike>;
|
|
29
|
+
mac: Uint8Array<ArrayBufferLike> & Uint8Array<ArrayBuffer>;
|
|
30
30
|
keyId: string;
|
|
31
31
|
}>;
|
|
32
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/providers/local.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/providers/local.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAiHtE,qBAAa,gBAAiB,YAAW,cAAc;IACrD,QAAQ,CAAC,UAAU,cAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE;IAe1C,sBAAsB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;;;;;;IAiBpE,qBAAqB,CAAC,KAAK,EAAE;QACjC,gBAAgB,EAAE,UAAU,CAAC;QAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB;IAmBK,WAAW,CAAC,KAAK,EAAE;QAAE,gBAAgB,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;CAW7F;AAED,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,QAAQ,CAAC,QAAQ,EAAG,WAAW,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAY;gBAE3B,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IAQ9D,aAAa,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,UAAU,CAAC;QACnB,YAAY,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3E;;;;;IA2DK,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1C,yEAAyE;IACzE,UAAU,IAAI,OAAO;CAGtB;AAaD,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC"}
|