@invisible-labs/sdk 0.6.0-devnet.3 → 0.6.0-devnet.5

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.
Files changed (45) hide show
  1. package/README.md +129 -15
  2. package/dist/.invisible-sdk-build-target.json +7 -0
  3. package/dist/{chunk-QQSI3ZD7.js → chunk-3MDHAS4D.js} +109 -17
  4. package/dist/chunk-3MDHAS4D.js.map +1 -0
  5. package/dist/{chunk-NKRVQXRP.js → chunk-3TGQ4CZ3.js} +297 -11
  6. package/dist/chunk-3TGQ4CZ3.js.map +1 -0
  7. package/dist/chunk-DCTYBUY3.js +258 -0
  8. package/dist/chunk-DCTYBUY3.js.map +1 -0
  9. package/dist/{chunk-NHEHCUS5.js → chunk-EBWTAXNT.js} +3 -3
  10. package/dist/{chunk-NHEHCUS5.js.map → chunk-EBWTAXNT.js.map} +1 -1
  11. package/dist/{chunk-V5HXJRBW.js → chunk-HJFMDMPY.js} +3 -3
  12. package/dist/chunk-HJFMDMPY.js.map +1 -0
  13. package/dist/{chunk-GHBQF3A7.js → chunk-QRN46R3F.js} +5 -2
  14. package/dist/chunk-QRN46R3F.js.map +1 -0
  15. package/dist/chunk-Y7AK6RBV.js +4189 -0
  16. package/dist/chunk-Y7AK6RBV.js.map +1 -0
  17. package/dist/{coordinator-VVJ33WF2.js → coordinator-PEWHNZ7I.js} +3 -3
  18. package/dist/{coordinator-VVJ33WF2.js.map → coordinator-PEWHNZ7I.js.map} +1 -1
  19. package/dist/events.js +3 -3
  20. package/dist/index.d.ts +69 -353
  21. package/dist/index.js +161 -43
  22. package/dist/index.js.map +1 -1
  23. package/dist/lp.d.ts +76 -18
  24. package/dist/lp.js +511 -111
  25. package/dist/lp.js.map +1 -1
  26. package/dist/presets.d.ts +7 -40
  27. package/dist/presets.js +10 -68
  28. package/dist/presets.js.map +1 -1
  29. package/dist/stats.js +1 -1
  30. package/dist/storage.js +2 -243
  31. package/dist/storage.js.map +1 -1
  32. package/dist/{errors-N2touVm4.d.ts → types.generated-YhFu9ZBR.d.ts} +65 -4
  33. package/dist/user.d.ts +134 -8
  34. package/dist/user.js +991 -250
  35. package/dist/user.js.map +1 -1
  36. package/package.json +5 -31
  37. package/dist/chunk-BWCGNTN5.js +0 -1153
  38. package/dist/chunk-BWCGNTN5.js.map +0 -1
  39. package/dist/chunk-DIA6U2CV.js +0 -1927
  40. package/dist/chunk-DIA6U2CV.js.map +0 -1
  41. package/dist/chunk-GHBQF3A7.js.map +0 -1
  42. package/dist/chunk-NKRVQXRP.js.map +0 -1
  43. package/dist/chunk-QQSI3ZD7.js.map +0 -1
  44. package/dist/chunk-V5HXJRBW.js.map +0 -1
  45. package/dist/types.generated-BSEBz4jR.d.ts +0 -68
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/exponentialBackoff.ts","../src/transport/stateController.ts","../src/transport/noiseWebSocketTransport.ts","../src/storage/clientPersistence.ts","../src/attestation/verifier.ts","../src/transport/noiseXx.ts","../src/session/secureChannel.ts","../src/transport/handshake.ts","../src/schemas/payoutPolicy.schema.json","../src/schemas/coordinatorPoolConfig.schema.json","../src/schemas/lpPositionView.schema.json","../src/schemas/storageEnvelope.schema.json","../src/validation/ajv.ts","../src/attestation/reattest.ts","../src/session/createSession.ts"],"names":["bytesToHex","hexToBytes","cursor","sha256Hash","err"],"mappings":"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","file":"chunk-Y7AK6RBV.js","sourcesContent":["export interface ExponentialBackoffOptions {\n readonly initialDelayMs: number;\n readonly maxDelayMs: number;\n readonly multiplier?: number;\n readonly jitterRatio?: number;\n readonly random?: () => number;\n}\n\nexport interface ExponentialBackoff {\n nextDelayMs(): number;\n reset(): void;\n}\n\n/**\n * Stateful exponential backoff shared by reconnecting SDK consumers.\n * Jitter avoids synchronized reconnect storms while reset makes a healthy\n * connection return to the normal cadence.\n */\nexport function createExponentialBackoff(options: ExponentialBackoffOptions): ExponentialBackoff {\n if (!Number.isFinite(options.initialDelayMs) || options.initialDelayMs <= 0) {\n throw new Error(\"initialDelayMs must be a positive finite number\");\n }\n if (!Number.isFinite(options.maxDelayMs) || options.maxDelayMs < options.initialDelayMs) {\n throw new Error(\"maxDelayMs must be finite and >= initialDelayMs\");\n }\n if (\n options.multiplier !== undefined &&\n (!Number.isFinite(options.multiplier) || options.multiplier < 1)\n ) {\n throw new Error(\"multiplier must be finite and >= 1\");\n }\n if (\n options.jitterRatio !== undefined &&\n (!Number.isFinite(options.jitterRatio) || options.jitterRatio < 0 || options.jitterRatio > 1)\n ) {\n throw new Error(\"jitterRatio must be between 0 and 1\");\n }\n\n const initialDelayMs = options.initialDelayMs;\n const maxDelayMs = options.maxDelayMs;\n const multiplier = options.multiplier ?? 2;\n const jitterRatio = options.jitterRatio ?? 0;\n const random = options.random ?? Math.random;\n let attempt = 0;\n\n return {\n nextDelayMs(): number {\n const baseDelayMs = Math.min(maxDelayMs, initialDelayMs * multiplier ** attempt);\n attempt += 1;\n\n if (jitterRatio === 0) return Math.round(baseDelayMs);\n\n const lowerBound = baseDelayMs * (1 - jitterRatio);\n const upperBound = baseDelayMs * (1 + jitterRatio);\n const boundedRandom = Math.min(Math.max(random(), 0), 1);\n return Math.min(\n maxDelayMs,\n Math.round(lowerBound + (upperBound - lowerBound) * boundedRandom),\n );\n },\n reset(): void {\n attempt = 0;\n },\n };\n}\n","/**\n * A tiny observable state holder shared by the transports. Keeps the\n * lifecycle-transition plumbing in one place so each transport only decides\n * *when* to transition, not *how* to notify.\n */\n\nimport type { ConnectionState, Unsubscribe } from \"./types.js\";\n\nexport interface StateController {\n get(): ConnectionState;\n /** Set the state; notifies listeners only when the value actually changes. */\n set(next: ConnectionState): void;\n onChange(listener: (state: ConnectionState) => void): Unsubscribe;\n}\n\nexport function createStateController(initial: ConnectionState): StateController {\n let state = initial;\n const listeners = new Set<(state: ConnectionState) => void>();\n return {\n get: () => state,\n set(next) {\n if (next === state) return;\n state = next;\n for (const listener of listeners) listener(next);\n },\n onChange(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n","/**\n * WebSocket transport - the one genuinely functional piece of the skeleton.\n *\n * `connect()` opens a real WebSocket and drives the lifecycle\n * (`connecting -> open`, `-> closed` on close/error/abort). It is a pure byte\n * channel: the Noise XX handshake and TDX attestation are session-level steps\n * layered on top (see ./handshake), not part of opening the socket. `send`\n * writes one raw frame to the socket; the WebSocket message boundary is the\n * frame boundary, so there is no extra length prefix (Noise lives above).\n *\n * The WebSocket implementation is injected (default: the platform global\n * `WebSocket`, present in browsers and Node 22+), so tests connect to a local\n * mock server with no external network.\n */\n\nimport { TransportError } from \"../core/errors.js\";\nimport { createStateController } from \"./stateController.js\";\nimport type {\n NoiseWebSocketTransportOptions,\n Transport,\n Unsubscribe,\n WebSocketFactory,\n WebSocketLike,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 30_000;\n\nfunction defaultWebSocketFactory(url: string): WebSocketLike {\n const ctor = (globalThis as { WebSocket?: new (url: string) => WebSocketLike }).WebSocket;\n if (!ctor) {\n throw new TransportError(\n \"WS_HANDSHAKE_FAILED\",\n \"no global WebSocket available; pass options.webSocketFactory\",\n );\n }\n return new ctor(url);\n}\n\nfunction toUint8Array(data: unknown): Uint8Array {\n if (data instanceof Uint8Array) return data;\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n if (typeof data === \"string\") return new TextEncoder().encode(data);\n throw new TransportError(\"NOISE_FRAME_TOO_LARGE\", \"unsupported inbound frame type\");\n}\n\nexport function noiseWebSocketTransport(options: NoiseWebSocketTransportOptions): Transport {\n const factory: WebSocketFactory = options.webSocketFactory ?? defaultWebSocketFactory;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const sc = createStateController(\"idle\");\n const messageListeners = new Set<(frame: Uint8Array) => void>();\n let socket: WebSocketLike | null = null;\n\n function teardown() {\n if (sc.get() === \"closed\") return;\n sc.set(\"closing\");\n const ws = socket;\n socket = null;\n if (ws) {\n ws.onopen = null;\n ws.onerror = null;\n ws.onmessage = null;\n ws.onclose = null;\n try {\n ws.close();\n } catch {\n // Closing an already-closing socket is fine.\n }\n }\n sc.set(\"closed\");\n }\n\n return {\n state: () => sc.get(),\n onStateChange: (listener) => sc.onChange(listener),\n onMessage(listener): Unsubscribe {\n messageListeners.add(listener);\n return () => messageListeners.delete(listener);\n },\n\n connect(signal) {\n if (sc.get() === \"open\") return Promise.resolve();\n if (signal?.aborted) {\n return Promise.reject(\n new TransportError(\"CONNECTION_LOST\", \"connect aborted before it started\"),\n );\n }\n sc.set(\"connecting\");\n\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const ws = factory(options.wsUrl);\n socket = ws;\n ws.binaryType = \"arraybuffer\";\n\n const cleanupConnect = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n };\n const fail = (error: TransportError) => {\n if (settled) return;\n settled = true;\n cleanupConnect();\n teardown();\n reject(error);\n };\n const onAbort = () => fail(new TransportError(\"CONNECTION_LOST\", \"connect aborted\"));\n const timer = setTimeout(\n () =>\n fail(\n new TransportError(\n \"WS_HANDSHAKE_FAILED\",\n `connect timed out after ${connectTimeoutMs}ms`,\n ),\n ),\n connectTimeoutMs,\n );\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n ws.onopen = () => {\n if (settled) return;\n settled = true;\n cleanupConnect();\n // The socket is the live byte channel from here on.\n ws.onmessage = (event) => {\n const frame = toUint8Array(event.data);\n for (const listener of messageListeners) listener(frame);\n };\n ws.onclose = () => teardown();\n ws.onerror = () => teardown();\n sc.set(\"open\");\n resolve();\n };\n ws.onerror = () =>\n fail(new TransportError(\"WS_HANDSHAKE_FAILED\", \"socket error during connect\"));\n ws.onclose = () =>\n fail(new TransportError(\"CONNECTION_LOST\", \"socket closed during connect\"));\n });\n },\n\n send(frame: Uint8Array) {\n const ws = socket;\n if (sc.get() !== \"open\" || !ws) {\n throw new TransportError(\"CONNECTION_LOST\", \"cannot send on a non-open transport\");\n }\n // The WebSocket message boundary is the frame boundary: write the raw\n // bytes with no extra length prefix. Noise framing lives above this.\n ws.send(frame);\n },\n\n close() {\n teardown();\n },\n };\n}\n","import { StorageError, type StorageErrorPhase } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\nimport type { ClientSwapState, PayoutSpec, SpendingPolicySnapshot } from \"../core/transferTypes.js\";\nimport { getSessionState } from \"../session/state.js\";\nimport { getStorageBacking } from \"./coordination.js\";\nimport {\n browserStorage,\n extensionStorage,\n type BrowserStorageOptions,\n type ExtensionStorageOptions,\n type StorageAdapter,\n} from \"./index.js\";\n\nexport const CLIENT_PERSISTENCE_NAMESPACE = \"normal-user-transfers\";\nexport const CLIENT_PERSISTENCE_SCHEMA_VERSION = 1;\nexport const CLIENT_PERSISTENCE_MAX_RECORD_BYTES = 64 * 1024;\nexport const CLIENT_PERSISTENCE_MAX_RECORD_COUNT = 100;\nexport const CLIENT_PERSISTENCE_MAX_NAMESPACE_BYTES = 1024 * 1024;\n\nconst HEX_BYTE_LENGTH = 32;\nconst HEX_LENGTH = HEX_BYTE_LENGTH * 2;\nconst MAX_IDENTIFIER_LENGTH = 256;\nconst MAX_ADDRESS_LENGTH = 128;\nconst MAX_POLICY_DESTINATION_COUNT = CLIENT_PERSISTENCE_MAX_RECORD_COUNT;\nconst MAX_POLICY_JSON_BYTES = CLIENT_PERSISTENCE_MAX_RECORD_BYTES;\nconst CLIENT_PERSISTENCE_PROBE_KEY_PREFIX = \"__sdk_probe__\";\nconst CLIENT_PERSISTENCE_PROBE_BYTES = Uint8Array.from([0x53, 0x44, 0x4b, 0x31]);\nconst CLIENT_PERSISTENCE_NAMESPACE_GATE_KEY = \"__sdk_namespace_gate__\";\nconst PERSISTED_STAGE_VALUES = new Set<PersistedTransferStage>([\n \"allocation\",\n \"ready\",\n \"terminal-cleaned\",\n]);\nconst CLIENT_SWAP_STATE_VALUES = new Set<ClientSwapState>([\n \"new\",\n \"awaiting_dkg\",\n \"awaiting_deposit\",\n \"awaiting_delegation\",\n \"awaiting_delegate_ack\",\n \"awaiting_delegate_ack_after_deposit\",\n \"ready_for_settlement\",\n \"settling\",\n \"completed\",\n \"refunded\",\n \"failed\",\n]);\nconst SERIALIZED_RECORD_KEYS = new Set([\n \"schemaVersion\",\n \"stage\",\n \"swapId\",\n \"amountLamports\",\n \"destinationAddress\",\n \"policySnapshot\",\n \"status\",\n \"stateVersion\",\n \"updatedAtMs\",\n \"coordinatorTimestampMs\",\n \"depositAddress\",\n \"depositExpiresAtMs\",\n \"delegatedAtMs\",\n \"syncSecretHex\",\n \"recoveryCodeHex\",\n]);\nconst POLICY_SNAPSHOT_KEYS = new Set([\n \"asset\",\n \"entry_amount_lamports\",\n \"total_committed_lamports\",\n \"payout_deadline_ms\",\n \"payout_window_ms\",\n \"payout_schedule\",\n \"fragment_count\",\n \"payout_mode\",\n \"matching_mode\",\n \"fragmentation_allowed\",\n \"min_fee_bps\",\n \"fee_bps\",\n \"fee_lamports\",\n \"net_payout_lamports\",\n]);\nconst POLICY_DESTINATION_KEYS = new Set([\"destination_address\"]);\nconst HEX_PATTERN = /^[0-9a-f]+$/u;\n\ntype TerminalWriteBarrier = {\n activeNonTerminalWrites: number;\n activeTerminalWrites: number;\n terminalRequested: boolean;\n nonTerminalWaiters: Array<() => void>;\n};\n\ntype TerminalWriteHandle = {\n readonly waitForNonTerminalWrites: Promise<void>;\n release(): void;\n};\n\ntype NamespaceWriteGate = {\n activeKey: string | null;\n activeCount: number;\n exclusive: boolean;\n waiters: Array<{ readonly key: string; readonly resolve: () => void }>;\n};\n\n// ponytail: known wrappers share in-process gates by backing store; separate\n// browser contexts remain last-write-wins because StorageAdapter has no CAS.\nconst terminalWriteBarriers = new WeakMap<object, Map<string, TerminalWriteBarrier>>();\nconst namespaceWriteGates = new WeakMap<object, Map<string, NamespaceWriteGate>>();\nconst automaticStorageAdapters = new WeakMap<object, StorageAdapter>();\nlet clientPersistenceProbeSequence = 0;\n\nexport type PersistedTransferStage = \"allocation\" | \"ready\" | \"terminal-cleaned\";\n\n/** Public, local-only projection of an SDK-owned normal-user transfer record. */\nexport interface PersistedTransfer {\n readonly schemaVersion: typeof CLIENT_PERSISTENCE_SCHEMA_VERSION;\n readonly stage: PersistedTransferStage;\n readonly swapId: string;\n readonly amountLamports: number;\n readonly destinationAddress: string;\n readonly policySnapshot: SpendingPolicySnapshot;\n readonly status: ClientSwapState;\n readonly stateVersion?: number;\n readonly updatedAtMs: number;\n readonly coordinatorTimestampMs?: number;\n readonly depositAddress?: string;\n readonly depositExpiresAtMs?: number;\n readonly delegatedAtMs?: number;\n readonly syncSecret?: Uint8Array;\n readonly recoveryCode?: Uint8Array;\n}\n\ntype SerializedPersistedTransfer = Omit<PersistedTransfer, \"syncSecret\" | \"recoveryCode\"> & {\n readonly syncSecretHex?: string;\n readonly recoveryCodeHex?: string;\n};\n\nexport interface ClientPersistenceState {\n readonly enabled: boolean;\n readonly adapter: StorageAdapter | null;\n}\n\nexport function disabledClientPersistence(): ClientPersistenceState {\n return { enabled: false, adapter: null };\n}\n\nexport async function resolveClientPersistence(\n enabled: boolean,\n storage: unknown,\n): Promise<ClientPersistenceState> {\n if (!enabled) return disabledClientPersistence();\n\n let adapter: StorageAdapter | null = null;\n let automaticBackend: object | null = null;\n try {\n if (storage === undefined) {\n const selection = automaticStorageAdapter();\n adapter = selection.adapter;\n automaticBackend = selection.backend;\n } else {\n adapter = validateStorageAdapter(storage);\n }\n if (adapter === null) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"client persistence storage is unavailable\");\n }\n await probeStorage(adapter);\n return { enabled: true, adapter };\n } catch (error) {\n if (\n automaticBackend !== null &&\n adapter !== null &&\n automaticStorageAdapters.get(automaticBackend) === adapter\n ) {\n automaticStorageAdapters.delete(automaticBackend);\n }\n throw withContext(error, { phase: \"session-init\" });\n }\n}\n\nexport async function listPersistedTransfers(\n session: Session,\n): Promise<readonly PersistedTransfer[]> {\n const state = getSessionState(session).clientPersistence;\n const records = await readAllRecords(state, \"read\");\n return records.map(toPublicRecord);\n}\n\nexport async function getPersistedTransfer(\n session: Session,\n swapId: string,\n): Promise<PersistedTransfer | null> {\n const state = getSessionState(session).clientPersistence;\n assertSwapId(swapId, \"read\");\n if (isReservedPersistenceKey(swapId)) return null;\n const record = await readOptionalRecord(state, swapId, \"read\");\n return record === null ? null : toPublicRecord(record);\n}\n\nexport async function removePersistedTransfer(session: Session, swapId: string): Promise<void> {\n const state = getSessionState(session).clientPersistence;\n assertSwapId(swapId, \"remove\");\n const adapter = requireAdapter(state, \"remove\");\n const terminalWrite = beginTerminalWrite(state, swapId);\n try {\n await terminalWrite?.waitForNonTerminalWrites;\n await withNamespaceWriteGate(\n adapter,\n CLIENT_PERSISTENCE_NAMESPACE,\n swapId,\n () => adapter.remove(CLIENT_PERSISTENCE_NAMESPACE, swapId),\n { exclusive: true },\n );\n } catch (error) {\n throw withContext(error, { phase: \"remove\" });\n } finally {\n terminalWrite?.release();\n }\n}\n\nexport async function purgePersistedTransfers(session: Session): Promise<void> {\n const state = getSessionState(session).clientPersistence;\n const adapter = requireAdapter(state, \"purge\");\n try {\n await withNamespaceWriteGate(\n adapter,\n CLIENT_PERSISTENCE_NAMESPACE,\n CLIENT_PERSISTENCE_NAMESPACE_GATE_KEY,\n async () => {\n const keys = await adapter.list(CLIENT_PERSISTENCE_NAMESPACE);\n for (const key of keys) {\n await adapter.remove(CLIENT_PERSISTENCE_NAMESPACE, key);\n }\n },\n { exclusive: true },\n );\n } catch (error) {\n throw withContext(error, { phase: \"purge\" });\n }\n}\n\nexport async function persistTransferAllocation(\n state: ClientPersistenceState,\n params: {\n readonly swapId: string;\n readonly amountLamports: number;\n readonly payoutSpec: PayoutSpec;\n readonly policySnapshot: SpendingPolicySnapshot;\n readonly syncSecret: Uint8Array;\n readonly coordinatorTimestampMs: number;\n },\n): Promise<void> {\n const record: PersistedTransfer = {\n schemaVersion: CLIENT_PERSISTENCE_SCHEMA_VERSION,\n stage: \"allocation\",\n swapId: params.swapId,\n amountLamports: params.amountLamports,\n destinationAddress: destinationFromPayoutSpec(params.payoutSpec),\n policySnapshot: params.policySnapshot,\n status: \"awaiting_dkg\",\n updatedAtMs: Date.now(),\n coordinatorTimestampMs: params.coordinatorTimestampMs,\n syncSecret: new Uint8Array(params.syncSecret),\n };\n const nonTerminalWrite = beginNonTerminalWriteForState(state, params.swapId);\n if (nonTerminalWrite === null) return;\n try {\n await writeRecord(state, record, \"allocation\", true, null, nonTerminalWrite);\n } finally {\n nonTerminalWrite();\n }\n}\n\n/** Checkpoint DKG-derived metadata without exposing deposit details publicly. */\nexport async function persistTransferDkgMetadata(\n state: ClientPersistenceState,\n params: {\n readonly swapId: string;\n readonly depositAddress: string;\n readonly depositExpiresAtMs: number;\n readonly coordinatorTimestampMs: number;\n },\n): Promise<void> {\n if (!state.enabled) return;\n const adapter = requireAdapter(state, \"allocation\", params.swapId, true);\n const nonTerminalWrite = beginNonTerminalWriteForState(state, params.swapId);\n if (nonTerminalWrite === null) return;\n try {\n await withNamespaceWriteGate(adapter, CLIENT_PERSISTENCE_NAMESPACE, params.swapId, async () => {\n const record = await readRequiredRecord(state, params.swapId, \"allocation\", true);\n if (record.stage !== \"allocation\") return;\n await writeRecord(\n state,\n {\n ...record,\n depositAddress: params.depositAddress,\n depositExpiresAtMs: params.depositExpiresAtMs,\n coordinatorTimestampMs: params.coordinatorTimestampMs,\n updatedAtMs: Date.now(),\n },\n \"allocation\",\n true,\n null,\n nonTerminalWrite,\n { namespaceGateHeld: true },\n );\n });\n } finally {\n nonTerminalWrite();\n }\n}\n\nexport async function persistTransferRecoveryCode(\n state: ClientPersistenceState,\n swapId: string,\n recoveryCode: Uint8Array,\n): Promise<void> {\n if (!state.enabled) return;\n const adapter = requireAdapter(state, \"recovery-code\", swapId, true);\n const nonTerminalWrite = beginNonTerminalWriteForState(state, swapId);\n if (nonTerminalWrite === null) return;\n try {\n await withNamespaceWriteGate(adapter, CLIENT_PERSISTENCE_NAMESPACE, swapId, async () => {\n const record = await readOptionalRecord(state, swapId, \"recovery-code\", true);\n if (record === null) return;\n await writeRecord(\n state,\n { ...record, recoveryCode: new Uint8Array(recoveryCode), updatedAtMs: Date.now() },\n \"recovery-code\",\n true,\n null,\n nonTerminalWrite,\n { namespaceGateHeld: true },\n );\n });\n } finally {\n nonTerminalWrite();\n }\n}\n\n/** @internal Read coordinator-owned DKG metadata after a saved-share resume. */\nexport async function readPersistedTransferForResume(\n state: ClientPersistenceState,\n swapId: string,\n): Promise<PersistedTransfer | null> {\n return readOptionalRecord(state, swapId, \"ready\", false);\n}\n\nexport async function persistTransferReady(\n state: ClientPersistenceState,\n params: {\n readonly swapId: string;\n readonly depositAddress: string;\n readonly depositExpiresAtMs: number;\n readonly delegatedAtMs: number;\n readonly coordinatorTimestampMs: number;\n },\n): Promise<void> {\n if (!state.enabled) return;\n const adapter = requireAdapter(state, \"ready\", params.swapId, true);\n const nonTerminalWrite = beginNonTerminalWriteForState(state, params.swapId);\n if (nonTerminalWrite === null) return;\n try {\n await withNamespaceWriteGate(adapter, CLIENT_PERSISTENCE_NAMESPACE, params.swapId, async () => {\n const record = await readRequiredRecord(state, params.swapId, \"ready\", true);\n await writeRecord(\n state,\n {\n ...record,\n stage: \"ready\",\n status: \"awaiting_deposit\",\n depositAddress: params.depositAddress,\n depositExpiresAtMs: params.depositExpiresAtMs,\n delegatedAtMs: params.delegatedAtMs,\n coordinatorTimestampMs: params.coordinatorTimestampMs,\n updatedAtMs: Date.now(),\n },\n \"ready\",\n true,\n null,\n nonTerminalWrite,\n { namespaceGateHeld: true },\n );\n });\n } finally {\n nonTerminalWrite();\n }\n}\n\nexport async function persistTransferStatus(\n state: ClientPersistenceState,\n swapId: string,\n status: {\n readonly state: ClientSwapState;\n readonly actor_sync?: { readonly snapshot: { readonly state_version: number } };\n },\n coordinatorTimestampMs: number,\n): Promise<void> {\n if (!state.enabled) return;\n const isTerminal = CLIENT_SWAP_STATE_VALUES.has(status.state) && isTerminalState(status.state);\n const terminalWrite = isTerminal ? beginTerminalWrite(state, swapId) : null;\n const nonTerminalWrite = isTerminal ? null : beginNonTerminalWriteForState(state, swapId);\n if (!isTerminal && nonTerminalWrite === null) return;\n const adapter = requireAdapter(state, \"sync\", swapId, true);\n try {\n if (terminalWrite) await terminalWrite.waitForNonTerminalWrites;\n await withNamespaceWriteGate(\n adapter,\n CLIENT_PERSISTENCE_NAMESPACE,\n swapId,\n async () => {\n const record = await readOptionalRecord(state, swapId, \"sync\", true);\n if (record === null || (record.stage === \"terminal-cleaned\" && !isTerminal)) return;\n const next: PersistedTransfer = isTerminal\n ? {\n ...record,\n stage: \"terminal-cleaned\",\n status: status.state,\n ...(status.actor_sync === undefined\n ? {}\n : { stateVersion: status.actor_sync.snapshot.state_version }),\n updatedAtMs: Date.now(),\n coordinatorTimestampMs,\n syncSecret: undefined,\n recoveryCode: undefined,\n }\n : {\n ...record,\n status: status.state,\n ...(status.actor_sync === undefined\n ? {}\n : { stateVersion: status.actor_sync.snapshot.state_version }),\n updatedAtMs: Date.now(),\n coordinatorTimestampMs,\n };\n await writeRecord(state, next, \"sync\", true, terminalWrite, nonTerminalWrite, {\n namespaceGateHeld: true,\n });\n },\n { exclusive: isTerminal },\n );\n } finally {\n terminalWrite?.release();\n nonTerminalWrite?.();\n }\n}\n\nexport async function persistTransferTerminal(\n state: ClientPersistenceState,\n swapId: string,\n status: Extract<ClientSwapState, \"completed\" | \"refunded\" | \"failed\">,\n coordinatorTimestampMs: number,\n phase: Extract<StorageErrorPhase, \"sync\" | \"refund\"> = \"refund\",\n): Promise<void> {\n if (!state.enabled) return;\n const terminalWrite = beginTerminalWrite(state, swapId);\n const adapter = requireAdapter(state, phase, swapId, true);\n try {\n await terminalWrite?.waitForNonTerminalWrites;\n await withNamespaceWriteGate(\n adapter,\n CLIENT_PERSISTENCE_NAMESPACE,\n swapId,\n async () => {\n const record = await readOptionalRecord(state, swapId, phase, true);\n if (record === null) return;\n await writeRecord(\n state,\n {\n ...record,\n stage: \"terminal-cleaned\",\n status,\n updatedAtMs: Date.now(),\n coordinatorTimestampMs,\n syncSecret: undefined,\n recoveryCode: undefined,\n },\n phase,\n true,\n terminalWrite,\n undefined,\n { namespaceGateHeld: true },\n );\n },\n { exclusive: true },\n );\n } finally {\n terminalWrite?.release();\n }\n}\n\ntype AutomaticStorageSelection = {\n readonly backend: object | null;\n readonly adapter: StorageAdapter;\n};\n\nfunction automaticStorageAdapter(): AutomaticStorageSelection {\n const global = globalThis as {\n chrome?: {\n runtime?: { readonly id?: string };\n storage?: { local?: unknown };\n };\n browser?: {\n runtime?: { readonly id?: string };\n storage?: { local?: unknown };\n };\n };\n const chromeStorage = global.chrome?.storage?.local;\n const extensionContext =\n global.chrome?.runtime?.id !== undefined || global.browser?.runtime?.id !== undefined;\n if (isExtensionStorageArea(chromeStorage)) {\n return automaticAdapterFor(chromeStorage, () => extensionStorage({ storage: chromeStorage }));\n }\n if (extensionContext) {\n throw new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n \"Chrome extension storage.local is unavailable\",\n { phase: \"session-init\" },\n );\n }\n let localStorage: unknown;\n try {\n localStorage = (globalThis as { localStorage?: unknown }).localStorage;\n } catch {\n return { backend: null, adapter: browserStorage() };\n }\n if (typeof localStorage === \"object\" && localStorage !== null) {\n return automaticAdapterFor(localStorage, () =>\n browserStorage({ storage: localStorage as BrowserStorageOptions[\"storage\"] }),\n );\n }\n return { backend: null, adapter: browserStorage() };\n}\n\nfunction automaticAdapterFor(\n backend: object,\n create: () => StorageAdapter,\n): AutomaticStorageSelection {\n const existing = automaticStorageAdapters.get(backend);\n if (existing !== undefined) return { backend, adapter: existing };\n const adapter = create();\n automaticStorageAdapters.set(backend, adapter);\n return { backend, adapter };\n}\n\nfunction isExtensionStorageArea(\n value: unknown,\n): value is NonNullable<ExtensionStorageOptions[\"storage\"]> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n isFunction((value as { get?: unknown }).get) &&\n isFunction((value as { set?: unknown }).set) &&\n isFunction((value as { remove?: unknown }).remove)\n );\n}\n\nfunction validateStorageAdapter(value: unknown): StorageAdapter {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !isStorageKind((value as { kind?: unknown }).kind) ||\n !isFunction((value as { put?: unknown }).put) ||\n !isFunction((value as { get?: unknown }).get) ||\n !isFunction((value as { list?: unknown }).list) ||\n !isFunction((value as { remove?: unknown }).remove)\n ) {\n throw new StorageError(\n \"STORAGE_INVALID_ADAPTER\",\n \"client persistence storage must implement the StorageAdapter contract\",\n { phase: \"session-init\" },\n );\n }\n return value as StorageAdapter;\n}\n\nasync function probeStorage(adapter: StorageAdapter): Promise<void> {\n const probeKey = `${CLIENT_PERSISTENCE_PROBE_KEY_PREFIX}${Date.now()}-${clientPersistenceProbeSequence}`;\n clientPersistenceProbeSequence += 1;\n const probeBytes = new Uint8Array(CLIENT_PERSISTENCE_PROBE_BYTES);\n try {\n await withNamespaceWriteGate(\n adapter,\n CLIENT_PERSISTENCE_NAMESPACE,\n probeKey,\n async () => {\n let probeMayExist = false;\n try {\n await adapter.list(CLIENT_PERSISTENCE_NAMESPACE);\n probeMayExist = true;\n await adapter.put(CLIENT_PERSISTENCE_NAMESPACE, probeKey, probeBytes);\n const storedProbe = await adapter.get(CLIENT_PERSISTENCE_NAMESPACE, probeKey);\n if (\n !(storedProbe instanceof Uint8Array) ||\n storedProbe.byteLength !== probeBytes.byteLength ||\n storedProbe.some((byte, index) => byte !== probeBytes[index])\n ) {\n throw new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n \"client persistence storage probe readback failed\",\n { phase: \"session-init\" },\n );\n }\n await adapter.remove(CLIENT_PERSISTENCE_NAMESPACE, probeKey);\n const remainingProbe = await adapter.get(CLIENT_PERSISTENCE_NAMESPACE, probeKey);\n if (remainingProbe !== null) {\n throw new StorageError(\n \"STORAGE_NOT_AVAILABLE\",\n \"client persistence storage probe removal readback failed\",\n { phase: \"session-init\" },\n );\n }\n probeMayExist = false;\n } catch (error) {\n if (probeMayExist) {\n try {\n await adapter.remove(CLIENT_PERSISTENCE_NAMESPACE, probeKey);\n } catch {\n // Preserve the original preflight failure and do not mask it with cleanup.\n }\n }\n throw error;\n }\n },\n { exclusive: true },\n );\n } catch (error) {\n throw withContext(error, { phase: \"session-init\" });\n }\n}\n\nasync function writeRecord(\n state: ClientPersistenceState,\n record: PersistedTransfer,\n phase: StorageErrorPhase,\n remoteAccepted: boolean,\n terminalWrite?: TerminalWriteHandle | null,\n nonTerminalWrite?: (() => void) | null,\n options: { readonly namespaceGateHeld?: boolean } = {},\n): Promise<void> {\n if (!state.enabled) return;\n const adapter = requireAdapter(state, phase, record.swapId, remoteAccepted);\n const terminalRecord = record.stage === \"terminal-cleaned\";\n const ownedTerminalWrite =\n terminalRecord && terminalWrite === undefined ? beginTerminalWrite(state, record.swapId) : null;\n const activeTerminalWrite = terminalWrite ?? ownedTerminalWrite;\n const releaseNonTerminalWrite = terminalRecord\n ? null\n : (nonTerminalWrite ?? beginNonTerminalWrite(adapter, record.swapId));\n if (!terminalRecord && releaseNonTerminalWrite === null) return;\n try {\n if (activeTerminalWrite) await activeTerminalWrite.waitForNonTerminalWrites;\n const bytes = serializeRecord(record);\n const write = async () => {\n const keys = (await adapter.list(CLIENT_PERSISTENCE_NAMESPACE)).filter(\n (key) => !isReservedPersistenceKey(key),\n );\n const values = new Map<string, Uint8Array>();\n let namespaceBytes = 0;\n for (const key of keys) {\n const value = await adapter.get(CLIENT_PERSISTENCE_NAMESPACE, key);\n if (value !== null) {\n values.set(key, value);\n namespaceBytes += value.byteLength;\n }\n }\n const previous = values.get(record.swapId);\n const nextCount = previous === undefined ? keys.length + 1 : keys.length;\n if (previous === undefined && nextCount > CLIENT_PERSISTENCE_MAX_RECORD_COUNT) {\n throw namespaceLimitError(\"namespace record limit exceeded\");\n }\n const nextBytes = namespaceBytes - (previous?.byteLength ?? 0) + bytes.byteLength;\n if (\n nextBytes > CLIENT_PERSISTENCE_MAX_NAMESPACE_BYTES &&\n (previous === undefined || bytes.byteLength > previous.byteLength)\n ) {\n throw namespaceLimitError(\"namespace byte limit exceeded\");\n }\n await adapter.put(CLIENT_PERSISTENCE_NAMESPACE, record.swapId, bytes);\n };\n if (options.namespaceGateHeld) {\n await write();\n } else {\n await withNamespaceWriteGate(adapter, CLIENT_PERSISTENCE_NAMESPACE, record.swapId, write);\n }\n } catch (error) {\n throw withContext(error, { phase, swapId: record.swapId, remoteAccepted });\n } finally {\n releaseNonTerminalWrite?.();\n ownedTerminalWrite?.release();\n }\n}\n\nfunction beginNonTerminalWriteForState(\n state: ClientPersistenceState,\n swapId: string,\n): (() => void) | null {\n if (!state.enabled || state.adapter === null) return null;\n return beginNonTerminalWrite(state.adapter, swapId);\n}\n\nasync function withNamespaceWriteGate(\n adapter: StorageAdapter,\n namespace: string,\n key: string,\n write: () => Promise<void>,\n options: { readonly exclusive?: boolean } = {},\n): Promise<void> {\n const release = await acquireNamespaceWriteGate(adapter, namespace, key, options);\n try {\n await write();\n } finally {\n release();\n }\n}\n\nasync function acquireNamespaceWriteGate(\n adapter: StorageAdapter,\n namespace: string,\n key: string,\n options: { readonly exclusive?: boolean } = {},\n): Promise<() => void> {\n const gate = getNamespaceWriteGate(adapter, namespace);\n const exclusive = options.exclusive === true;\n let granted = false;\n const shouldWait = () => {\n if (gate.activeCount === 0) return gate.waiters.length !== 0;\n if (exclusive || gate.exclusive) return true;\n return gate.activeKey !== key || gate.waiters.length !== 0;\n };\n while (!granted && shouldWait()) {\n await new Promise<void>((resolve) =>\n gate.waiters.push({\n key,\n resolve: () => {\n granted = true;\n resolve();\n },\n }),\n );\n }\n gate.activeKey = key;\n gate.activeCount += 1;\n gate.exclusive = exclusive;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n gate.activeCount -= 1;\n if (gate.activeCount !== 0) return;\n gate.activeKey = null;\n gate.exclusive = false;\n const next = gate.waiters.shift();\n if (next) {\n next.resolve();\n return;\n }\n cleanupNamespaceWriteGate(adapter, namespace, gate);\n };\n}\n\nfunction getNamespaceWriteGate(adapter: StorageAdapter, namespace: string): NamespaceWriteGate {\n const backing = getStorageBacking(adapter);\n let gates = namespaceWriteGates.get(backing);\n if (!gates) {\n gates = new Map();\n namespaceWriteGates.set(backing, gates);\n }\n let gate = gates.get(namespace);\n if (!gate) {\n gate = { activeKey: null, activeCount: 0, exclusive: false, waiters: [] };\n gates.set(namespace, gate);\n }\n return gate;\n}\n\nfunction cleanupNamespaceWriteGate(\n adapter: StorageAdapter,\n namespace: string,\n gate: NamespaceWriteGate,\n): void {\n if (gate.activeKey !== null || gate.waiters.length !== 0) return;\n namespaceWriteGates.get(getStorageBacking(adapter))?.delete(namespace);\n}\n\nfunction beginTerminalWrite(\n state: ClientPersistenceState,\n swapId: string,\n): TerminalWriteHandle | null {\n if (!state.enabled || state.adapter === null) return null;\n const barrier = getTerminalWriteBarrier(state.adapter, swapId);\n barrier.activeTerminalWrites += 1;\n barrier.terminalRequested = true;\n const waitForNonTerminalWrites =\n barrier.activeNonTerminalWrites === 0\n ? Promise.resolve()\n : new Promise<void>((resolve) => barrier.nonTerminalWaiters.push(resolve));\n let released = false;\n return {\n waitForNonTerminalWrites,\n release() {\n if (released) return;\n released = true;\n barrier.activeTerminalWrites -= 1;\n if (barrier.activeTerminalWrites === 0) barrier.terminalRequested = false;\n cleanupTerminalWriteBarrier(state.adapter!, swapId, barrier);\n },\n };\n}\n\nfunction beginNonTerminalWrite(adapter: StorageAdapter, swapId: string): (() => void) | null {\n const barrier = getTerminalWriteBarrier(adapter, swapId);\n if (barrier.terminalRequested) return null;\n barrier.activeNonTerminalWrites += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n barrier.activeNonTerminalWrites -= 1;\n if (barrier.activeNonTerminalWrites === 0) {\n const waiters = barrier.nonTerminalWaiters.splice(0);\n for (const resolve of waiters) resolve();\n }\n cleanupTerminalWriteBarrier(adapter, swapId, barrier);\n };\n}\n\nfunction getTerminalWriteBarrier(adapter: StorageAdapter, swapId: string): TerminalWriteBarrier {\n const backing = getStorageBacking(adapter);\n let barriers = terminalWriteBarriers.get(backing);\n if (!barriers) {\n barriers = new Map();\n terminalWriteBarriers.set(backing, barriers);\n }\n let barrier = barriers.get(swapId);\n if (!barrier) {\n barrier = {\n activeNonTerminalWrites: 0,\n activeTerminalWrites: 0,\n terminalRequested: false,\n nonTerminalWaiters: [],\n };\n barriers.set(swapId, barrier);\n }\n return barrier;\n}\n\nfunction cleanupTerminalWriteBarrier(\n adapter: StorageAdapter,\n swapId: string,\n barrier: TerminalWriteBarrier,\n): void {\n if (\n barrier.activeNonTerminalWrites !== 0 ||\n barrier.activeTerminalWrites !== 0 ||\n barrier.terminalRequested ||\n barrier.nonTerminalWaiters.length !== 0\n ) {\n return;\n }\n terminalWriteBarriers.get(getStorageBacking(adapter))?.delete(swapId);\n}\n\nasync function readAllRecords(\n state: ClientPersistenceState,\n phase: StorageErrorPhase,\n): Promise<PersistedTransfer[]> {\n const adapter = requireAdapter(state, phase);\n try {\n const keys = (await adapter.list(CLIENT_PERSISTENCE_NAMESPACE)).filter(\n (key) => !isReservedPersistenceKey(key),\n );\n if (keys.length > CLIENT_PERSISTENCE_MAX_RECORD_COUNT) {\n throw namespaceLimitError(\"namespace contains too many records\");\n }\n const records: PersistedTransfer[] = [];\n let namespaceBytes = 0;\n for (const key of keys) {\n const value = await adapter.get(CLIENT_PERSISTENCE_NAMESPACE, key);\n if (value === null) {\n throw new StorageError(\n \"STORAGE_KEY_MISSING\",\n \"persisted transfer key disappeared during read\",\n );\n }\n namespaceBytes += value.byteLength;\n if (namespaceBytes > CLIENT_PERSISTENCE_MAX_NAMESPACE_BYTES) {\n throw namespaceLimitError(\"namespace byte limit exceeded\");\n }\n records.push(parseRecord(value, key));\n }\n return records;\n } catch (error) {\n throw withContext(error, { phase });\n }\n}\n\nasync function readOptionalRecord(\n state: ClientPersistenceState,\n swapId: string,\n phase: StorageErrorPhase,\n remoteAccepted = false,\n): Promise<PersistedTransfer | null> {\n if (!state.enabled) return null;\n assertSwapId(swapId, phase);\n const value = await readValue(state, swapId, phase, remoteAccepted);\n if (value === null) return null;\n try {\n return parseRecord(value, swapId);\n } catch (error) {\n throw withContext(error, { phase, swapId, remoteAccepted });\n }\n}\n\nasync function readRequiredRecord(\n state: ClientPersistenceState,\n swapId: string,\n phase: StorageErrorPhase,\n remoteAccepted = true,\n): Promise<PersistedTransfer> {\n const record = await readOptionalRecord(state, swapId, phase, remoteAccepted);\n if (record === null) {\n throw new StorageError(\"STORAGE_KEY_MISSING\", `persisted transfer ${swapId} is missing`, {\n phase,\n swapId,\n remoteAccepted,\n });\n }\n return record;\n}\n\nasync function readValue(\n state: ClientPersistenceState,\n swapId: string,\n phase: StorageErrorPhase,\n remoteAccepted = false,\n): Promise<Uint8Array | null> {\n const adapter = requireAdapter(state, phase, swapId, remoteAccepted);\n try {\n return await adapter.get(CLIENT_PERSISTENCE_NAMESPACE, swapId);\n } catch (error) {\n throw withContext(error, { phase, swapId, remoteAccepted });\n }\n}\n\nfunction serializeRecord(record: PersistedTransfer): Uint8Array {\n assertRecord(record);\n const policySnapshot = normalizePolicySnapshot(record.policySnapshot);\n const serialized: SerializedPersistedTransfer = {\n schemaVersion: record.schemaVersion,\n stage: record.stage,\n swapId: record.swapId,\n amountLamports: record.amountLamports,\n destinationAddress: record.destinationAddress,\n policySnapshot,\n status: record.status,\n ...(record.stateVersion !== undefined && { stateVersion: record.stateVersion }),\n updatedAtMs: record.updatedAtMs,\n ...(record.coordinatorTimestampMs !== undefined && {\n coordinatorTimestampMs: record.coordinatorTimestampMs,\n }),\n ...(record.depositAddress !== undefined && { depositAddress: record.depositAddress }),\n ...(record.depositExpiresAtMs !== undefined && {\n depositExpiresAtMs: record.depositExpiresAtMs,\n }),\n ...(record.delegatedAtMs !== undefined && { delegatedAtMs: record.delegatedAtMs }),\n syncSecretHex: record.syncSecret === undefined ? undefined : bytesToHex(record.syncSecret),\n recoveryCodeHex:\n record.recoveryCode === undefined ? undefined : bytesToHex(record.recoveryCode),\n };\n const json = JSON.stringify(serialized);\n const bytes = new TextEncoder().encode(json);\n if (bytes.byteLength > CLIENT_PERSISTENCE_MAX_RECORD_BYTES) {\n throw namespaceLimitError(\"persisted transfer record exceeds the byte limit\");\n }\n return bytes;\n}\n\nfunction parseRecord(bytes: Uint8Array, expectedSwapId: string): PersistedTransfer {\n if (bytes.byteLength > CLIENT_PERSISTENCE_MAX_RECORD_BYTES) {\n throw new StorageError(\n \"STORAGE_QUOTA_EXCEEDED\",\n \"persisted transfer record exceeds the byte limit\",\n );\n }\n let value: unknown;\n try {\n value = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes));\n } catch (cause) {\n throw new StorageError(\n \"STORAGE_DECRYPT_FAILED\",\n \"persisted transfer record is not valid JSON\",\n {\n cause,\n },\n );\n }\n if (!isRecord(value)) {\n throw corruptRecordError(\"persisted transfer record is not an object\");\n }\n const keys = Object.keys(value);\n if (keys.some((key) => !SERIALIZED_RECORD_KEYS.has(key))) {\n throw corruptRecordError(\"persisted transfer record contains an unknown field\");\n }\n if (value.schemaVersion !== CLIENT_PERSISTENCE_SCHEMA_VERSION) {\n throw corruptRecordError(\"persisted transfer record has an unsupported schema version\");\n }\n if (value.swapId !== expectedSwapId) {\n throw corruptRecordError(\"persisted transfer key does not match its swap id\");\n }\n const record = value as Partial<SerializedPersistedTransfer>;\n if (\n !isPersistedStage(record.stage) ||\n typeof record.swapId !== \"string\" ||\n typeof record.amountLamports !== \"number\" ||\n !Number.isSafeInteger(record.amountLamports) ||\n record.amountLamports < 0 ||\n typeof record.destinationAddress !== \"string\" ||\n typeof record.status !== \"string\" ||\n !CLIENT_SWAP_STATE_VALUES.has(record.status as ClientSwapState) ||\n typeof record.updatedAtMs !== \"number\" ||\n !Number.isSafeInteger(record.updatedAtMs) ||\n record.updatedAtMs < 0 ||\n !isRecord(record.policySnapshot)\n ) {\n throw corruptRecordError(\"persisted transfer record has invalid required fields\");\n }\n assertBoundedString(record.swapId, MAX_IDENTIFIER_LENGTH, \"swap id\");\n assertBoundedString(record.destinationAddress, MAX_ADDRESS_LENGTH, \"destination address\");\n if (record.syncSecretHex !== undefined) {\n if (typeof record.syncSecretHex !== \"string\") {\n throw corruptRecordError(\"persisted transfer sync secret is invalid\");\n }\n assertHex(record.syncSecretHex, \"sync secret\");\n }\n if (record.recoveryCodeHex !== undefined) {\n if (typeof record.recoveryCodeHex !== \"string\") {\n throw corruptRecordError(\"persisted transfer recovery code is invalid\");\n }\n assertHex(record.recoveryCodeHex, \"recovery code\");\n }\n assertOptionalTimestamp(record.stateVersion, \"state version\");\n assertOptionalTimestamp(record.coordinatorTimestampMs, \"coordinator timestamp\");\n assertOptionalTimestamp(record.depositExpiresAtMs, \"deposit expiry\");\n assertOptionalTimestamp(record.delegatedAtMs, \"delegated timestamp\");\n if (record.depositAddress !== undefined) {\n if (typeof record.depositAddress !== \"string\") {\n throw corruptRecordError(\"persisted transfer deposit address is invalid\");\n }\n assertBoundedString(record.depositAddress, MAX_ADDRESS_LENGTH, \"deposit address\");\n }\n if (record.stage === \"ready\") {\n if (\n record.depositAddress === undefined ||\n record.depositExpiresAtMs === undefined ||\n record.delegatedAtMs === undefined\n ) {\n throw corruptRecordError(\"ready persisted transfer is missing deposit metadata\");\n }\n }\n if (record.stage === \"terminal-cleaned\") {\n if (record.syncSecretHex !== undefined || record.recoveryCodeHex !== undefined) {\n throw corruptRecordError(\"terminal persisted transfer contains bearer material\");\n }\n if (!isTerminalState(record.status as ClientSwapState)) {\n throw corruptRecordError(\"terminal persisted transfer has a non-terminal status\");\n }\n } else if (\n record.syncSecretHex === undefined ||\n isTerminalState(record.status as ClientSwapState)\n ) {\n throw corruptRecordError(\"non-terminal persisted transfer has invalid bearer state\");\n }\n const policySnapshot = normalizePolicySnapshot(record.policySnapshot);\n if (\n record.amountLamports !== policySnapshot.entry_amount_lamports ||\n record.destinationAddress !== policySnapshot.payout_schedule[0]?.destination_address\n ) {\n throw corruptRecordError(\"persisted transfer metadata does not match its policy snapshot\");\n }\n return {\n schemaVersion: CLIENT_PERSISTENCE_SCHEMA_VERSION,\n stage: record.stage,\n swapId: record.swapId,\n amountLamports: record.amountLamports,\n destinationAddress: record.destinationAddress,\n policySnapshot,\n status: record.status as ClientSwapState,\n ...(record.stateVersion !== undefined && { stateVersion: record.stateVersion }),\n updatedAtMs: record.updatedAtMs,\n ...(record.coordinatorTimestampMs !== undefined && {\n coordinatorTimestampMs: record.coordinatorTimestampMs,\n }),\n ...(record.depositAddress !== undefined && { depositAddress: record.depositAddress }),\n ...(record.depositExpiresAtMs !== undefined && {\n depositExpiresAtMs: record.depositExpiresAtMs,\n }),\n ...(record.delegatedAtMs !== undefined && { delegatedAtMs: record.delegatedAtMs }),\n ...(record.syncSecretHex !== undefined && { syncSecret: hexToBytes(record.syncSecretHex) }),\n ...(record.recoveryCodeHex !== undefined && {\n recoveryCode: hexToBytes(record.recoveryCodeHex),\n }),\n };\n}\n\nfunction assertRecord(record: PersistedTransfer): void {\n assertSwapId(record.swapId, \"write\");\n if (record.schemaVersion !== CLIENT_PERSISTENCE_SCHEMA_VERSION) {\n throw corruptRecordError(\"persisted transfer has an unsupported schema version\");\n }\n if (!PERSISTED_STAGE_VALUES.has(record.stage)) {\n throw corruptRecordError(\"persisted transfer has an invalid stage\");\n }\n if (!Number.isSafeInteger(record.amountLamports) || record.amountLamports < 0) {\n throw corruptRecordError(\"persisted transfer has an invalid amount\");\n }\n assertBoundedString(record.destinationAddress, MAX_ADDRESS_LENGTH, \"destination address\");\n if (!CLIENT_SWAP_STATE_VALUES.has(record.status)) {\n throw corruptRecordError(\"persisted transfer has an invalid status\");\n }\n if (!Number.isSafeInteger(record.updatedAtMs) || record.updatedAtMs < 0) {\n throw corruptRecordError(\"persisted transfer has an invalid update timestamp\");\n }\n assertOptionalTimestamp(record.stateVersion, \"state version\");\n if (\n record.syncSecret !== undefined &&\n (!(record.syncSecret instanceof Uint8Array) || record.syncSecret.length !== HEX_BYTE_LENGTH)\n ) {\n throw corruptRecordError(\"persisted transfer sync secret has an invalid length\");\n }\n if (\n record.recoveryCode !== undefined &&\n (!(record.recoveryCode instanceof Uint8Array) || record.recoveryCode.length !== HEX_BYTE_LENGTH)\n ) {\n throw corruptRecordError(\"persisted transfer recovery code has an invalid length\");\n }\n const policySnapshot = normalizePolicySnapshot(record.policySnapshot);\n if (\n record.amountLamports !== policySnapshot.entry_amount_lamports ||\n record.destinationAddress !== policySnapshot.payout_schedule[0]?.destination_address\n ) {\n throw corruptRecordError(\"persisted transfer metadata does not match its policy snapshot\");\n }\n assertOptionalTimestamp(record.coordinatorTimestampMs, \"coordinator timestamp\");\n assertOptionalTimestamp(record.depositExpiresAtMs, \"deposit expiry\");\n assertOptionalTimestamp(record.delegatedAtMs, \"delegated timestamp\");\n if (record.depositAddress !== undefined) {\n assertBoundedString(record.depositAddress, MAX_ADDRESS_LENGTH, \"deposit address\");\n }\n if (record.stage === \"ready\") {\n if (\n record.depositAddress === undefined ||\n record.depositExpiresAtMs === undefined ||\n record.delegatedAtMs === undefined\n ) {\n throw corruptRecordError(\"ready persisted transfer is missing deposit metadata\");\n }\n }\n if (record.stage === \"terminal-cleaned\") {\n if (record.syncSecret !== undefined || record.recoveryCode !== undefined) {\n throw corruptRecordError(\"terminal persisted transfer contains bearer material\");\n }\n if (!isTerminalState(record.status)) {\n throw corruptRecordError(\"terminal persisted transfer has a non-terminal status\");\n }\n } else if (record.syncSecret === undefined || isTerminalState(record.status)) {\n throw corruptRecordError(\"non-terminal persisted transfer has invalid bearer state\");\n }\n const policyBytes = new TextEncoder().encode(JSON.stringify(policySnapshot));\n if (policyBytes.byteLength > MAX_POLICY_JSON_BYTES) {\n throw namespaceLimitError(\"persisted transfer policy snapshot exceeds the byte limit\");\n }\n}\n\nfunction toPublicRecord(record: PersistedTransfer): PersistedTransfer {\n const hasDurableDelegation =\n record.stage !== \"allocation\" &&\n record.depositAddress !== undefined &&\n record.depositExpiresAtMs !== undefined &&\n record.delegatedAtMs !== undefined;\n return {\n schemaVersion: record.schemaVersion,\n stage: record.stage,\n swapId: record.swapId,\n amountLamports: record.amountLamports,\n destinationAddress: record.destinationAddress,\n policySnapshot: record.policySnapshot,\n status: record.status,\n ...(record.stateVersion !== undefined && { stateVersion: record.stateVersion }),\n updatedAtMs: record.updatedAtMs,\n ...(record.coordinatorTimestampMs !== undefined && {\n coordinatorTimestampMs: record.coordinatorTimestampMs,\n }),\n ...(hasDurableDelegation && { depositAddress: record.depositAddress }),\n ...(hasDurableDelegation && { depositExpiresAtMs: record.depositExpiresAtMs }),\n ...(hasDurableDelegation && { delegatedAtMs: record.delegatedAtMs }),\n ...(record.syncSecret !== undefined && { syncSecret: new Uint8Array(record.syncSecret) }),\n ...(record.recoveryCode !== undefined && {\n recoveryCode: new Uint8Array(record.recoveryCode),\n }),\n };\n}\n\nfunction destinationFromPayoutSpec(payoutSpec: PayoutSpec): string {\n return payoutSpec.mode === \"instant\"\n ? payoutSpec.destination_address\n : (payoutSpec.destination_addresses[0] ?? \"\");\n}\n\nfunction requireAdapter(\n state: ClientPersistenceState,\n phase: StorageErrorPhase,\n swapId?: string,\n remoteAccepted?: boolean,\n): StorageAdapter {\n if (!state.enabled || state.adapter === null) {\n throw new StorageError(\"STORAGE_NOT_AVAILABLE\", \"client persistence is disabled\", {\n phase,\n ...(swapId === undefined ? {} : { swapId }),\n ...(remoteAccepted === undefined ? {} : { remoteAccepted }),\n });\n }\n return state.adapter;\n}\n\nfunction withContext(\n error: unknown,\n context: {\n readonly phase: StorageErrorPhase;\n readonly swapId?: string;\n readonly remoteAccepted?: boolean;\n },\n): StorageError {\n const code =\n error instanceof StorageError\n ? error.code === \"STORAGE_NOT_AVAILABLE\" && isQuotaError(error)\n ? \"STORAGE_QUOTA_EXCEEDED\"\n : error.code\n : isQuotaError(error)\n ? \"STORAGE_QUOTA_EXCEEDED\"\n : \"STORAGE_NOT_AVAILABLE\";\n const message = error instanceof Error ? error.message : \"storage operation failed\";\n return new StorageError(code, message, {\n cause: error,\n swapId: context.swapId ?? (error instanceof StorageError ? error.swapId : undefined),\n phase: context.phase,\n remoteAccepted:\n context.remoteAccepted ?? (error instanceof StorageError ? error.remoteAccepted : undefined),\n });\n}\n\nfunction namespaceLimitError(message: string): StorageError {\n return new StorageError(\"STORAGE_QUOTA_EXCEEDED\", message);\n}\n\nfunction corruptRecordError(message: string): StorageError {\n return new StorageError(\"STORAGE_DECRYPT_FAILED\", message);\n}\n\nfunction assertSwapId(swapId: string, phase: StorageErrorPhase | \"write\"): void {\n if (typeof swapId !== \"string\" || swapId.length === 0 || swapId.length > MAX_IDENTIFIER_LENGTH) {\n throw new StorageError(\"STORAGE_KEY_MISSING\", \"swapId is invalid\", { phase });\n }\n}\n\nfunction isReservedPersistenceKey(key: string): boolean {\n return key.startsWith(CLIENT_PERSISTENCE_PROBE_KEY_PREFIX);\n}\n\nfunction assertBoundedString(value: unknown, maxLength: number, label: string): void {\n if (typeof value !== \"string\" || value.length === 0 || value.length > maxLength) {\n throw corruptRecordError(`${label} is outside the supported length`);\n }\n}\n\nfunction assertHex(value: string, label: string): void {\n if (value.length !== HEX_LENGTH || !HEX_PATTERN.test(value)) {\n throw corruptRecordError(`${label} is not a 32-byte hexadecimal value`);\n }\n}\n\nfunction assertOptionalTimestamp(value: unknown, label: string): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || (value as number) < 0)) {\n throw corruptRecordError(`${label} is invalid`);\n }\n}\n\nfunction normalizePolicySnapshot(value: unknown): SpendingPolicySnapshot {\n if (!isRecord(value)) throw corruptRecordError(\"persisted transfer policy snapshot is invalid\");\n if (Object.keys(value).some((key) => !POLICY_SNAPSHOT_KEYS.has(key))) {\n throw corruptRecordError(\"persisted transfer policy snapshot contains an unknown field\");\n }\n if (value.asset !== \"SOL\") throw corruptRecordError(\"persisted transfer policy asset is invalid\");\n const integerFields = [\n \"entry_amount_lamports\",\n \"total_committed_lamports\",\n \"payout_deadline_ms\",\n \"fragment_count\",\n \"min_fee_bps\",\n \"fee_bps\",\n \"fee_lamports\",\n \"net_payout_lamports\",\n ] as const;\n for (const field of integerFields) assertNonNegativeInteger(value[field], field);\n if (value.payout_window_ms !== undefined) {\n assertNonNegativeInteger(value.payout_window_ms, \"payout_window_ms\");\n }\n if (value.payout_mode !== \"instant\" && value.payout_mode !== \"scheduled\") {\n throw corruptRecordError(\"persisted transfer payout mode is invalid\");\n }\n if (value.matching_mode !== \"exact_1_to_1\") {\n throw corruptRecordError(\"persisted transfer matching mode is invalid\");\n }\n if (value.fragmentation_allowed !== \"payout_side_only\") {\n throw corruptRecordError(\"persisted transfer fragmentation mode is invalid\");\n }\n if (!Array.isArray(value.payout_schedule) || value.payout_schedule.length === 0) {\n throw corruptRecordError(\"persisted transfer payout schedule is invalid\");\n }\n if (value.payout_schedule.length > MAX_POLICY_DESTINATION_COUNT) {\n throw corruptRecordError(\"persisted transfer payout schedule is too large\");\n }\n const payoutSchedule = Array.from(value.payout_schedule, (entry) => {\n if (!isRecord(entry) || Object.keys(entry).some((key) => !POLICY_DESTINATION_KEYS.has(key))) {\n throw corruptRecordError(\"persisted transfer payout schedule entry is invalid\");\n }\n if (typeof entry.destination_address !== \"string\") {\n throw corruptRecordError(\"persisted transfer payout destination is invalid\");\n }\n assertBoundedString(entry.destination_address, MAX_ADDRESS_LENGTH, \"payout destination\");\n return { destination_address: entry.destination_address };\n });\n return {\n asset: \"SOL\",\n entry_amount_lamports: value.entry_amount_lamports as number,\n total_committed_lamports: value.total_committed_lamports as number,\n payout_deadline_ms: value.payout_deadline_ms as number,\n ...(value.payout_window_ms !== undefined && {\n payout_window_ms: value.payout_window_ms as number,\n }),\n payout_schedule: payoutSchedule,\n fragment_count: value.fragment_count as number,\n payout_mode: value.payout_mode as \"instant\" | \"scheduled\",\n matching_mode: \"exact_1_to_1\",\n fragmentation_allowed: \"payout_side_only\",\n min_fee_bps: value.min_fee_bps as number,\n fee_bps: value.fee_bps as number,\n fee_lamports: value.fee_lamports as number,\n net_payout_lamports: value.net_payout_lamports as number,\n };\n}\n\nfunction assertNonNegativeInteger(value: unknown, label: string): void {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) {\n throw corruptRecordError(`persisted transfer policy ${label} is invalid`);\n }\n}\n\nfunction isQuotaError(error: unknown): boolean {\n if (error instanceof StorageError) {\n return isQuotaError((error as Error & { cause?: unknown }).cause);\n }\n if (error instanceof Error && /quota/i.test(error.name)) return true;\n if (error instanceof Error && /quota/i.test(error.message)) return true;\n if (isRecord(error)) {\n const name = typeof error.name === \"string\" ? error.name : \"\";\n const message = typeof error.message === \"string\" ? error.message : \"\";\n return /quota/i.test(name) || /quota/i.test(message);\n }\n return false;\n}\n\nfunction isPersistedStage(value: unknown): value is PersistedTransferStage {\n return typeof value === \"string\" && PERSISTED_STAGE_VALUES.has(value as PersistedTransferStage);\n}\n\nfunction isStorageKind(value: unknown): value is StorageAdapter[\"kind\"] {\n return (\n value === \"browser\" ||\n value === \"extension\" ||\n value === \"server-hkdf\" ||\n value === \"server-custom\" ||\n value === \"memory\"\n );\n}\n\nfunction isFunction(value: unknown): value is (...args: never[]) => unknown {\n return typeof value === \"function\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isTerminalState(state: ClientSwapState): state is \"completed\" | \"refunded\" | \"failed\" {\n return state === \"completed\" || state === \"refunded\" || state === \"failed\";\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction hexToBytes(value: string): Uint8Array {\n const bytes = new Uint8Array(value.length / 2);\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Number.parseInt(value.slice(index * 2, index * 2 + 2), 16);\n }\n return bytes;\n}\n","/**\n * TDX DCAP attestation verifier (SDK port of\n * `web/src/lib/coordinator/tdx-attestation.ts`).\n *\n * Verifies a TDX DCAP quote on three paths, using Web Crypto (`crypto.subtle`,\n * a Node 22 / browser global) and `@peculiar/x509`:\n *\n * - GCP (spec section 5.1): cert chain to the pinned Intel SGX Root CA, TCB\n * validity, freshness nonce == REPORT_DATA[0:32], Noise binding ==\n * REPORT_DATA[32:64], debug bit clear, MRTD pin.\n * - Azure (spec section 5.2): MAA JWT issuer / JWKS / policy-hash / compliance\n * / debug, MAA<->DCAP REPORTDATA binding, hcl_keys hash binding, HCL AK pub\n * extraction, raw DCAP measurement binding, TPM AK quote signature, TPM\n * qualifying data binding.\n * - Local (loopback dev fallback): checks nonce and Noise pubkey consistency\n * only; no hardware attestation.\n *\n * Throws the SDK {@link AttestationError} (from `../core/errors.js`) with a\n * closed `code` on any failure. Callers fail-closed: tear down the Noise\n * transport rather than surface an unverified channel.\n *\n * Never log secrets, nonces, or raw decrypted payloads (spec section 9).\n *\n * @module JW-145 / JW-431\n */\n\nimport * as x509 from \"@peculiar/x509\";\nimport { AttestationError, type AttestationErrorCode } from \"../core/errors.js\";\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\nexport type AttestationMode = \"dev\" | \"prod\";\nexport type CoordinatorRuntimeProfile =\n | \"prod-hardened\"\n | \"prod-devnet-simplified\"\n | \"prod-devnet-simplified-locked\"\n | \"azure-tdx-v0-agentless\";\n\nexport type TdxRuntimeMeasurements = {\n readonly rtmr0: string;\n readonly rtmr1: string;\n readonly rtmr2: string;\n readonly rtmr3: string;\n};\n\nexport type AzureMaaPolicy = {\n /** Expected MAA token issuer for the approved Azure Attestation provider. */\n expectedIssuer: string;\n /** Expected JWKS endpoint for that provider. Token headers must not choose it. */\n expectedJwksUrl: string;\n /** Expected Azure Attestation evaluation policy hash from the signed token. */\n expectedPolicyHash: string;\n};\n\nexport type AttestationPolicy = {\n /**\n * Expected MRTD for the published production coordinator build.\n * Dev mode ignores this pin entirely.\n */\n expectedMrtd?: string;\n /**\n * SHA-256 hash of the approved coordinator binary. Azure production\n * attestation requires this pin because binary_hash is otherwise only\n * response metadata, even though the TPM quote binds it cryptographically.\n */\n expectedBinaryHash?: string;\n /** Expected compile-time runtime profile carried by the approved artifact. */\n expectedRuntimeProfile?: CoordinatorRuntimeProfile;\n /** Approved userspace/runtime measurements for the agentless release. */\n expectedRuntimeMeasurements?: TdxRuntimeMeasurements;\n /**\n * Runtime mode the client expects for this coordinator route. Production\n * builds set this to \"prod\" so a prod hostname cannot silently accept an\n * unpinned dev coordinator after DNS or load-balancer misrouting.\n */\n requiredMode?: AttestationMode;\n /**\n * Release tooling only: verify a prod quote before the new MRTD has been\n * published. Runtime policy must leave this unset so prod stays fail-closed\n * when the pin is missing.\n */\n allowUnpinnedProdMrtdForRelease?: boolean;\n /**\n * SHA-256 fingerprint (lowercase hex) of the DER-encoded Intel SGX Root CA.\n * Defaults to {@link INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256}. Override only in tests.\n */\n intelRootFingerprint?: string;\n /**\n * Temporary non-prod rollout escape hatch for legacy coordinators that have\n * not rolled out `dcap_collateral`. When collateral is present, it is always\n * verified. Production mode never honors this flag.\n */\n allowMissingDcapCollateral?: boolean;\n /**\n * Development-only escape hatch for a local coordinator running on a non-TDX\n * machine. The transport only honors this for loopback coordinator URLs.\n */\n allowLocalAttestation?: boolean;\n /**\n * Azure-specific trust policy. Required for platform=\"azure-tdx-dcap\" because\n * MAA providers and policies are customer-configurable Azure resources.\n */\n azureMaa?: AzureMaaPolicy;\n};\n\nexport type SignedDcapJson = {\n /**\n * JSON string returned by Intel PCS. May be either the inner body\n * (`tcbInfo` / `enclaveIdentity`) or the full PCS wrapper.\n */\n body: string;\n /** Hex signature over the exact signed body bytes. */\n signature: string;\n /** PEM chain whose first certificate verifies `signature`, ending at Intel root. */\n issuerChainPem: string;\n};\n\nexport type DcapCollateral = {\n /** PEM X.509 CRL for the PCK certificate issuer. */\n pckCrlPem: string;\n /** PEM chain for the PCK CRL issuer, ending at Intel root. */\n pckCrlIssuerChainPem: string;\n /** PEM X.509 CRL issued by Intel root, covering collateral signing certs. */\n rootCaCrlPem: string;\n /** Signed Intel TDX TCB Info V3. */\n tcbInfo: SignedDcapJson;\n /** Signed Intel TD QE Identity V2. */\n qeIdentity: SignedDcapJson;\n};\n\nconst DEFAULT_AZURE_JWKS_TIMEOUT_MS = 30_000;\nconst TPM_GENERATED_VALUE = 0xff544347;\nconst TPM_ST_ATTEST_QUOTE = 0x8018;\n\nexport type AttestedMetadata = {\n mode: AttestationMode;\n binaryHash: string;\n runtimeProfile?: CoordinatorRuntimeProfile;\n mrtd: string;\n rtmr0: string;\n rtmr1: string;\n rtmr2: string;\n rtmr3: string;\n pubkeyHex: string;\n localAttestation: boolean;\n};\n\nexport type AttestResponse = {\n quote: string; // base64\n /**\n * Nonce echoed back by the coordinator. Informational only: freshness is\n * enforced cryptographically via REPORT_DATA[0:32] inside the TDX quote, not\n * by trusting this JSON field.\n */\n nonce: string; // hex (64 chars)\n pubkey: string; // hex (64 chars - X25519 pubkey)\n binary_hash: string; // hex (64 chars - sha256)\n mode: AttestationMode;\n /** Compile-time runtime profile embedded in the coordinator artifact. */\n runtime_profile?: CoordinatorRuntimeProfile;\n /**\n * Platform identifier set by the coordinator. Absent on GCP (tdx-dcap).\n * Azure returns \"azure-tdx-dcap\".\n */\n platform?: string;\n /**\n * Azure only: MAA JWT from /attest/TdxVm, RS256-signed by MAA. Contains\n * tdx_mrtd, tdx_td_attributes_debug, and x-ms-compliance-status.\n */\n maa_token?: string;\n /**\n * Azure only: TPM PCR quote packed as\n * [4-byte msg_len LE][TPM2B_ATTEST][TPMT_SIGNATURE].\n * qualifying_data = SHA-256(nonce || noise_pubkey || binary_hash). Base64-encoded.\n */\n tpm_quote?: string;\n /**\n * Azure only: raw bytes (base64) of the JSON key-blob from HCL report NV\n * 0x1400001 [1056:]. SHA-256(hcl_keys_json_bytes) == DCAP REPORTDATA[0:32].\n * Contains the AK public key as kid=\"HCLAkPub\".\n */\n hcl_keys_json?: string;\n /**\n * Intel DCAP verification collateral. When present, the verifier evaluates\n * PCK revocation, TCB Info, and TD QE Identity. Policies can require it.\n */\n dcap_collateral?: DcapCollateral;\n local_attestation?: boolean;\n};\n\n/**\n * Assert that an unknown JSON value has the shape of {@link AttestResponse}.\n * Throws {@link AttestationError} (\"NOT_ATTESTED\") on any missing or wrong-typed\n * field. Replaces an unsafe cast so missing fields produce a typed error rather\n * than silently reaching downstream checks as `undefined`.\n */\nexport function assertAttestResponse(value: unknown): asserts value is AttestResponse {\n if (typeof value !== \"object\" || value === null) {\n throw err(\"QUOTE_DECODE\", \"attestation response is not a JSON object\");\n }\n const v = value as Record<string, unknown>;\n const fields: (keyof AttestResponse)[] = [\"quote\", \"nonce\", \"pubkey\", \"binary_hash\", \"mode\"];\n for (const field of fields) {\n if (typeof v[field] !== \"string\") {\n throw err(\n \"QUOTE_DECODE\",\n `attestation response missing or non-string field: \"${field}\" (got ${typeof v[field]})`,\n );\n }\n }\n if (v[\"mode\"] !== \"dev\" && v[\"mode\"] !== \"prod\") {\n throw err(\"QUOTE_DECODE\", `attestation response has unknown mode: \"${v[\"mode\"]}\"`);\n }\n if (\n v[\"runtime_profile\"] !== undefined &&\n v[\"runtime_profile\"] !== \"prod-hardened\" &&\n v[\"runtime_profile\"] !== \"prod-devnet-simplified\" &&\n v[\"runtime_profile\"] !== \"prod-devnet-simplified-locked\" &&\n v[\"runtime_profile\"] !== \"azure-tdx-v0-agentless\"\n ) {\n throw err(\n \"QUOTE_DECODE\",\n `attestation response has unknown runtime profile: \"${v[\"runtime_profile\"]}\"`,\n );\n }\n if (v[\"local_attestation\"] !== undefined && typeof v[\"local_attestation\"] !== \"boolean\") {\n throw err(\n \"QUOTE_DECODE\",\n `attestation response has non-boolean local_attestation: ${typeof v[\"local_attestation\"]}`,\n );\n }\n}\n\n/**\n * SHA-256 fingerprint of the DER-encoded Intel SGX Root CA certificate\n * (CN=\"Intel SGX Root CA\"). Trust anchor for all PCK chains in DCAP quotes.\n *\n * Source:\n * https://certificates.trustedservices.intel.com/Intel_SGX_Provisioning_Certification_RootCA.pem\n * Re-derive with:\n * curl -s <url> | openssl x509 -outform DER | shasum -a 256\n *\n * Pinned: rotation requires a coordinator release.\n */\nexport const INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 =\n \"44a0196b2b99f889b8e149e95b807a350e7424964399e885a7cbb8ccfab674d3\";\n\n// ── Error taxonomy mapping ───────────────────────────────────────────────────\n//\n// The reference verifier carried its own fine-grained code union. The SDK error\n// taxonomy (core/errors.ts, spec section 8.3) is a smaller closed set. Each\n// reference failure reason is mapped here to the closest SDK AttestationErrorCode.\n// The reference code is kept as a prefix in the message so failures stay\n// diagnosable without widening the public union.\n\n/** The reference verifier's internal failure reasons (port traceability only). */\ntype RefReason =\n | \"QUOTE_DECODE\"\n | \"QUOTE_STRUCTURE\"\n | \"UNSUPPORTED_PLATFORM\"\n | \"NONCE_MISMATCH\"\n | \"NONCE_FIELD_MISMATCH\"\n | \"PUBKEY_FIELD_MISMATCH\"\n | \"CHANNEL_BINDING_MISMATCH\"\n | \"BINARY_HASH_FORMAT\"\n | \"BINARY_HASH_MISMATCH\"\n | \"PCK_CHAIN_MISSING\"\n | \"PCK_CHAIN_PARSE\"\n | \"ROOT_FINGERPRINT_MISMATCH\"\n | \"PCK_CHAIN_SIGNATURE\"\n | \"DCAP_COLLATERAL_MISSING\"\n | \"DCAP_COLLATERAL_PARSE\"\n | \"DCAP_COLLATERAL_SIGNATURE\"\n | \"DCAP_COLLATERAL_REVOKED\"\n | \"TCB_STATUS_REJECTED\"\n | \"QE_IDENTITY_REJECTED\"\n | \"QUOTE_SIGNATURE\"\n | \"QE_REPORT_BINDING\"\n | \"QE_REPORT_SIGNATURE\"\n | \"DEBUG_BIT_SET\"\n | \"MODE_MISMATCH\"\n | \"MRTD_MISMATCH\"\n | \"RUNTIME_MEASUREMENTS_MISMATCH\"\n | \"RUNTIME_PROFILE_MISMATCH\"\n | \"LOCAL_ATTESTATION_DISABLED\"\n | \"MAA_TOKEN_MISSING\"\n | \"MAA_TOKEN_PARSE\"\n | \"MAA_TOKEN_EXPIRED\"\n | \"MAA_TOKEN_SIGNATURE\"\n | \"MAA_TRUST_POLICY_MISSING\"\n | \"MAA_ISSUER_MISMATCH\"\n | \"MAA_JWKS_MISMATCH\"\n | \"MAA_POLICY_HASH_MISMATCH\"\n | \"MAA_REPORTDATA_MISMATCH\"\n | \"MAA_COMPLIANCE_MISMATCH\"\n | \"MAA_DEBUG_BIT_SET\"\n | \"TPM_QUOTE_MISSING\"\n | \"TPM_QUOTE_SIGNATURE\"\n | \"TPM_NONCE_MISMATCH\"\n | \"HCL_KEYS_MISSING\"\n | \"HCL_KEYS_PARSE\"\n | \"HCL_KEYS_HASH_MISMATCH\";\n\n/** Map each reference reason to the closest SDK AttestationErrorCode. */\nconst REASON_TO_CODE: Record<RefReason, AttestationErrorCode> = {\n // Structural / chain / quote-signature failures -> the cert-chain bucket.\n QUOTE_DECODE: \"CERT_CHAIN_INVALID\",\n QUOTE_STRUCTURE: \"CERT_CHAIN_INVALID\",\n UNSUPPORTED_PLATFORM: \"CERT_CHAIN_INVALID\",\n PCK_CHAIN_MISSING: \"CERT_CHAIN_INVALID\",\n PCK_CHAIN_PARSE: \"CERT_CHAIN_INVALID\",\n ROOT_FINGERPRINT_MISMATCH: \"CERT_CHAIN_INVALID\",\n PCK_CHAIN_SIGNATURE: \"CERT_CHAIN_INVALID\",\n DCAP_COLLATERAL_SIGNATURE: \"CERT_CHAIN_INVALID\",\n DCAP_COLLATERAL_MISSING: \"TCB_REJECTED\",\n DCAP_COLLATERAL_PARSE: \"TCB_REJECTED\",\n DCAP_COLLATERAL_REVOKED: \"TCB_REJECTED\",\n TCB_STATUS_REJECTED: \"TCB_REJECTED\",\n QE_IDENTITY_REJECTED: \"TCB_REJECTED\",\n QUOTE_SIGNATURE: \"CERT_CHAIN_INVALID\",\n QE_REPORT_BINDING: \"CERT_CHAIN_INVALID\",\n QE_REPORT_SIGNATURE: \"CERT_CHAIN_INVALID\",\n // Freshness.\n NONCE_MISMATCH: \"FRESHNESS_NONCE_MISMATCH\",\n NONCE_FIELD_MISMATCH: \"FRESHNESS_NONCE_MISMATCH\",\n TPM_NONCE_MISMATCH: \"AZURE_TPM_QUALIFYING_DATA_MISMATCH\",\n // Noise channel binding (pubkey / report-data binding / bound JSON fields).\n CHANNEL_BINDING_MISMATCH: \"NOISE_BINDING_MISMATCH\",\n PUBKEY_FIELD_MISMATCH: \"NOISE_BINDING_MISMATCH\",\n BINARY_HASH_FORMAT: \"NOISE_BINDING_MISMATCH\",\n BINARY_HASH_MISMATCH: \"NOISE_BINDING_MISMATCH\",\n // Debug bit.\n DEBUG_BIT_SET: \"DEBUG_BIT_SET\",\n MAA_DEBUG_BIT_SET: \"DEBUG_BIT_SET\",\n // Mode / measurement pinning.\n MODE_MISMATCH: \"MRTD_MISMATCH\",\n MRTD_MISMATCH: \"MRTD_MISMATCH\",\n RUNTIME_MEASUREMENTS_MISMATCH: \"RUNTIME_MEASUREMENTS_MISMATCH\",\n RUNTIME_PROFILE_MISMATCH: \"RUNTIME_PROFILE_MISMATCH\",\n // Local fallback disabled -> not attested.\n LOCAL_ATTESTATION_DISABLED: \"NOT_ATTESTED\",\n // Azure MAA token issuer / JWKS / policy / signature / compliance / binding.\n MAA_TOKEN_MISSING: \"AZURE_MAA_JWKS_INVALID\",\n MAA_TOKEN_PARSE: \"AZURE_MAA_JWKS_INVALID\",\n MAA_TOKEN_EXPIRED: \"AZURE_MAA_JWKS_INVALID\",\n MAA_TOKEN_SIGNATURE: \"AZURE_MAA_JWKS_INVALID\",\n MAA_TRUST_POLICY_MISSING: \"AZURE_MAA_ISSUER_MISMATCH\",\n MAA_ISSUER_MISMATCH: \"AZURE_MAA_ISSUER_MISMATCH\",\n MAA_JWKS_MISMATCH: \"AZURE_MAA_JWKS_INVALID\",\n MAA_POLICY_HASH_MISMATCH: \"AZURE_MAA_POLICY_HASH_MISMATCH\",\n MAA_COMPLIANCE_MISMATCH: \"AZURE_MAA_NOT_COMPLIANT\",\n MAA_REPORTDATA_MISMATCH: \"AZURE_MAA_DCAP_MISMATCH\",\n // Azure HCL key blob hash binding.\n HCL_KEYS_MISSING: \"AZURE_HCL_KEYS_MISMATCH\",\n HCL_KEYS_HASH_MISMATCH: \"AZURE_HCL_KEYS_MISMATCH\",\n HCL_KEYS_PARSE: \"AZURE_AK_PUB_INVALID\",\n // Azure TPM AK quote.\n TPM_QUOTE_MISSING: \"AZURE_TPM_AK_QUOTE_INVALID\",\n TPM_QUOTE_SIGNATURE: \"AZURE_TPM_AK_QUOTE_INVALID\",\n};\n\n/** Build an SDK AttestationError, mapping the reference reason and prefixing it. */\nfunction err(reason: RefReason, message: string): AttestationError {\n return new AttestationError(REASON_TO_CODE[reason], `[${reason}] ${message}`);\n}\n\n// ── TDX quote v4 layout (mirrors test-attest.py) ─────────────────────────────\n\n/** Length of one TDX measurement (SHA-384 digest). */\nconst MEASUREMENT_LEN = 48;\n\nconst HEADER_SIZE = 48;\nconst HEADER_VERSION_OFF = 0;\nconst HEADER_ATT_KEY_OFF = 2;\nconst HEADER_TEE_TYPE_OFF = 4;\n\nconst TDX_TEE_TYPE = 0x00000081;\nconst ECDSA_P256_KEY_TYPE = 2;\n\nconst BODY_OFFSET = 48;\nconst BODY_SIZE = 584;\n\nconst BODY_TEE_TCB_SVN_OFF = 0;\nconst BODY_MRSIGNERSEAM_OFF = 64;\nconst BODY_SEAM_ATTRIBUTES_OFF = 112;\nconst BODY_TD_ATTR_OFF = 120;\nconst BODY_MRTD_OFF = 136;\nconst BODY_RTMR0_OFF = 328;\nconst BODY_RTMR1_OFF = 376;\nconst BODY_RTMR2_OFF = 424;\nconst BODY_RTMR3_OFF = 472;\nconst BODY_REPORT_DATA_OFF = 520;\nconst BODY_REPORT_DATA_LEN = 64;\n\nconst SIG_DATA_LEN_OFFSET = BODY_OFFSET + BODY_SIZE; // u32 LE @ offset 632\n\n// Within ECDSA-P256 quote signature data\nconst SIG_QUOTE_SIG_OFF = 0; // 64 bytes (r || s) over header+body\nconst SIG_ATT_KEY_OFF = 64; // 64 bytes raw P-256 (X || Y), no 0x04 prefix\nconst SIG_QE_CERT_DATA_OFF = 128; // QE Certification Data - Version 4 (type+size+data)\nconst SIG_QE_CERT_DATA_HEADER_SIZE = 6; // uint16 type + uint32 size\nconst SIG_QE_REPORT_SIZE = 384; // Intel TDX DCAP Quote Library API, A.3.11\nconst SIG_QE_REPORT_SIG_SIZE = 64; // ECDSA-P256 over QE report\n\n// SGX report body (384 bytes) - REPORT_DATA is at offset 320, 64 bytes\nconst SGX_REPORT_MISCSELECT_OFF = 16;\nconst SGX_REPORT_ATTRIBUTES_OFF = 48;\nconst SGX_REPORT_MRSIGNER_OFF = 128;\nconst SGX_REPORT_ISV_PROD_ID_OFF = 256;\nconst SGX_REPORT_ISV_SVN_OFF = 258;\nconst SGX_REPORT_DATA_OFF = 320;\n\nconst QE_CERT_TYPE_PCK_CHAIN = 5;\nconst QE_CERT_TYPE_QE_REPORT_CERT_DATA = 6;\n\nconst INTEL_PCK_SGX_EXTENSIONS_OID = \"1.2.840.113741.1.13.1\";\nconst INTEL_PCK_EXTENSION_TCB_OID = \"1.2.840.113741.1.13.1.2\";\nconst INTEL_PCK_EXTENSION_PCE_ID_OID = \"1.2.840.113741.1.13.1.3\";\nconst INTEL_PCK_EXTENSION_FMSPC_OID = \"1.2.840.113741.1.13.1.4\";\nconst INTEL_PCK_EXTENSION_PCESVN_OID = \"1.2.840.113741.1.13.1.2.17\";\nconst INTEL_PCK_EXTENSION_CPUSVN_OID = \"1.2.840.113741.1.13.1.2.18\";\nconst INTEL_PCK_EXTENSION_SGX_TCB_COMPONENT_OID_PREFIX = \"1.2.840.113741.1.13.1.2.\";\nconst INTEL_TCB_SIGNING_SUBJECT =\n \"CN=Intel SGX TCB Signing, O=Intel Corporation, L=Santa Clara, ST=CA, C=US\";\nconst TEST_TCB_SIGNING_SUBJECT = \"CN=Test SGX and TDX TCB Signing\";\n\nconst ACCEPTED_TCB_STATUSES = new Set([\"UpToDate\"]);\nconst ACCEPTED_TDX_MODULE_STATUSES = new Set([\"UpToDate\"]);\nconst ACCEPTED_QE_IDENTITY_STATUSES = new Set([\"UpToDate\"]);\n\n// ── Main entry point ─────────────────────────────────────────────────────────\n\nexport async function verifyAttestation(params: {\n response: AttestResponse;\n expectedNonce: Uint8Array; // 32 bytes the client sent\n expectedNoiseStaticPub: Uint8Array; // 32 bytes seen in readMessage2\n policy: AttestationPolicy;\n timeoutMs?: number;\n}): Promise<AttestedMetadata> {\n const { response, expectedNonce, expectedNoiseStaticPub, policy, timeoutMs } = params;\n\n if (\n policy.expectedRuntimeProfile !== undefined &&\n response.runtime_profile !== policy.expectedRuntimeProfile\n ) {\n throw err(\n \"RUNTIME_PROFILE_MISMATCH\",\n `runtime profile ${String(response.runtime_profile)} does not match the approved release profile ${policy.expectedRuntimeProfile}`,\n );\n }\n if (\n response.runtime_profile === \"azure-tdx-v0-agentless\" &&\n policy.expectedRuntimeMeasurements === undefined\n ) {\n throw err(\n \"RUNTIME_MEASUREMENTS_MISMATCH\",\n \"agentless attestation requires pinned RTMR0..RTMR3 measurements\",\n );\n }\n if (\n response.runtime_profile === \"azure-tdx-v0-agentless\" &&\n response.local_attestation === true\n ) {\n throw err(\n \"LOCAL_ATTESTATION_DISABLED\",\n \"the agentless Azure TDX profile requires a hardware attestation quote\",\n );\n }\n if (\n response.runtime_profile === \"azure-tdx-v0-agentless\" &&\n response.platform !== \"azure-tdx-dcap\"\n ) {\n throw err(\n \"UNSUPPORTED_PLATFORM\",\n \"the agentless Azure TDX profile requires an Azure DCAP attestation response\",\n );\n }\n\n if (response.local_attestation === true) {\n return verifyLocalAttestation({\n response,\n expectedNonce,\n expectedNoiseStaticPub,\n policy,\n });\n }\n\n // 0. Decode and unpack\n const raw = decodeQuoteB64(response.quote);\n ensureStructure(raw);\n\n // 1. Platform dispatch. Azure DCAP REPORTDATA[0:32] = SHA-256(hcl_keys_json),\n // set by the Azure hypervisor. Nonce+pubkey binding is proven via the TPM AK\n // quote; MRTD and compliance status via the MAA JWT.\n if (response.platform === \"azure-tdx-dcap\") {\n return verifyAzureTdxAttestation({\n raw,\n response,\n expectedNonce,\n expectedNoiseStaticPub,\n policy,\n timeoutMs,\n });\n }\n if (response.platform && response.platform !== \"tdx-dcap\") {\n throw err(\n \"UNSUPPORTED_PLATFORM\",\n `attestation not supported for platform \"${response.platform}\"`,\n );\n }\n\n return verifyGcpTdxAttestation({\n raw,\n response,\n expectedNonce,\n expectedNoiseStaticPub,\n policy,\n });\n}\n\nasync function verifyGcpTdxAttestation(params: {\n raw: Uint8Array;\n response: AttestResponse;\n expectedNonce: Uint8Array;\n expectedNoiseStaticPub: Uint8Array;\n policy: AttestationPolicy;\n}): Promise<AttestedMetadata> {\n const { raw, response, expectedNonce, expectedNoiseStaticPub, policy } = params;\n\n const body = raw.subarray(BODY_OFFSET, BODY_OFFSET + BODY_SIZE);\n const reportData = body.subarray(\n BODY_REPORT_DATA_OFF,\n BODY_REPORT_DATA_OFF + BODY_REPORT_DATA_LEN,\n );\n\n // 2. Freshness\n if (!constantTimeEq(reportData.subarray(0, 32), expectedNonce)) {\n throw err(\n \"NONCE_MISMATCH\",\n \"REPORT_DATA[0:32] does not match verifier nonce - possible replay\",\n );\n }\n // The quote is the cryptographic source of truth for freshness, but the JSON\n // `nonce` field is still checked to keep the API contract honest and fail fast\n // on malformed or mismatched responses.\n if (response.nonce.toLowerCase() !== bytesToHex(expectedNonce)) {\n throw err(\"NONCE_FIELD_MISMATCH\", `JSON nonce ${response.nonce} does not match verifier nonce`);\n }\n\n // 3. Channel binding (REPORT_DATA[32:64] and JSON pubkey field both)\n if (!constantTimeEq(reportData.subarray(32, 64), expectedNoiseStaticPub)) {\n throw err(\n \"CHANNEL_BINDING_MISMATCH\",\n \"REPORT_DATA[32:64] does not match Noise static pubkey from handshake\",\n );\n }\n const expectedPubHex = bytesToHex(expectedNoiseStaticPub);\n if (response.pubkey.toLowerCase() !== expectedPubHex) {\n throw err(\n \"PUBKEY_FIELD_MISMATCH\",\n \"attestation pubkey field does not match Noise static pubkey from handshake\",\n );\n }\n\n // 4. Binary hash sanity (32-byte hex). Azure binds it again in TPM\n // qualifying data below; the GCP quote does not currently measure userspace.\n if (!/^[0-9a-f]{64}$/i.test(response.binary_hash)) {\n throw err(\"BINARY_HASH_FORMAT\", \"binary_hash field is not a 32-byte hex digest\");\n }\n if (\n policy.expectedBinaryHash !== undefined &&\n response.binary_hash.toLowerCase() !== policy.expectedBinaryHash.toLowerCase()\n ) {\n throw err(\n \"BINARY_HASH_MISMATCH\",\n `binary hash ${response.binary_hash.toLowerCase()} does not match the approved release pin`,\n );\n }\n\n // 5. Quote, PCK chain, PCK CRL, TCB Info, and TD QE Identity.\n await verifyDcapQuoteAndCollateral({ raw, body, response, policy });\n\n // 6. TD_ATTRIBUTES DEBUG bit must be cleared. Bit 0 of byte 0 at offset 120:\n // when set, the host can inspect guest memory; a debuggable TD offers no\n // confidentiality, so any quote with DEBUG=1 is refused.\n assertDebugBitClear(body);\n\n // 7. MRTD pinning. Dev is intentionally unpinned (the coordinator image\n // rotates during iteration). Prod must compare against a release pin.\n const measurements = parseMeasurements(body);\n assertRuntimeMeasurementsMatch(measurements, policy);\n if (policy.requiredMode !== undefined && response.mode !== policy.requiredMode) {\n throw err(\n \"MODE_MISMATCH\",\n `attestation mode ${response.mode} does not match required ${policy.requiredMode}`,\n );\n }\n\n if (response.mode === \"prod\") {\n if (\n (policy.expectedMrtd === undefined || policy.expectedMrtd === null) &&\n policy.allowUnpinnedProdMrtdForRelease !== true\n ) {\n throw err(\n \"MRTD_MISMATCH\",\n \"production attestation requires a pinned MRTD but none was configured\",\n );\n }\n\n if (\n policy.expectedMrtd !== undefined &&\n policy.expectedMrtd !== null &&\n measurements.mrtd !== policy.expectedMrtd.toLowerCase()\n ) {\n throw err(\n \"MRTD_MISMATCH\",\n `MRTD ${measurements.mrtd} does not match pinned ${policy.expectedMrtd.toLowerCase()}`,\n );\n }\n }\n\n return {\n mode: response.mode,\n binaryHash: response.binary_hash,\n runtimeProfile: response.runtime_profile,\n mrtd: measurements.mrtd,\n rtmr0: measurements.rtmr0,\n rtmr1: measurements.rtmr1,\n rtmr2: measurements.rtmr2,\n rtmr3: measurements.rtmr3,\n pubkeyHex: response.pubkey.toLowerCase(),\n localAttestation: false,\n };\n}\n\nfunction assertRuntimeMeasurementsMatch(\n measurements: QuoteMeasurements,\n policy: AttestationPolicy,\n): void {\n const expected = policy.expectedRuntimeMeasurements;\n if (expected === undefined) return;\n for (const field of [\"rtmr0\", \"rtmr1\", \"rtmr2\", \"rtmr3\"] as const) {\n if (!/^[0-9a-f]{96}$/i.test(expected[field])) {\n throw err(\n \"RUNTIME_MEASUREMENTS_MISMATCH\",\n `approved ${field.toUpperCase()} pin is not a 48-byte hex digest`,\n );\n }\n if (measurements[field] !== expected[field].toLowerCase()) {\n throw err(\n \"RUNTIME_MEASUREMENTS_MISMATCH\",\n `${field.toUpperCase()} does not match the approved runtime measurement`,\n );\n }\n }\n}\n\n// ── DCAP quote collateral ────────────────────────────────────────────────────\n\nasync function verifyDcapQuoteAndCollateral(params: {\n raw: Uint8Array;\n body: Uint8Array;\n response: AttestResponse;\n policy: AttestationPolicy;\n}): Promise<void> {\n const { raw, body, response, policy } = params;\n\n const sigData = readSigData(raw);\n const qeCertData = parseQeCertificationData(sigData);\n const pckChain = extractPckChain(qeCertData.qeCertificationData);\n\n const expectedRootFp =\n policy.intelRootFingerprint?.toLowerCase() ?? INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256;\n const rootFp = await sha256Hex(new Uint8Array(pckChain[pckChain.length - 1].rawData));\n if (rootFp !== expectedRootFp) {\n throw err(\n \"ROOT_FINGERPRINT_MISMATCH\",\n `PCK root fingerprint ${rootFp} does not match pinned ${expectedRootFp}`,\n );\n }\n\n await verifyChainSignatures(pckChain);\n\n const quoteSig = sigData.subarray(SIG_QUOTE_SIG_OFF, SIG_QUOTE_SIG_OFF + 64);\n const attKey = sigData.subarray(SIG_ATT_KEY_OFF, SIG_ATT_KEY_OFF + 64);\n const headerAndBody = raw.subarray(0, BODY_OFFSET + BODY_SIZE);\n await verifyP256Signature(\n rawXyToSpki(attKey),\n quoteSig,\n headerAndBody,\n \"QUOTE_SIGNATURE\",\n \"quote header||body signature\",\n );\n\n const { qeReport, qeReportSig, qeAuthData } = qeCertData;\n const expectedBinding = await sha256(concat(attKey, qeAuthData));\n const qeReportData = qeReport.subarray(SGX_REPORT_DATA_OFF, SGX_REPORT_DATA_OFF + 32);\n if (!constantTimeEq(qeReportData, expectedBinding)) {\n throw err(\n \"QE_REPORT_BINDING\",\n \"QE report does not bind the in-quote attestation key (REPORT_DATA mismatch)\",\n );\n }\n\n const pckLeafSpki = await leafSpki(pckChain[0]);\n await verifyP256Signature(\n pckLeafSpki,\n qeReportSig,\n qeReport,\n \"QE_REPORT_SIGNATURE\",\n \"QE report signature\",\n );\n\n await verifyDcapCollateral({\n collateral: response.dcap_collateral,\n pckChain,\n body,\n qeReport,\n mode: response.mode,\n policy,\n });\n}\n\nasync function verifyDcapCollateral(params: {\n collateral: DcapCollateral | undefined;\n pckChain: x509.X509Certificate[];\n body: Uint8Array;\n qeReport: Uint8Array;\n mode: AttestResponse[\"mode\"];\n policy: AttestationPolicy;\n}): Promise<void> {\n const { collateral, pckChain, body, qeReport, mode, policy } = params;\n if (!collateral) {\n if (\n policy.allowMissingDcapCollateral === true &&\n mode === \"dev\" &&\n policy.requiredMode === \"dev\"\n ) {\n return;\n }\n throw err(\"DCAP_COLLATERAL_MISSING\", \"TDX quote is missing Intel DCAP collateral\");\n }\n\n const now = new Date();\n const rootCert = pckChain[pckChain.length - 1];\n const rootCrl = parseCrl(collateral.rootCaCrlPem, \"root_ca_crl\");\n await verifyCrl(rootCrl, rootCert, \"root_ca_crl\", now);\n\n const pckCrlIssuerChain = await verifyCollateralIssuerChain(\n parsePemCertificateChain(collateral.pckCrlIssuerChainPem, \"pck_crl_issuer_chain\", 2),\n policy,\n \"pck_crl_issuer_chain\",\n );\n await assertNotRevokedByRoot(rootCrl, pckCrlIssuerChain[0], \"PCK CRL issuer\");\n await assertSameCertificate(pckCrlIssuerChain[0], pckChain[1], \"PCK CRL issuer\");\n\n const pckCrl = parseCrl(collateral.pckCrlPem, \"pck_crl\");\n await verifyCrl(pckCrl, pckCrlIssuerChain[0], \"pck_crl\", now);\n if (pckCrl.findRevoked(pckChain[0])) {\n throw err(\"DCAP_COLLATERAL_REVOKED\", \"PCK leaf certificate is revoked by PCK CRL\");\n }\n\n const tcbInfo = await verifySignedDcapJson<ParsedTcbInfo>({\n signed: collateral.tcbInfo,\n wrapperField: \"tcbInfo\",\n policy,\n rootCrl,\n label: \"tcb_info\",\n });\n\n const qeIdentity = await verifySignedDcapJson<ParsedQeIdentity>({\n signed: collateral.qeIdentity,\n wrapperField: \"enclaveIdentity\",\n policy,\n rootCrl,\n label: \"qe_identity\",\n });\n assertMatchingTcbEvaluationDataNumber(tcbInfo, qeIdentity);\n verifyTcbInfo(tcbInfo, pckChain[0], body, now);\n verifyQeIdentity(qeIdentity, qeReport, now);\n}\n\nfunction assertDebugBitClear(body: Uint8Array): void {\n if ((body[BODY_TD_ATTR_OFF] & 0x01) !== 0) {\n throw err(\"DEBUG_BIT_SET\", \"TD_ATTRIBUTES DEBUG bit set - refusing to attest a debuggable TD\");\n }\n}\n\ntype ParsedTcbInfo = {\n id?: unknown;\n version?: unknown;\n issueDate?: unknown;\n nextUpdate?: unknown;\n fmspc?: unknown;\n pceId?: unknown;\n tcbType?: unknown;\n tcbEvaluationDataNumber?: unknown;\n tcbLevels?: unknown;\n tdxModule?: unknown;\n tdxModuleIdentities?: unknown;\n};\n\ntype ParsedQeIdentity = {\n id?: unknown;\n version?: unknown;\n issueDate?: unknown;\n nextUpdate?: unknown;\n miscselect?: unknown;\n miscselectMask?: unknown;\n attributes?: unknown;\n attributesMask?: unknown;\n mrsigner?: unknown;\n isvprodid?: unknown;\n tcbEvaluationDataNumber?: unknown;\n tcbLevels?: unknown;\n};\n\nasync function verifySignedDcapJson<T extends Record<string, unknown>>(params: {\n signed: SignedDcapJson;\n wrapperField: \"tcbInfo\" | \"enclaveIdentity\";\n policy: AttestationPolicy;\n rootCrl: x509.X509Crl;\n label: string;\n}): Promise<T> {\n const { signed, wrapperField, policy, rootCrl, label } = params;\n if (\n !signed ||\n typeof signed.body !== \"string\" ||\n typeof signed.signature !== \"string\" ||\n typeof signed.issuerChainPem !== \"string\"\n ) {\n throw err(\"DCAP_COLLATERAL_MISSING\", `${label} collateral is incomplete`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(signed.body);\n } catch (e) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} body is not valid JSON: ${e}`);\n }\n\n const signedBody = exactSignedDcapJsonBody(signed.body, parsed, wrapperField, label);\n const body = signedBody.parsed;\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} body is not a JSON object`);\n }\n\n const issuerChain = await verifyCollateralIssuerChain(\n parsePemCertificateChain(signed.issuerChainPem, `${label}_issuer_chain`, 2),\n policy,\n `${label}_issuer_chain`,\n );\n await assertNotRevokedByRoot(rootCrl, issuerChain[0], `${label} signing certificate`);\n assertDcapJsonSignerIdentity(issuerChain[0], issuerChain[issuerChain.length - 1], policy, label);\n\n if (!/^[0-9a-f]{128}$/i.test(signed.signature)) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} signature is not a 64-byte hex ECDSA signature`);\n }\n await verifyP256Signature(\n await leafSpki(issuerChain[0]),\n hexToBytes(signed.signature),\n new TextEncoder().encode(signedBody.body),\n \"DCAP_COLLATERAL_SIGNATURE\",\n `${label} signature`,\n );\n\n return body as T;\n}\n\nfunction exactSignedDcapJsonBody(\n raw: string,\n parsed: unknown,\n wrapperField: \"tcbInfo\" | \"enclaveIdentity\",\n label: string,\n): { body: string; parsed: unknown } {\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { body: raw, parsed };\n }\n if (!(wrapperField in parsed)) {\n return { body: raw, parsed };\n }\n const body = extractTopLevelJsonProperty(raw, wrapperField);\n if (body === null) {\n throw err(\n \"DCAP_COLLATERAL_PARSE\",\n `${label} PCS wrapper contains ${wrapperField} but exact signed body bytes could not be extracted`,\n );\n }\n try {\n return { body, parsed: JSON.parse(body) };\n } catch (e) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} exact signed body is not valid JSON: ${e}`);\n }\n}\n\nfunction extractTopLevelJsonProperty(raw: string, property: string): string | null {\n let offset = skipJsonWhitespace(raw, 0);\n if (raw[offset] !== \"{\") return null;\n offset++;\n\n while (offset < raw.length) {\n offset = skipJsonWhitespace(raw, offset);\n if (raw[offset] === \"}\") return null;\n if (raw[offset] === \",\") {\n offset++;\n continue;\n }\n const key = readJsonString(raw, offset);\n if (key === null) return null;\n offset = skipJsonWhitespace(raw, key.end);\n if (raw[offset] !== \":\") return null;\n offset = skipJsonWhitespace(raw, offset + 1);\n const valueStart = offset;\n const valueEnd = findJsonValueEnd(raw, valueStart);\n if (valueEnd === null) return null;\n if (key.value === property) return raw.slice(valueStart, valueEnd);\n offset = valueEnd;\n }\n\n return null;\n}\n\nfunction skipJsonWhitespace(raw: string, offset: number): number {\n while (offset < raw.length && /[\\t\\n\\r ]/u.test(raw[offset]!)) offset++;\n return offset;\n}\n\nfunction readJsonString(raw: string, offset: number): { value: string; end: number } | null {\n if (raw[offset] !== '\"') return null;\n let cursor = offset + 1;\n let escaped = false;\n while (cursor < raw.length) {\n const char = raw[cursor]!;\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n const token = raw.slice(offset, cursor + 1);\n try {\n return { value: JSON.parse(token) as string, end: cursor + 1 };\n } catch {\n return null;\n }\n }\n cursor++;\n }\n return null;\n}\n\nfunction findJsonValueEnd(raw: string, offset: number): number | null {\n if (offset >= raw.length) return null;\n if (raw[offset] === '\"') return readJsonString(raw, offset)?.end ?? null;\n if (raw[offset] === \"{\" || raw[offset] === \"[\") {\n const stack = [raw[offset]];\n let cursor = offset + 1;\n while (cursor < raw.length) {\n const char = raw[cursor]!;\n if (char === '\"') {\n const stringToken = readJsonString(raw, cursor);\n if (stringToken === null) return null;\n cursor = stringToken.end;\n continue;\n }\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n } else if (char === \"}\" || char === \"]\") {\n const open = stack.pop();\n if ((char === \"}\" && open !== \"{\") || (char === \"]\" && open !== \"[\")) return null;\n if (stack.length === 0) return cursor + 1;\n }\n cursor++;\n }\n return null;\n }\n\n let cursor = offset;\n while (cursor < raw.length && !/[\\t\\n\\r ,}\\]]/u.test(raw[cursor]!)) cursor++;\n return cursor > offset ? cursor : null;\n}\n\nfunction assertMatchingTcbEvaluationDataNumber(\n tcbInfo: ParsedTcbInfo,\n qeIdentity: ParsedQeIdentity,\n): void {\n const tcbNumber = tcbInfo.tcbEvaluationDataNumber;\n const qeNumber = qeIdentity.tcbEvaluationDataNumber;\n if (!isTcbEvaluationDataNumber(tcbNumber) || !isTcbEvaluationDataNumber(qeNumber)) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n \"TCB Info and QE Identity must include valid tcbEvaluationDataNumber values\",\n );\n }\n if (tcbNumber !== qeNumber) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `TCB Info tcbEvaluationDataNumber ${tcbNumber} does not match QE Identity ${qeNumber}`,\n );\n }\n}\n\nfunction isTcbEvaluationDataNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nasync function verifyCollateralIssuerChain(\n certs: x509.X509Certificate[],\n policy: AttestationPolicy,\n label: string,\n): Promise<x509.X509Certificate[]> {\n const candidates = [certs, [...certs].reverse()];\n let lastError: unknown;\n for (const chain of candidates) {\n try {\n const rootFp = await sha256Hex(new Uint8Array(chain[chain.length - 1].rawData));\n const expectedRootFp =\n policy.intelRootFingerprint?.toLowerCase() ?? INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256;\n if (rootFp !== expectedRootFp) {\n throw err(\n \"ROOT_FINGERPRINT_MISMATCH\",\n `${label} root fingerprint ${rootFp} does not match pinned ${expectedRootFp}`,\n );\n }\n await verifyChainSignatures(chain);\n return chain;\n } catch (e) {\n lastError = e;\n }\n }\n if (lastError instanceof AttestationError) throw lastError;\n throw err(\"DCAP_COLLATERAL_SIGNATURE\", `${label} certificate chain failed verification`);\n}\n\nfunction assertDcapJsonSignerIdentity(\n leaf: x509.X509Certificate,\n root: x509.X509Certificate,\n policy: AttestationPolicy,\n label: string,\n): void {\n const expectedRootFp =\n policy.intelRootFingerprint?.toLowerCase() ?? INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256;\n const allowsSyntheticRoot = expectedRootFp !== INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256;\n const allowedSubjects = allowsSyntheticRoot\n ? [INTEL_TCB_SIGNING_SUBJECT, TEST_TCB_SIGNING_SUBJECT]\n : [INTEL_TCB_SIGNING_SUBJECT];\n\n if (!allowedSubjects.includes(leaf.subject)) {\n throw err(\n \"DCAP_COLLATERAL_SIGNATURE\",\n `${label} signing certificate subject ${leaf.subject} is not an Intel PCS TCB signing identity`,\n );\n }\n if (leaf.issuer !== root.subject) {\n throw err(\n \"DCAP_COLLATERAL_SIGNATURE\",\n `${label} signing certificate issuer ${leaf.issuer} does not match root ${root.subject}`,\n );\n }\n const basicConstraints = leaf.getExtension(x509.BasicConstraintsExtension);\n if (basicConstraints?.ca) {\n throw err(\"DCAP_COLLATERAL_SIGNATURE\", `${label} signing certificate must not be a CA`);\n }\n}\n\nfunction verifyTcbInfo(\n tcbInfo: ParsedTcbInfo,\n pckLeaf: x509.X509Certificate,\n body: Uint8Array,\n now: Date,\n): void {\n if (tcbInfo.id !== \"TDX\") {\n throw err(\"TCB_STATUS_REJECTED\", `TCB Info id ${String(tcbInfo.id)} is not TDX`);\n }\n if (tcbInfo.version !== 3 || tcbInfo.tcbType !== 0) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `unsupported TCB Info version=${String(tcbInfo.version)} tcbType=${String(tcbInfo.tcbType)}`,\n );\n }\n assertFreshDcapJsonWindow(tcbInfo, \"TCB Info\", now);\n\n const pckTcb = extractPckTcb(pckLeaf);\n if (typeof tcbInfo.fmspc !== \"string\" || tcbInfo.fmspc.toLowerCase() !== pckTcb.fmspc) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `TCB Info FMSPC ${String(tcbInfo.fmspc)} does not match PCK FMSPC ${pckTcb.fmspc}`,\n );\n }\n if (typeof tcbInfo.pceId !== \"string\" || tcbInfo.pceId.toLowerCase() !== pckTcb.pceId) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `TCB Info PCE ID ${String(tcbInfo.pceId)} does not match PCK PCE ID ${pckTcb.pceId}`,\n );\n }\n\n if (!Array.isArray(tcbInfo.tcbLevels)) {\n throw err(\"TCB_STATUS_REJECTED\", \"TCB Info has no tcbLevels array\");\n }\n const teeTcbSvn = body.subarray(BODY_TEE_TCB_SVN_OFF, BODY_TEE_TCB_SVN_OFF + 16);\n const matched = tcbInfo.tcbLevels.find((level) => tdxTcbLevelMatches(level, pckTcb, teeTcbSvn));\n if (!matched || typeof matched !== \"object\") {\n throw err(\"TCB_STATUS_REJECTED\", \"no TCB Info level matches PCK SGX TCB and quote TEE_TCB_SVN\");\n }\n const status = (matched as Record<string, unknown>)[\"tcbStatus\"];\n if (typeof status !== \"string\" || !ACCEPTED_TCB_STATUSES.has(status)) {\n throw err(\"TCB_STATUS_REJECTED\", `TCB status ${String(status)} is not accepted`);\n }\n verifyTdxModuleIdentity(tcbInfo, body, teeTcbSvn);\n}\n\nfunction verifyQeIdentity(identity: ParsedQeIdentity, qeReport: Uint8Array, now: Date): void {\n if (identity.id !== \"TD_QE\") {\n throw err(\"QE_IDENTITY_REJECTED\", `QE Identity id ${String(identity.id)} is not TD_QE`);\n }\n if (identity.version !== 2) {\n throw err(\n \"QE_IDENTITY_REJECTED\",\n `unsupported QE Identity version ${String(identity.version)}`,\n );\n }\n assertFreshDcapJsonWindow(identity, \"QE Identity\", now);\n\n assertMaskedHexMatches({\n actual: qeReport.subarray(SGX_REPORT_MISCSELECT_OFF, SGX_REPORT_MISCSELECT_OFF + 4),\n expectedHex: identity.miscselect,\n maskHex: identity.miscselectMask,\n label: \"QE Identity MISCSELECT\",\n reason: \"QE_IDENTITY_REJECTED\",\n });\n assertMaskedHexMatches({\n actual: qeReport.subarray(SGX_REPORT_ATTRIBUTES_OFF, SGX_REPORT_ATTRIBUTES_OFF + 16),\n expectedHex: identity.attributes,\n maskHex: identity.attributesMask,\n label: \"QE Identity ATTRIBUTES\",\n reason: \"QE_IDENTITY_REJECTED\",\n });\n\n const expectedMrSigner = bytesToHex(\n qeReport.subarray(SGX_REPORT_MRSIGNER_OFF, SGX_REPORT_MRSIGNER_OFF + 32),\n );\n if (\n typeof identity.mrsigner !== \"string\" ||\n identity.mrsigner.toLowerCase() !== expectedMrSigner\n ) {\n throw err(\n \"QE_IDENTITY_REJECTED\",\n `QE Identity MRSIGNER ${String(identity.mrsigner)} does not match QE report ${expectedMrSigner}`,\n );\n }\n const isvProdId = readU16LE(qeReport, SGX_REPORT_ISV_PROD_ID_OFF);\n if (identity.isvprodid !== isvProdId) {\n throw err(\n \"QE_IDENTITY_REJECTED\",\n `QE Identity ISVProdID ${String(identity.isvprodid)} does not match QE report ${isvProdId}`,\n );\n }\n\n if (!Array.isArray(identity.tcbLevels)) {\n throw err(\"QE_IDENTITY_REJECTED\", \"QE Identity has no tcbLevels array\");\n }\n const isvSvn = readU16LE(qeReport, SGX_REPORT_ISV_SVN_OFF);\n const matched = identity.tcbLevels.find((level) => qeIdentityLevelMatches(level, isvSvn));\n if (!matched || typeof matched !== \"object\") {\n throw err(\"QE_IDENTITY_REJECTED\", \"no QE Identity level matches QE report ISVSVN\");\n }\n const status = (matched as Record<string, unknown>)[\"tcbStatus\"];\n if (typeof status !== \"string\" || !ACCEPTED_QE_IDENTITY_STATUSES.has(status)) {\n throw err(\"QE_IDENTITY_REJECTED\", `QE Identity status ${String(status)} is not accepted`);\n }\n}\n\ntype PckTcb = {\n fmspc: string;\n pceId: string;\n sgxTcbSvns: number[];\n pceSvn: number;\n cpuSvn: Uint8Array;\n};\n\nfunction tdxTcbLevelMatches(level: unknown, pckTcb: PckTcb, teeTcbSvn: Uint8Array): boolean {\n if (!level || typeof level !== \"object\") return false;\n const tcb = (level as Record<string, unknown>)[\"tcb\"];\n if (!tcb || typeof tcb !== \"object\") return false;\n const record = tcb as Record<string, unknown>;\n const sgxComponents = record[\"sgxtcbcomponents\"];\n if (!tcbComponentsMatch(sgxComponents, pckTcb.sgxTcbSvns, 0)) return false;\n const pceSvn = record[\"pcesvn\"];\n if (typeof pceSvn !== \"number\" || pckTcb.pceSvn < pceSvn) return false;\n const tdxComponents = record[\"tdxtcbcomponents\"];\n const tdxStartIndex = teeTcbSvn[1] === 0 ? 0 : 2;\n return tcbComponentsMatch(tdxComponents, Array.from(teeTcbSvn), tdxStartIndex);\n}\n\nfunction tcbComponentsMatch(\n components: unknown,\n actualSvns: ArrayLike<number>,\n startIndex: number,\n): boolean {\n if (!Array.isArray(components) || components.length < 16) return false;\n for (let index = startIndex; index < 16; index++) {\n const component = components[index];\n if (!component || typeof component !== \"object\") return false;\n const svn = (component as Record<string, unknown>)[\"svn\"];\n if (typeof svn !== \"number\" || actualSvns[index] < svn) return false;\n }\n return true;\n}\n\nfunction verifyTdxModuleIdentity(\n tcbInfo: ParsedTcbInfo,\n body: Uint8Array,\n teeTcbSvn: Uint8Array,\n): void {\n const moduleVersion = teeTcbSvn[1];\n const identity = getTdxModuleIdentity(tcbInfo, moduleVersion);\n const expectedMrSigner = bytesToHex(\n body.subarray(BODY_MRSIGNERSEAM_OFF, BODY_MRSIGNERSEAM_OFF + 48),\n );\n if (\n typeof identity[\"mrsigner\"] !== \"string\" ||\n identity[\"mrsigner\"].toLowerCase() !== expectedMrSigner\n ) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `TDX Module Identity MRSIGNER ${String(identity[\"mrsigner\"])} does not match quote ${expectedMrSigner}`,\n );\n }\n assertMaskedHexMatches({\n actual: body.subarray(BODY_SEAM_ATTRIBUTES_OFF, BODY_SEAM_ATTRIBUTES_OFF + 8),\n expectedHex: identity[\"attributes\"],\n maskHex: identity[\"attributesMask\"],\n label: \"TDX Module Identity ATTRIBUTES\",\n reason: \"TCB_STATUS_REJECTED\",\n });\n if (moduleVersion < 1) return;\n\n const tcbLevels = identity[\"tcbLevels\"];\n if (!Array.isArray(tcbLevels)) {\n throw err(\"TCB_STATUS_REJECTED\", \"TDX Module Identity has no tcbLevels array\");\n }\n const matched = tcbLevels.find((level) => tdxModuleTcbLevelMatches(level, teeTcbSvn[0]));\n if (!matched || typeof matched !== \"object\") {\n throw err(\"TCB_STATUS_REJECTED\", \"no TDX Module Identity level matches TEE_TCB_SVN ISVSVN\");\n }\n const status = (matched as Record<string, unknown>)[\"tcbStatus\"];\n if (typeof status !== \"string\" || !ACCEPTED_TDX_MODULE_STATUSES.has(status)) {\n throw err(\"TCB_STATUS_REJECTED\", `TDX Module status ${String(status)} is not accepted`);\n }\n}\n\nfunction getTdxModuleIdentity(\n tcbInfo: ParsedTcbInfo,\n moduleVersion: number,\n): Record<string, unknown> {\n if (moduleVersion < 1) {\n const module = tcbInfo.tdxModule;\n if (!module || typeof module !== \"object\" || Array.isArray(module)) {\n throw err(\"TCB_STATUS_REJECTED\", \"TCB Info has no tdxModule object\");\n }\n return module as Record<string, unknown>;\n }\n\n const identities = tcbInfo.tdxModuleIdentities;\n if (!Array.isArray(identities)) {\n throw err(\"TCB_STATUS_REJECTED\", \"TCB Info has no tdxModuleIdentities array\");\n }\n const moduleIdentity = identities.find((candidate) => {\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) return false;\n const id = (candidate as Record<string, unknown>)[\"id\"];\n return typeof id === \"string\" && tdxModuleIdMatches(id, moduleVersion);\n });\n if (!moduleIdentity || typeof moduleIdentity !== \"object\") {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `no TDX Module Identity matches TEE_TCB_SVN module version ${moduleVersion}`,\n );\n }\n return moduleIdentity as Record<string, unknown>;\n}\n\nfunction tdxModuleIdMatches(id: string, moduleVersion: number): boolean {\n const match = /^TDX_(\\d+)$/.exec(id);\n return match !== null && Number.parseInt(match[1], 10) === moduleVersion;\n}\n\nfunction tdxModuleTcbLevelMatches(level: unknown, isvSvn: number): boolean {\n if (!level || typeof level !== \"object\") return false;\n const tcb = (level as Record<string, unknown>)[\"tcb\"];\n if (!tcb || typeof tcb !== \"object\") return false;\n const record = tcb as Record<string, unknown>;\n const required =\n typeof record[\"isvsvn\"] === \"number\"\n ? record[\"isvsvn\"]\n : typeof record[\"isvnsvn\"] === \"number\"\n ? record[\"isvnsvn\"]\n : undefined;\n return typeof required === \"number\" && isvSvn >= required;\n}\n\nfunction qeIdentityLevelMatches(level: unknown, isvSvn: number): boolean {\n if (!level || typeof level !== \"object\") return false;\n const tcb = (level as Record<string, unknown>)[\"tcb\"];\n if (!tcb || typeof tcb !== \"object\") return false;\n const requiredIsvSvn = (tcb as Record<string, unknown>)[\"isvsvn\"];\n return typeof requiredIsvSvn === \"number\" && isvSvn >= requiredIsvSvn;\n}\n\nfunction assertMaskedHexMatches(params: {\n actual: Uint8Array;\n expectedHex: unknown;\n maskHex: unknown;\n label: string;\n reason: Extract<RefReason, \"TCB_STATUS_REJECTED\" | \"QE_IDENTITY_REJECTED\">;\n}): void {\n const { actual, expectedHex, maskHex, label, reason } = params;\n if (typeof expectedHex !== \"string\" || !isHexByteLength(expectedHex, actual.length)) {\n throw err(reason, `${label} is missing or not ${actual.length} bytes of hex`);\n }\n if (typeof maskHex !== \"string\" || !isHexByteLength(maskHex, actual.length)) {\n throw err(reason, `${label} mask is missing or not ${actual.length} bytes of hex`);\n }\n const expected = hexToBytes(expectedHex);\n const mask = hexToBytes(maskHex);\n for (let index = 0; index < actual.length; index++) {\n if ((actual[index]! & mask[index]!) !== (expected[index]! & mask[index]!)) {\n throw err(reason, `${label} masked byte ${index} does not match signed collateral policy`);\n }\n }\n}\n\nfunction isHexByteLength(value: string, byteLength: number): boolean {\n return value.length === byteLength * 2 && /^[0-9a-f]+$/i.test(value);\n}\n\nfunction assertFreshDcapJsonWindow(\n value: { issueDate?: unknown; nextUpdate?: unknown },\n label: string,\n now: Date,\n): void {\n if (typeof value.issueDate !== \"string\" || typeof value.nextUpdate !== \"string\") {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} is missing issueDate or nextUpdate`);\n }\n const issueDate = new Date(value.issueDate);\n const nextUpdate = new Date(value.nextUpdate);\n if (Number.isNaN(issueDate.getTime()) || Number.isNaN(nextUpdate.getTime())) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} has invalid issueDate or nextUpdate`);\n }\n if (now < issueDate) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} is not yet valid`);\n }\n if (now > nextUpdate) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} is stale past nextUpdate`);\n }\n}\n\nfunction parseCrl(pem: string, label: string): x509.X509Crl {\n if (typeof pem !== \"string\" || pem.length === 0) {\n throw err(\"DCAP_COLLATERAL_MISSING\", `${label} is missing`);\n }\n try {\n return new x509.X509Crl(pem);\n } catch (e) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} is not a parseable X.509 CRL: ${e}`);\n }\n}\n\nasync function verifyCrl(\n crl: x509.X509Crl,\n issuer: x509.X509Certificate,\n label: string,\n now: Date,\n): Promise<void> {\n if (crl.issuer !== issuer.subject) {\n throw err(\n \"DCAP_COLLATERAL_SIGNATURE\",\n `${label} issuer ${crl.issuer} does not match expected ${issuer.subject}`,\n );\n }\n if (now < crl.thisUpdate) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} is not yet valid`);\n }\n if (!crl.nextUpdate || now > crl.nextUpdate) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} is stale past nextUpdate`);\n }\n let ok: boolean;\n try {\n ok = await crl.verify({ publicKey: issuer });\n } catch (e) {\n throw err(\"DCAP_COLLATERAL_SIGNATURE\", `${label} signature verification threw: ${e}`);\n }\n if (!ok) {\n throw err(\"DCAP_COLLATERAL_SIGNATURE\", `${label} signature verification failed`);\n }\n}\n\nasync function assertNotRevokedByRoot(\n rootCrl: x509.X509Crl,\n cert: x509.X509Certificate,\n label: string,\n): Promise<void> {\n if (rootCrl.findRevoked(cert)) {\n throw err(\"DCAP_COLLATERAL_REVOKED\", `${label} is revoked by Intel root CRL`);\n }\n}\n\nasync function assertSameCertificate(\n actual: x509.X509Certificate,\n expected: x509.X509Certificate,\n label: string,\n): Promise<void> {\n const actualFp = await sha256Hex(new Uint8Array(actual.rawData));\n const expectedFp = await sha256Hex(new Uint8Array(expected.rawData));\n if (actualFp !== expectedFp) {\n throw err(\n \"DCAP_COLLATERAL_SIGNATURE\",\n `${label} fingerprint ${actualFp} does not match quote chain issuer ${expectedFp}`,\n );\n }\n}\n\nfunction parsePemCertificateChain(\n pem: string,\n label: string,\n minCerts: number,\n): x509.X509Certificate[] {\n if (typeof pem !== \"string\" || pem.length === 0) {\n throw err(\"DCAP_COLLATERAL_MISSING\", `${label} is missing`);\n }\n const matches = pem.match(/-----BEGIN CERTIFICATE-----[\\s\\S]+?-----END CERTIFICATE-----/g) ?? [];\n if (matches.length < minCerts) {\n throw err(\n \"DCAP_COLLATERAL_PARSE\",\n `${label} has ${matches.length} cert(s), expected at least ${minCerts}`,\n );\n }\n return matches.map((certPem, index) => {\n try {\n return new x509.X509Certificate(certPem);\n } catch (e) {\n throw err(\"DCAP_COLLATERAL_PARSE\", `${label} cert[${index}] is not parseable: ${e}`);\n }\n });\n}\n\nfunction extractPckTcb(cert: x509.X509Certificate): PckTcb {\n const sgxExtensions = cert.getExtension(INTEL_PCK_SGX_EXTENSIONS_OID);\n if (sgxExtensions) {\n return parsePckSgxExtensions(new Uint8Array(sgxExtensions.value));\n }\n\n return {\n fmspc: extractPckExtensionHex(cert, INTEL_PCK_EXTENSION_FMSPC_OID, 6, \"FMSPC\"),\n pceId: extractPckExtensionHex(cert, INTEL_PCK_EXTENSION_PCE_ID_OID, 2, \"PCE ID\"),\n sgxTcbSvns: Array.from({ length: 16 }, (_, index) =>\n extractPckIntegerExtension(\n cert,\n `${INTEL_PCK_EXTENSION_SGX_TCB_COMPONENT_OID_PREFIX}${index + 1}`,\n `SGX TCB component ${index + 1}`,\n ),\n ),\n pceSvn: extractPckIntegerExtension(cert, INTEL_PCK_EXTENSION_PCESVN_OID, \"PCESVN\"),\n cpuSvn: hexToBytes(extractPckExtensionHex(cert, INTEL_PCK_EXTENSION_CPUSVN_OID, 16, \"CPUSVN\")),\n };\n}\n\nfunction parsePckSgxExtensions(bytes: Uint8Array): PckTcb {\n const topLevel = unwrapDerOctetStringIfPresent(bytes);\n const extensions = derChildren(expectDerTag(readDerTlv(topLevel, 0), 0x30, \"SGX extensions\"));\n const parsed: Partial<PckTcb> = {};\n for (const extension of extensions) {\n const contextTag = contextSpecificTagNumber(extension);\n if (contextTag === 2) {\n parsed.pceId = bytesToHex(readContextOctetString(extension, \"PCE ID\"));\n continue;\n }\n if (contextTag === 3) {\n parsed.fmspc = bytesToHex(readContextOctetString(extension, \"FMSPC\"));\n continue;\n }\n if (contextTag === 1) {\n const tcb = parsePckTcbExtension(extension);\n parsed.sgxTcbSvns = tcb.sgxTcbSvns;\n parsed.pceSvn = tcb.pceSvn;\n parsed.cpuSvn = tcb.cpuSvn;\n continue;\n }\n\n const children = derChildren(expectDerTag(extension, 0x30, \"SGX extension item\"));\n if (children.length !== 2) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK SGX extension item does not contain OID and value\");\n }\n const oid = readDerOid(children[0]!);\n const value = children[1]!;\n if (oid === INTEL_PCK_EXTENSION_PCE_ID_OID) {\n parsed.pceId = bytesToHex(readPckChoiceOctetString(value, 2, \"PCE ID\"));\n } else if (oid === INTEL_PCK_EXTENSION_FMSPC_OID) {\n parsed.fmspc = bytesToHex(readPckChoiceOctetString(value, 3, \"FMSPC\"));\n } else if (oid === INTEL_PCK_EXTENSION_TCB_OID) {\n const tcb = parsePckTcbExtension(value);\n parsed.sgxTcbSvns = tcb.sgxTcbSvns;\n parsed.pceSvn = tcb.pceSvn;\n parsed.cpuSvn = tcb.cpuSvn;\n }\n }\n\n if (\n parsed.fmspc === undefined ||\n parsed.pceId === undefined ||\n parsed.sgxTcbSvns === undefined ||\n parsed.pceSvn === undefined ||\n parsed.cpuSvn === undefined\n ) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK SGX extension is missing FMSPC, PCE ID, or TCB fields\");\n }\n return parsed as PckTcb;\n}\n\nfunction parsePckTcbExtension(value: DerTlv): Pick<PckTcb, \"sgxTcbSvns\" | \"pceSvn\" | \"cpuSvn\"> {\n const tcbItems = pckTcbChildren(value);\n const sgxTcbSvns: number[] = [];\n let pceSvn: number | undefined;\n let cpuSvn: Uint8Array | undefined;\n for (const item of tcbItems) {\n const contextTag = contextSpecificTagNumber(item);\n if (contextTag !== null) {\n if (contextTag === 16) {\n pceSvn = readContextInteger(item, \"PCESVN\");\n } else if (contextTag === 17) {\n cpuSvn = readContextOctetString(item, \"CPUSVN\");\n } else if (contextTag >= 0 && contextTag <= 15) {\n sgxTcbSvns[contextTag] = readContextInteger(item, `SGX TCB component ${contextTag + 1}`);\n }\n continue;\n }\n\n const children = derChildren(expectDerTag(item, 0x30, \"PCK TCB item\"));\n if (children.length !== 2) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK TCB item does not contain OID and value\");\n }\n const oid = readDerOid(children[0]!);\n const valueTlv = children[1]!;\n if (oid === INTEL_PCK_EXTENSION_PCESVN_OID) {\n pceSvn = readPckChoiceInteger(valueTlv, 16, \"PCESVN\");\n } else if (oid === INTEL_PCK_EXTENSION_CPUSVN_OID) {\n cpuSvn = readPckChoiceOctetString(valueTlv, 17, \"CPUSVN\");\n } else if (oid.startsWith(INTEL_PCK_EXTENSION_SGX_TCB_COMPONENT_OID_PREFIX)) {\n const index = Number.parseInt(\n oid.slice(INTEL_PCK_EXTENSION_SGX_TCB_COMPONENT_OID_PREFIX.length),\n 10,\n );\n if (!Number.isInteger(index) || index < 1 || index > 16) {\n throw err(\"TCB_STATUS_REJECTED\", `PCK TCB component OID ${oid} is out of range`);\n }\n sgxTcbSvns[index - 1] = readPckChoiceInteger(\n valueTlv,\n index - 1,\n `SGX TCB component ${index}`,\n );\n }\n }\n if (\n sgxTcbSvns.length !== 16 ||\n Array.from({ length: 16 }, (_, index) => sgxTcbSvns[index]).some((svn) => svn === undefined)\n ) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK TCB extension is missing SGX TCB components\");\n }\n if (pceSvn === undefined || cpuSvn === undefined) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK TCB extension is missing PCESVN or CPUSVN\");\n }\n if (cpuSvn.length !== 16) {\n throw err(\"TCB_STATUS_REJECTED\", `PCK CPUSVN has ${cpuSvn.length} bytes, expected 16`);\n }\n return { sgxTcbSvns, pceSvn, cpuSvn };\n}\n\nfunction extractPckExtensionHex(\n cert: x509.X509Certificate,\n oid: string,\n expectedBytes: number,\n label: string,\n): string {\n const ext = cert.getExtension(oid);\n if (!ext) {\n throw err(\"TCB_STATUS_REJECTED\", `PCK leaf is missing ${label} extension ${oid}`);\n }\n const decoded = unwrapDerOctetStringIfPresent(new Uint8Array(ext.value));\n if (decoded.length !== expectedBytes) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `PCK ${label} extension has ${decoded.length} bytes, expected ${expectedBytes}`,\n );\n }\n return bytesToHex(decoded);\n}\n\nfunction extractPckIntegerExtension(\n cert: x509.X509Certificate,\n oid: string,\n label: string,\n): number {\n const ext = cert.getExtension(oid);\n if (!ext) {\n throw err(\"TCB_STATUS_REJECTED\", `PCK leaf is missing ${label} extension ${oid}`);\n }\n return readDerInteger(readDerTlv(new Uint8Array(ext.value), 0), label);\n}\n\ntype DerTlv = {\n tag: number;\n start: number;\n valueStart: number;\n valueEnd: number;\n end: number;\n source: Uint8Array;\n};\n\nfunction readDerTlv(source: Uint8Array, start: number): DerTlv {\n if (start + 2 > source.length) {\n throw err(\"TCB_STATUS_REJECTED\", \"truncated DER value\");\n }\n const tag = source[start]!;\n let offset = start + 1;\n const firstLength = source[offset++]!;\n let length: number;\n if ((firstLength & 0x80) === 0) {\n length = firstLength;\n } else {\n const octets = firstLength & 0x7f;\n if (octets === 0 || octets > 4 || offset + octets > source.length) {\n throw err(\"TCB_STATUS_REJECTED\", \"unsupported DER length\");\n }\n length = 0;\n for (let i = 0; i < octets; i++) {\n length = (length << 8) | source[offset++]!;\n }\n }\n const valueStart = offset;\n const valueEnd = valueStart + length;\n if (valueEnd > source.length) {\n throw err(\"TCB_STATUS_REJECTED\", \"DER value length exceeds buffer\");\n }\n return { tag, start, valueStart, valueEnd, end: valueEnd, source };\n}\n\nfunction expectDerTag(tlv: DerTlv, tag: number, label: string): DerTlv {\n if (tlv.tag !== tag) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} has DER tag 0x${tlv.tag.toString(16)}`);\n }\n return tlv;\n}\n\nfunction derChildren(tlv: DerTlv): DerTlv[] {\n const children: DerTlv[] = [];\n let offset = tlv.valueStart;\n while (offset < tlv.valueEnd) {\n const child = readDerTlv(tlv.source, offset);\n if (child.end > tlv.valueEnd) {\n throw err(\"TCB_STATUS_REJECTED\", \"DER child exceeds parent\");\n }\n children.push(child);\n offset = child.end;\n }\n return children;\n}\n\nfunction readDerOid(tlv: DerTlv): string {\n expectDerTag(tlv, 0x06, \"OID\");\n const bytes = tlv.source.subarray(tlv.valueStart, tlv.valueEnd);\n if (bytes.length === 0) {\n throw err(\"TCB_STATUS_REJECTED\", \"empty DER OID\");\n }\n const parts = [Math.floor(bytes[0]! / 40), bytes[0]! % 40];\n let value = 0;\n for (const byte of bytes.subarray(1)) {\n value = (value << 7) | (byte & 0x7f);\n if ((byte & 0x80) === 0) {\n parts.push(value);\n value = 0;\n }\n }\n if (value !== 0) {\n throw err(\"TCB_STATUS_REJECTED\", \"truncated DER OID\");\n }\n return parts.join(\".\");\n}\n\nfunction readDerInteger(tlv: DerTlv, label: string): number {\n expectDerTag(tlv, 0x02, label);\n const bytes = tlv.source.subarray(tlv.valueStart, tlv.valueEnd);\n if (bytes.length === 0 || (bytes[0]! & 0x80) !== 0) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} is not a positive DER integer`);\n }\n let value = 0;\n for (const byte of bytes) value = (value << 8) | byte;\n return value;\n}\n\nfunction readDerOctetString(tlv: DerTlv, label: string): Uint8Array {\n expectDerTag(tlv, 0x04, label);\n return tlv.source.subarray(tlv.valueStart, tlv.valueEnd);\n}\n\nfunction pckTcbChildren(value: DerTlv): DerTlv[] {\n if (contextSpecificTagNumber(value) === 1) {\n if ((value.tag & 0x20) === 0) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK TCB field is not constructed\");\n }\n const children = derChildren(value);\n if (children.length === 1 && children[0]!.tag === 0x30) {\n return derChildren(children[0]!);\n }\n return children;\n }\n return derChildren(expectDerTag(value, 0x30, \"PCK TCB extension\"));\n}\n\nfunction readPckChoiceInteger(tlv: DerTlv, expectedTag: number, label: string): number {\n const contextTag = contextSpecificTagNumber(tlv);\n if (contextTag !== null) {\n if (contextTag !== expectedTag) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `${label} uses context tag ${contextTag}, expected ${expectedTag}`,\n );\n }\n return readContextInteger(tlv, label);\n }\n return readDerInteger(tlv, label);\n}\n\nfunction readPckChoiceOctetString(tlv: DerTlv, expectedTag: number, label: string): Uint8Array {\n const contextTag = contextSpecificTagNumber(tlv);\n if (contextTag !== null) {\n if (contextTag !== expectedTag) {\n throw err(\n \"TCB_STATUS_REJECTED\",\n `${label} uses context tag ${contextTag}, expected ${expectedTag}`,\n );\n }\n return readContextOctetString(tlv, label);\n }\n return readDerOctetString(tlv, label);\n}\n\nfunction contextSpecificTagNumber(tlv: DerTlv): number | null {\n if ((tlv.tag & 0xc0) !== 0x80) return null;\n const tagNumber = tlv.tag & 0x1f;\n return tagNumber === 0x1f ? null : tagNumber;\n}\n\nfunction readContextInner(tlv: DerTlv): DerTlv {\n if ((tlv.tag & 0x20) === 0) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK context-specific field is not constructed\");\n }\n const children = derChildren(tlv);\n if (children.length !== 1) {\n throw err(\"TCB_STATUS_REJECTED\", \"PCK context-specific field has multiple values\");\n }\n return children[0]!;\n}\n\nfunction readContextInteger(tlv: DerTlv, label: string): number {\n const inner = (tlv.tag & 0x20) !== 0 ? readContextInner(tlv) : tlv;\n if ((tlv.tag & 0x20) !== 0) return readDerInteger(inner, label);\n return readDerIntegerValue(inner.source.subarray(inner.valueStart, inner.valueEnd), label);\n}\n\nfunction readContextOctetString(tlv: DerTlv, label: string): Uint8Array {\n const inner = (tlv.tag & 0x20) !== 0 ? readContextInner(tlv) : tlv;\n if ((tlv.tag & 0x20) !== 0) return readDerOctetString(inner, label);\n return inner.source.subarray(inner.valueStart, inner.valueEnd);\n}\n\nfunction readDerIntegerValue(bytes: Uint8Array, label: string): number {\n if (bytes.length === 0 || (bytes[0]! & 0x80) !== 0) {\n throw err(\"TCB_STATUS_REJECTED\", `${label} is not a positive DER integer`);\n }\n let value = 0;\n for (const byte of bytes) value = (value << 8) | byte;\n return value;\n}\n\nfunction unwrapDerOctetStringIfPresent(bytes: Uint8Array): Uint8Array {\n if (bytes.length >= 2 && bytes[0] === 0x04) {\n const tlv = readDerTlv(bytes, 0);\n if (tlv.end === bytes.length) return bytes.subarray(tlv.valueStart, tlv.valueEnd);\n }\n return bytes;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n if (hex.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(hex)) {\n throw err(\"DCAP_COLLATERAL_PARSE\", \"invalid hex string\");\n }\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n}\n\n// ── Azure TDX + MAA attestation ───────────────────────────────────────────────\n//\n// azure-tdx-dcap combines four evidence sources:\n// 1. DCAP quote (Intel PCK chain) - genuine TDX VM.\n// REPORTDATA[0:32] = SHA-256(hcl_keys_json) - set by the Azure hypervisor.\n// 2. MAA JWT (/attest/TdxVm) - RS256-signed by Microsoft Azure Attestation.\n// Contains tdx_report_data, tdx_mrtd, tdx_td_attributes_debug, compliance.\n// 3. hcl_keys_json - raw JSON blob from HCL NV index 0x1400001.\n// SHA-256(hcl_keys_json_bytes) == DCAP REPORTDATA[0:32]. Contains the AK.\n// 4. TPM AK quote - signed by the AK from hcl_keys_json.\n// qualifying_data = SHA-256(nonce || noise_pubkey || binary_hash).\n\nconst MAA_JKU_PATTERN = /^https:\\/\\/[a-z0-9-]+\\.[a-z0-9]+\\.attest\\.azure\\.net\\/certs$/;\n\n/** Base64url decode to string (for JWT header/payload JSON). */\nfunction b64urlDecodeStr(s: string): string {\n const padded = s.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"=\".repeat((4 - (s.length % 4)) % 4);\n return atob(padded);\n}\n\n/** Base64url decode to Uint8Array (for JWT signature bytes). */\nfunction b64urlDecodeBytes(s: string): Uint8Array {\n const decoded = b64urlDecodeStr(s);\n const out = new Uint8Array(decoded.length);\n for (let i = 0; i < decoded.length; i++) out[i] = decoded.charCodeAt(i);\n return out;\n}\n\ntype MaaMeasurements = {\n reportData: string;\n mrtd: string;\n rtmr0: string;\n rtmr1: string;\n rtmr2: string;\n rtmr3: string;\n};\n\ntype QuoteMeasurements = Omit<MaaMeasurements, \"reportData\">;\n\n/**\n * Verify a MAA JWT from /attest/TdxVm and extract TDX measurements. Validates\n * the RS256 signature against the MAA JWKS, expiry, compliance status, and the\n * debug bit. AK extraction is done separately from hcl_keys_json.\n */\nasync function verifyAzureMaaToken(\n token: string,\n policy: AzureMaaPolicy,\n timeoutMs: number = DEFAULT_AZURE_JWKS_TIMEOUT_MS,\n): Promise<MaaMeasurements> {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw err(\"MAA_TOKEN_PARSE\", `MAA token is not a valid JWT (${parts.length} parts)`);\n }\n const [headerB64, payloadB64, sigB64] = parts;\n\n let header: Record<string, unknown>;\n let payload: Record<string, unknown>;\n try {\n header = JSON.parse(b64urlDecodeStr(headerB64));\n payload = JSON.parse(b64urlDecodeStr(payloadB64));\n } catch (e) {\n throw err(\"MAA_TOKEN_PARSE\", `failed to decode MAA JWT header/payload: ${e}`);\n }\n\n // Token expiry: reject stale tokens before any network fetch.\n const exp = payload[\"exp\"];\n if (typeof exp === \"number\" && Math.floor(Date.now() / 1000) > exp) {\n throw err(\"MAA_TOKEN_EXPIRED\", `MAA JWT expired at ${new Date(exp * 1000).toISOString()}`);\n }\n\n const jku = header[\"jku\"] as string | undefined;\n const kid = header[\"kid\"] as string | undefined;\n if (!jku || !kid) {\n throw err(\"MAA_TOKEN_PARSE\", \"MAA JWT header missing jku or kid\");\n }\n if (payload[\"iss\"] !== policy.expectedIssuer) {\n throw err(\n \"MAA_ISSUER_MISMATCH\",\n `MAA JWT issuer ${String(payload[\"iss\"])} does not match pinned ${policy.expectedIssuer}`,\n );\n }\n if (jku !== policy.expectedJwksUrl) {\n throw err(\n \"MAA_JWKS_MISMATCH\",\n `MAA JWT jku ${jku} does not match pinned ${policy.expectedJwksUrl}`,\n );\n }\n if (!MAA_JKU_PATTERN.test(policy.expectedJwksUrl)) {\n throw err(\n \"MAA_JWKS_MISMATCH\",\n `pinned MAA JWKS URL does not match Azure attestation domain: ${policy.expectedJwksUrl}`,\n );\n }\n if (payload[\"x-ms-policy-hash\"] !== policy.expectedPolicyHash) {\n throw err(\n \"MAA_POLICY_HASH_MISMATCH\",\n `MAA policy hash ${String(payload[\"x-ms-policy-hash\"])} does not match pinned ${policy.expectedPolicyHash}`,\n );\n }\n\n // Fetch the pinned MAA JWKS. The token header must not select the trust root.\n let jwks: { keys: Array<{ kid: string; kty: string; n: string; e: string }> };\n try {\n jwks = await fetchMaaJwks(policy.expectedJwksUrl, timeoutMs);\n } catch (e) {\n throw err(\n \"MAA_TOKEN_SIGNATURE\",\n `failed to fetch MAA JWKS from ${policy.expectedJwksUrl}: ${e}`,\n );\n }\n\n const jwk = jwks.keys.find((k) => k.kid === kid);\n if (!jwk) {\n throw err(\"MAA_TOKEN_SIGNATURE\", `no key with kid=${kid} found in MAA JWKS`);\n }\n\n // Import RSA-2048 public key and verify RS256 signature.\n let sigPubKey: CryptoKey;\n try {\n sigPubKey = await crypto.subtle.importKey(\n \"jwk\",\n { kty: \"RSA\", n: jwk.n, e: jwk.e, alg: \"RS256\", ext: true },\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"verify\"],\n );\n } catch (e) {\n throw err(\"MAA_TOKEN_SIGNATURE\", `failed to import MAA JWK: ${e}`);\n }\n\n const msg = new TextEncoder().encode(`${headerB64}.${payloadB64}`);\n const sig = b64urlDecodeBytes(sigB64);\n const valid = await crypto.subtle.verify(\n { name: \"RSASSA-PKCS1-v1_5\" },\n sigPubKey,\n sig as BufferSource,\n msg as BufferSource,\n );\n if (!valid) {\n throw err(\"MAA_TOKEN_SIGNATURE\", \"MAA JWT RS256 signature verification failed\");\n }\n\n // Compliance status: MAA certifies this is a genuine Azure CVM.\n if (payload[\"x-ms-compliance-status\"] !== \"azure-compliant-cvm\") {\n throw err(\n \"MAA_COMPLIANCE_MISMATCH\",\n `MAA compliance status: \"${payload[\"x-ms-compliance-status\"]}\" (expected \"azure-compliant-cvm\")`,\n );\n }\n\n // Debug bit: refuse a debuggable TD.\n if (payload[\"tdx_td_attributes_debug\"] !== false) {\n throw err(\"MAA_DEBUG_BIT_SET\", \"MAA token reports TDX debug bit set\");\n }\n\n const reportData = payload[\"tdx_report_data\"];\n if (typeof reportData !== \"string\" || !/^[0-9a-f]{128}$/i.test(reportData)) {\n throw err(\"MAA_REPORTDATA_MISMATCH\", \"MAA token missing valid 64-byte tdx_report_data claim\");\n }\n\n return {\n reportData: reportData.toLowerCase(),\n mrtd: readMaaMeasurement(payload, \"tdx_mrtd\"),\n rtmr0: readMaaMeasurement(payload, \"tdx_rtmr0\"),\n rtmr1: readMaaMeasurement(payload, \"tdx_rtmr1\"),\n rtmr2: readMaaMeasurement(payload, \"tdx_rtmr2\"),\n rtmr3: readMaaMeasurement(payload, \"tdx_rtmr3\"),\n };\n}\n\nfunction readMaaMeasurement(payload: Record<string, unknown>, claim: string): string {\n const value = payload[claim];\n if (typeof value !== \"string\" || !/^[0-9a-f]{96}$/i.test(value)) {\n throw err(\"MAA_REPORTDATA_MISMATCH\", `MAA token missing valid ${claim} claim`);\n }\n return value.toLowerCase();\n}\n\nfunction assertMaaMeasurementsMatchDcap(maa: MaaMeasurements, dcap: QuoteMeasurements): void {\n const fields = [\"mrtd\", \"rtmr0\", \"rtmr1\", \"rtmr2\", \"rtmr3\"] as const;\n for (const field of fields) {\n if (maa[field] !== dcap[field]) {\n throw err(\n \"MAA_REPORTDATA_MISMATCH\",\n `MAA ${field} ${maa[field]} does not match DCAP quote ${field.toUpperCase()} ${dcap[field]}`,\n );\n }\n }\n}\n\nasync function fetchMaaJwks(\n url: string,\n timeoutMs: number,\n): Promise<{ keys: Array<{ kid: string; kty: string; n: string; e: string }> }> {\n const boundedTimeoutMs =\n Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : DEFAULT_AZURE_JWKS_TIMEOUT_MS;\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n controller.abort();\n reject(new Error(`timed out after ${boundedTimeoutMs}ms`));\n }, boundedTimeoutMs);\n });\n\n try {\n return await Promise.race([\n (async () => {\n const resp = await fetch(url, { signal: controller.signal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n return (await resp.json()) as {\n keys: Array<{ kid: string; kty: string; n: string; e: string }>;\n };\n })(),\n timeout,\n ]);\n } finally {\n if (timeoutId !== null) clearTimeout(timeoutId);\n }\n}\n\n/**\n * Verify the Azure TPM AK quote nonce binding.\n *\n * Wire format: [4-byte msg_len LE][TPM2B_ATTEST][TPMT_SIGNATURE].\n * Signature: RSA-2048 RSASSA-PKCS1v15-SHA256 over the TPMS_ATTEST body.\n * qualifying_data = SHA-256(nonce_bytes || noise_pubkey_bytes || binary_hash)\n * must appear\n * verbatim in the TPMS_ATTEST extraData field.\n */\nasync function verifyTpmQuoteNonce(\n tpmQuoteB64: string,\n akPubKey: CryptoKey,\n expectedNonce: Uint8Array,\n expectedNoiseStaticPub: Uint8Array,\n expectedBinaryHash: Uint8Array,\n): Promise<void> {\n let raw: Uint8Array;\n try {\n raw = base64ToBytes(tpmQuoteB64);\n } catch (e) {\n throw err(\"TPM_QUOTE_SIGNATURE\", `failed to decode tpm_quote: ${e}`);\n }\n\n if (raw.length < 8) {\n throw err(\"TPM_QUOTE_SIGNATURE\", \"tpm_quote too short\");\n }\n\n // [4-byte msg_len LE][TPMS_ATTEST raw bytes][TPMT_SIGNATURE raw bytes].\n // tpm2_quote -m writes the raw TPMS_ATTEST directly (no TPM2B size prefix).\n const msgLen = new DataView(raw.buffer, raw.byteOffset).getUint32(0, true /* little-endian */);\n if (4 + msgLen > raw.length) {\n throw err(\"TPM_QUOTE_SIGNATURE\", `tpm_quote msg_len=${msgLen} exceeds buffer`);\n }\n const tpmsAttest = raw.slice(4, 4 + msgLen); // starts with ff544347 (TPM_GENERATED_VALUE)\n const sigBlob = raw.slice(4 + msgLen);\n\n // TPMT_SIGNATURE: [sigAlg u16 BE][hashAlg u16 BE][size u16 BE][sig bytes]\n if (sigBlob.length < 6) {\n throw err(\"TPM_QUOTE_SIGNATURE\", \"TPMT_SIGNATURE too short\");\n }\n const sigSize = (sigBlob[4] << 8) | sigBlob[5];\n const sigBytes = sigBlob.slice(6, 6 + sigSize);\n if (sigBytes.length !== sigSize) {\n throw err(\n \"TPM_QUOTE_SIGNATURE\",\n `TPMT_SIGNATURE truncated: need ${sigSize}, have ${sigBytes.length}`,\n );\n }\n\n // Verify RSA signature over tpmsAttest using the MAA-certified AK public key.\n const valid = await crypto.subtle.verify(\n { name: \"RSASSA-PKCS1-v1_5\" },\n akPubKey,\n sigBytes as BufferSource,\n tpmsAttest as BufferSource,\n );\n if (!valid) {\n throw err(\"TPM_QUOTE_SIGNATURE\", \"TPM AK RSA signature verification failed\");\n }\n\n // Verify qualifying_data == SHA-256(nonce || noise_pubkey || binary_hash) exactly matches\n // TPMS_ATTEST.extraData. A substring search would accept unrelated signed\n // fields that happen to contain the challenge bytes.\n const qdInput = new Uint8Array(\n expectedNonce.length + expectedNoiseStaticPub.length + expectedBinaryHash.length,\n );\n qdInput.set(expectedNonce, 0);\n qdInput.set(expectedNoiseStaticPub, expectedNonce.length);\n qdInput.set(expectedBinaryHash, expectedNonce.length + expectedNoiseStaticPub.length);\n const expectedQd = new Uint8Array(await crypto.subtle.digest(\"SHA-256\", qdInput as BufferSource));\n\n const extraData = readTpmsAttestExtraData(tpmsAttest);\n if (!constantTimeEq(extraData, expectedQd)) {\n throw err(\n \"TPM_NONCE_MISMATCH\",\n \"TPMS_ATTEST extraData does not equal SHA-256(nonce || noise_pubkey || binary_hash)\",\n );\n }\n}\n\nfunction readTpmsAttestExtraData(tpmsAttest: Uint8Array): Uint8Array {\n if (tpmsAttest.length < 10) {\n throw err(\"TPM_QUOTE_SIGNATURE\", \"TPMS_ATTEST too short\");\n }\n\n const view = new DataView(tpmsAttest.buffer, tpmsAttest.byteOffset, tpmsAttest.byteLength);\n const magic = view.getUint32(0, false);\n if (magic !== TPM_GENERATED_VALUE) {\n throw err(\n \"TPM_QUOTE_SIGNATURE\",\n `TPMS_ATTEST magic ${magic.toString(16)} is not TPM_GENERATED_VALUE`,\n );\n }\n const attestType = view.getUint16(4, false);\n if (attestType !== TPM_ST_ATTEST_QUOTE) {\n throw err(\"TPM_QUOTE_SIGNATURE\", `TPMS_ATTEST type ${attestType.toString(16)} is not quote`);\n }\n\n let offset = 6;\n offset = readTpm2b(tpmsAttest, offset, \"qualifiedSigner\").nextOffset;\n return readTpm2b(tpmsAttest, offset, \"extraData\").data;\n}\n\nfunction readTpm2b(\n bytes: Uint8Array,\n offset: number,\n label: string,\n): { data: Uint8Array; nextOffset: number } {\n if (offset + 2 > bytes.length) {\n throw err(\"TPM_QUOTE_SIGNATURE\", `TPMS_ATTEST truncated before ${label} size`);\n }\n const size = (bytes[offset] << 8) | bytes[offset + 1];\n const start = offset + 2;\n const end = start + size;\n if (end > bytes.length) {\n throw err(\"TPM_QUOTE_SIGNATURE\", `TPMS_ATTEST truncated in ${label}`);\n }\n return { data: bytes.slice(start, end), nextOffset: end };\n}\n\n/** Base64 (standard or URL-safe) decode to Uint8Array. */\nfunction base64ToBytes(b64: string): Uint8Array {\n const normalized = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n const binaryStr = atob(padded);\n const out = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) out[i] = binaryStr.charCodeAt(i);\n return out;\n}\n\nasync function verifyAzureTdxAttestation(params: {\n raw: Uint8Array;\n response: AttestResponse;\n expectedNonce: Uint8Array;\n expectedNoiseStaticPub: Uint8Array;\n policy: AttestationPolicy;\n timeoutMs?: number;\n}): Promise<AttestedMetadata> {\n const { raw, response, expectedNonce, expectedNoiseStaticPub, policy, timeoutMs } = params;\n\n const body = raw.subarray(BODY_OFFSET, BODY_OFFSET + BODY_SIZE);\n const dcapMeasurements = parseMeasurements(body);\n const reportData = body.subarray(\n BODY_REPORT_DATA_OFF,\n BODY_REPORT_DATA_OFF + BODY_REPORT_DATA_LEN,\n );\n\n await verifyDcapQuoteAndCollateral({ raw, body, response, policy });\n assertDebugBitClear(body);\n\n // A. MAA JWT: verify RS256 signature, expiry, compliance status, debug bit,\n // and that MAA attested the exact REPORTDATA read from the DCAP quote.\n if (!response.maa_token) {\n throw err(\"MAA_TOKEN_MISSING\", \"azure-tdx-dcap response missing maa_token\");\n }\n if (!policy.azureMaa) {\n throw err(\n \"MAA_TRUST_POLICY_MISSING\",\n \"azure-tdx-dcap attestation requires pinned MAA issuer, JWKS URL, and policy hash\",\n );\n }\n const measurements = await verifyAzureMaaToken(response.maa_token, policy.azureMaa, timeoutMs);\n const reportDataHex = bytesToHex(reportData);\n if (measurements.reportData !== reportDataHex) {\n throw err(\n \"MAA_REPORTDATA_MISMATCH\",\n `MAA tdx_report_data ${measurements.reportData} does not match DCAP REPORTDATA ${reportDataHex}`,\n );\n }\n assertMaaMeasurementsMatchDcap(measurements, dcapMeasurements);\n assertRuntimeMeasurementsMatch(dcapMeasurements, policy);\n\n // B. hcl_keys_json SHA-256 binding: REPORTDATA[0:32] == SHA-256(hcl_keys_json_bytes).\n if (!response.hcl_keys_json) {\n throw err(\"HCL_KEYS_MISSING\", \"azure-tdx-dcap response missing hcl_keys_json\");\n }\n let hclKeysBytes: Uint8Array;\n try {\n hclKeysBytes = base64ToBytes(response.hcl_keys_json);\n } catch (e) {\n throw err(\"HCL_KEYS_PARSE\", `failed to decode hcl_keys_json base64: ${e}`);\n }\n const reportData0_32 = reportData.subarray(0, 32);\n const hclKeysHash = new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", hclKeysBytes as BufferSource),\n );\n if (!constantTimeEq(hclKeysHash, reportData0_32)) {\n throw err(\n \"HCL_KEYS_HASH_MISMATCH\",\n \"SHA-256(hcl_keys_json) does not match DCAP quote REPORTDATA[0:32]\",\n );\n }\n\n // C. Extract AK public key from hcl_keys_json (kid=\"HCLAkPub\"). Trusting this\n // key is safe because the signed MAA tdx_report_data matched this raw quote\n // REPORTDATA, and REPORTDATA[0:32] matched hcl_keys_json.\n let hclKeys: unknown;\n try {\n hclKeys = JSON.parse(new TextDecoder().decode(hclKeysBytes));\n } catch (e) {\n throw err(\"HCL_KEYS_PARSE\", `failed to parse hcl_keys_json: ${e}`);\n }\n const keysArray = (hclKeys as Record<string, unknown>)[\"keys\"];\n const akJwk = Array.isArray(keysArray)\n ? (keysArray as Array<Record<string, unknown>>).find((k) => k[\"kid\"] === \"HCLAkPub\")\n : undefined;\n if (!akJwk) {\n throw err(\"HCL_KEYS_PARSE\", 'hcl_keys_json does not contain a key with kid=\"HCLAkPub\"');\n }\n let akPubKey: CryptoKey;\n try {\n akPubKey = await crypto.subtle.importKey(\n \"jwk\",\n { kty: \"RSA\", n: akJwk[\"n\"] as string, e: akJwk[\"e\"] as string, ext: true },\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"verify\"],\n );\n } catch (e) {\n throw err(\"HCL_KEYS_PARSE\", `failed to import HCLAkPub from hcl_keys_json: ${e}`);\n }\n\n // D. TPM AK quote: verify RSA signature using the DCAP-certified AK + nonce binding.\n if (!response.tpm_quote) {\n throw err(\"TPM_QUOTE_MISSING\", \"azure-tdx-dcap response missing tpm_quote\");\n }\n if (!/^[0-9a-f]{64}$/i.test(response.binary_hash)) {\n throw err(\"BINARY_HASH_FORMAT\", \"binary_hash field is not a 32-byte hex digest\");\n }\n if (response.mode === \"prod\" && policy.expectedBinaryHash === undefined) {\n throw err(\n \"BINARY_HASH_MISMATCH\",\n \"production Azure attestation requires a pinned coordinator binary hash\",\n );\n }\n if (\n policy.expectedBinaryHash !== undefined &&\n response.binary_hash.toLowerCase() !== policy.expectedBinaryHash.toLowerCase()\n ) {\n throw err(\n \"BINARY_HASH_MISMATCH\",\n `binary hash ${response.binary_hash.toLowerCase()} does not match the approved release pin`,\n );\n }\n await verifyTpmQuoteNonce(\n response.tpm_quote,\n akPubKey,\n expectedNonce,\n expectedNoiseStaticPub,\n hexToBytes(response.binary_hash),\n );\n\n // E. JSON field consistency.\n if (response.nonce.toLowerCase() !== bytesToHex(expectedNonce)) {\n throw err(\"NONCE_FIELD_MISMATCH\", `JSON nonce ${response.nonce} does not match verifier nonce`);\n }\n if (response.pubkey.toLowerCase() !== bytesToHex(expectedNoiseStaticPub)) {\n throw err(\n \"PUBKEY_FIELD_MISMATCH\",\n \"attestation pubkey field does not match Noise static pubkey from handshake\",\n );\n }\n if (!/^[0-9a-f]{64}$/i.test(response.binary_hash)) {\n throw err(\"BINARY_HASH_FORMAT\", \"binary_hash field is not a 32-byte hex digest\");\n }\n\n // F. Mode and MRTD pinning (same policy as GCP path).\n if (policy.requiredMode !== undefined && response.mode !== policy.requiredMode) {\n throw err(\n \"MODE_MISMATCH\",\n `attestation mode ${response.mode} does not match required ${policy.requiredMode}`,\n );\n }\n if (response.mode === \"prod\") {\n if (\n (policy.expectedMrtd === undefined || policy.expectedMrtd === null) &&\n policy.allowUnpinnedProdMrtdForRelease !== true\n ) {\n throw err(\n \"MRTD_MISMATCH\",\n \"production attestation requires a pinned MRTD but none was configured\",\n );\n }\n if (\n policy.expectedMrtd !== undefined &&\n policy.expectedMrtd !== null &&\n dcapMeasurements.mrtd !== policy.expectedMrtd.toLowerCase()\n ) {\n throw err(\n \"MRTD_MISMATCH\",\n `MRTD ${dcapMeasurements.mrtd} does not match pinned ${policy.expectedMrtd.toLowerCase()}`,\n );\n }\n }\n\n return {\n mode: response.mode,\n binaryHash: response.binary_hash,\n runtimeProfile: response.runtime_profile,\n mrtd: dcapMeasurements.mrtd,\n rtmr0: dcapMeasurements.rtmr0,\n rtmr1: dcapMeasurements.rtmr1,\n rtmr2: dcapMeasurements.rtmr2,\n rtmr3: dcapMeasurements.rtmr3,\n pubkeyHex: response.pubkey.toLowerCase(),\n localAttestation: false,\n };\n}\n\nfunction verifyLocalAttestation(params: {\n response: AttestResponse;\n expectedNonce: Uint8Array;\n expectedNoiseStaticPub: Uint8Array;\n policy: AttestationPolicy;\n}): AttestedMetadata {\n const { response, expectedNonce, expectedNoiseStaticPub, policy } = params;\n\n if (policy.allowLocalAttestation !== true) {\n throw err(\n \"LOCAL_ATTESTATION_DISABLED\",\n \"local attestation response received but local attestation is not enabled\",\n );\n }\n if (policy.requiredMode !== undefined && response.mode !== policy.requiredMode) {\n throw err(\n \"MODE_MISMATCH\",\n `attestation mode ${response.mode} does not match required ${policy.requiredMode}`,\n );\n }\n if (response.mode !== \"dev\") {\n throw err(\n \"LOCAL_ATTESTATION_DISABLED\",\n \"local attestation is only accepted for dev mode responses\",\n );\n }\n if (response.nonce.toLowerCase() !== bytesToHex(expectedNonce)) {\n throw err(\"NONCE_FIELD_MISMATCH\", `JSON nonce ${response.nonce} does not match verifier nonce`);\n }\n if (!/^[0-9a-f]{64}$/i.test(response.binary_hash)) {\n throw err(\"BINARY_HASH_FORMAT\", \"binary_hash field is not a 32-byte hex digest\");\n }\n\n const expectedPubHex = bytesToHex(expectedNoiseStaticPub);\n if (response.pubkey.toLowerCase() !== expectedPubHex) {\n throw err(\n \"PUBKEY_FIELD_MISMATCH\",\n \"local attestation pubkey field does not match Noise static pubkey from handshake\",\n );\n }\n\n return {\n mode: response.mode,\n binaryHash: response.binary_hash.toLowerCase(),\n runtimeProfile: response.runtime_profile,\n mrtd: \"local-dev-no-mrtd\",\n rtmr0: \"local-dev-no-rtmr0\",\n rtmr1: \"local-dev-no-rtmr1\",\n rtmr2: \"local-dev-no-rtmr2\",\n rtmr3: \"local-dev-no-rtmr3\",\n pubkeyHex: response.pubkey.toLowerCase(),\n localAttestation: true,\n };\n}\n\n// ── Quote parsing ────────────────────────────────────────────────────────────\n\nfunction decodeQuoteB64(b64: string): Uint8Array {\n let bin: string;\n try {\n bin = atob(b64);\n } catch (e) {\n throw err(\"QUOTE_DECODE\", `quote field is not valid base64: ${e}`);\n }\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nfunction ensureStructure(raw: Uint8Array): void {\n if (raw.length < HEADER_SIZE + BODY_SIZE + 4) {\n throw err(\n \"QUOTE_STRUCTURE\",\n `quote too short: ${raw.length} bytes (need >= ${HEADER_SIZE + BODY_SIZE + 4})`,\n );\n }\n const version = readU16LE(raw, HEADER_VERSION_OFF);\n const attKey = readU16LE(raw, HEADER_ATT_KEY_OFF);\n const teeType = readU32LE(raw, HEADER_TEE_TYPE_OFF);\n if (version !== 4) {\n throw err(\"QUOTE_STRUCTURE\", `unsupported quote version ${version}`);\n }\n if (teeType !== TDX_TEE_TYPE) {\n throw err(\"QUOTE_STRUCTURE\", `not a TDX quote (TEE type 0x${teeType.toString(16)})`);\n }\n if (attKey !== ECDSA_P256_KEY_TYPE) {\n throw err(\n \"QUOTE_STRUCTURE\",\n `unsupported attestation key type ${attKey} (expected ECDSA-P256)`,\n );\n }\n}\n\nfunction readSigData(raw: Uint8Array): Uint8Array {\n const sigDataLen = readU32LE(raw, SIG_DATA_LEN_OFFSET);\n const sigStart = SIG_DATA_LEN_OFFSET + 4;\n if (raw.length < sigStart + sigDataLen) {\n throw err(\"QUOTE_STRUCTURE\", \"quote truncated in signature data\");\n }\n return raw.subarray(sigStart, sigStart + sigDataLen);\n}\n\nfunction parseMeasurements(body: Uint8Array): {\n mrtd: string;\n rtmr0: string;\n rtmr1: string;\n rtmr2: string;\n rtmr3: string;\n tdAttr: string;\n} {\n const m = (off: number) => bytesToHex(body.subarray(off, off + MEASUREMENT_LEN));\n return {\n mrtd: m(BODY_MRTD_OFF),\n rtmr0: m(BODY_RTMR0_OFF),\n rtmr1: m(BODY_RTMR1_OFF),\n rtmr2: m(BODY_RTMR2_OFF),\n rtmr3: m(BODY_RTMR3_OFF),\n tdAttr: bytesToHex(body.subarray(BODY_TD_ATTR_OFF, BODY_TD_ATTR_OFF + 8)),\n };\n}\n\n// ── PCK chain ────────────────────────────────────────────────────────────────\n\nconst PEM_BEGIN = \"-----BEGIN CERTIFICATE-----\";\nconst PEM_END = \"-----END CERTIFICATE-----\";\nconst PEM_BEGIN_BYTES = new TextEncoder().encode(PEM_BEGIN);\nconst PEM_END_BYTES = new TextEncoder().encode(PEM_END);\n\n/**\n * Byte-level substring search. Cannot use utf8 decode + string.indexOf here:\n * sig data is binary, and TextDecoder replaces invalid sequences with 0xFFFD\n * (3 bytes -> 1 char), so string indices do not line up with byte offsets.\n */\nfunction findBytes(hay: Uint8Array, needle: Uint8Array, from = 0): number {\n if (needle.length === 0) return from;\n const last = hay.length - needle.length;\n outer: for (let i = from; i <= last; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (hay[i + j] !== needle[j]) continue outer;\n }\n return i;\n }\n return -1;\n}\n\ntype ParsedQeCertificationData = {\n qeReport: Uint8Array;\n qeReportSig: Uint8Array;\n qeAuthData: Uint8Array;\n qeCertificationData: Uint8Array; // nested QE Certification Data v4 header + payload\n};\n\nfunction parseQeCertificationData(sigData: Uint8Array): ParsedQeCertificationData {\n // Intel TDX DCAP Quote Library API, A.3.8 / A.3.11:\n // Quote Signature Data v4 = quoteSig || attKey || QE Certification Data (type=6)\n if (sigData.length < SIG_QE_CERT_DATA_OFF + SIG_QE_CERT_DATA_HEADER_SIZE) {\n throw err(\"QUOTE_STRUCTURE\", \"signature data truncated before QE certification data header\");\n }\n const outerCertType = readU16LE(sigData, SIG_QE_CERT_DATA_OFF);\n const outerCertSize = readU32LE(sigData, SIG_QE_CERT_DATA_OFF + 2);\n if (outerCertType !== QE_CERT_TYPE_QE_REPORT_CERT_DATA) {\n throw err(\n \"QUOTE_STRUCTURE\",\n `unexpected QE certification data type ${outerCertType} (expected ${QE_CERT_TYPE_QE_REPORT_CERT_DATA})`,\n );\n }\n\n const outerDataStart = SIG_QE_CERT_DATA_OFF + SIG_QE_CERT_DATA_HEADER_SIZE;\n const outerDataEnd = outerDataStart + outerCertSize;\n if (sigData.length < outerDataEnd) {\n throw err(\"QUOTE_STRUCTURE\", \"signature data truncated in outer QE certification data\");\n }\n const outerData = sigData.subarray(outerDataStart, outerDataEnd);\n const qeReportSigOff = SIG_QE_REPORT_SIZE;\n const qeAuthSizeOff = qeReportSigOff + SIG_QE_REPORT_SIG_SIZE;\n const qeAuthDataOff = qeAuthSizeOff + 2;\n\n if (outerData.length < qeAuthDataOff + SIG_QE_CERT_DATA_HEADER_SIZE) {\n throw err(\n \"QUOTE_STRUCTURE\",\n \"signature data truncated before QE auth_data and nested certification data\",\n );\n }\n\n const qeReport = outerData.subarray(0, SIG_QE_REPORT_SIZE);\n const qeReportSig = outerData.subarray(qeReportSigOff, qeReportSigOff + SIG_QE_REPORT_SIG_SIZE);\n const authSize = readU16LE(outerData, qeAuthSizeOff);\n const qeAuthDataEnd = qeAuthDataOff + authSize;\n if (outerData.length < qeAuthDataEnd + SIG_QE_CERT_DATA_HEADER_SIZE) {\n throw err(\"QUOTE_STRUCTURE\", \"signature data truncated in QE auth_data\");\n }\n\n const qeAuthData = outerData.subarray(qeAuthDataOff, qeAuthDataEnd);\n const nestedCertType = readU16LE(outerData, qeAuthDataEnd);\n const nestedCertSize = readU32LE(outerData, qeAuthDataEnd + 2);\n if (nestedCertType !== QE_CERT_TYPE_PCK_CHAIN) {\n throw err(\n \"PCK_CHAIN_MISSING\",\n `cert data type ${nestedCertType} is not PCK chain (expected ${QE_CERT_TYPE_PCK_CHAIN})`,\n );\n }\n const nestedDataEnd = qeAuthDataEnd + SIG_QE_CERT_DATA_HEADER_SIZE + nestedCertSize;\n if (outerData.length < nestedDataEnd) {\n throw err(\"QUOTE_STRUCTURE\", \"signature data truncated in nested QE certification data\");\n }\n\n return {\n qeReport,\n qeReportSig,\n qeAuthData,\n qeCertificationData: outerData.subarray(qeAuthDataEnd, nestedDataEnd),\n };\n}\n\nfunction extractPckChain(qeCertificationData: Uint8Array): x509.X509Certificate[] {\n if (qeCertificationData.length < SIG_QE_CERT_DATA_HEADER_SIZE) {\n throw err(\"PCK_CHAIN_PARSE\", \"nested QE certification data header truncated\");\n }\n const certType = readU16LE(qeCertificationData, 0);\n const certSize = readU32LE(qeCertificationData, 2);\n if (certType !== QE_CERT_TYPE_PCK_CHAIN) {\n throw err(\n \"PCK_CHAIN_MISSING\",\n `cert data type ${certType} is not PCK chain (expected ${QE_CERT_TYPE_PCK_CHAIN})`,\n );\n }\n if (qeCertificationData.length < SIG_QE_CERT_DATA_HEADER_SIZE + certSize) {\n throw err(\"PCK_CHAIN_PARSE\", \"nested QE certification data truncated\");\n }\n\n const certBytes = qeCertificationData.subarray(\n SIG_QE_CERT_DATA_HEADER_SIZE,\n SIG_QE_CERT_DATA_HEADER_SIZE + certSize,\n );\n const certs: x509.X509Certificate[] = [];\n let cursor = 0;\n while (cursor < certBytes.length) {\n const begin = findBytes(certBytes, PEM_BEGIN_BYTES, cursor);\n if (begin === -1) break;\n const endTag = findBytes(certBytes, PEM_END_BYTES, begin);\n if (endTag === -1) {\n throw err(\"PCK_CHAIN_PARSE\", \"unterminated PEM block\");\n }\n const end = endTag + PEM_END_BYTES.length;\n // PEM is ASCII inside the BEGIN..END markers, safe to decode.\n const pem = new TextDecoder(\"utf-8\").decode(certBytes.subarray(begin, end));\n try {\n certs.push(new x509.X509Certificate(pem));\n } catch (e) {\n throw err(\"PCK_CHAIN_PARSE\", `failed to parse PEM cert: ${e}`);\n }\n cursor = end;\n }\n\n if (certs.length === 0) {\n throw err(\"PCK_CHAIN_MISSING\", \"no parseable certs in PCK chain\");\n }\n // Intel DCAP requires at least: PCK leaf + Platform/Processor CA + Intel SGX Root CA.\n if (certs.length < 3) {\n throw err(\n \"PCK_CHAIN_MISSING\",\n `PCK chain has only ${certs.length} cert(s); Intel DCAP requires leaf + CA + Root (min 3)`,\n );\n }\n return certs;\n}\n\nasync function verifyChainSignatures(chain: x509.X509Certificate[]): Promise<void> {\n const now = new Date();\n for (let i = 0; i < chain.length - 1; i++) {\n const cert = chain[i];\n // Validity period check - an expired PCK cert is invalid even with a good signature.\n if (now < cert.notBefore) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `cert[${i}] (${cert.subject}) is not yet valid (notBefore=${cert.notBefore.toISOString()})`,\n );\n }\n if (now > cert.notAfter) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `cert[${i}] (${cert.subject}) has expired (notAfter=${cert.notAfter.toISOString()})`,\n );\n }\n let ok: boolean;\n try {\n ok = await chain[i].verify({ publicKey: chain[i + 1].publicKey });\n } catch (e) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `cert[${i}] (${chain[i].subject}) signature verification threw: ${e}`,\n );\n }\n if (!ok) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `cert[${i}] (${chain[i].subject}) signature does not verify against issuer cert[${i + 1}]`,\n );\n }\n }\n // Root must be self-signed and currently valid\n const root = chain[chain.length - 1];\n if (now < root.notBefore) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `root cert (${root.subject}) is not yet valid (notBefore=${root.notBefore.toISOString()})`,\n );\n }\n if (now > root.notAfter) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `root cert (${root.subject}) has expired (notAfter=${root.notAfter.toISOString()})`,\n );\n }\n let rootOk: boolean;\n try {\n rootOk = await root.verify({ publicKey: root.publicKey });\n } catch (e) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `root cert (${root.subject}) self-signature verification threw: ${e}`,\n );\n }\n if (!rootOk) {\n throw err(\"PCK_CHAIN_SIGNATURE\", `root cert (${root.subject}) is not self-signed`);\n }\n\n // BasicConstraints structural check: every cert above the leaf must declare\n // itself a CA (cA=true). Checking length alone is insufficient.\n for (let i = 1; i < chain.length; i++) {\n const bc = chain[i].getExtension(x509.BasicConstraintsExtension);\n if (!bc || !bc.ca) {\n throw err(\n \"PCK_CHAIN_SIGNATURE\",\n `cert[${i}] (${chain[i].subject}) is not a CA cert (BasicConstraints.cA is not true)`,\n );\n }\n }\n}\n\nasync function leafSpki(leaf: x509.X509Certificate): Promise<Uint8Array> {\n const key = await leaf.publicKey.export();\n const spki = await crypto.subtle.exportKey(\"spki\", key);\n return new Uint8Array(spki);\n}\n\n// ── Web Crypto helpers ───────────────────────────────────────────────────────\n\n/** Convert raw P-256 X||Y (64 bytes) into uncompressed SPKI bytes. */\nfunction rawXyToSpki(xy: Uint8Array): Uint8Array {\n if (xy.length !== 64) {\n throw err(\"QUOTE_STRUCTURE\", `attestation pubkey must be 64 bytes (got ${xy.length})`);\n }\n const uncompressed = new Uint8Array(65);\n uncompressed[0] = 0x04;\n uncompressed.set(xy, 1);\n\n // SPKI prefix for ecPublicKey + secp256r1 (P-256), then BIT STRING wrapping the point.\n const prefix = new Uint8Array([\n 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,\n 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00,\n ]);\n return concat(prefix, uncompressed);\n}\n\nasync function verifyP256Signature(\n spki: Uint8Array,\n rsSig: Uint8Array,\n data: Uint8Array,\n failureReason: RefReason,\n what: string,\n): Promise<void> {\n if (rsSig.length !== 64) {\n throw err(failureReason, `${what}: signature must be 64 bytes (r||s)`);\n }\n let key: CryptoKey;\n try {\n key = await crypto.subtle.importKey(\n \"spki\",\n spki as BufferSource,\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n false,\n [\"verify\"],\n );\n } catch (e) {\n throw err(failureReason, `${what}: failed to import key: ${e}`);\n }\n const ok = await crypto.subtle.verify(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n key,\n rsSig as BufferSource,\n data as BufferSource,\n );\n if (!ok) {\n throw err(failureReason, `${what}: ECDSA verification failed`);\n }\n}\n\nasync function sha256(data: Uint8Array): Promise<Uint8Array> {\n return new Uint8Array(await crypto.subtle.digest(\"SHA-256\", data as BufferSource));\n}\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n return bytesToHex(await sha256(data));\n}\n\n// ── Tiny utilities ───────────────────────────────────────────────────────────\n\nfunction readU16LE(buf: Uint8Array, off: number): number {\n return buf[off] | (buf[off + 1] << 8);\n}\n\nfunction readU32LE(buf: Uint8Array, off: number): number {\n // >>> 0 to coerce to unsigned 32-bit\n return (buf[off] | (buf[off + 1] << 8) | (buf[off + 2] << 16) | (buf[off + 3] << 24)) >>> 0;\n}\n\nfunction constantTimeEq(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n return diff === 0;\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n\nfunction bytesToHex(b: Uint8Array): string {\n let s = \"\";\n for (let i = 0; i < b.length; i++) s += b[i].toString(16).padStart(2, \"0\");\n return s;\n}\n","/**\n * Noise XX handshake - DH:X25519, Cipher:ChaChaPoly, Hash:SHA256.\n *\n * Port of `web/src/lib/coordinator/noise-xx.ts` into the SDK. Implements the\n * Noise_XX_25519_ChaChaPoly_SHA256 pattern. Mirrors the Rust responder in\n * `tee/coordinator/src/noise_xx.rs` exactly, so it interoperates with the live\n * coordinator.\n *\n * Initiator message flow:\n * Write msg1: -> e (32 bytes)\n * Read msg2: <- e, ee, s, es (96 bytes)\n * Write msg3: -> s, se (64 bytes)\n * => NoiseTransport for encrypted application I/O\n *\n * SDK conventions: no exported `class`. The handshake state and transport are\n * exposed as plain objects with method properties, created by free functions.\n * Never log secrets, nonces, or raw decrypted payloads.\n *\n * @module JW-138 / JW-431\n */\n\nimport { generateKeyPair, sharedKey } from \"@stablelib/x25519\";\nimport { ChaCha20Poly1305 } from \"@stablelib/chacha20poly1305\";\nimport { hash as sha256Hash, SHA256 } from \"@stablelib/sha256\";\nimport { HMAC } from \"@stablelib/hmac\";\n\nconst PROTOCOL_NAME = \"Noise_XX_25519_ChaChaPoly_SHA256\"; // exactly 32 bytes\n\n// ── Public plain-object interfaces ───────────────────────────────────────────\n\n/**\n * Post-handshake encrypted byte channel with split send/recv keys.\n *\n * Returned by {@link NoiseXXInitiator.writeMessage3} (initiator role) and by\n * {@link NoiseXXResponder.readMessage3} (responder role, in-process test peer).\n */\nexport interface NoiseTransport {\n /** Encrypt one application frame with the send key, advancing the send nonce. */\n encrypt(plaintext: Uint8Array): Uint8Array;\n /** Decrypt one application frame with the recv key, advancing the recv nonce. */\n decrypt(ciphertext: Uint8Array): Uint8Array;\n}\n\n/** Noise XX initiator handshake handle. */\nexport interface NoiseXXInitiator {\n /** msg1: -> e (32 bytes). */\n writeMessage1(): Uint8Array;\n /** msg2: <- e, ee, s, es (96 bytes from responder). Reveals the remote static key. */\n readMessage2(msg: Uint8Array): void;\n /** msg3: -> s, se (64 bytes to responder), plus the split transport. */\n writeMessage3(): { message: Uint8Array; transport: NoiseTransport };\n /**\n * Responder's static X25519 public key, decrypted from msg2.\n * `null` until {@link readMessage2} has been called successfully.\n *\n * This is the value attestation verification compares against\n * `REPORT_DATA[32:64]` and the attestation `pubkey` field.\n */\n readonly remoteStaticPublicKey: Uint8Array | null;\n}\n\n/** Noise XX responder handshake handle (in-process test/loopback peer). */\nexport interface NoiseXXResponder {\n /** msg1: <- e (32 bytes from initiator). */\n readMessage1(msg: Uint8Array): void;\n /** msg2: -> e, ee, s, es (96 bytes to initiator). */\n writeMessage2(): Uint8Array;\n /** msg3: <- s, se (64 bytes from initiator), plus the split transport. */\n readMessage3(msg: Uint8Array): NoiseTransport;\n /**\n * This responder's static X25519 public key. The initiator recovers exactly\n * this value from msg2; the loopback attestation response echoes it as the\n * bound `pubkey` field.\n */\n readonly staticPublicKey: Uint8Array;\n}\n\n// ── Symmetric state (internal) ───────────────────────────────────────────────\n\nfunction noiseNonce(n: number): Uint8Array {\n const buf = new Uint8Array(12);\n // 4 zero bytes + 8-byte little-endian counter\n const view = new DataView(buf.buffer);\n view.setUint32(4, n & 0xffffffff, true);\n view.setUint32(8, Math.floor(n / 0x100000000) & 0xffffffff, true);\n return buf;\n}\n\nfunction hkdf2(ck: Uint8Array, ikm: Uint8Array): [Uint8Array, Uint8Array] {\n const mac1 = new HMAC(SHA256, ck);\n mac1.update(ikm);\n const temp = mac1.digest();\n\n const mac2 = new HMAC(SHA256, temp);\n mac2.update(new Uint8Array([1]));\n const out1 = mac2.digest();\n\n const mac3 = new HMAC(SHA256, temp);\n mac3.update(out1);\n mac3.update(new Uint8Array([2]));\n const out2 = mac3.digest();\n\n return [out1, out2];\n}\n\ninterface NoiseSymState {\n h: Uint8Array; // handshake hash, 32 bytes\n ck: Uint8Array; // chaining key, 32 bytes\n k: Uint8Array | null; // AEAD key, 32 bytes\n n: number; // nonce counter\n mixHash(data: Uint8Array): void;\n mixKey(ikm: Uint8Array): void;\n encryptAndHash(plaintext: Uint8Array): Uint8Array;\n decryptAndHash(ciphertext: Uint8Array): Uint8Array;\n /** Returns [k1, k2] = HKDF(ck, \"\"). k1 = initiator->responder, k2 = responder->initiator. */\n split(): [Uint8Array, Uint8Array];\n}\n\nfunction createSymState(): NoiseSymState {\n const proto = new TextEncoder().encode(PROTOCOL_NAME);\n const h0 = new Uint8Array(32);\n h0.set(proto);\n const ck0 = new Uint8Array(32);\n ck0.set(h0);\n\n const ss: NoiseSymState = {\n h: h0,\n ck: ck0,\n k: null,\n n: 0,\n\n mixHash(data: Uint8Array): void {\n const combined = new Uint8Array(this.h.length + data.length);\n combined.set(this.h);\n combined.set(data, this.h.length);\n this.h = sha256Hash(combined);\n },\n\n mixKey(ikm: Uint8Array): void {\n const [newCk, newK] = hkdf2(this.ck, ikm);\n this.ck = newCk;\n this.k = newK;\n this.n = 0;\n },\n\n encryptAndHash(plaintext: Uint8Array): Uint8Array {\n if (!this.k) {\n this.mixHash(plaintext);\n return new Uint8Array(plaintext);\n }\n const aead = new ChaCha20Poly1305(this.k);\n const ct = aead.seal(noiseNonce(this.n), plaintext, this.h);\n this.n++;\n this.mixHash(ct);\n return ct;\n },\n\n decryptAndHash(ciphertext: Uint8Array): Uint8Array {\n if (!this.k) {\n this.mixHash(ciphertext);\n return new Uint8Array(ciphertext);\n }\n const aead = new ChaCha20Poly1305(this.k);\n const pt = aead.open(noiseNonce(this.n), ciphertext, this.h);\n if (!pt) throw new Error(\"Noise: AEAD decryption failed\");\n this.n++;\n this.mixHash(ciphertext);\n return pt;\n },\n\n split(): [Uint8Array, Uint8Array] {\n const [k1, k2] = hkdf2(this.ck, new Uint8Array(0));\n // k1 = initiator->responder, k2 = responder->initiator\n return [k1, k2];\n },\n };\n\n ss.mixHash(new Uint8Array(0)); // empty prologue\n return ss;\n}\n\n// ── Transport ────────────────────────────────────────────────────────────────\n\n/**\n * Create a transport over a fixed (sendKey, recvKey) pair. Each direction has\n * its own monotonically increasing nonce. AEAD associated data is empty for\n * application frames (matches the Rust responder).\n */\nexport function createNoiseTransport(sendKey: Uint8Array, recvKey: Uint8Array): NoiseTransport {\n let sendN = 0;\n let recvN = 0;\n return {\n encrypt(plaintext: Uint8Array): Uint8Array {\n const aead = new ChaCha20Poly1305(sendKey);\n const ct = aead.seal(noiseNonce(sendN), plaintext, undefined);\n sendN++;\n return ct;\n },\n decrypt(ciphertext: Uint8Array): Uint8Array {\n const aead = new ChaCha20Poly1305(recvKey);\n const pt = aead.open(noiseNonce(recvN), ciphertext, undefined);\n if (!pt) throw new Error(\"Noise: transport decryption failed\");\n recvN++;\n return pt;\n },\n };\n}\n\n// ── Initiator handshake ──────────────────────────────────────────────────────\n\n/**\n * Create a Noise XX initiator. Generates a fresh static and ephemeral X25519\n * key pair. Drive it with writeMessage1 -> readMessage2 -> writeMessage3.\n */\nexport function createNoiseXXInitiator(): NoiseXXInitiator {\n const staticKeyPair = generateKeyPair();\n const ephKeyPair = generateKeyPair();\n const ss = createSymState();\n let remoteEphPub: Uint8Array | null = null;\n let remoteStaticPub: Uint8Array | null = null;\n\n return {\n get remoteStaticPublicKey(): Uint8Array | null {\n return remoteStaticPub;\n },\n\n writeMessage1(): Uint8Array {\n ss.mixHash(ephKeyPair.publicKey);\n return new Uint8Array(ephKeyPair.publicKey);\n },\n\n readMessage2(msg: Uint8Array): void {\n if (msg.length < 96) {\n throw new Error(`noise msg2: expected >=96 bytes, got ${msg.length}`);\n }\n\n // e: responder ephemeral public key (32 bytes)\n remoteEphPub = msg.slice(0, 32);\n ss.mixHash(remoteEphPub);\n\n // ee: DH(our ephemeral, their ephemeral)\n const dhEE = sharedKey(ephKeyPair.secretKey, remoteEphPub);\n ss.mixKey(dhEE);\n\n // s: decrypt responder's static public key (32 + 16 tag = 48 bytes).\n // Stored for JW-145 channel binding (compared against the pubkey bound\n // into the TDX quote's REPORT_DATA[32:64]).\n remoteStaticPub = ss.decryptAndHash(msg.slice(32, 80));\n\n // es (initiator): DH(e=our_ephemeral, rs=responder_static)\n const dhES = sharedKey(ephKeyPair.secretKey, remoteStaticPub);\n ss.mixKey(dhES);\n\n // empty payload (16-byte tag)\n if (msg.length > 80) {\n ss.decryptAndHash(msg.slice(80));\n }\n },\n\n writeMessage3(): { message: Uint8Array; transport: NoiseTransport } {\n if (!remoteEphPub) {\n throw new Error(\"noise msg3: must call readMessage2 first\");\n }\n\n // s: encrypt our static public key (32 + 16 tag = 48 bytes)\n const encS = ss.encryptAndHash(staticKeyPair.publicKey);\n\n // se (initiator): DH(s=our_static, re=responder_ephemeral)\n const dhSE = sharedKey(staticKeyPair.secretKey, remoteEphPub);\n ss.mixKey(dhSE);\n\n // empty payload\n const encPayload = ss.encryptAndHash(new Uint8Array(0));\n\n const message = new Uint8Array(encS.length + encPayload.length);\n message.set(encS);\n message.set(encPayload, encS.length);\n\n const [sendKey, recvKey] = ss.split();\n // Initiator sends with k1, receives with k2.\n return { message, transport: createNoiseTransport(sendKey, recvKey) };\n },\n };\n}\n\n// ── Responder handshake (in-process test/loopback peer) ──────────────────────\n\n/**\n * Create a Noise XX responder. Mirrors the Rust/Go responder so an in-process\n * round-trip test can run without a real coordinator. Drive it with\n * readMessage1 -> writeMessage2 -> readMessage3.\n */\nexport function createNoiseXXResponder(): NoiseXXResponder {\n const staticKeyPair = generateKeyPair();\n const ephKeyPair = generateKeyPair();\n const ss = createSymState();\n let remoteEphPub = new Uint8Array(32);\n\n return {\n get staticPublicKey(): Uint8Array {\n return new Uint8Array(staticKeyPair.publicKey);\n },\n\n readMessage1(msg: Uint8Array): void {\n remoteEphPub = msg.slice(0, 32);\n ss.mixHash(remoteEphPub);\n },\n\n writeMessage2(): Uint8Array {\n ss.mixHash(ephKeyPair.publicKey);\n const dhEE = sharedKey(ephKeyPair.secretKey, remoteEphPub);\n ss.mixKey(dhEE);\n const encS = ss.encryptAndHash(staticKeyPair.publicKey);\n const dhES = sharedKey(staticKeyPair.secretKey, remoteEphPub);\n ss.mixKey(dhES);\n const encPayload = ss.encryptAndHash(new Uint8Array(0));\n const msg = new Uint8Array(32 + encS.length + encPayload.length);\n msg.set(ephKeyPair.publicKey);\n msg.set(encS, 32);\n msg.set(encPayload, 32 + encS.length);\n return msg;\n },\n\n readMessage3(msg: Uint8Array): NoiseTransport {\n const remoteSBytes = ss.decryptAndHash(msg.slice(0, 48));\n const dhSE = sharedKey(ephKeyPair.secretKey, remoteSBytes);\n ss.mixKey(dhSE);\n if (msg.length > 48) {\n ss.decryptAndHash(msg.slice(48));\n }\n const [k1, k2] = ss.split();\n // Responder sends with k2, receives with k1.\n return createNoiseTransport(k2, k1);\n },\n };\n}\n","/**\n * Secure channel: Noise XX handshake + TDX attestation over a raw transport.\n *\n * Free functions, no class (SDK conformance). Given an open {@link Transport}\n * and a {@link CoordinatorEndpoint}, {@link establishSecureChannel} drives:\n *\n * 1. the Noise XX handshake (initiator role) over the raw byte channel:\n * -> msg1 (e) send raw\n * <- msg2 (e, ee, s, es) read raw, reveals the responder static pubkey\n * -> msg3 (s, se) send raw, yields the split NoiseTransport\n * 2. the attestation exchange over the freshly-split (but not-yet-promoted)\n * Noise transport:\n * -> encrypt(encodeAttestationRequest(nonceHex))\n * <- decodeAttestationResponse(decrypt(frame)) -> verifyAttestation\n *\n * On success the pending Noise transport is promoted to the live cipher and an\n * attested channel handle is returned: `send`/`onMessage` transparently\n * Noise-encrypt/decrypt application frames over the raw transport.\n *\n * The release pin (mrtd, intelRootFingerprint, azureMaa) and the endpoint's\n * requiredMode map to the verifier's {@link AttestationPolicy}. The loopback\n * local-attestation fallback (ADR-0037) is only enabled when the endpoint host\n * is a loopback address - it must never be honored for a remote coordinator.\n *\n * Never log secrets, nonces, shares, or decrypted payloads (spec section 9).\n *\n * @module JW-428\n */\n\nimport { AttestationError, TransportError } from \"../core/errors.js\";\nimport {\n verifyAttestation,\n assertAttestResponse,\n type AttestationPolicy,\n type AttestedMetadata,\n type AttestResponse,\n} from \"../attestation/verifier.js\";\nimport { createNoiseXXInitiator, type NoiseTransport } from \"../transport/noiseXx.js\";\nimport type { Transport, Unsubscribe } from \"../transport/types.js\";\nimport type { CoordinatorEndpoint } from \"../schemas/types.generated.js\";\n\n/**\n * Prefix that tags an attestation control frame. Ported verbatim from the\n * canonical client so the SDK and the live coordinator agree on the wire shape.\n */\nexport const ATTEST_REQUEST_PREFIX = new TextEncoder().encode(\"invisible-attest-v1\\0\");\n\n/** Default deadline for the whole handshake + attestation exchange. */\nconst DEFAULT_CHANNEL_TIMEOUT_MS = 30_000;\n\n/** An established, attested Noise channel over a raw transport. */\nexport interface SecureChannel {\n /** Verified attestation metadata for the coordinator this channel reached. */\n readonly attestation: AttestedMetadata;\n /** The coordinator's Noise static public key, pinned for this channel. */\n readonly remoteStaticPublicKey: Uint8Array;\n /** Request re-attestation without consuming application frames as responses. */\n requestAttestation(nonceHex: string, timeoutMs: number): Promise<AttestResponse>;\n /** Encrypt and send one application frame over the raw transport. */\n send(plaintext: Uint8Array): void;\n /** Subscribe to decrypted inbound application frames. */\n onMessage(handler: (plaintext: Uint8Array) => void): Unsubscribe;\n /** Subscribe to fatal channel failures such as Noise decrypt desync. */\n onFatal(handler: (error: Error) => void): Unsubscribe;\n /** Tear down the channel: detach listeners and stop accepting frames. */\n close(): void;\n}\n\n/** Options for {@link establishSecureChannel}. */\nexport interface EstablishSecureChannelOptions {\n /** The open raw byte channel to layer Noise + attestation over. */\n readonly transport: Transport;\n /** The endpoint being attested (release pin, requiredMode, host). */\n readonly endpoint: CoordinatorEndpoint;\n /** Fresh 32-byte CSPRNG nonce, bound into the attestation request. */\n readonly nonce: Uint8Array;\n /** Whole-exchange deadline in ms. Defaults to {@link DEFAULT_CHANNEL_TIMEOUT_MS}. */\n readonly timeoutMs?: number;\n}\n\n/**\n * Run the Noise XX handshake then the attestation exchange over `transport`,\n * returning an attested {@link SecureChannel}.\n *\n * @throws TransportError if the raw channel fails or the handshake is malformed.\n * @throws AttestationError if attestation verification fails.\n */\nexport async function establishSecureChannel(\n options: EstablishSecureChannelOptions,\n): Promise<SecureChannel> {\n const { transport, endpoint, nonce } = options;\n const timeoutMs = options.timeoutMs ?? DEFAULT_CHANNEL_TIMEOUT_MS;\n\n if (transport.state() !== \"open\") {\n throw new TransportError(\"CONNECTION_LOST\", \"secure channel requires an open transport\");\n }\n\n // Inbound raw frames are funneled into a single-slot queue. The handshake is\n // strictly request/response, so at most one frame is awaited at a time.\n const inbound = createFrameReader(transport);\n\n try {\n const initiator = createNoiseXXInitiator();\n\n // msg1: -> e\n transport.send(initiator.writeMessage1());\n\n // msg2: <- e, ee, s, es\n const msg2 = await inbound.next(timeoutMs);\n try {\n initiator.readMessage2(msg2);\n } catch (cause) {\n throw new TransportError(\"NOISE_HANDSHAKE_FAILED\", `readMessage2 failed: ${String(cause)}`, {\n cause,\n });\n }\n\n const remoteStaticPublicKey = initiator.remoteStaticPublicKey;\n if (!remoteStaticPublicKey) {\n throw new TransportError(\n \"NOISE_HANDSHAKE_FAILED\",\n \"missing responder static pubkey after readMessage2\",\n );\n }\n\n // msg3: -> s, se, plus the split (pending) Noise transport.\n let pending: NoiseTransport;\n try {\n const result = initiator.writeMessage3();\n transport.send(result.message);\n pending = result.transport;\n } catch (cause) {\n throw new TransportError(\"NOISE_HANDSHAKE_FAILED\", `writeMessage3 failed: ${String(cause)}`, {\n cause,\n });\n }\n\n // Attestation request over the pending Noise transport. Requesting it over\n // the same channel binds the attestation to this exact Noise session.\n const nonceHex = bytesToHex(nonce);\n transport.send(pending.encrypt(encodeAttestationRequest(nonceHex)));\n\n // Attestation response: decrypt, decode, verify.\n const responseFrame = await inbound.next(timeoutMs);\n let response: AttestResponse;\n try {\n response = decodeAttestationResponse(pending.decrypt(responseFrame));\n } catch (cause) {\n if (cause instanceof AttestationError) throw cause;\n throw new AttestationError(\n \"NOT_ATTESTED\",\n `failed to decode attestation response: ${String(cause)}`,\n { cause },\n );\n }\n\n const policy = toAttestationPolicy(endpoint);\n const attestation = await verifyAttestation({\n response,\n expectedNonce: nonce,\n expectedNoiseStaticPub: remoteStaticPublicKey,\n policy,\n timeoutMs,\n });\n\n inbound.detach();\n return promoteChannel({ transport, cipher: pending, attestation, remoteStaticPublicKey });\n } catch (err) {\n inbound.detach();\n throw err;\n }\n}\n\n/**\n * Map a {@link CoordinatorEndpoint} (release pin + requiredMode + host) to the\n * verifier's {@link AttestationPolicy}. The loopback local-attestation fallback\n * is only enabled for loopback hosts (ADR-0037).\n */\nexport function toAttestationPolicy(endpoint: CoordinatorEndpoint): AttestationPolicy {\n const pin = endpoint.releasePin;\n const loopback = isLoopbackUrl(endpoint.wsUrl);\n const allowLocalAttestation =\n endpoint.allowLocalAttestation === true && loopback && endpoint.requiredMode !== \"prod\";\n\n const policy: AttestationPolicy = {\n ...(pin.intelRootFingerprint ? { intelRootFingerprint: pin.intelRootFingerprint } : {}),\n // \"auto\" leaves the mode unconstrained; \"prod\"/\"dev\" are passed through.\n ...(endpoint.requiredMode !== \"auto\" ? { requiredMode: endpoint.requiredMode } : {}),\n // Keep the release pin active in prod and auto mode. Dev local attestations\n // ignore the MRTD pin inside the verifier.\n expectedMrtd: pin.mrtd,\n ...(pin.binaryHash ? { expectedBinaryHash: pin.binaryHash } : {}),\n ...(pin.runtimeProfile ? { expectedRuntimeProfile: pin.runtimeProfile } : {}),\n ...(pin.runtimeMeasurements ? { expectedRuntimeMeasurements: pin.runtimeMeasurements } : {}),\n allowMissingDcapCollateral: pin.allowMissingDcapCollateral === true,\n allowLocalAttestation,\n };\n\n if (pin.azureMaa) {\n policy.azureMaa = {\n expectedIssuer: pin.azureMaa.issuer,\n expectedJwksUrl: pin.azureMaa.jwksUrl,\n expectedPolicyHash: pin.azureMaa.policyHash,\n };\n }\n\n return policy;\n}\n\n// ── Internal: promote pending cipher to a live attested channel ──────────────\n\nfunction promoteChannel(params: {\n transport: Transport;\n cipher: NoiseTransport;\n attestation: AttestedMetadata;\n remoteStaticPublicKey: Uint8Array;\n}): SecureChannel {\n const { transport, cipher, attestation, remoteStaticPublicKey } = params;\n const handlers = new Set<(plaintext: Uint8Array) => void>();\n const fatalHandlers = new Set<(error: Error) => void>();\n let attestationWaiter: {\n readonly resolve: (response: AttestResponse) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n } | null = null;\n let closed = false;\n\n const unsubscribeRaw = transport.onMessage((frame) => {\n if (closed) return;\n let plaintext: Uint8Array;\n try {\n plaintext = cipher.decrypt(frame);\n } catch (cause) {\n // A decrypt failure means the cipher state is irrecoverably desynced\n // (tamper or nonce desync). Drop the channel rather than surface\n // untrusted bytes.\n const error = new TransportError(\n \"NOISE_HANDSHAKE_FAILED\",\n `secure channel decrypt failed: ${String(cause)}`,\n { cause },\n );\n fail(error);\n return;\n }\n if (attestationWaiter !== null) {\n const decoded = decodeAttestationControlFrame(plaintext);\n if (decoded.kind === \"response\") {\n const waiter = attestationWaiter;\n attestationWaiter = null;\n clearTimeout(waiter.timer);\n waiter.resolve(decoded.response);\n return;\n }\n if (decoded.kind === \"invalid\") {\n const waiter = attestationWaiter;\n attestationWaiter = null;\n clearTimeout(waiter.timer);\n waiter.reject(decoded.error);\n return;\n }\n }\n for (const handler of handlers) handler(plaintext);\n });\n\n const unsubscribeState = transport.onStateChange((state) => {\n if (closed) return;\n if (state === \"closing\" || state === \"closed\") {\n fail(new TransportError(\"CONNECTION_LOST\", \"secure channel transport closed\"));\n }\n });\n\n function close(): void {\n if (closed) return;\n closed = true;\n handlers.clear();\n fatalHandlers.clear();\n if (attestationWaiter !== null) {\n const waiter = attestationWaiter;\n attestationWaiter = null;\n clearTimeout(waiter.timer);\n waiter.reject(new TransportError(\"CONNECTION_LOST\", \"secure channel is closed\"));\n }\n unsubscribeRaw();\n unsubscribeState();\n }\n\n function fail(error: Error): void {\n if (closed) return;\n const notifyHandlers = [...fatalHandlers];\n for (const handler of notifyHandlers) handler(error);\n if (!closed) {\n close();\n transport.close();\n }\n }\n\n return {\n attestation,\n remoteStaticPublicKey,\n requestAttestation(nonceHex: string, timeoutMs: number): Promise<AttestResponse> {\n if (closed) {\n return Promise.reject(new TransportError(\"CONNECTION_LOST\", \"secure channel is closed\"));\n }\n if (attestationWaiter !== null) {\n return Promise.reject(\n new AttestationError(\"NOT_ATTESTED\", \"re-attestation is already in flight\"),\n );\n }\n return new Promise<AttestResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (attestationWaiter === null) return;\n attestationWaiter = null;\n reject(\n new AttestationError(\"NOT_ATTESTED\", `re-attestation timed out after ${timeoutMs}ms`),\n );\n }, timeoutMs);\n attestationWaiter = { resolve, reject, timer };\n try {\n transport.send(cipher.encrypt(encodeAttestationRequest(nonceHex)));\n } catch (cause) {\n if (attestationWaiter === null) return;\n attestationWaiter = null;\n clearTimeout(timer);\n reject(cause instanceof Error ? cause : new Error(String(cause)));\n }\n });\n },\n send(plaintext: Uint8Array): void {\n if (closed) {\n throw new TransportError(\"CONNECTION_LOST\", \"secure channel is closed\");\n }\n transport.send(cipher.encrypt(plaintext));\n },\n onMessage(handler): Unsubscribe {\n handlers.add(handler);\n return () => handlers.delete(handler);\n },\n onFatal(handler): Unsubscribe {\n fatalHandlers.add(handler);\n return () => fatalHandlers.delete(handler);\n },\n close,\n };\n}\n\n// ── Internal: single-slot inbound frame reader ───────────────────────────────\n\ninterface FrameReader {\n /** Resolve with the next inbound frame, or reject on timeout/close. */\n next(timeoutMs: number): Promise<Uint8Array>;\n /** Stop buffering and detach from the transport. */\n detach(): void;\n}\n\nfunction createFrameReader(transport: Transport): FrameReader {\n const queue: Uint8Array[] = [];\n let waiter: { resolve: (f: Uint8Array) => void; reject: (e: Error) => void } | null = null;\n let detached = false;\n\n const unsubscribeMessage = transport.onMessage((frame) => {\n if (detached) return;\n if (waiter) {\n const w = waiter;\n waiter = null;\n w.resolve(frame);\n } else {\n queue.push(frame);\n }\n });\n\n const unsubscribeState = transport.onStateChange((state) => {\n if (detached) return;\n if (state === \"closing\" || state === \"closed\") {\n const w = waiter;\n waiter = null;\n w?.reject(\n new TransportError(\"CONNECTION_LOST\", \"transport closed during handshake/attestation\"),\n );\n }\n });\n\n function detach(): void {\n if (detached) return;\n detached = true;\n unsubscribeMessage();\n unsubscribeState();\n queue.length = 0;\n }\n\n return {\n next(timeoutMs: number): Promise<Uint8Array> {\n if (detached) {\n return Promise.reject(new TransportError(\"CONNECTION_LOST\", \"frame reader detached\"));\n }\n const queued = queue.shift();\n if (queued) return Promise.resolve(queued);\n return new Promise<Uint8Array>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (waiter) {\n waiter = null;\n reject(\n new TransportError(\n \"NOISE_HANDSHAKE_FAILED\",\n `timed out waiting for a handshake frame after ${timeoutMs}ms`,\n ),\n );\n }\n }, timeoutMs);\n waiter = {\n resolve: (f) => {\n clearTimeout(timer);\n resolve(f);\n },\n reject: (e) => {\n clearTimeout(timer);\n reject(e);\n },\n };\n });\n },\n detach,\n };\n}\n\ntype AttestationControlFrame =\n | { readonly kind: \"response\"; readonly response: AttestResponse }\n | { readonly kind: \"invalid\"; readonly error: AttestationError }\n | { readonly kind: \"app\" };\n\nfunction decodeAttestationControlFrame(plaintext: Uint8Array): AttestationControlFrame {\n const text = new TextDecoder().decode(plaintext);\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n return { kind: \"app\" };\n }\n\n try {\n assertAttestResponse(body);\n return { kind: \"response\", response: body };\n } catch (cause) {\n if (looksLikeAttestationResponse(body)) {\n return {\n kind: \"invalid\",\n error:\n cause instanceof AttestationError\n ? cause\n : new AttestationError(\"NOT_ATTESTED\", String(cause), { cause }),\n };\n }\n return { kind: \"app\" };\n }\n}\n\nfunction looksLikeAttestationResponse(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) return false;\n const body = value as Record<string, unknown>;\n return (\n \"quote\" in body ||\n \"nonce\" in body ||\n \"pubkey\" in body ||\n \"binary_hash\" in body ||\n \"local_attestation\" in body ||\n \"maa_token\" in body ||\n \"tpm_quote\" in body ||\n \"hcl_keys_json\" in body\n );\n}\n\n// ── Internal: attestation control-frame codecs (ported from the WS client) ───\n\n/** Encode an attestation request frame: prefix || ascii(nonceHex). */\nexport function encodeAttestationRequest(nonceHex: string): Uint8Array {\n const nonce = new TextEncoder().encode(nonceHex);\n const out = new Uint8Array(ATTEST_REQUEST_PREFIX.length + nonce.length);\n out.set(ATTEST_REQUEST_PREFIX);\n out.set(nonce, ATTEST_REQUEST_PREFIX.length);\n return out;\n}\n\n/** Decode + structurally validate a decrypted attestation response (JSON). */\nexport function decodeAttestationResponse(plaintext: Uint8Array): AttestResponse {\n const text = new TextDecoder().decode(plaintext);\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch (cause) {\n throw new AttestationError(\n \"NOT_ATTESTED\",\n `attestation response is not valid JSON: ${String(cause)}`,\n { cause },\n );\n }\n assertAttestResponse(body);\n return body;\n}\n\n// ── Internal: loopback detection (ported from the WS client) ─────────────────\n\n/** True when `value` is a ws(s) URL whose host is a loopback address. */\nexport function isLoopbackUrl(value: string): boolean {\n try {\n return isLoopbackHostname(new URL(value).hostname);\n } catch {\n return false;\n }\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase();\n if (normalized === \"localhost\" || normalized === \"::1\" || normalized === \"[::1]\") {\n return true;\n }\n if (isLoopbackIpv4(normalized)) {\n return true;\n }\n if (!normalized.startsWith(\"[::ffff:\") || !normalized.endsWith(\"]\")) {\n return false;\n }\n\n const mapped = normalized.slice(\"[::ffff:\".length, -1);\n if (isLoopbackIpv4(mapped)) {\n return true;\n }\n const parts = mapped.split(\":\");\n if (parts.length !== 2) {\n return false;\n }\n const high = Number.parseInt(parts[0] ?? \"\", 16);\n const low = Number.parseInt(parts[1] ?? \"\", 16);\n if (\n !Number.isInteger(high) ||\n !Number.isInteger(low) ||\n high < 0 ||\n high > 0xffff ||\n low < 0 ||\n low > 0xffff\n ) {\n return false;\n }\n return ((high << 16) | low) >>> 24 === 127;\n}\n\nfunction isLoopbackIpv4(hostname: string): boolean {\n const parts = hostname.split(\".\");\n return (\n parts.length === 4 &&\n parts.every((part) => /^\\d+$/.test(part)) &&\n Number(parts[0]) === 127 &&\n parts.every((part) => Number(part) >= 0 && Number(part) <= 255)\n );\n}\n\n// ── Tiny utilities ───────────────────────────────────────────────────────────\n\nfunction bytesToHex(b: Uint8Array): string {\n let s = \"\";\n for (let i = 0; i < b.length; i++) s += b[i].toString(16).padStart(2, \"0\");\n return s;\n}\n","/**\n * Session-establishment seams layered on top of an open {@link Transport}.\n *\n * Once a socket is open, a session runs the Noise XX handshake and then TDX\n * attestation before any sensitive command is allowed. The real logic lives in\n * the secure-channel module (`../session/secureChannel`); these functions are\n * the stable, transport-level entrypoints the root index re-exports.\n *\n * Both halves are driven from one underlying {@link establishSecureChannel}\n * run, because attestation is requested over the same Noise cipher the\n * handshake split. {@link performNoiseHandshake} runs that establishment and\n * caches the resulting channel keyed on the transport; {@link performAttestation}\n * reads the attestation evidence from it. Callers that want the whole flow in\n * one step should use {@link establishAttestedChannel}.\n */\n\nimport { TransportError } from \"../core/errors.js\";\nimport {\n establishSecureChannel,\n toAttestationPolicy,\n type SecureChannel,\n} from \"../session/secureChannel.js\";\nimport type { CoordinatorEndpoint } from \"../schemas/types.generated.js\";\nimport type { Transport } from \"./types.js\";\n\n/** Result of a completed Noise XX handshake. */\nexport interface NoiseHandshakeResult {\n /** The coordinator's Noise static public key, pinned for this session. */\n readonly noiseStaticPublicKey: Uint8Array;\n /**\n * The attested secure channel produced by this handshake. Carried so a\n * subsequent {@link performAttestation} can read attestation evidence without\n * re-running the exchange. Internal: not part of the structural contract.\n */\n readonly channel: SecureChannel;\n}\n\n/** Result of a completed TDX attestation. */\nexport interface AttestationResult {\n /** The verified release MRTD. */\n readonly mrtd: string;\n /** Attestation mode the coordinator reported. */\n readonly mode: \"prod\" | \"dev\";\n /** Coordinator binary hash reported by the verified attestation response. */\n readonly binaryHash: string;\n /** Compile-time runtime profile carried by the attested coordinator artifact. */\n readonly runtimeProfile?:\n | \"prod-hardened\"\n | \"prod-devnet-simplified\"\n | \"prod-devnet-simplified-locked\"\n | \"azure-tdx-v0-agentless\";\n /** Noise static public key bound into the attestation quote. */\n readonly pubkeyHex: string;\n /** True only for explicit loopback local development attestation. */\n readonly localAttestation: boolean;\n readonly rtmr0?: string;\n readonly rtmr1?: string;\n readonly rtmr2?: string;\n readonly rtmr3?: string;\n /** When verification completed (epoch ms), stamped by the caller. */\n readonly verifiedAtMs: number;\n}\n\n/** A fully-established, attested channel plus its derived evidence. */\nexport interface AttestedChannel {\n /** The live attested secure channel. */\n readonly channel: SecureChannel;\n /** The handshake result (pinned Noise static key). */\n readonly handshake: NoiseHandshakeResult;\n /** The attestation result, stamped with the verification time. */\n readonly attestation: AttestationResult;\n}\n\n/**\n * Run the Noise XX handshake then attestation over an open transport, returning\n * the live channel and its derived evidence. This is the single internal entry\n * the session orchestration uses.\n */\nexport async function establishAttestedChannel(params: {\n transport: Transport;\n endpoint: CoordinatorEndpoint;\n nonce: Uint8Array;\n timeoutMs?: number;\n}): Promise<AttestedChannel> {\n const { transport, endpoint, nonce, timeoutMs } = params;\n const channel = await establishSecureChannel({ transport, endpoint, nonce, timeoutMs });\n const handshake: NoiseHandshakeResult = {\n noiseStaticPublicKey: channel.remoteStaticPublicKey,\n channel,\n };\n const attestation: AttestationResult = {\n mrtd: channel.attestation.mrtd,\n mode: channel.attestation.mode,\n binaryHash: channel.attestation.binaryHash,\n runtimeProfile: channel.attestation.runtimeProfile,\n pubkeyHex: channel.attestation.pubkeyHex,\n localAttestation: channel.attestation.localAttestation,\n rtmr0: channel.attestation.rtmr0,\n rtmr1: channel.attestation.rtmr1,\n rtmr2: channel.attestation.rtmr2,\n rtmr3: channel.attestation.rtmr3,\n verifiedAtMs: Date.now(),\n };\n // Touch the policy mapper so its loopback gating stays exercised by the\n // single-step entrypoint as well.\n void toAttestationPolicy(endpoint);\n return { channel, handshake, attestation };\n}\n\n/**\n * Run the Noise XX handshake over an open transport and pin the coordinator's\n * static key. Drives a full attested-channel establishment (attestation is\n * bound to the same Noise cipher) and returns the handshake half; read the\n * attestation half from {@link performAttestation} with the returned result.\n *\n * @throws TransportError if the channel fails or the handshake is malformed.\n * @throws AttestationError if attestation verification fails.\n */\nexport async function performNoiseHandshake(\n transport: Transport,\n endpoint: CoordinatorEndpoint,\n nonce: Uint8Array = crypto.getRandomValues(new Uint8Array(32)),\n): Promise<NoiseHandshakeResult> {\n const established = await establishAttestedChannel({ transport, endpoint, nonce });\n return established.handshake;\n}\n\n/**\n * Verify the coordinator's TDX attestation, bound to the handshake's Noise\n * static key. Reads the evidence captured by {@link performNoiseHandshake}.\n *\n * @throws TransportError if the handshake result carries no channel.\n */\nexport function performAttestation(\n _transport: Transport,\n handshake: NoiseHandshakeResult,\n): Promise<AttestationResult> {\n const channel = handshake.channel as SecureChannel | undefined;\n if (!channel) {\n return Promise.reject(\n new TransportError(\n \"NOISE_HANDSHAKE_FAILED\",\n \"performAttestation requires a handshake result produced by performNoiseHandshake\",\n ),\n );\n }\n return Promise.resolve({\n mrtd: channel.attestation.mrtd,\n mode: channel.attestation.mode,\n binaryHash: channel.attestation.binaryHash,\n runtimeProfile: channel.attestation.runtimeProfile,\n pubkeyHex: channel.attestation.pubkeyHex,\n localAttestation: channel.attestation.localAttestation,\n rtmr0: channel.attestation.rtmr0,\n rtmr1: channel.attestation.rtmr1,\n rtmr2: channel.attestation.rtmr2,\n rtmr3: channel.attestation.rtmr3,\n verifiedAtMs: Date.now(),\n });\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://invisible.exchange/schemas/sdk/payoutPolicy.schema.json\",\n \"title\": \"PayoutPolicy\",\n \"description\": \"Where and how a contract's output is delivered. V0 normal-user requests accept exactly one destination. Validated locally before submission (spec sections 4.3.1 and 10.1).\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"destinations\"],\n \"properties\": {\n \"destinations\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"description\": \"V0 normal-user requests accept exactly one destination. Multi-address receive is not supported yet.\",\n \"items\": { \"$ref\": \"#/$defs/payoutDestination\" }\n },\n \"totalDeadlineMs\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Payout-window selector in milliseconds: 0 for instant, or a currently supported scheduled window duration.\"\n },\n \"batchExclusionId\": {\n \"type\": \"string\",\n \"description\": \"Not supported in V0 normal-user requests. Reserved for V1 campaign-scoped batch exclusion; never a stable actor identity.\"\n }\n },\n \"$defs\": {\n \"payoutDestination\": {\n \"title\": \"PayoutDestination\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"address\", \"sharePercent\"],\n \"properties\": {\n \"address\": {\n \"type\": \"string\",\n \"description\": \"Base58 Solana account address.\"\n },\n \"sharePercent\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 100,\n \"description\": \"Share of the payout. Sums to 100 across destinations.\"\n },\n \"minDelayMs\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Not supported in V0 normal-user requests; the SDK rejects this field because the current runtime does not honor per-destination delay bounds.\"\n },\n \"maxDelayMs\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Not supported in V0 normal-user requests; the SDK rejects this field because the current runtime does not honor per-destination delay bounds.\"\n },\n \"minLamports\": { \"type\": \"integer\", \"minimum\": 0 }\n }\n }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://invisible.exchange/schemas/sdk/coordinatorPoolConfig.schema.json\",\n \"title\": \"CoordinatorPoolConfig\",\n \"description\": \"The coordinator endpoint pool a session connects through (spec section 6.1). No hostname is baked in; callers supply endpoints (or opt into a preset).\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"endpoints\"],\n \"properties\": {\n \"endpoints\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": { \"$ref\": \"#/$defs/coordinatorEndpoint\" }\n },\n \"reattestEveryMs\": { \"type\": \"integer\", \"minimum\": 1 },\n \"failoverDebounceMs\": { \"type\": \"integer\", \"minimum\": 0 },\n \"maxReconnectAttempts\": { \"type\": \"integer\", \"minimum\": 0 },\n \"noiseTransportTimeoutMs\": { \"type\": \"integer\", \"minimum\": 1 },\n \"preferLeader\": { \"type\": \"boolean\" },\n \"allowedRoles\": {\n \"type\": \"array\",\n \"items\": { \"enum\": [\"leader\", \"watcher\"] }\n }\n },\n \"$defs\": {\n \"coordinatorEndpoint\": {\n \"title\": \"CoordinatorEndpoint\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"wsUrl\", \"expectedHostname\", \"releasePin\", \"requiredMode\"],\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"releasePin\": {\n \"type\": \"object\",\n \"required\": [\"allowMissingDcapCollateral\"],\n \"properties\": {\n \"allowMissingDcapCollateral\": { \"const\": true }\n }\n }\n },\n \"required\": [\"releasePin\"]\n },\n \"then\": {\n \"properties\": {\n \"requiredMode\": { \"const\": \"dev\" }\n }\n }\n }\n ],\n \"properties\": {\n \"wsUrl\": { \"type\": \"string\", \"description\": \"wss://<host>/ws-noise\" },\n \"expectedHostname\": {\n \"type\": \"string\",\n \"description\": \"Must match the SNI / TLS certificate host.\"\n },\n \"releasePin\": { \"$ref\": \"#/$defs/releasePin\" },\n \"requiredMode\": { \"enum\": [\"prod\", \"dev\", \"auto\"] },\n \"allowLocalAttestation\": {\n \"type\": \"boolean\",\n \"description\": \"Explicit local-dev fallback opt-in. Honored only for loopback non-prod endpoints.\"\n },\n \"roleHint\": { \"enum\": [\"leader\", \"watcher\"] },\n \"weight\": { \"type\": \"number\", \"minimum\": 0 }\n }\n },\n \"releasePin\": {\n \"title\": \"CoordinatorReleasePin\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"mrtd\"],\n \"properties\": {\n \"mrtd\": { \"type\": \"string\", \"description\": \"Hex MRTD release pin.\" },\n \"binaryHash\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-fA-F]{64}$\",\n \"description\": \"Optional SHA-256 hash of the approved coordinator binary; required for production Azure attestation.\"\n },\n \"runtimeProfile\": {\n \"enum\": [\n \"prod-hardened\",\n \"prod-devnet-simplified\",\n \"prod-devnet-simplified-locked\",\n \"azure-tdx-v0-agentless\"\n ],\n \"description\": \"Optional compile-time coordinator runtime profile; production simplified deployments must pin it.\"\n },\n \"runtimeMeasurements\": {\n \"$ref\": \"#/$defs/runtimeMeasurements\",\n \"description\": \"Approved RTMR0..RTMR3 values. Required for the agentless Azure TDX V0 profile.\"\n },\n \"intelRootFingerprint\": {\n \"type\": \"string\",\n \"description\": \"Hex SHA-256 of the Intel root cert.\"\n },\n \"allowMissingDcapCollateral\": {\n \"type\": \"boolean\",\n \"description\": \"Temporary non-prod legacy escape hatch for coordinators that do not yet emit Intel DCAP collateral.\"\n },\n \"azureMaa\": { \"$ref\": \"#/$defs/azureMaaPin\" }\n }\n },\n \"runtimeMeasurements\": {\n \"title\": \"RuntimeMeasurements\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"rtmr0\", \"rtmr1\", \"rtmr2\", \"rtmr3\"],\n \"properties\": {\n \"rtmr0\": { \"type\": \"string\", \"pattern\": \"^[0-9a-fA-F]{96}$\" },\n \"rtmr1\": { \"type\": \"string\", \"pattern\": \"^[0-9a-fA-F]{96}$\" },\n \"rtmr2\": { \"type\": \"string\", \"pattern\": \"^[0-9a-fA-F]{96}$\" },\n \"rtmr3\": { \"type\": \"string\", \"pattern\": \"^[0-9a-fA-F]{96}$\" }\n }\n },\n \"azureMaaPin\": {\n \"title\": \"AzureMaaPin\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"issuer\", \"jwksUrl\", \"policyHash\"],\n \"properties\": {\n \"issuer\": { \"type\": \"string\" },\n \"jwksUrl\": { \"type\": \"string\" },\n \"policyHash\": { \"type\": \"string\" }\n }\n }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://invisible.exchange/schemas/sdk/lpPositionView.schema.json\",\n \"title\": \"LpPositionView\",\n \"description\": \"The actor-safe LP position projection (spec section 4.4.1). Earned fees are per-position, never aggregated globally.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"status\",\n \"targetShardCount\",\n \"authPublicKey\",\n \"refillPublicKey\",\n \"withdrawalCommitment\",\n \"committedLamports\",\n \"earnedLamports\",\n \"refillThreshold\",\n \"shards\",\n \"createdAt\"\n ],\n \"properties\": {\n \"id\": { \"type\": \"string\", \"description\": \"lp_position_id\" },\n \"status\": { \"enum\": [\"dkg_pending\", \"active\", \"withdrawing\", \"closed\"] },\n \"targetShardCount\": { \"type\": \"integer\", \"minimum\": 0, \"maximum\": 300 },\n \"authPublicKey\": {\n \"type\": \"string\",\n \"description\": \"Derived from the LP Position Code; signs LP commands.\"\n },\n \"refillPublicKey\": { \"type\": \"string\", \"description\": \"Ed25519, 32 bytes.\" },\n \"withdrawalCommitment\": {\n \"type\": \"string\",\n \"description\": \"SHA256(withdrawal_secret).\"\n },\n \"committedLamports\": { \"type\": \"integer\", \"minimum\": 0 },\n \"earnedLamports\": { \"type\": \"integer\", \"minimum\": 0 },\n \"refillThreshold\": { \"type\": \"integer\", \"minimum\": 0 },\n \"shards\": {\n \"type\": \"array\",\n \"description\": \"LpInventoryShard[] from the protocol package; opaque to the SDK skeleton.\",\n \"items\": { \"type\": \"object\" }\n },\n \"createdAt\": { \"type\": \"integer\", \"minimum\": 0 },\n \"redemptionPermission\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"state\", \"grantRevision\", \"observedAtMs\"],\n \"properties\": {\n \"state\": { \"enum\": [\"unknown\", \"locked\", \"enabled\"] },\n \"grantRevision\": { \"type\": \"integer\", \"minimum\": 0 },\n \"observedAtMs\": { \"type\": \"integer\", \"minimum\": 0 }\n }\n }\n }\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://invisible.exchange/schemas/sdk/storageEnvelope.schema.json\",\n \"title\": \"StorageEnvelope\",\n \"description\": \"Optional wrapped form for callers or future encrypted storage adapters (spec section 7). Current browser and extension adapters persist caller-supplied bytes; callers decide whether those bytes are plaintext, wrapped, or encrypted.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"namespace\", \"key\", \"alg\", \"ciphertext\", \"createdAtMs\"],\n \"properties\": {\n \"namespace\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"key\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"alg\": {\n \"enum\": [\"AES-GCM\", \"none\"],\n \"description\": \"Wrapping algorithm. `none` means the caller supplied bytes without an envelope-level transform.\"\n },\n \"ciphertext\": {\n \"type\": \"string\",\n \"description\": \"Base64url-encoded wrapped bytes, encrypted bytes, or caller-supplied plaintext bytes when alg is `none`.\"\n },\n \"iv\": {\n \"type\": \"string\",\n \"description\": \"Base64url-encoded AES-GCM nonce; required when alg is AES-GCM.\"\n },\n \"createdAtMs\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": { \"alg\": { \"const\": \"AES-GCM\" } },\n \"required\": [\"alg\"]\n },\n \"then\": {\n \"properties\": { \"iv\": { \"type\": \"string\" } },\n \"required\": [\"iv\"]\n }\n }\n ]\n}\n","/**\n * Shared AJV instance and compiled schema validators.\n *\n * Mirrors protocol/src/coordinator/envelope.ts: a single strict `Ajv2020`\n * instance (draft 2020-12) with the SDK schemas compiled once at module load.\n * These validators check structural shape only; semantic rules that JSON Schema\n * cannot express (e.g. payout shares summing to 100) live in the per-type\n * validators alongside.\n */\n\n// ajv's `dist/2020` exposes the class as a named export (`exports.Ajv2020`),\n// which resolves cleanly under both Node's ESM/CJS interop and NodeNext +\n// verbatimModuleSyntax - unlike the default export, whose CJS interop is\n// self-referential.\nimport { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type { ErrorObject, ValidateFunction } from \"ajv\";\nimport payoutPolicySchema from \"../schemas/payoutPolicy.schema.json\" with { type: \"json\" };\nimport coordinatorPoolConfigSchema from \"../schemas/coordinatorPoolConfig.schema.json\" with { type: \"json\" };\nimport lpPositionViewSchema from \"../schemas/lpPositionView.schema.json\" with { type: \"json\" };\nimport storageEnvelopeSchema from \"../schemas/storageEnvelope.schema.json\" with { type: \"json\" };\nimport type {\n CoordinatorPoolConfig,\n LpPositionView,\n PayoutPolicy,\n StorageEnvelope,\n} from \"../schemas/types.generated.js\";\n\nconst ajv = new Ajv2020({ allErrors: true, strict: true });\n\nexport const validatePayoutPolicyShape: ValidateFunction<PayoutPolicy> =\n ajv.compile<PayoutPolicy>(payoutPolicySchema);\n\nexport const validateCoordinatorPoolConfigShape: ValidateFunction<CoordinatorPoolConfig> =\n ajv.compile<CoordinatorPoolConfig>(coordinatorPoolConfigSchema);\n\nexport const validateLpPositionViewShape: ValidateFunction<LpPositionView> =\n ajv.compile<LpPositionView>(lpPositionViewSchema);\n\nexport const validateStorageEnvelopeShape: ValidateFunction<StorageEnvelope> =\n ajv.compile<StorageEnvelope>(storageEnvelopeSchema);\n\n/** Render AJV errors into a compact, readable single line. */\nexport function formatAjvErrors(errors: ErrorObject[] | null | undefined): string {\n if (!errors || errors.length === 0) return \"schema validation failed\";\n return errors\n .map((e) => `${e.instancePath || \"(root)\"} ${e.message ?? \"is invalid\"}`.trim())\n .join(\"; \");\n}\n","/**\n * Re-attestation over a live secure channel.\n *\n * The initial attestation runs inside {@link establishSecureChannel} during\n * handshake. Re-attestation reuses the already-promoted Noise cipher: it sends\n * a fresh attestation-request plaintext through {@link SecureChannel.send} (the\n * channel Noise-encrypts it) and verifies the next inbound plaintext, which the\n * channel has already Noise-decrypted.\n *\n * Returns a fresh {@link AttestationResult} on success; throws\n * {@link AttestationError} / {@link TransportError} on failure so the caller can\n * fail closed and notify policy-violation handlers.\n *\n * @module JW-428\n */\n\nimport { TransportError } from \"../core/errors.js\";\nimport { toAttestationPolicy } from \"../session/secureChannel.js\";\nimport type { SessionState } from \"../session/state.js\";\nimport { verifyAttestation } from \"./verifier.js\";\nimport type { AttestationResult } from \"../transport/handshake.js\";\nimport type { CoordinatorEndpoint } from \"../schemas/types.generated.js\";\n\nconst DEFAULT_REATTEST_TIMEOUT_MS = 30_000;\n\n/**\n * Re-run attestation over `state.channel` against `endpoint`, returning the\n * fresh result. Does not mutate session state - the caller decides how to apply\n * the outcome.\n */\nexport async function reattest(\n state: SessionState,\n endpoint: CoordinatorEndpoint,\n timeoutMs: number = DEFAULT_REATTEST_TIMEOUT_MS,\n): Promise<AttestationResult> {\n const { channel, remoteStaticPublicKey } = state;\n if (channel === null || remoteStaticPublicKey === null) {\n throw new TransportError(\"CONNECTION_LOST\", \"re-attestation requires a live attested channel\");\n }\n\n const nonce = crypto.getRandomValues(new Uint8Array(32));\n const response = await channel.requestAttestation(toHex(nonce), timeoutMs);\n\n const metadata = await verifyAttestation({\n response,\n expectedNonce: nonce,\n expectedNoiseStaticPub: remoteStaticPublicKey,\n policy: toAttestationPolicy(endpoint),\n timeoutMs,\n });\n\n return {\n mrtd: metadata.mrtd,\n mode: metadata.mode,\n binaryHash: metadata.binaryHash,\n runtimeProfile: metadata.runtimeProfile,\n pubkeyHex: metadata.pubkeyHex,\n localAttestation: metadata.localAttestation,\n rtmr0: metadata.rtmr0,\n rtmr1: metadata.rtmr1,\n rtmr2: metadata.rtmr2,\n rtmr3: metadata.rtmr3,\n verifiedAtMs: Date.now(),\n };\n}\n\nexport function reattestSerialized(\n state: SessionState,\n endpoint: CoordinatorEndpoint,\n timeoutMs: number = DEFAULT_REATTEST_TIMEOUT_MS,\n): Promise<AttestationResult> {\n if (state.reattestPromise !== null) {\n return state.reattestPromise;\n }\n const promise = Promise.resolve()\n .then(() => reattest(state, endpoint, timeoutMs))\n .finally(() => {\n if (state.reattestPromise === promise) {\n state.reattestPromise = null;\n }\n });\n state.reattestPromise = promise;\n return promise;\n}\n\nfunction toHex(b: Uint8Array): string {\n let s = \"\";\n for (let i = 0; i < b.length; i++) s += b[i].toString(16).padStart(2, \"0\");\n return s;\n}\n","/**\n * `createSession` - the single entrypoint that opens an attested session.\n *\n * It validates the endpoint pool, opens the transport, runs the Noise XX\n * handshake + TDX attestation, and returns an opaque {@link Session} that has\n * already passed attestation (`attested === true`). It resolves only once\n * attestation succeeds; any transport or attestation failure rejects with a\n * typed {@link TransportError} / {@link AttestationError}.\n *\n * A re-attestation timer re-runs verification over the live channel every\n * {@link REATTEST_EVERY_MS}; on failure it marks the session unattested and\n * notifies any registered policy-violation handlers. The transport is\n * injectable for tests.\n */\n\nimport type { Session } from \"../core/session.js\";\nimport type { Transport } from \"../transport/types.js\";\nimport type { CoordinatorPoolConfig } from \"../schemas/types.generated.js\";\nimport { TransportError } from \"../core/errors.js\";\nimport { establishAttestedChannel } from \"../transport/handshake.js\";\nimport { noiseWebSocketTransport } from \"../transport/noiseWebSocketTransport.js\";\nimport { formatAjvErrors, validateCoordinatorPoolConfigShape } from \"../validation/ajv.js\";\nimport { reattestSerialized } from \"../attestation/reattest.js\";\nimport {\n closeSessionState,\n createSessionHandle,\n failSessionClosed,\n getSessionState,\n type SessionState,\n} from \"./state.js\";\nimport {\n disabledClientPersistence,\n resolveClientPersistence,\n} from \"../storage/clientPersistence.js\";\n\n/** Re-attest long-lived SDK Noise sessions at least every 15 minutes. */\nexport const REATTEST_EVERY_MS = 900_000;\n\n/** Options for the private low-level session constructor. */\nexport interface CreateSessionOptions {\n /**\n * The coordinator endpoint pool. Must contain at least one endpoint. No\n * hostname is provided by default; supply your own or use `@invisible-labs/sdk/presets`.\n */\n readonly coordinator: CoordinatorPoolConfig;\n /**\n * Storage adapter for recoverable secrets. Typed by `@invisible-labs/sdk/storage`;\n * accepted here so the session can be threaded into storage-backed flows.\n */\n readonly storage?: unknown;\n /** Enable SDK-owned normal-user transfer persistence. Defaults to false. */\n readonly clientPersistence?: boolean;\n /** Wallet adapter used for storage key derivation and signing. */\n readonly wallet?: unknown;\n /**\n * Inject a transport. Defaults to a Noise WebSocket transport over the first\n * endpoint. Tests pass an in-memory transport (paired with a loopback\n * coordinator that can complete the handshake + attestation).\n */\n readonly transport?: Transport;\n /** Abort WebSocket connection, Noise handshake, or initial attestation. */\n readonly signal?: AbortSignal;\n}\n\n/**\n * Open an attested session against the configured coordinator pool.\n *\n * @throws Error if the pool config is structurally invalid (including an empty\n * `endpoints` array).\n * @throws TransportError if the connection or Noise handshake fails.\n * @throws AttestationError if attestation verification fails.\n */\nexport async function createSessionInternal(options: CreateSessionOptions): Promise<Session> {\n const { coordinator } = options;\n if (options.clientPersistence !== undefined && typeof options.clientPersistence !== \"boolean\") {\n throw new TypeError(\"clientPersistence must be a boolean\");\n }\n if (!validateCoordinatorPoolConfigShape(coordinator)) {\n throw new Error(\n `invalid coordinator pool config: ${formatAjvErrors(validateCoordinatorPoolConfigShape.errors)}`,\n );\n }\n\n const endpoint = coordinator.endpoints[0]!;\n assertExpectedHostname(endpoint);\n const clientPersistence =\n options.clientPersistence === true\n ? await resolveClientPersistence(true, options.storage)\n : disabledClientPersistence();\n const timeoutMs = coordinator.noiseTransportTimeoutMs;\n const transport =\n options.transport ??\n noiseWebSocketTransport({ wsUrl: endpoint.wsUrl, connectTimeoutMs: timeoutMs });\n await transport.connect(options.signal);\n\n // Fresh per-connection nonce (anti-replay): 32 bytes from a CSPRNG.\n const nonce = crypto.getRandomValues(new Uint8Array(32));\n\n let established;\n try {\n established = await abortableSessionEstablishment(\n establishAttestedChannel({ transport, endpoint, nonce, timeoutMs }),\n transport,\n options.signal,\n );\n } catch (err) {\n // Fail closed: never expose an unverified channel as a usable session.\n transport.close();\n throw err;\n }\n\n const state: SessionState = {\n attested: true,\n transport,\n pool: coordinator,\n attestation: established.attestation,\n channel: established.channel,\n nonce,\n remoteStaticPublicKey: established.handshake.noiseStaticPublicKey,\n reattestTimer: null,\n reattestPromise: null,\n lastFatalError: null,\n policyViolationHandlers: new Set(),\n clientPersistence,\n close(): void {\n closeSessionState(this);\n },\n };\n\n established.channel.onFatal((error) => failSessionClosed(state, error));\n scheduleReattest(state, endpoint);\n\n return createSessionHandle(state);\n}\n\nfunction abortableSessionEstablishment<T>(\n establishment: Promise<T>,\n transport: Transport,\n signal: AbortSignal | undefined,\n): Promise<T> {\n if (signal === undefined) return establishment;\n if (signal.aborted) {\n transport.close();\n return Promise.reject(createSessionAbortError());\n }\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n transport.close();\n reject(createSessionAbortError());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n void establishment.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nfunction createSessionAbortError(): TransportError {\n return new TransportError(\"CONNECTION_LOST\", \"session establishment aborted\");\n}\n\n/** Backward-compatible private low-level alias used by internal consumers. */\nexport const createSession = createSessionInternal;\n\nfunction assertExpectedHostname(endpoint: CoordinatorPoolConfig[\"endpoints\"][number]): void {\n let hostname: string;\n try {\n hostname = new URL(endpoint.wsUrl).hostname;\n } catch (err) {\n const error = new Error(`invalid coordinator wsUrl: ${endpoint.wsUrl}`);\n (error as { cause?: unknown }).cause = err;\n throw error;\n }\n if (hostname.toLowerCase() !== endpoint.expectedHostname.toLowerCase()) {\n throw new Error(\n `coordinator endpoint hostname ${hostname} does not match expectedHostname ${endpoint.expectedHostname}`,\n );\n }\n}\n\n/** Close a session created by {@link createSession}. */\nexport function closeSession(session: Session): void {\n getSessionState(session).close();\n}\n\n/**\n * Arm a one-shot re-attestation timer. On fire it re-verifies over the live\n * channel; success re-arms the timer, failure marks the session unattested and\n * notifies policy-violation handlers. Leak-free: the timer is cleared on close.\n */\nfunction scheduleReattest(\n state: SessionState,\n endpoint: SessionState[\"pool\"][\"endpoints\"][number],\n): void {\n if (state.channel === null) return;\n const reattestEveryMs = state.pool.reattestEveryMs ?? REATTEST_EVERY_MS;\n const timer = setTimeout(() => {\n void runReattest(state, endpoint);\n }, reattestEveryMs);\n // Do not keep the process alive solely for re-attestation.\n if (typeof timer === \"object\" && timer !== null && \"unref\" in timer) {\n (timer as { unref(): void }).unref();\n }\n state.reattestTimer = timer;\n}\n\nasync function runReattest(\n state: SessionState,\n endpoint: SessionState[\"pool\"][\"endpoints\"][number],\n): Promise<void> {\n state.reattestTimer = null;\n if (state.channel === null || state.nonce === null || state.remoteStaticPublicKey === null) {\n return;\n }\n try {\n state.attestation = await reattestSerialized(\n state,\n endpoint,\n state.pool.noiseTransportTimeoutMs,\n );\n state.attested = true;\n scheduleReattest(state, endpoint);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n failSessionClosed(state, error);\n }\n}\n"]}