@private.me/xbind 1.3.0 → 2.3.4
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/LICENSES.md +212 -0
- package/README.md +388 -6
- package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
- package/dist-standalone/_deps/shared/cjs/errors.js +1 -275
- package/dist-standalone/_deps/shared/cjs/index.js +1 -138
- package/dist-standalone/_deps/shared/cjs/types.js +1 -90
- package/dist-standalone/_deps/shared/errors.js +1 -262
- package/dist-standalone/_deps/shared/index.js +1 -77
- package/dist-standalone/_deps/shared/types.js +1 -91
- package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
- package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
- package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
- package/dist-standalone/_deps/ux-helpers/index.js +1 -1
- package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
- package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
- package/dist-standalone/_deps/ux-helpers/search.js +1 -1
- package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
- package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
- package/dist-standalone/_deps/xchange/errors.js +1 -1
- package/dist-standalone/_deps/xchange/index.js +1 -1
- package/dist-standalone/_deps/xchange/invite-client.js +1 -1
- package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
- package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
- package/dist-standalone/_deps/xchange/xchange.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
- package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
- package/dist-standalone/_deps/xregistry/discovery.js +1 -1
- package/dist-standalone/_deps/xregistry/errors.js +1 -1
- package/dist-standalone/_deps/xregistry/index.js +1 -1
- package/dist-standalone/_deps/xregistry/registry.js +1 -1
- package/dist-standalone/_deps/xregistry/schema.js +1 -1
- package/dist-standalone/_deps/xregistry/types.js +1 -1
- package/dist-standalone/agent-call.js +1 -642
- package/dist-standalone/agent-sdk.js +1 -328
- package/dist-standalone/agent.d.ts +95 -5
- package/dist-standalone/agent.js +1 -1545
- package/dist-standalone/approval.js +1 -193
- package/dist-standalone/async-iterators.d.ts +275 -0
- package/dist-standalone/async-iterators.js +1 -0
- package/dist-standalone/auth.js +1 -219
- package/dist-standalone/auto-accept.js +1 -229
- package/dist-standalone/backup-config.js +1 -201
- package/dist-standalone/backup.d.ts +114 -0
- package/dist-standalone/backup.js +1 -0
- package/dist-standalone/batch-operations.d.ts +297 -0
- package/dist-standalone/batch-operations.js +1 -0
- package/dist-standalone/cancellation.d.ts +301 -0
- package/dist-standalone/cancellation.js +1 -0
- package/dist-standalone/checkpoint.js +1 -186
- package/dist-standalone/circuit-breaker.d.ts +351 -0
- package/dist-standalone/circuit-breaker.js +1 -0
- package/dist-standalone/cjs/agent-call.js +1 -651
- package/dist-standalone/cjs/agent-sdk.js +1 -332
- package/dist-standalone/cjs/agent.js +1 -1582
- package/dist-standalone/cjs/approval.js +1 -199
- package/dist-standalone/cjs/async-iterators.js +1 -0
- package/dist-standalone/cjs/auth.js +1 -225
- package/dist-standalone/cjs/auto-accept.js +1 -233
- package/dist-standalone/cjs/backup-config.js +1 -207
- package/dist-standalone/cjs/backup.js +1 -0
- package/dist-standalone/cjs/batch-operations.js +1 -0
- package/dist-standalone/cjs/cancellation.js +1 -0
- package/dist-standalone/cjs/checkpoint.js +1 -193
- package/dist-standalone/cjs/circuit-breaker.js +1 -0
- package/dist-standalone/cjs/cli/init.js +1 -486
- package/dist-standalone/cjs/config-validation.js +1 -0
- package/dist-standalone/cjs/connect.js +1 -312
- package/dist-standalone/cjs/connection-pool.js +1 -0
- package/dist-standalone/cjs/correlation-id.js +1 -339
- package/dist-standalone/cjs/crypto-utils.js +1 -0
- package/dist-standalone/cjs/debug-mode.js +1 -0
- package/dist-standalone/cjs/did-document.js +1 -101
- package/dist-standalone/cjs/did-privateme.js +1 -130
- package/dist-standalone/cjs/did-web.js +1 -201
- package/dist-standalone/cjs/discovery.js +1 -462
- package/dist-standalone/cjs/dual-mode.js +1 -251
- package/dist-standalone/cjs/email-templates.js +1 -313
- package/dist-standalone/cjs/email-transport.js +1 -239
- package/dist-standalone/cjs/envelope.js +1 -510
- package/dist-standalone/cjs/errors.js +1 -826
- package/dist-standalone/cjs/event-emitter.js +1 -0
- package/dist-standalone/cjs/gateway-state.js +1 -55
- package/dist-standalone/cjs/gateway-transport.js +1 -120
- package/dist-standalone/cjs/graceful-degradation.js +1 -0
- package/dist-standalone/cjs/guardrails.js +1 -223
- package/dist-standalone/cjs/health-check.js +1 -0
- package/dist-standalone/cjs/http-compat.js +1 -272
- package/dist-standalone/cjs/http-status-map.js +1 -571
- package/dist-standalone/cjs/identity.js +1 -541
- package/dist-standalone/cjs/index.js +1 -237
- package/dist-standalone/cjs/invitation.js +1 -421
- package/dist-standalone/cjs/invite.js +1 -328
- package/dist-standalone/cjs/key-agreement.js +1 -246
- package/dist-standalone/cjs/lazy-init.js +1 -300
- package/dist-standalone/cjs/logger.js +1 -0
- package/dist-standalone/cjs/mdns-discovery.js +1 -202
- package/dist-standalone/cjs/nonce-store.js +1 -66
- package/dist-standalone/cjs/pairing-manager.js +1 -223
- package/dist-standalone/cjs/plugin-system.js +1 -0
- package/dist-standalone/cjs/plugins/logging.js +1 -0
- package/dist-standalone/cjs/plugins/metrics.js +1 -0
- package/dist-standalone/cjs/plugins/validation.js +1 -0
- package/dist-standalone/cjs/policy.js +1 -320
- package/dist-standalone/cjs/progress-callbacks.js +1 -0
- package/dist-standalone/cjs/redis-nonce-store.js +1 -76
- package/dist-standalone/cjs/registry-middleware.js +1 -50
- package/dist-standalone/cjs/retry-strategies.js +1 -0
- package/dist-standalone/cjs/retry-transport.js +1 -102
- package/dist-standalone/cjs/runtime/browser.js +1 -0
- package/dist-standalone/cjs/runtime/edge.js +1 -0
- package/dist-standalone/cjs/runtime/react-native.js +1 -0
- package/dist-standalone/cjs/security-policy.js +1 -245
- package/dist-standalone/cjs/serialization.js +1 -0
- package/dist-standalone/cjs/split-channel.js +1 -177
- package/dist-standalone/cjs/subscription-proof.js +1 -230
- package/dist-standalone/cjs/succession.js +1 -148
- package/dist-standalone/cjs/timeouts.js +1 -0
- package/dist-standalone/cjs/trace-context.js +1 -0
- package/dist-standalone/cjs/trace-spans.js +1 -0
- package/dist-standalone/cjs/transport.js +1 -63
- package/dist-standalone/cjs/trust-registry.js +1 -742
- package/dist-standalone/cjs/types/error-response.js +1 -56
- package/dist-standalone/cjs/vault-auth.js +1 -0
- package/dist-standalone/cjs/vault-store-loader.js +1 -0
- package/dist-standalone/cjs/verify.js +1 -25
- package/dist-standalone/cjs/version-info.js +1 -0
- package/dist-standalone/cjs/xfetch.js +1 -252
- package/dist-standalone/cli/init.js +1 -449
- package/dist-standalone/cli/setup.js +1 -514
- package/dist-standalone/cli/types.js +1 -27
- package/dist-standalone/cli/xbind.js +1 -148
- package/dist-standalone/config-validation.d.ts +185 -0
- package/dist-standalone/config-validation.js +1 -0
- package/dist-standalone/connect.js +1 -274
- package/dist-standalone/connection-pool.d.ts +251 -0
- package/dist-standalone/connection-pool.js +1 -0
- package/dist-standalone/correlation-id.js +1 -326
- package/dist-standalone/crypto-utils.d.ts +60 -0
- package/dist-standalone/crypto-utils.js +1 -0
- package/dist-standalone/debug-mode.d.ts +286 -0
- package/dist-standalone/debug-mode.js +1 -0
- package/dist-standalone/did-document.js +1 -96
- package/dist-standalone/did-privateme.js +1 -121
- package/dist-standalone/did-web.js +1 -196
- package/dist-standalone/discovery.js +1 -458
- package/dist-standalone/dual-mode.js +1 -247
- package/dist-standalone/email-templates.js +1 -309
- package/dist-standalone/email-transport.js +1 -232
- package/dist-standalone/envelope.d.ts +29 -1
- package/dist-standalone/envelope.js +1 -497
- package/dist-standalone/errors.d.ts +10 -0
- package/dist-standalone/errors.js +1 -811
- package/dist-standalone/event-emitter.d.ts +395 -0
- package/dist-standalone/event-emitter.js +1 -0
- package/dist-standalone/gateway-state.js +1 -51
- package/dist-standalone/gateway-transport.js +1 -116
- package/dist-standalone/graceful-degradation.d.ts +246 -0
- package/dist-standalone/graceful-degradation.js +1 -0
- package/dist-standalone/guardrails.js +1 -216
- package/dist-standalone/health-check.d.ts +150 -0
- package/dist-standalone/health-check.js +1 -0
- package/dist-standalone/http-compat.js +1 -267
- package/dist-standalone/http-status-map.js +1 -561
- package/dist-standalone/identity.d.ts +64 -1
- package/dist-standalone/identity.js +1 -516
- package/dist-standalone/index.d.ts +45 -3
- package/dist-standalone/index.js +1 -52
- package/dist-standalone/invitation.js +1 -415
- package/dist-standalone/invite.js +1 -324
- package/dist-standalone/key-agreement.d.ts +61 -13
- package/dist-standalone/key-agreement.js +1 -236
- package/dist-standalone/lazy-init.js +1 -295
- package/dist-standalone/logger.d.ts +77 -0
- package/dist-standalone/logger.js +1 -0
- package/dist-standalone/mdns-discovery.js +1 -195
- package/dist-standalone/nonce-store.d.ts +16 -3
- package/dist-standalone/nonce-store.js +1 -62
- package/dist-standalone/package.json +0 -1
- package/dist-standalone/pairing-manager.js +1 -219
- package/dist-standalone/plugin-system.d.ts +145 -0
- package/dist-standalone/plugin-system.js +1 -0
- package/dist-standalone/policy.js +1 -315
- package/dist-standalone/progress-callbacks.d.ts +394 -0
- package/dist-standalone/progress-callbacks.js +1 -0
- package/dist-standalone/redis-nonce-store.js +1 -72
- package/dist-standalone/registry-middleware.js +1 -47
- package/dist-standalone/retry-strategies.d.ts +382 -0
- package/dist-standalone/retry-strategies.js +1 -0
- package/dist-standalone/retry-transport.js +1 -98
- package/dist-standalone/security-policy.js +1 -239
- package/dist-standalone/serialization.d.ts +244 -0
- package/dist-standalone/serialization.js +1 -0
- package/dist-standalone/split-channel.d.ts +49 -1
- package/dist-standalone/split-channel.js +1 -171
- package/dist-standalone/subscription-proof.js +1 -224
- package/dist-standalone/succession.js +1 -142
- package/dist-standalone/timeouts.d.ts +275 -0
- package/dist-standalone/timeouts.js +1 -0
- package/dist-standalone/trace-context.d.ts +252 -0
- package/dist-standalone/trace-context.js +1 -0
- package/dist-standalone/trace-spans.d.ts +360 -0
- package/dist-standalone/trace-spans.js +1 -0
- package/dist-standalone/transport.js +1 -59
- package/dist-standalone/trust-registry.d.ts +106 -5
- package/dist-standalone/trust-registry.js +1 -702
- package/dist-standalone/vault-auth.d.ts +91 -0
- package/dist-standalone/vault-auth.js +1 -0
- package/dist-standalone/vault-store-loader.d.ts +110 -0
- package/dist-standalone/vault-store-loader.js +1 -0
- package/dist-standalone/verify.js +1 -16
- package/dist-standalone/version-info.d.ts +259 -0
- package/dist-standalone/version-info.js +1 -0
- package/dist-standalone/xfetch.js +1 -247
- package/llms.txt +1 -0
- package/package.json +66 -5
- package/share1.dat +0 -0
- package/dist-standalone/_deps/crypto/base64.d.ts +0 -29
- package/dist-standalone/_deps/crypto/base64.js +0 -209
- package/dist-standalone/_deps/crypto/cjs/base64.js +0 -103
- package/dist-standalone/_deps/crypto/cjs/errors.js +0 -119
- package/dist-standalone/_deps/crypto/cjs/hmac.js +0 -71
- package/dist-standalone/_deps/crypto/cjs/index.js +0 -86
- package/dist-standalone/_deps/crypto/cjs/padding.js +0 -57
- package/dist-standalone/_deps/crypto/cjs/share-header.js +0 -68
- package/dist-standalone/_deps/crypto/cjs/shares.js +0 -152
- package/dist-standalone/_deps/crypto/cjs/tlv.js +0 -199
- package/dist-standalone/_deps/crypto/cjs/uuid.js +0 -61
- package/dist-standalone/_deps/crypto/cjs/verify.js +0 -24
- package/dist-standalone/_deps/crypto/cjs/xorida.js +0 -221
- package/dist-standalone/_deps/crypto/errors.d.ts +0 -51
- package/dist-standalone/_deps/crypto/errors.js +0 -109
- package/dist-standalone/_deps/crypto/hmac.d.ts +0 -39
- package/dist-standalone/_deps/crypto/hmac.js +0 -66
- package/dist-standalone/_deps/crypto/index.d.ts +0 -20
- package/dist-standalone/_deps/crypto/index.js +0 -45
- package/dist-standalone/_deps/crypto/padding.d.ts +0 -19
- package/dist-standalone/_deps/crypto/padding.js +0 -53
- package/dist-standalone/_deps/crypto/share-header.d.ts +0 -44
- package/dist-standalone/_deps/crypto/share-header.js +0 -63
- package/dist-standalone/_deps/crypto/shares.d.ts +0 -27
- package/dist-standalone/_deps/crypto/shares.js +0 -148
- package/dist-standalone/_deps/crypto/tlv.d.ts +0 -26
- package/dist-standalone/_deps/crypto/tlv.js +0 -195
- package/dist-standalone/_deps/crypto/uuid.d.ts +0 -22
- package/dist-standalone/_deps/crypto/uuid.js +0 -56
- package/dist-standalone/_deps/crypto/verify.d.ts +0 -15
- package/dist-standalone/_deps/crypto/verify.js +0 -15
- package/dist-standalone/_deps/crypto/xorida.d.ts +0 -44
- package/dist-standalone/_deps/crypto/xorida.js +0 -215
- package/dist-standalone/_deps/shared/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/shared/errors.js.map +0 -1
- package/dist-standalone/_deps/shared/index.d.ts.map +0 -1
- package/dist-standalone/_deps/shared/index.js.map +0 -1
- package/dist-standalone/_deps/shared/types.d.ts.map +0 -1
- package/dist-standalone/_deps/shared/types.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/errors.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/index.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/index.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/pagination.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/pagination.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/progress.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/progress.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/search.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/search.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/types.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/cjs/types.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/errors.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/index.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/index.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/pagination.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/pagination.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/progress.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/progress.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/search.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/search.js.map +0 -1
- package/dist-standalone/_deps/ux-helpers/types.d.ts.map +0 -1
- package/dist-standalone/_deps/ux-helpers/types.js.map +0 -1
- package/dist-standalone/_deps/xregistry/discovery.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/discovery.js.map +0 -1
- package/dist-standalone/_deps/xregistry/errors.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/errors.js.map +0 -1
- package/dist-standalone/_deps/xregistry/index.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/index.js.map +0 -1
- package/dist-standalone/_deps/xregistry/registry.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/registry.js.map +0 -1
- package/dist-standalone/_deps/xregistry/schema.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/schema.js.map +0 -1
- package/dist-standalone/_deps/xregistry/types.d.ts.map +0 -1
- package/dist-standalone/_deps/xregistry/types.js.map +0 -1
|
@@ -1,516 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { fromBase64Url } from"./_deps/crypto/index.js";
|
|
3
|
-
import { MlKem768 } from 'mlkem';
|
|
4
|
-
import mldsa from"./_deps/mldsa-wasm/dist/mldsa.js";
|
|
5
|
-
/** Ed25519 multicodec varint prefix. */
|
|
6
|
-
const ED25519_MULTICODEC = new Uint8Array([0xed, 0x01]);
|
|
7
|
-
const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
8
|
-
/** Copy Uint8Array to fresh ArrayBuffer (avoids SharedArrayBuffer type issues). */
|
|
9
|
-
function toArrayBuffer(data) {
|
|
10
|
-
const buf = new ArrayBuffer(data.byteLength);
|
|
11
|
-
new Uint8Array(buf).set(data);
|
|
12
|
-
return buf;
|
|
13
|
-
}
|
|
14
|
-
/* ── Key Generation ── */
|
|
15
|
-
/**
|
|
16
|
-
* Generate a new Ed25519 agent identity.
|
|
17
|
-
* Creates keypair via Web Crypto API, derives did:key DID.
|
|
18
|
-
*/
|
|
19
|
-
export async function generateIdentity(opts) {
|
|
20
|
-
try {
|
|
21
|
-
// SAFETY: Ed25519 generateKey always returns CryptoKeyPair
|
|
22
|
-
const keyPair = await crypto.subtle.generateKey('Ed25519', true, ['sign', 'verify']);
|
|
23
|
-
const rawPub = new Uint8Array(await crypto.subtle.exportKey('raw', keyPair.publicKey));
|
|
24
|
-
const did = publicKeyToDid(rawPub);
|
|
25
|
-
// SAFETY: X25519 generateKey always returns CryptoKeyPair
|
|
26
|
-
const x25519Pair = await crypto.subtle.generateKey({ name: 'X25519' }, true, ['deriveBits']);
|
|
27
|
-
const rawX25519Pub = new Uint8Array(await crypto.subtle.exportKey('raw', x25519Pair.publicKey));
|
|
28
|
-
// Generate ML-KEM-768 keypair for hybrid post-quantum KEM (always-on)
|
|
29
|
-
let mlKemPublicKey;
|
|
30
|
-
let mlKemSecretKey;
|
|
31
|
-
try {
|
|
32
|
-
const mlkem = new MlKem768();
|
|
33
|
-
const [publicKey, secretKey] = await mlkem.generateKeyPair();
|
|
34
|
-
mlKemPublicKey = publicKey;
|
|
35
|
-
mlKemSecretKey = secretKey;
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
console.warn('[xBind] ML-KEM-768 keygen failed, using classical crypto only:', err);
|
|
39
|
-
}
|
|
40
|
-
// Generate ML-DSA-65 keypair only when opt-in flag is set
|
|
41
|
-
let mlDsaPublicKey;
|
|
42
|
-
let mlDsaSecretKey;
|
|
43
|
-
if (opts?.postQuantumSig) {
|
|
44
|
-
try {
|
|
45
|
-
const keypair = await mldsa.generateKey('ML-DSA-65', true, ['sign', 'verify']);
|
|
46
|
-
const publicKeyRaw = await mldsa.exportKey('raw-public', keypair.publicKey);
|
|
47
|
-
const secretKeySeed = await mldsa.exportKey('raw-seed', keypair.privateKey);
|
|
48
|
-
mlDsaPublicKey = new Uint8Array(publicKeyRaw);
|
|
49
|
-
// For storage, we need the full secret key, not just the seed
|
|
50
|
-
// We'll store the seed and regenerate when needed
|
|
51
|
-
mlDsaSecretKey = new Uint8Array(secretKeySeed);
|
|
52
|
-
}
|
|
53
|
-
catch (err) {
|
|
54
|
-
console.warn('[xBind] ML-DSA-65 keygen failed, using classical crypto only:', err);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return ok({
|
|
58
|
-
did,
|
|
59
|
-
publicKey: keyPair.publicKey,
|
|
60
|
-
privateKey: keyPair.privateKey,
|
|
61
|
-
rawPublicKey: rawPub,
|
|
62
|
-
x25519PrivateKey: x25519Pair.privateKey,
|
|
63
|
-
x25519PublicKey: x25519Pair.publicKey,
|
|
64
|
-
rawX25519PublicKey: rawX25519Pub,
|
|
65
|
-
...(mlKemPublicKey ? { mlKemPublicKey } : {}),
|
|
66
|
-
...(mlKemSecretKey ? { mlKemSecretKey } : {}),
|
|
67
|
-
...(mlDsaPublicKey ? { mlDsaPublicKey } : {}),
|
|
68
|
-
...(mlDsaSecretKey ? { mlDsaSecretKey } : {}),
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return err('KEYGEN_FAILED');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/* ── Sign / Verify ── */
|
|
76
|
-
/**
|
|
77
|
-
* Sign data with an Ed25519 private key.
|
|
78
|
-
* @returns 64-byte Ed25519 signature.
|
|
79
|
-
*/
|
|
80
|
-
export async function sign(privateKey, data) {
|
|
81
|
-
try {
|
|
82
|
-
const sig = new Uint8Array(await crypto.subtle.sign('Ed25519', privateKey, toArrayBuffer(data)));
|
|
83
|
-
return ok(sig);
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
return err('SIGN_FAILED');
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Verify an Ed25519 signature.
|
|
91
|
-
* @returns true if valid, false if invalid (not an error).
|
|
92
|
-
*/
|
|
93
|
-
export async function verify(publicKey, signature, data) {
|
|
94
|
-
try {
|
|
95
|
-
const valid = await crypto.subtle.verify('Ed25519', publicKey, toArrayBuffer(signature), toArrayBuffer(data));
|
|
96
|
-
return ok(valid);
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
return err('VERIFY_FAILED');
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/* ── Key Import ── */
|
|
103
|
-
/**
|
|
104
|
-
* Import a raw 32-byte Ed25519 public key into a CryptoKey.
|
|
105
|
-
*/
|
|
106
|
-
export async function importPublicKey(rawPublicKey) {
|
|
107
|
-
if (rawPublicKey.length !== 32)
|
|
108
|
-
return err('INVALID_KEY_LENGTH');
|
|
109
|
-
try {
|
|
110
|
-
const key = await crypto.subtle.importKey('raw', toArrayBuffer(rawPublicKey), 'Ed25519', true, ['verify']);
|
|
111
|
-
return ok(key);
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
return err('KEYGEN_FAILED');
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/* ── DID Conversion ── */
|
|
118
|
-
/**
|
|
119
|
-
* Convert 32-byte Ed25519 public key to did:key DID.
|
|
120
|
-
* Format: did:key:z + base58btc(0xed01 || publicKey).
|
|
121
|
-
*/
|
|
122
|
-
export function publicKeyToDid(rawPublicKey) {
|
|
123
|
-
const prefixed = new Uint8Array(2 + rawPublicKey.length);
|
|
124
|
-
prefixed.set(ED25519_MULTICODEC);
|
|
125
|
-
prefixed.set(rawPublicKey, 2);
|
|
126
|
-
return `did:key:z${base58btcEncode(prefixed)}`;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Extract raw 32-byte public key bytes from a did:key DID.
|
|
130
|
-
*/
|
|
131
|
-
export function didToPublicKeyBytes(did) {
|
|
132
|
-
if (!did.startsWith('did:key:z'))
|
|
133
|
-
return err('INVALID_DID');
|
|
134
|
-
try {
|
|
135
|
-
const encoded = did.slice('did:key:z'.length);
|
|
136
|
-
const bytes = base58btcDecode(encoded);
|
|
137
|
-
if (bytes[0] !== 0xed || bytes[1] !== 0x01)
|
|
138
|
-
return err('INVALID_DID');
|
|
139
|
-
if (bytes.length !== 34)
|
|
140
|
-
return err('INVALID_DID');
|
|
141
|
-
return ok(bytes.slice(2));
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
return err('INVALID_DID');
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/* ── PKCS8 Export/Import ── */
|
|
148
|
-
/**
|
|
149
|
-
* Export an Ed25519 private key as PKCS8 DER bytes.
|
|
150
|
-
*
|
|
151
|
-
* Use this to persist an agent identity across restarts.
|
|
152
|
-
* Node 20 does not support raw export for Ed25519 private keys —
|
|
153
|
-
* PKCS8 is the portable format.
|
|
154
|
-
*
|
|
155
|
-
* @param privateKey - Ed25519 CryptoKey (must be extractable).
|
|
156
|
-
* @returns PKCS8 DER bytes or error.
|
|
157
|
-
*/
|
|
158
|
-
export async function exportPKCS8(privateKey) {
|
|
159
|
-
try {
|
|
160
|
-
const buf = await crypto.subtle.exportKey('pkcs8', privateKey);
|
|
161
|
-
return ok(new Uint8Array(buf));
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
return err('EXPORT_FAILED');
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Export an X25519 private key as PKCS8 DER bytes.
|
|
169
|
-
*
|
|
170
|
-
* @param privateKey - X25519 CryptoKey (must be extractable).
|
|
171
|
-
* @returns PKCS8 DER bytes or error.
|
|
172
|
-
*/
|
|
173
|
-
export async function exportX25519PKCS8(privateKey) {
|
|
174
|
-
try {
|
|
175
|
-
const buf = await crypto.subtle.exportKey('pkcs8', privateKey);
|
|
176
|
-
return ok(new Uint8Array(buf));
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
return err('EXPORT_FAILED');
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Import an Ed25519 identity from PKCS8 DER bytes.
|
|
184
|
-
*
|
|
185
|
-
* Generates a new X25519 keypair for forward secrecy.
|
|
186
|
-
* Use this when you only persisted the Ed25519 key.
|
|
187
|
-
*
|
|
188
|
-
* @param pkcs8 - PKCS8-encoded Ed25519 private key bytes.
|
|
189
|
-
* @returns Full AgentIdentity or error.
|
|
190
|
-
*/
|
|
191
|
-
export async function importFromPKCS8(pkcs8) {
|
|
192
|
-
try {
|
|
193
|
-
const privateKey = await crypto.subtle.importKey('pkcs8', toArrayBuffer(pkcs8), 'Ed25519', true, ['sign']);
|
|
194
|
-
// Extract public key from JWK (PKCS8 import returns only private key)
|
|
195
|
-
const jwk = await crypto.subtle.exportKey('jwk', privateKey);
|
|
196
|
-
if (!jwk.x)
|
|
197
|
-
return err('IMPORT_FAILED');
|
|
198
|
-
// JWK x field is base64url-encoded raw public key
|
|
199
|
-
const rawPub = fromBase64Url(jwk.x);
|
|
200
|
-
const publicKey = await crypto.subtle.importKey('raw', toArrayBuffer(rawPub), 'Ed25519', true, ['verify']);
|
|
201
|
-
const did = publicKeyToDid(rawPub);
|
|
202
|
-
// Generate fresh X25519 keypair for forward secrecy
|
|
203
|
-
// SAFETY: X25519 generateKey always returns CryptoKeyPair
|
|
204
|
-
const x25519Pair = await crypto.subtle.generateKey({ name: 'X25519' }, true, ['deriveBits']);
|
|
205
|
-
const rawX25519Pub = new Uint8Array(await crypto.subtle.exportKey('raw', x25519Pair.publicKey));
|
|
206
|
-
return ok({
|
|
207
|
-
did,
|
|
208
|
-
publicKey,
|
|
209
|
-
privateKey,
|
|
210
|
-
rawPublicKey: rawPub,
|
|
211
|
-
x25519PrivateKey: x25519Pair.privateKey,
|
|
212
|
-
x25519PublicKey: x25519Pair.publicKey,
|
|
213
|
-
rawX25519PublicKey: rawX25519Pub,
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
catch {
|
|
217
|
-
return err('IMPORT_FAILED');
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Import a full identity from both PKCS8 blobs (Ed25519 + X25519).
|
|
222
|
-
*
|
|
223
|
-
* Use this when you persisted both keys for full identity restoration
|
|
224
|
-
* including the original X25519 key (preserves registered key agreement).
|
|
225
|
-
*
|
|
226
|
-
* @param ed25519Pkcs8 - PKCS8-encoded Ed25519 private key bytes.
|
|
227
|
-
* @param x25519Pkcs8 - PKCS8-encoded X25519 private key bytes.
|
|
228
|
-
* @returns Full AgentIdentity or error.
|
|
229
|
-
*/
|
|
230
|
-
export async function importIdentity(ed25519Pkcs8, x25519Pkcs8, mlKemSecretKey, mlKemPublicKey, mlDsaSecretKey, mlDsaPublicKey) {
|
|
231
|
-
try {
|
|
232
|
-
const privateKey = await crypto.subtle.importKey('pkcs8', toArrayBuffer(ed25519Pkcs8), 'Ed25519', true, ['sign']);
|
|
233
|
-
const jwk = await crypto.subtle.exportKey('jwk', privateKey);
|
|
234
|
-
if (!jwk.x)
|
|
235
|
-
return err('IMPORT_FAILED');
|
|
236
|
-
const rawPub = fromBase64Url(jwk.x);
|
|
237
|
-
const publicKey = await crypto.subtle.importKey('raw', toArrayBuffer(rawPub), 'Ed25519', true, ['verify']);
|
|
238
|
-
const did = publicKeyToDid(rawPub);
|
|
239
|
-
const x25519PrivateKey = await crypto.subtle.importKey('pkcs8', toArrayBuffer(x25519Pkcs8), { name: 'X25519' }, true, ['deriveBits']);
|
|
240
|
-
const x25519Jwk = await crypto.subtle.exportKey('jwk', x25519PrivateKey);
|
|
241
|
-
if (!x25519Jwk.x)
|
|
242
|
-
return err('IMPORT_FAILED');
|
|
243
|
-
const rawX25519Pub = fromBase64Url(x25519Jwk.x);
|
|
244
|
-
const x25519PublicKey = await crypto.subtle.importKey('raw', toArrayBuffer(rawX25519Pub), { name: 'X25519' }, true, []);
|
|
245
|
-
return ok({
|
|
246
|
-
did,
|
|
247
|
-
publicKey,
|
|
248
|
-
privateKey,
|
|
249
|
-
rawPublicKey: rawPub,
|
|
250
|
-
x25519PrivateKey,
|
|
251
|
-
x25519PublicKey,
|
|
252
|
-
rawX25519PublicKey: rawX25519Pub,
|
|
253
|
-
...(mlKemSecretKey ? { mlKemSecretKey } : {}),
|
|
254
|
-
...(mlKemPublicKey ? { mlKemPublicKey } : {}),
|
|
255
|
-
...(mlDsaSecretKey ? { mlDsaSecretKey } : {}),
|
|
256
|
-
...(mlDsaPublicKey ? { mlDsaPublicKey } : {}),
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
catch {
|
|
260
|
-
return err('IMPORT_FAILED');
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
/* ── ML-KEM Key Export ── */
|
|
264
|
-
/**
|
|
265
|
-
* Export ML-KEM-768 secret key bytes from an identity.
|
|
266
|
-
*
|
|
267
|
-
* @param identity - Agent identity with ML-KEM keys.
|
|
268
|
-
* @returns Raw 2400-byte ML-KEM secret key or undefined if not available.
|
|
269
|
-
*/
|
|
270
|
-
export function exportMlKemSecretKey(identity) {
|
|
271
|
-
return identity.mlKemSecretKey;
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Export ML-KEM-768 public key bytes from an identity.
|
|
275
|
-
*
|
|
276
|
-
* @param identity - Agent identity with ML-KEM keys.
|
|
277
|
-
* @returns Raw 1184-byte ML-KEM public key or undefined if not available.
|
|
278
|
-
*/
|
|
279
|
-
export function exportMlKemPublicKey(identity) {
|
|
280
|
-
return identity.mlKemPublicKey;
|
|
281
|
-
}
|
|
282
|
-
/* ── ML-DSA-65 Sign / Verify ── */
|
|
283
|
-
/** ML-DSA-65 signature length in bytes. */
|
|
284
|
-
export const ML_DSA65_SIG_BYTES = 3309;
|
|
285
|
-
/** ML-DSA-65 public key length in bytes. */
|
|
286
|
-
export const ML_DSA65_PK_BYTES = 1952;
|
|
287
|
-
/** ML-DSA-65 secret key seed length in bytes (using seed format for storage). */
|
|
288
|
-
export const ML_DSA65_SK_BYTES = 32;
|
|
289
|
-
/**
|
|
290
|
-
* Sign data with an ML-DSA-65 secret key (FIPS 204).
|
|
291
|
-
* @param secretKey - 32-byte ML-DSA-65 secret key seed.
|
|
292
|
-
* @param data - Data to sign.
|
|
293
|
-
* @returns 3309-byte ML-DSA-65 signature.
|
|
294
|
-
*/
|
|
295
|
-
export async function signMlDsa65(secretKey, data) {
|
|
296
|
-
try {
|
|
297
|
-
// Import secret key seed as CryptoKey
|
|
298
|
-
const privateKey = await mldsa.importKey('raw-seed', toArrayBuffer(secretKey), 'ML-DSA-65', false, ['sign']);
|
|
299
|
-
// Sign using mldsa-wasm API
|
|
300
|
-
const signature = await mldsa.sign('ML-DSA-65', privateKey, toArrayBuffer(data));
|
|
301
|
-
return ok(new Uint8Array(signature));
|
|
302
|
-
}
|
|
303
|
-
catch {
|
|
304
|
-
return err('SIGN_FAILED');
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Verify an ML-DSA-65 signature (FIPS 204).
|
|
309
|
-
* @param publicKey - 1952-byte ML-DSA-65 public key.
|
|
310
|
-
* @param signature - 3309-byte ML-DSA-65 signature.
|
|
311
|
-
* @param data - Data that was signed.
|
|
312
|
-
* @returns true if valid, false if invalid (not an error).
|
|
313
|
-
*/
|
|
314
|
-
export async function verifyMlDsa65(publicKey, signature, data) {
|
|
315
|
-
try {
|
|
316
|
-
// Import public key as CryptoKey
|
|
317
|
-
const pubKey = await mldsa.importKey('raw-public', toArrayBuffer(publicKey), 'ML-DSA-65', false, ['verify']);
|
|
318
|
-
// Verify using mldsa-wasm API
|
|
319
|
-
const valid = await mldsa.verify('ML-DSA-65', pubKey, toArrayBuffer(signature), toArrayBuffer(data));
|
|
320
|
-
return ok(valid);
|
|
321
|
-
}
|
|
322
|
-
catch {
|
|
323
|
-
return err('VERIFY_FAILED');
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/* ── ML-DSA Key Export ── */
|
|
327
|
-
/**
|
|
328
|
-
* Export ML-DSA-65 secret key bytes from an identity.
|
|
329
|
-
*
|
|
330
|
-
* @param identity - Agent identity with ML-DSA keys.
|
|
331
|
-
* @returns Raw 4032-byte ML-DSA-65 secret key or undefined if not available.
|
|
332
|
-
*/
|
|
333
|
-
export function exportMlDsaSecretKey(identity) {
|
|
334
|
-
return identity.mlDsaSecretKey;
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Export ML-DSA-65 public key bytes from an identity.
|
|
338
|
-
*
|
|
339
|
-
* @param identity - Agent identity with ML-DSA keys.
|
|
340
|
-
* @returns Raw 1952-byte ML-DSA-65 public key or undefined if not available.
|
|
341
|
-
*/
|
|
342
|
-
export function exportMlDsaPublicKey(identity) {
|
|
343
|
-
return identity.mlDsaPublicKey;
|
|
344
|
-
}
|
|
345
|
-
/* ── PKCS8 ASN.1 Prefixes ── */
|
|
346
|
-
/**
|
|
347
|
-
* PKCS8 ASN.1 DER header for Ed25519 private keys (16 bytes).
|
|
348
|
-
* Structure: SEQUENCE { INTEGER(0), SEQUENCE { OID(1.3.101.112) }, OCTET STRING header }
|
|
349
|
-
* The 32-byte raw seed follows immediately after this prefix.
|
|
350
|
-
*/
|
|
351
|
-
const ED25519_PKCS8_PREFIX = new Uint8Array([
|
|
352
|
-
0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06,
|
|
353
|
-
0x03, 0x2b, 0x65, 0x70, 0x04, 0x22, 0x04, 0x20,
|
|
354
|
-
]);
|
|
355
|
-
/**
|
|
356
|
-
* PKCS8 ASN.1 DER header for X25519 private keys (16 bytes).
|
|
357
|
-
* Structure: SEQUENCE { INTEGER(0), SEQUENCE { OID(1.3.101.110) }, OCTET STRING header }
|
|
358
|
-
* The 32-byte raw seed follows immediately after this prefix.
|
|
359
|
-
*/
|
|
360
|
-
const X25519_PKCS8_PREFIX = new Uint8Array([
|
|
361
|
-
0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06,
|
|
362
|
-
0x03, 0x2b, 0x65, 0x6e, 0x04, 0x22, 0x04, 0x20,
|
|
363
|
-
]);
|
|
364
|
-
/* ── Deterministic Identity from Seed ── */
|
|
365
|
-
/**
|
|
366
|
-
* Derive a deterministic AgentIdentity from a 32-byte seed.
|
|
367
|
-
*
|
|
368
|
-
* Uses HKDF-SHA256 to derive separate Ed25519 and X25519 private keys
|
|
369
|
-
* from the seed. The same seed always produces the same identity (same DID).
|
|
370
|
-
*
|
|
371
|
-
* @param seed - Exactly 32 bytes of high-entropy key material.
|
|
372
|
-
* @returns Full AgentIdentity or error.
|
|
373
|
-
*/
|
|
374
|
-
export async function identityFromSeed(seed, opts) {
|
|
375
|
-
if (seed.length !== 32)
|
|
376
|
-
return err('INVALID_KEY_LENGTH');
|
|
377
|
-
try {
|
|
378
|
-
// Import seed as HKDF base key
|
|
379
|
-
const baseKey = await crypto.subtle.importKey('raw', toArrayBuffer(seed), 'HKDF', false, ['deriveBits']);
|
|
380
|
-
// Derive 32 bytes for Ed25519
|
|
381
|
-
const edBits = new Uint8Array(await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(32), info: new TextEncoder().encode('ed25519') }, baseKey, 256));
|
|
382
|
-
// Derive 32 bytes for X25519
|
|
383
|
-
const x25519Bits = new Uint8Array(await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(32), info: new TextEncoder().encode('x25519') }, baseKey, 256));
|
|
384
|
-
// Derive 64 bytes for ML-KEM-768
|
|
385
|
-
const mlKemBits = new Uint8Array(await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(32), info: new TextEncoder().encode('ml-kem-768') }, baseKey, 512));
|
|
386
|
-
// Wrap as PKCS8 and import
|
|
387
|
-
const edPkcs8 = new Uint8Array(ED25519_PKCS8_PREFIX.length + edBits.length);
|
|
388
|
-
edPkcs8.set(ED25519_PKCS8_PREFIX);
|
|
389
|
-
edPkcs8.set(edBits, ED25519_PKCS8_PREFIX.length);
|
|
390
|
-
const x25519Pkcs8 = new Uint8Array(X25519_PKCS8_PREFIX.length + x25519Bits.length);
|
|
391
|
-
x25519Pkcs8.set(X25519_PKCS8_PREFIX);
|
|
392
|
-
x25519Pkcs8.set(x25519Bits, X25519_PKCS8_PREFIX.length);
|
|
393
|
-
// Generate deterministic ML-KEM-768 keypair from derived seed (always-on)
|
|
394
|
-
let mlKemPublicKey;
|
|
395
|
-
let mlKemSecretKey;
|
|
396
|
-
try {
|
|
397
|
-
// Note: mlkem library doesn't support deterministic key generation from seed
|
|
398
|
-
// Generate new random keypair instead (identityFromSeed will have non-deterministic PQ keys)
|
|
399
|
-
const mlkem = new MlKem768();
|
|
400
|
-
const [publicKey, secretKey] = await mlkem.generateKeyPair();
|
|
401
|
-
mlKemPublicKey = publicKey;
|
|
402
|
-
mlKemSecretKey = secretKey;
|
|
403
|
-
}
|
|
404
|
-
catch (err) {
|
|
405
|
-
console.warn('[xBind] ML-KEM-768 keygen failed, using classical crypto only:', err);
|
|
406
|
-
}
|
|
407
|
-
// Generate ML-DSA-65 keypair only when opt-in flag is set
|
|
408
|
-
let mlDsaSecretKey;
|
|
409
|
-
let mlDsaPublicKey;
|
|
410
|
-
if (opts?.postQuantumSig) {
|
|
411
|
-
try {
|
|
412
|
-
const mlDsaBits = new Uint8Array(await crypto.subtle.deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(32), info: new TextEncoder().encode('ml-dsa-65') }, baseKey, 256));
|
|
413
|
-
// Import seed and generate deterministic keypair
|
|
414
|
-
const privateKey = await mldsa.importKey('raw-seed', mlDsaBits, 'ML-DSA-65', true, ['sign']);
|
|
415
|
-
const publicKey = await mldsa.getPublicKey(privateKey, ['verify']);
|
|
416
|
-
const publicKeyRaw = await mldsa.exportKey('raw-public', publicKey);
|
|
417
|
-
mlDsaPublicKey = new Uint8Array(publicKeyRaw);
|
|
418
|
-
mlDsaSecretKey = mlDsaBits; // Store the seed for later use
|
|
419
|
-
}
|
|
420
|
-
catch (err) {
|
|
421
|
-
console.warn('[xBind] ML-DSA-65 keygen failed, using classical crypto only:', err);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
return importIdentity(edPkcs8, x25519Pkcs8, mlKemSecretKey, mlKemPublicKey, mlDsaSecretKey, mlDsaPublicKey);
|
|
425
|
-
}
|
|
426
|
-
catch {
|
|
427
|
-
return err('KEYGEN_FAILED');
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Extract the raw 32-byte Ed25519 private key from a PKCS8 DER blob.
|
|
432
|
-
*
|
|
433
|
-
* Strips the 16-byte ASN.1 header. Validates prefix matches Ed25519 OID.
|
|
434
|
-
*
|
|
435
|
-
* @param pkcs8 - 48-byte PKCS8 DER for Ed25519.
|
|
436
|
-
* @returns 32-byte raw private key or error.
|
|
437
|
-
*/
|
|
438
|
-
export function extractRawEd25519(pkcs8) {
|
|
439
|
-
if (pkcs8.length !== ED25519_PKCS8_PREFIX.length + 32) {
|
|
440
|
-
return err('INVALID_KEY_LENGTH');
|
|
441
|
-
}
|
|
442
|
-
for (let i = 0; i < ED25519_PKCS8_PREFIX.length; i++) {
|
|
443
|
-
if (pkcs8[i] !== ED25519_PKCS8_PREFIX[i])
|
|
444
|
-
return err('IMPORT_FAILED');
|
|
445
|
-
}
|
|
446
|
-
return ok(pkcs8.slice(ED25519_PKCS8_PREFIX.length));
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Extract the raw 32-byte X25519 private key from a PKCS8 DER blob.
|
|
450
|
-
*
|
|
451
|
-
* Strips the 16-byte ASN.1 header. Validates prefix matches X25519 OID.
|
|
452
|
-
*
|
|
453
|
-
* @param pkcs8 - 48-byte PKCS8 DER for X25519.
|
|
454
|
-
* @returns 32-byte raw private key or error.
|
|
455
|
-
*/
|
|
456
|
-
export function extractRawX25519(pkcs8) {
|
|
457
|
-
if (pkcs8.length !== X25519_PKCS8_PREFIX.length + 32) {
|
|
458
|
-
return err('INVALID_KEY_LENGTH');
|
|
459
|
-
}
|
|
460
|
-
for (let i = 0; i < X25519_PKCS8_PREFIX.length; i++) {
|
|
461
|
-
if (pkcs8[i] !== X25519_PKCS8_PREFIX[i])
|
|
462
|
-
return err('IMPORT_FAILED');
|
|
463
|
-
}
|
|
464
|
-
return ok(pkcs8.slice(X25519_PKCS8_PREFIX.length));
|
|
465
|
-
}
|
|
466
|
-
/* ── Base58btc (internal) ── */
|
|
467
|
-
/** Encode bytes to base58btc string. */
|
|
468
|
-
function base58btcEncode(bytes) {
|
|
469
|
-
let zeros = 0;
|
|
470
|
-
for (const b of bytes) {
|
|
471
|
-
if (b !== 0)
|
|
472
|
-
break;
|
|
473
|
-
zeros++;
|
|
474
|
-
}
|
|
475
|
-
let num = 0n;
|
|
476
|
-
for (const b of bytes) {
|
|
477
|
-
num = num * 256n + BigInt(b);
|
|
478
|
-
}
|
|
479
|
-
const chars = [];
|
|
480
|
-
while (num > 0n) {
|
|
481
|
-
const ch = BASE58_ALPHABET[Number(num % 58n)];
|
|
482
|
-
if (ch !== undefined)
|
|
483
|
-
chars.unshift(ch);
|
|
484
|
-
num = num / 58n;
|
|
485
|
-
}
|
|
486
|
-
for (let i = 0; i < zeros; i++) {
|
|
487
|
-
chars.unshift('1');
|
|
488
|
-
}
|
|
489
|
-
return chars.join('');
|
|
490
|
-
}
|
|
491
|
-
/** Decode base58btc string to bytes. */
|
|
492
|
-
function base58btcDecode(str) {
|
|
493
|
-
let zeros = 0;
|
|
494
|
-
for (const c of str) {
|
|
495
|
-
if (c !== '1')
|
|
496
|
-
break;
|
|
497
|
-
zeros++;
|
|
498
|
-
}
|
|
499
|
-
let num = 0n;
|
|
500
|
-
for (const c of str) {
|
|
501
|
-
const idx = BASE58_ALPHABET.indexOf(c);
|
|
502
|
-
if (idx === -1)
|
|
503
|
-
throw new Error('Invalid base58 character');
|
|
504
|
-
num = num * 58n + BigInt(idx);
|
|
505
|
-
}
|
|
506
|
-
if (num === 0n)
|
|
507
|
-
return new Uint8Array(zeros);
|
|
508
|
-
const hex = num.toString(16);
|
|
509
|
-
const paddedHex = hex.length % 2 ? '0' + hex : hex;
|
|
510
|
-
const byteLen = paddedHex.length / 2;
|
|
511
|
-
const result = new Uint8Array(zeros + byteLen);
|
|
512
|
-
for (let i = 0; i < byteLen; i++) {
|
|
513
|
-
result[zeros + i] = parseInt(paddedHex.slice(i * 2, i * 2 + 2), 16);
|
|
514
|
-
}
|
|
515
|
-
return result;
|
|
516
|
-
}
|
|
1
|
+
import{ok,err}from"./_deps/shared/index.js";import{fromBase64Url}from"./crypto-utils.js";import{createMlKem768}from"mlkem";import mldsa from"./_deps/mldsa-wasm/dist/mldsa.js";const ED25519_MULTICODEC=new Uint8Array([237,1]),BASE58_ALPHABET="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";function toArrayBuffer(e){const r=new ArrayBuffer(e.byteLength);return new Uint8Array(r).set(e),r}export async function generateIdentity(e){try{const r=await crypto.subtle.generateKey("Ed25519",!0,["sign","verify"]),t=new Uint8Array(await crypto.subtle.exportKey("raw",r.publicKey)),n=publicKeyToDid(t),a=await crypto.subtle.generateKey({name:"X25519"},!0,["deriveBits"]),i=new Uint8Array(await crypto.subtle.exportKey("raw",a.publicKey));let o,c,y,s;try{const e=await createMlKem768(),[r,t]=e.generateKeyPair();o=r,c=t}catch(e){console.warn("[xBind] ML-KEM-768 keygen failed, using classical crypto only:",e)}if(e?.postQuantumSig)try{const e=await mldsa.generateKey("ML-DSA-65",!0,["sign","verify"]),r=await mldsa.exportKey("raw-public",e.publicKey),t=await mldsa.exportKey("raw-seed",e.privateKey);y=new Uint8Array(r),s=new Uint8Array(t)}catch(e){console.warn("[xBind] ML-DSA-65 keygen failed, using classical crypto only:",e)}return ok({did:n,publicKey:r.publicKey,privateKey:r.privateKey,rawPublicKey:t,x25519PrivateKey:a.privateKey,x25519PublicKey:a.publicKey,rawX25519PublicKey:i,...o?{mlKemPublicKey:o}:{},...c?{mlKemSecretKey:c}:{},...y?{mlDsaPublicKey:y}:{},...s?{mlDsaSecretKey:s}:{}})}catch{return err("KEYGEN_FAILED")}}export async function sign(e,r){try{const t=new Uint8Array(await crypto.subtle.sign("Ed25519",e,toArrayBuffer(r)));return ok(t)}catch{return err("SIGN_FAILED")}}export async function verify(e,r,t){try{const n=await crypto.subtle.verify("Ed25519",e,toArrayBuffer(r),toArrayBuffer(t));return ok(n)}catch{return err("VERIFY_FAILED")}}export async function importPublicKey(e){if(32!==e.length)return err("INVALID_KEY_LENGTH");try{const r=await crypto.subtle.importKey("raw",toArrayBuffer(e),"Ed25519",!0,["verify"]);return ok(r)}catch{return err("KEYGEN_FAILED")}}export function publicKeyToDid(e){const r=new Uint8Array(2+e.length);return r.set(ED25519_MULTICODEC),r.set(e,2),`did:key:z${base58btcEncode(r)}`}export function didToPublicKeyBytes(e){if(!e.startsWith("did:key:z"))return err("INVALID_DID");try{const r=base58btcDecode(e.slice(9));return 237!==r[0]||1!==r[1]||34!==r.length?err("INVALID_DID"):ok(r.slice(2))}catch{return err("INVALID_DID")}}export async function exportPKCS8(e){try{const r=await crypto.subtle.exportKey("pkcs8",e);return ok(new Uint8Array(r))}catch{return err("EXPORT_FAILED")}}export async function exportX25519PKCS8(e){try{const r=await crypto.subtle.exportKey("pkcs8",e);return ok(new Uint8Array(r))}catch{return err("EXPORT_FAILED")}}export async function importFromPKCS8(e){try{const r=await crypto.subtle.importKey("pkcs8",toArrayBuffer(e),"Ed25519",!0,["sign"]),t=await crypto.subtle.exportKey("jwk",r);if(!t.x)return err("IMPORT_FAILED");const n=fromBase64Url(t.x),a=await crypto.subtle.importKey("raw",toArrayBuffer(n),"Ed25519",!0,["verify"]),i=publicKeyToDid(n),o=await crypto.subtle.generateKey({name:"X25519"},!0,["deriveBits"]),c=new Uint8Array(await crypto.subtle.exportKey("raw",o.publicKey));return ok({did:i,publicKey:a,privateKey:r,rawPublicKey:n,x25519PrivateKey:o.privateKey,x25519PublicKey:o.publicKey,rawX25519PublicKey:c})}catch{return err("IMPORT_FAILED")}}export async function importIdentity(e,r,t,n,a,i){try{const o=await crypto.subtle.importKey("pkcs8",toArrayBuffer(e),"Ed25519",!0,["sign"]),c=await crypto.subtle.exportKey("jwk",o);if(!c.x)return err("IMPORT_FAILED");const y=fromBase64Url(c.x),s=await crypto.subtle.importKey("raw",toArrayBuffer(y),"Ed25519",!0,["verify"]),l=publicKeyToDid(y),u=await crypto.subtle.importKey("pkcs8",toArrayBuffer(r),{name:"X25519"},!0,["deriveBits"]),K=await crypto.subtle.exportKey("jwk",u);if(!K.x)return err("IMPORT_FAILED");const p=fromBase64Url(K.x),f=await crypto.subtle.importKey("raw",toArrayBuffer(p),{name:"X25519"},!0,[]);return ok({did:l,publicKey:s,privateKey:o,rawPublicKey:y,x25519PrivateKey:u,x25519PublicKey:f,rawX25519PublicKey:p,...t?{mlKemSecretKey:t}:{},...n?{mlKemPublicKey:n}:{},...a?{mlDsaSecretKey:a}:{},...i?{mlDsaPublicKey:i}:{}})}catch{return err("IMPORT_FAILED")}}export function exportMlKemSecretKey(e){return e.mlKemSecretKey}export function exportMlKemPublicKey(e){return e.mlKemPublicKey}export const ML_DSA65_SIG_BYTES=3309;export const ML_DSA65_PK_BYTES=1952;export const ML_DSA65_SK_BYTES=32;export async function signMlDsa65(e,r){try{const t=await mldsa.importKey("raw-seed",toArrayBuffer(e),"ML-DSA-65",!1,["sign"]),n=await mldsa.sign("ML-DSA-65",t,toArrayBuffer(r));return ok(new Uint8Array(n))}catch{return err("SIGN_FAILED")}}export async function verifyMlDsa65(e,r,t){try{const n=await mldsa.importKey("raw-public",toArrayBuffer(e),"ML-DSA-65",!1,["verify"]),a=await mldsa.verify("ML-DSA-65",n,toArrayBuffer(r),toArrayBuffer(t));return ok(a)}catch{return err("VERIFY_FAILED")}}export function exportMlDsaSecretKey(e){return e.mlDsaSecretKey}export function exportMlDsaPublicKey(e){return e.mlDsaPublicKey}const ED25519_PKCS8_PREFIX=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]),X25519_PKCS8_PREFIX=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);export async function identityFromSeed(e,r){if(32!==e.length)return err("INVALID_KEY_LENGTH");try{const t=await crypto.subtle.importKey("raw",toArrayBuffer(e),"HKDF",!1,["deriveBits"]),n=new Uint8Array(await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array(32),info:(new TextEncoder).encode("ed25519")},t,256)),a=new Uint8Array(await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array(32),info:(new TextEncoder).encode("x25519")},t,256)),i=new Uint8Array(await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array(32),info:(new TextEncoder).encode("ml-kem-768")},t,512)),o=new Uint8Array(ED25519_PKCS8_PREFIX.length+n.length);o.set(ED25519_PKCS8_PREFIX),o.set(n,ED25519_PKCS8_PREFIX.length);const c=new Uint8Array(X25519_PKCS8_PREFIX.length+a.length);let y,s,l,u;c.set(X25519_PKCS8_PREFIX),c.set(a,X25519_PKCS8_PREFIX.length);try{const e=await createMlKem768(),[r,t]=e.deriveKeyPair(i);y=r,s=t}catch(e){console.warn("[xBind] ML-KEM-768 keygen failed, using classical crypto only:",e)}if(r?.postQuantumSig)try{const e=new Uint8Array(await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array(32),info:(new TextEncoder).encode("ml-dsa-65")},t,256)),r=await mldsa.importKey("raw-seed",e,"ML-DSA-65",!0,["sign"]),n=await mldsa.getPublicKey(r,["verify"]),a=await mldsa.exportKey("raw-public",n);u=new Uint8Array(a),l=e}catch(e){console.warn("[xBind] ML-DSA-65 keygen failed, using classical crypto only:",e)}return importIdentity(o,c,s,y,l,u)}catch{return err("KEYGEN_FAILED")}}export function extractRawEd25519(e){if(e.length!==ED25519_PKCS8_PREFIX.length+32)return err("INVALID_KEY_LENGTH");for(let r=0;r<ED25519_PKCS8_PREFIX.length;r++)if(e[r]!==ED25519_PKCS8_PREFIX[r])return err("IMPORT_FAILED");return ok(e.slice(ED25519_PKCS8_PREFIX.length))}export function extractRawX25519(e){if(e.length!==X25519_PKCS8_PREFIX.length+32)return err("INVALID_KEY_LENGTH");for(let r=0;r<X25519_PKCS8_PREFIX.length;r++)if(e[r]!==X25519_PKCS8_PREFIX[r])return err("IMPORT_FAILED");return ok(e.slice(X25519_PKCS8_PREFIX.length))}export async function rotateKeys(e){try{const r=e.rotatedKeys??[],t={rotatedAt:Date.now(),x25519PrivateKey:e.x25519PrivateKey,mlKemSecretKey:e.mlKemSecretKey},n=await crypto.subtle.generateKey({name:"X25519"},!0,["deriveBits"]),a=new Uint8Array(await crypto.subtle.exportKey("raw",n.publicKey));let i,o;if(e.mlKemPublicKey||e.mlKemSecretKey)try{const e=await createMlKem768(),[r,t]=e.generateKeyPair();i=r,o=t}catch(e){console.warn("[xBind] ML-KEM-768 rotation failed, using X25519 only:",e)}const c=[t,...r].slice(0,10);return ok({did:e.did,publicKey:e.publicKey,privateKey:e.privateKey,rawPublicKey:e.rawPublicKey,x25519PrivateKey:n.privateKey,x25519PublicKey:n.publicKey,rawX25519PublicKey:a,mlKemPublicKey:i,mlKemSecretKey:o,mlDsaPublicKey:e.mlDsaPublicKey,mlDsaSecretKey:e.mlDsaSecretKey,rotatedKeys:c})}catch{return err("ROTATION_FAILED")}}function base58btcEncode(e){let r=0;for(const t of e){if(0!==t)break;r++}let t=0n;for(const r of e)t=256n*t+BigInt(r);const n=[];for(;t>0n;){const e=BASE58_ALPHABET[Number(t%58n)];void 0!==e&&n.unshift(e),t/=58n}for(let e=0;e<r;e++)n.unshift("1");return n.join("")}function base58btcDecode(e){let r=0;for(const t of e){if("1"!==t)break;r++}let t=0n;for(const r of e){const e=BASE58_ALPHABET.indexOf(r);if(-1===e)throw new Error("Invalid base58 character");t=58n*t+BigInt(e)}if(0n===t)return new Uint8Array(r);const n=t.toString(16),a=n.length%2?"0"+n:n,i=a.length/2,o=new Uint8Array(r+i);for(let e=0;e<i;e++)o[r+e]=parseInt(a.slice(2*e,2*e+2),16);return o}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export type { InitOptions, RuntimeTemplate } from './cli/init.js';
|
|
2
2
|
export { initCommand, main as cliMain } from './cli/init.js';
|
|
3
|
-
export type { AgentIdentity, IdentityError } from './identity.js';
|
|
4
|
-
export { generateIdentity, sign, verify, importPublicKey, publicKeyToDid, didToPublicKeyBytes, exportPKCS8, exportX25519PKCS8, importFromPKCS8, importIdentity, identityFromSeed, extractRawEd25519, extractRawX25519, exportMlKemSecretKey, exportMlKemPublicKey, signMlDsa65, verifyMlDsa65, exportMlDsaSecretKey, exportMlDsaPublicKey, ML_DSA65_SIG_BYTES, ML_DSA65_PK_BYTES, ML_DSA65_SK_BYTES, } from './identity.js';
|
|
3
|
+
export type { AgentIdentity, IdentityError, RotatedKeys } from './identity.js';
|
|
4
|
+
export { generateIdentity, sign, verify, importPublicKey, publicKeyToDid, didToPublicKeyBytes, exportPKCS8, exportX25519PKCS8, importFromPKCS8, importIdentity, identityFromSeed, extractRawEd25519, extractRawX25519, exportMlKemSecretKey, exportMlKemPublicKey, signMlDsa65, verifyMlDsa65, exportMlDsaSecretKey, exportMlDsaPublicKey, rotateKeys, ML_DSA65_SIG_BYTES, ML_DSA65_PK_BYTES, ML_DSA65_SK_BYTES, } from './identity.js';
|
|
5
5
|
export type { TransportEnvelope, TransportEnvelopeV2, TransportEnvelopeV3, TransportEnvelopeV4, AnyTransportEnvelope, CreateEnvelopeOptions, CreateEnvelopeV2Options, CreateEnvelopeV3Options, CreateEnvelopeV4Options, CreateSignedEnvelopeOptions, EnvelopeError, } from './envelope.js';
|
|
6
6
|
export { createEnvelope, createEnvelopeV2, createEnvelopeV3, createEnvelopeV4, decryptPayload, serializeEnvelope, deserializeEnvelope, validateEnvelope, generateSharedKey, createSignedEnvelope, openSignedEnvelope, } from './envelope.js';
|
|
7
|
-
export type { NonceStore, MemoryNonceStoreOptions } from './nonce-store.js';
|
|
7
|
+
export type { NonceStore, MemoryNonceStoreOptions, ShareContext } from './nonce-store.js';
|
|
8
8
|
export { MemoryNonceStore } from './nonce-store.js';
|
|
9
9
|
export type { RedisClient, RedisNonceStoreOptions } from './redis-nonce-store.js';
|
|
10
10
|
export { RedisNonceStore } from './redis-nonce-store.js';
|
|
@@ -12,12 +12,20 @@ export type { XailTransportAdapter, TransportError, EnvelopeHandler, HttpsTransp
|
|
|
12
12
|
export { HttpsTransportAdapter } from './transport.js';
|
|
13
13
|
export type { RetryOptions } from './retry-transport.js';
|
|
14
14
|
export { RetryTransportAdapter } from './retry-transport.js';
|
|
15
|
+
export type { RetryContext, RetryDecision, ExponentialBackoffConfig, LinearBackoffConfig, FixedDelayConfig, CircuitBreakerConfig, CircuitState, CircuitBreakerStats, IRetryStrategy, } from './retry-strategies.js';
|
|
16
|
+
export { ExponentialBackoffStrategy, LinearBackoffStrategy, FixedDelayStrategy, NoRetryStrategy, CircuitBreaker, RetryStrategy, executeWithRetry, } from './retry-strategies.js';
|
|
17
|
+
export type { TimeoutConfigOptions } from './timeouts.js';
|
|
18
|
+
export { TimeoutConfig, OperationTimeoutController, TimeoutError, createTimeoutController, withTimeout, withTimeoutResult, createOperationTimeoutSignal, createOperationTimeout, isTimeoutError, getTimeoutFromError, createTimeoutConfigFromEnv, globalTimeoutConfig, DEFAULT_TIMEOUTS, } from './timeouts.js';
|
|
19
|
+
export type { QoSLevel, OperationContext, CacheConfig, RetryConfig, CacheEntry, ServiceStatus, } from './graceful-degradation.js';
|
|
20
|
+
export { GracefulDegradationManager, registryLookupWithFallback, sendWithTransportFallback, enhanceError, } from './graceful-degradation.js';
|
|
15
21
|
export type { TrustRegistry, RegistryEntry, RegistryError, HttpTrustRegistryOptions, FileTrustRegistryOptions, } from './trust-registry.js';
|
|
16
22
|
export { MemoryTrustRegistry, HttpTrustRegistry, FileTrustRegistry, createEnterpriseTrustRegistry, } from './trust-registry.js';
|
|
17
23
|
export type { EphemeralKeyPair, KeyAgreementResult, HybridKeyAgreementResult, KeyAgreementError, } from './key-agreement.js';
|
|
18
24
|
export { generateEphemeralKeyPair, importX25519PublicKey, deriveSharedKeyECDH, senderKeyAgreement, receiverKeyAgreement, combineSharedSecrets, senderHybridKeyAgreement, receiverHybridKeyAgreement, } from './key-agreement.js';
|
|
19
25
|
export type { AgentOptions, AgentCreateOptions, AgentSendOptions, AgentMessage, AgentError, AgentReceiveOptions, AgentErrorDetail, } from './agent.js';
|
|
20
26
|
export { Agent, parseAgentError } from './agent.js';
|
|
27
|
+
export type { MessageStreamOptions, CollectOptions, } from './async-iterators.js';
|
|
28
|
+
export { MessageStream, collectMessages, mapStream, filterStream, takeStream, mergeStreams, installAsyncIterators, } from './async-iterators.js';
|
|
21
29
|
export type { AgentCallOptions, PolicyConstraints, FieldFilter, ProgressEvent, AuditReceipt, CallResult, ResultFormats, } from './agent-call.js';
|
|
22
30
|
export { call, batchCall, stream, AgentErrorCode, ERROR_DETAILS, setToolRegistry, getToolRegistry, } from './agent-call.js';
|
|
23
31
|
export { AgentError as AgentCallError } from './agent-call.js';
|
|
@@ -49,8 +57,12 @@ export type { XchangeKey, XchangeError } from '@private.me/xchange';
|
|
|
49
57
|
export { generateXchangeKey, xchangeEncrypt, xchangeDecrypt } from '@private.me/xchange';
|
|
50
58
|
export { AES_KEY_BYTES, AES_IV_BYTES, BUNDLE_HEADER_BYTES } from '@private.me/xchange';
|
|
51
59
|
export { XBindError, XBindIdentityError, XBindEnvelopeError, XBindTransportError, XBindRegistryError, XBindKeyAgreementError, XBindSplitChannelError, XBindAgentError, toXBindError, isXBindError, createXBindErrorDetail, } from './errors.js';
|
|
60
|
+
export type { ValidationResult } from './config-validation.js';
|
|
61
|
+
export { ConfigValidationError, validateAgentOptions, validateAgentCreateOptions, getValidationDetails, assertValidConfig, assertValidCreateConfig, AGENT_OPTIONS_DEFAULTS, AGENT_CREATE_OPTIONS_DEFAULTS, } from './config-validation.js';
|
|
52
62
|
export type { ProgressCallback, ACIErrorDetail, ACIErrorOptions, PaginationOptions, PaginatedResult, SearchOptions, } from '@private.me/ux-helpers';
|
|
53
63
|
export { ProgressReporter, createStagedProgress, createDetailedError, formatErrorForUser, formatErrorForLog, isACIError, toACIError, paginate, createPaginationMetadata, search, } from '@private.me/ux-helpers';
|
|
64
|
+
export type { EnhancedProgressEvent, EnhancedProgressCallback, ProgressMetadata, OperationStage, OperationProgressOptions, } from './progress-callbacks.js';
|
|
65
|
+
export { OperationProgressTracker, TransferProgressTracker, ShareDistributionTracker, EncryptionProgressTracker, } from './progress-callbacks.js';
|
|
54
66
|
export type { ServiceInfo, DiscoveryError } from './discovery.js';
|
|
55
67
|
export { ServiceDiscovery, DiscoveryErrorCode } from './discovery.js';
|
|
56
68
|
export type { MdnsServiceInfo, DiscoveryError as MdnsDiscoveryError, DiscoveryErrorCode as MdnsDiscoveryErrorCode } from './mdns-discovery.js';
|
|
@@ -81,5 +93,35 @@ export type { SubscriptionProof, ProofError } from './subscription-proof.js';
|
|
|
81
93
|
export { createSubscriptionProof, verifySubscriptionProof, resumeSubscription, hashBloomFilter, } from './subscription-proof.js';
|
|
82
94
|
export type { BackupConfig, BackupShare, BackupError } from './backup-config.js';
|
|
83
95
|
export { DEFAULT_BACKUP_CONFIG, validateBackupConfig, splitKeyWithBackup, reconstructKeyFromBackup, } from './backup-config.js';
|
|
96
|
+
export type { EncryptedBackup, BackupError as EncryptedBackupError } from './backup.js';
|
|
97
|
+
export { exportBackup, importBackup } from './backup.js';
|
|
84
98
|
export type { CorrelationIdSpec } from './correlation-id.js';
|
|
85
99
|
export { generateCorrelationId, validateCorrelationId, parseCorrelationId, attachCorrelationId, extractCorrelationId, getOrCreateCorrelationId, createCorrelationIdFromTimestamp, getCorrelationIdAge, isCorrelationIdExpired, correlationIdMiddleware, CORRELATION_ID_HEADER, CORRELATION_ID_ALIASES, } from './correlation-id.js';
|
|
100
|
+
export type { Logger, LogContext } from './logger.js';
|
|
101
|
+
export { createLogger, LogLevel, getGlobalLogger, setGlobalLogger, logger, } from './logger.js';
|
|
102
|
+
export type { TimeoutController, TimeoutOptions, CleanupCallback, } from './cancellation.js';
|
|
103
|
+
export { CancellationError, createTimeoutSignal, combineSignals, onCancellation, throwIfAborted, withCancellation, delay, withRetry, createCancellationController, isCancellationError, } from './cancellation.js';
|
|
104
|
+
export type { DebugModeOptions, PerformanceMeasurement, NetworkTrace, CryptoTrace, AgentStateSnapshot, } from './debug-mode.js';
|
|
105
|
+
export { enableDebugMode, disableDebugMode, isDebugEnabled, getDebugOptions, createDebugLogger, startProfiling, endProfiling, getPerformanceMeasurements, clearPerformanceMeasurements, traceNetworkRequest, traceNetworkResponse, getNetworkTraces, clearNetworkTraces, traceCryptoOperation, getCryptoTraces, clearCryptoTraces, dumpState, getStateSnapshots, clearStateSnapshots, exportDebugData, clearAllDebugData, generateDebugReport, } from './debug-mode.js';
|
|
106
|
+
export type { VersionInfo, DeprecatedFeature, CompatibilityResult, } from './version-info.js';
|
|
107
|
+
export { getVersion, hasCapability, getCapabilities, getDeprecationInfo, warnIfDeprecated, parseVersion, compareVersions, checkCompatibility, getMinimumVersionFor, assertMinimumVersion, Capability, } from './version-info.js';
|
|
108
|
+
export type { HealthChecker, HealthStatus, ComponentHealth, ProbeType, HealthCheckerOptions, } from './health-check.js';
|
|
109
|
+
export { createHealthChecker, healthEndpoint } from './health-check.js';
|
|
110
|
+
export type { BatchSendOptions, BatchReceiveOptions, BatchRegistryOptions, BatchOperationResult, BatchSummary, RegistryOperation, } from './batch-operations.js';
|
|
111
|
+
export { batchSend, batchReceive, batchRegistryOps, batchResolve, batchGetEntries, BatchOperationError, } from './batch-operations.js';
|
|
112
|
+
export type { RuntimeEnvironment, BrowserStorage, BrowserCapabilities, WasmError, ServiceWorkerConfig, } from './runtime/browser.js';
|
|
113
|
+
export { detectRuntime, isBrowser, isNode, isServiceWorker, getRandomBytes, generateUUID, LocalStorageAdapter, IndexedDBAdapter, MemoryStorageAdapter, isWasmSupported, loadWasmModule, detectCapabilities, installNodePolyfills, initServiceWorker, DEFAULT_SERVICE_WORKER_CONFIG, } from './runtime/browser.js';
|
|
114
|
+
export type { XBindEventMap, XBindBaseEvent, MessageSentEvent, MessageReceivedEvent, KeyRotatedEvent, ErrorEvent, ConnectionStatusEvent, ConnectionStatus, EventListener, EmitOptions, ListenerOptions, EventEmitterErrorCode, } from './event-emitter.js';
|
|
115
|
+
export { XBindEventEmitter, createScopedEmitter, } from './event-emitter.js';
|
|
116
|
+
export type { Plugin, PluginContext, HookResult, } from './plugin-system.js';
|
|
117
|
+
export { MiddlewareChain, createPluginContext, createPlugin, PluginBuilder, } from './plugin-system.js';
|
|
118
|
+
export { LoggingPlugin, createLoggingPlugin } from './plugins/logging.js';
|
|
119
|
+
export type { LogEntry, LoggingPluginOptions } from './plugins/logging.js';
|
|
120
|
+
export { MetricsPlugin, createMetricsPlugin } from './plugins/metrics.js';
|
|
121
|
+
export type { MetricEntry, AggregatedMetrics, MetricsPluginOptions, } from './plugins/metrics.js';
|
|
122
|
+
export { ValidationPlugin, createValidationPlugin, CommonRules } from './plugins/validation.js';
|
|
123
|
+
export type { ValidationRule, ValidationPluginOptions, } from './plugins/validation.js';
|
|
124
|
+
export type { SerializationFormat, SerializationOptions, SerializedData, DeserializedData, SerializationMetrics, SerializationError, Serializer, } from './serialization.js';
|
|
125
|
+
export { serialize, deserialize, detectFormat, negotiateFormat, compareFormats, getContentType, parseContentType, } from './serialization.js';
|
|
126
|
+
export type { ConnectionPoolOptions, ConnectionPoolMetrics, } from './connection-pool.js';
|
|
127
|
+
export { ConnectionPool, getGlobalPool, resetGlobalPool, } from './connection-pool.js';
|