@bananalink-sdk/protocol 1.2.8 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/{chunk-32OWUOZ3.js → chunk-KJ7QIHAY.js} +11 -7
  2. package/dist/chunk-KJ7QIHAY.js.map +1 -0
  3. package/dist/{chunk-VXLUSU5B.cjs → chunk-MUYKP6UQ.cjs} +63 -8
  4. package/dist/chunk-MUYKP6UQ.cjs.map +1 -0
  5. package/dist/{chunk-MCZG7QEM.cjs → chunk-NGPP7HUR.cjs} +11 -7
  6. package/dist/chunk-NGPP7HUR.cjs.map +1 -0
  7. package/dist/{chunk-LELPCIE7.js → chunk-OBJR2TL4.js} +54 -4
  8. package/dist/chunk-OBJR2TL4.js.map +1 -0
  9. package/dist/{chunk-KNGZKGRS.cjs → chunk-RZPN2GDJ.cjs} +13 -4
  10. package/dist/chunk-RZPN2GDJ.cjs.map +1 -0
  11. package/dist/{chunk-7KYDLL3B.js → chunk-XCMAKN3P.js} +13 -5
  12. package/dist/chunk-XCMAKN3P.js.map +1 -0
  13. package/dist/{client-session-claim-C4lUik3b.d.cts → client-session-claim-CkRKTG50.d.cts} +12 -2
  14. package/dist/{client-session-claim-3QF3noOr.d.ts → client-session-claim-CrIDASkZ.d.ts} +12 -2
  15. package/dist/crypto/providers/noble-provider.cjs +2 -3
  16. package/dist/crypto/providers/noble-provider.d.cts +0 -7
  17. package/dist/crypto/providers/noble-provider.d.ts +0 -7
  18. package/dist/crypto/providers/noble-provider.js +1 -2
  19. package/dist/crypto/providers/node-provider.cjs +7 -29
  20. package/dist/crypto/providers/node-provider.cjs.map +1 -1
  21. package/dist/crypto/providers/node-provider.d.cts +0 -7
  22. package/dist/crypto/providers/node-provider.d.ts +0 -7
  23. package/dist/crypto/providers/node-provider.js +7 -29
  24. package/dist/crypto/providers/node-provider.js.map +1 -1
  25. package/dist/crypto/providers/quickcrypto-provider.cjs +8 -46
  26. package/dist/crypto/providers/quickcrypto-provider.cjs.map +1 -1
  27. package/dist/crypto/providers/quickcrypto-provider.d.cts +0 -9
  28. package/dist/crypto/providers/quickcrypto-provider.d.ts +0 -9
  29. package/dist/crypto/providers/quickcrypto-provider.js +7 -45
  30. package/dist/crypto/providers/quickcrypto-provider.js.map +1 -1
  31. package/dist/crypto/providers/webcrypto-provider.cjs +0 -2
  32. package/dist/crypto/providers/webcrypto-provider.cjs.map +1 -1
  33. package/dist/crypto/providers/webcrypto-provider.d.cts +0 -7
  34. package/dist/crypto/providers/webcrypto-provider.d.ts +0 -7
  35. package/dist/crypto/providers/webcrypto-provider.js +0 -2
  36. package/dist/crypto/providers/webcrypto-provider.js.map +1 -1
  37. package/dist/{crypto-BUS06Qz-.d.cts → crypto-BK0Ile6V.d.cts} +1 -1
  38. package/dist/{crypto-BUS06Qz-.d.ts → crypto-BK0Ile6V.d.ts} +1 -1
  39. package/dist/crypto-export.cjs +50 -51
  40. package/dist/crypto-export.cjs.map +1 -1
  41. package/dist/crypto-export.d.cts +1 -1
  42. package/dist/crypto-export.d.ts +1 -1
  43. package/dist/crypto-export.js +2 -4
  44. package/dist/crypto-export.js.map +1 -1
  45. package/dist/index.cjs +8 -4
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +31 -4
  48. package/dist/index.d.ts +31 -4
  49. package/dist/index.js +7 -4
  50. package/dist/index.js.map +1 -1
  51. package/dist/schemas-export.cjs +76 -72
  52. package/dist/schemas-export.d.cts +116 -1
  53. package/dist/schemas-export.d.ts +116 -1
  54. package/dist/schemas-export.js +1 -1
  55. package/dist/testing.d.cts +2 -2
  56. package/dist/testing.d.ts +2 -2
  57. package/dist/validation-export.cjs +76 -72
  58. package/dist/validation-export.d.cts +1 -1
  59. package/dist/validation-export.d.ts +1 -1
  60. package/dist/validation-export.js +1 -1
  61. package/package.json +1 -1
  62. package/src/crypto/providers/noble-provider.ts +44 -49
  63. package/src/crypto/providers/node-provider.ts +18 -59
  64. package/src/crypto/providers/quickcrypto-provider.ts +25 -84
  65. package/src/crypto/providers/registry.ts +14 -9
  66. package/src/crypto/providers/webcrypto-provider.ts +28 -43
  67. package/src/index.ts +1 -0
  68. package/src/schemas/client-messages.ts +14 -0
  69. package/src/schemas/wallet-messages.ts +4 -0
  70. package/src/types/client-messages.ts +26 -1
  71. package/src/types/index.ts +9 -0
  72. package/src/types/persistence.ts +32 -0
  73. package/src/types/wallet-messages.ts +6 -2
  74. package/dist/chunk-32OWUOZ3.js.map +0 -1
  75. package/dist/chunk-7KYDLL3B.js.map +0 -1
  76. package/dist/chunk-A6FLEJ7R.cjs +0 -62
  77. package/dist/chunk-A6FLEJ7R.cjs.map +0 -1
  78. package/dist/chunk-KNGZKGRS.cjs.map +0 -1
  79. package/dist/chunk-LELPCIE7.js.map +0 -1
  80. package/dist/chunk-MCZG7QEM.cjs.map +0 -1
  81. package/dist/chunk-TCVKC227.js +0 -56
  82. package/dist/chunk-TCVKC227.js.map +0 -1
  83. package/dist/chunk-VXLUSU5B.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/crypto/session-security.ts","../src/crypto/payload-handler.ts","../src/crypto/diagnostics.ts"],"names":["createCryptoProvider","arrayBufferToBase64","base64ToArrayBuffer","stringToArrayBuffer","arrayBufferToString","__name","randomBytes","detectPlatform","getRegisteredCryptoProviders"],"mappings":"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","file":"crypto-export.cjs","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { SessionKeys, EncryptedMessage, CryptoConfig } from './types';\nimport { arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString } from './utils';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from './providers';\nimport { createCryptoProvider } from './providers';\n\nconst CRYPTO_CONFIG: CryptoConfig = {\n algorithm: 'AES-GCM',\n keyLength: 256,\n ivLength: 12,\n tagLength: 128, // tagLength is in bits for Web Crypto API (128 bits = 16 bytes)\n curve: 'P-256',\n};\n\nexport class SessionSecurity {\n private keyPair?: ProviderKeyPair;\n private sharedSecret?: CryptoKeyLike;\n private sessionId: string;\n private encryptionKey?: CryptoKeyLike; // For AES-GCM\n private provider: CryptoProvider;\n\n constructor(sessionId?: string, provider?: CryptoProvider, logger?: Logger) {\n this.provider = provider || createCryptoProvider(undefined, logger);\n this.sessionId = sessionId || this.generateSessionId();\n }\n\n /**\n * Get the crypto provider used by this session\n */\n getCryptoProvider(): CryptoProvider {\n return this.provider;\n }\n\n /**\n * Establish a new session with ephemeral key generation\n */\n static async establishSession(sessionId?: string, provider?: CryptoProvider, logger?: Logger): Promise<SessionSecurity> {\n const session = new SessionSecurity(sessionId, provider, logger);\n await session.generateKeyPair();\n return session;\n }\n\n /**\n * Generate ECDH key pair for this session\n */\n private async generateKeyPair(): Promise<void> {\n this.keyPair = await this.provider.generateKeyPair();\n }\n\n /**\n * Get the public key for sharing (base64 encoded)\n */\n async getPublicKey(): Promise<string> {\n if (!this.keyPair?.publicKey) {\n throw new Error('Key pair not generated. Call generateKeyPair() first.');\n }\n\n const exported = await this.provider.exportPublicKey(this.keyPair.publicKey);\n return arrayBufferToBase64(exported);\n }\n\n /**\n * Derive shared secret from peer's public key\n */\n async deriveSharedSecret(peerPublicKeyBase64: string): Promise<void> {\n if (!this.keyPair?.privateKey) {\n throw new Error('Key pair not generated');\n }\n\n const peerPublicKeyBuffer = base64ToArrayBuffer(peerPublicKeyBase64);\n const importedPeerKey = await this.provider.importPublicKey(peerPublicKeyBuffer);\n\n this.sharedSecret = await this.provider.deriveSharedSecret(this.keyPair.privateKey, importedPeerKey);\n }\n\n /**\n * Derives an encryption key from the shared secret using HKDF.\n * @param salt - A non-secret random value.\n * @param info - Context-specific information.\n */\n async deriveEncryptionKey(salt: ArrayBuffer, info: ArrayBuffer): Promise<void> {\n if (!this.sharedSecret) {\n throw new Error('Shared secret not derived yet.');\n }\n\n this.encryptionKey = await this.provider.deriveEncryptionKey(this.sharedSecret, salt, info);\n }\n\n /**\n * Encrypt a message using the derived session key\n */\n async encrypt(message: Record<string, unknown>): Promise<EncryptedMessage> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = this.provider.randomBytes(CRYPTO_CONFIG.ivLength);\n const plaintext = stringToArrayBuffer(JSON.stringify(message));\n\n const ciphertext = await this.provider.encrypt(this.encryptionKey, plaintext, iv);\n\n // Generate HMAC for authentication\n const dataToSign = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const macBuffer = await this.provider.generateHMAC(this.encryptionKey, dataToSign.buffer);\n\n return {\n iv: arrayBufferToBase64(iv),\n ciphertext: arrayBufferToBase64(ciphertext),\n mac: arrayBufferToBase64(macBuffer),\n };\n }\n\n /**\n * Decrypt a message using the derived session key\n */\n async decrypt(encryptedMessage: EncryptedMessage): Promise<Record<string, unknown>> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = base64ToArrayBuffer(encryptedMessage.iv);\n const ciphertext = base64ToArrayBuffer(encryptedMessage.ciphertext);\n const receivedMac = base64ToArrayBuffer(encryptedMessage.mac);\n\n // Verify HMAC first\n const dataToVerify = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const isValidMac = await this.provider.verifyHMAC(this.encryptionKey, dataToVerify.buffer, receivedMac);\n if (!isValidMac) {\n throw new Error('Message authentication failed');\n }\n\n // Decrypt the message\n const plaintextBuffer = await this.provider.decrypt(this.encryptionKey, ciphertext, iv);\n const plaintextString = arrayBufferToString(plaintextBuffer);\n return JSON.parse(plaintextString) as Record<string, unknown>;\n }\n\n /**\n * Get session information\n */\n async getSessionKeys(): Promise<SessionKeys> {\n if (!this.keyPair || !this.sharedSecret) {\n throw new Error('Session not properly initialized');\n }\n\n return {\n sessionId: this.sessionId,\n publicKey: await this.getPublicKey(),\n sharedSecret: this.sharedSecret, // We know it exists due to the check above\n };\n }\n\n /**\n * Generate a random session ID\n */\n private generateSessionId(): string {\n const sessionBytes = this.provider.randomBytes(16); // 128 bits\n return arrayBufferToBase64(sessionBytes);\n }\n\n /**\n * Get provider information\n */\n getProviderInfo(): { name: string; isAvailable: boolean } {\n return {\n name: this.provider.name,\n isAvailable: this.provider.isAvailable,\n };\n }\n\n /**\n * Check if session is ready for encryption/decryption\n */\n get isReady(): boolean {\n return !!(this.keyPair && this.sharedSecret && this.encryptionKey);\n }\n}\n","import type { CreatePayloadOptions } from './types';\nimport type { CryptoPayload } from '../types/crypto';\nimport { randomBytes, arrayBufferToBase64, base64ToArrayBuffer } from './utils';\n\n/**\n * Parses a raw uncompressed P-256 public key.\n * The key should be 65 bytes: [0x04, 32-byte X, 32-byte Y]\n */\nfunction parsePublicKey(publicKey: ArrayBuffer): { x: ArrayBuffer; y: ArrayBuffer } {\n if (publicKey.byteLength !== 65 || new Uint8Array(publicKey)[0] !== 4) {\n throw new Error('Invalid P-256 public key format');\n }\n const x = publicKey.slice(1, 33);\n const y = publicKey.slice(33, 65);\n return { x, y };\n}\n\nexport class CryptoPayloadHandler {\n static createPayload(options: CreatePayloadOptions): CryptoPayload {\n if (options.encAlgo === 'plaintext') {\n return {\n version: '1.0',\n encryption: {\n algorithm: 'plaintext',\n },\n parameters: {\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n };\n }\n\n if (options.encAlgo === 'AES-GCM') {\n const iv = randomBytes(12);\n const salt = randomBytes(32);\n const publicKeyRaw = base64ToArrayBuffer(options.publicKeyB64);\n const { x, y } = parsePublicKey(publicKeyRaw);\n\n return {\n version: '1.0',\n keyExchange: {\n algorithm: 'ECDH',\n namedCurve: 'P-256',\n },\n encryption: {\n algorithm: 'AES-GCM',\n keyLength: 256,\n tagLength: 128,\n },\n publicKey: {\n kty: 'EC',\n crv: 'P-256',\n x: arrayBufferToBase64(x),\n y: arrayBufferToBase64(y),\n use: 'enc',\n key_ops: ['deriveKey'],\n },\n parameters: {\n iv: arrayBufferToBase64(iv.buffer),\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n derivation: {\n algorithm: 'HKDF',\n hash: 'SHA-256',\n info: 'message-exchange-v1',\n salt: arrayBufferToBase64(salt.buffer),\n },\n };\n }\n\n // This part should be unreachable with TypeScript's type checking\n throw new Error('Invalid encryption algorithm specified.');\n }\n\n /**\n * Validate crypto payload format\n */\n static validatePayload(payload: CryptoPayload): boolean {\n try {\n if (payload.version !== '1.0') {\n return false;\n }\n\n if (!payload.parameters?.sessionId || !payload.parameters?.timestamp) {\n return false;\n }\n\n if (payload.encryption?.algorithm === 'AES-GCM') {\n return !!(payload.keyExchange && payload.publicKey && payload.derivation);\n }\n\n if (payload.encryption?.algorithm === 'plaintext') {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Crypto Provider Diagnostics\n *\n * Utilities for testing, benchmarking, and diagnosing crypto provider issues.\n * These tools help developers understand provider availability and performance.\n *\n * @example\n * ```typescript\n * // Test if a provider actually works\n * const result = await testProvider('webcrypto');\n * if (result.success) {\n * console.log('WebCrypto is working!');\n * } else {\n * console.error('WebCrypto failed:', result.error);\n * }\n *\n * // Get detailed environment diagnostics\n * const diag = await diagnoseEnvironment();\n * console.log(diag.toMarkdown());\n *\n * // Benchmark providers\n * const bench = await benchmarkProvider('webcrypto');\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms`);\n * ```\n */\n\nimport type { Logger } from '@bananalink-sdk/logger';\nimport type {\n CryptoProvider,\n CryptoProviderType,\n PlatformDetectionResult,\n} from '../types/crypto-provider';\nimport { getRegisteredCryptoProviders } from './providers';\nimport { detectPlatform } from './utils';\n\n/**\n * Result of testing a specific crypto operation\n */\nexport interface OperationTestResult {\n /** Operation name */\n operation: string;\n /** Whether the operation succeeded */\n success: boolean;\n /** Execution time in milliseconds */\n durationMs?: number;\n /** Error message if failed */\n error?: string;\n /** Additional details */\n details?: Record<string, unknown>;\n}\n\n/**\n * Result of testing a crypto provider\n */\nexport interface ProviderTestResult {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** Whether the provider is available */\n available: boolean;\n /** Overall success (all operations passed) */\n success: boolean;\n /** Individual operation test results */\n operations: OperationTestResult[];\n /** Total test duration in milliseconds */\n totalDurationMs: number;\n /** Error message if provider not available */\n unavailableReason?: string;\n}\n\n/**\n * Performance benchmark result for a provider\n */\nexport interface ProviderBenchmark {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** ECDH key generation benchmark */\n ecdh: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** Random bytes generation benchmark */\n randomBytes: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** AES-GCM encryption benchmark */\n aesGcm: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n}\n\n/**\n * Provider detection summary\n */\nexport interface ProviderDetection {\n /** WebCrypto provider available */\n webCrypto: boolean;\n /** Node.js crypto provider available */\n node: boolean;\n /** Noble provider available (pure JS fallback) */\n noble: boolean;\n /** QuickCrypto provider available (React Native) */\n quickCrypto: boolean;\n /** Recommended provider for this environment */\n recommended?: CryptoProviderType;\n /** Detailed capability information */\n capabilities: Record<CryptoProviderType, {\n available: boolean;\n tested: boolean;\n success: boolean;\n }>;\n /** Provider-specific recommendations */\n recommendations: string[];\n}\n\n/**\n * Comprehensive environment diagnostics\n */\nexport interface EnvironmentDiagnostics {\n /** Timestamp of diagnostics */\n timestamp: string;\n /** Platform detection information */\n platform: PlatformDetectionResult;\n /** Provider detection summary */\n detection: ProviderDetection;\n /** List of registered providers */\n registeredProviders: CryptoProviderType[];\n /** Provider test results */\n providerTests: ProviderTestResult[];\n /** Recommended provider (first successful test) */\n recommendedProvider?: CryptoProviderType;\n /** Warnings and recommendations */\n warnings: string[];\n /** Platform-specific recommendations */\n recommendations: string[];\n /** Convert to human-readable markdown */\n toMarkdown(): string;\n /** Convert to JSON string */\n toJSON(): string;\n}\n\n/**\n * Test a specific crypto provider with real operations\n *\n * @param providerType - The provider type to test\n * @param logger - Optional logger for debug output\n * @returns Test result with success status and operation details\n *\n * @example\n * ```typescript\n * const result = await testProvider('webcrypto');\n * if (!result.success) {\n * console.error('Provider test failed:', result);\n * result.operations.forEach(op => {\n * if (!op.success) {\n * console.error(` ${op.operation}: ${op.error}`);\n * }\n * });\n * }\n * ```\n */\nexport async function testProvider(\n providerType: CryptoProviderType,\n logger?: Logger\n): Promise<ProviderTestResult> {\n const startTime = performance.now();\n const operations: OperationTestResult[] = [];\n\n let provider: CryptoProvider;\n try {\n // Create the specific provider without fallback to test it directly\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n\n if (!provider.isAvailable) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: `Provider ${providerType} not available in this environment`,\n };\n }\n } catch (error) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: error instanceof Error ? error.message : String(error),\n };\n }\n\n // Test 1: Random bytes generation\n try {\n const opStart = performance.now();\n const bytes = provider.randomBytes(32);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'randomBytes',\n success: true,\n durationMs: duration,\n details: {\n bytesLength: bytes.byteLength,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'randomBytes',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 2: ECDH key pair generation\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'generateKeyPair',\n success: true,\n durationMs: duration,\n details: {\n publicKeyType: keyPair.publicKey.type,\n privateKeyType: keyPair.privateKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'generateKeyPair',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 3: Key export/import\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const publicKeyData = await provider.exportPublicKey(keyPair.publicKey);\n const importedPublicKey = await provider.importPublicKey(publicKeyData);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'exportImportKey',\n success: true,\n durationMs: duration,\n details: {\n exportedKeySize: publicKeyData.byteLength,\n importedKeyType: importedPublicKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'exportImportKey',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 4: ECDH key agreement\n try {\n const opStart = performance.now();\n const keyPair1 = await provider.generateKeyPair();\n const keyPair2 = await provider.generateKeyPair();\n // Derive shared secrets from both sides (just verify they can be derived)\n await provider.deriveSharedSecret(keyPair1.privateKey, keyPair2.publicKey);\n await provider.deriveSharedSecret(keyPair2.privateKey, keyPair1.publicKey);\n const duration = performance.now() - opStart;\n\n // Both shared secrets were derived successfully\n operations.push({\n operation: 'deriveSharedSecret',\n success: true,\n durationMs: duration,\n details: {\n sharedSecretsGenerated: 2,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'deriveSharedSecret',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 5: AES-GCM encryption/decryption\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n\n const plaintext = new TextEncoder().encode('Hello, World!');\n const iv = provider.randomBytes(12);\n const ciphertext = await provider.encrypt(encryptionKey, plaintext, iv);\n const decrypted = await provider.decrypt(encryptionKey, ciphertext, iv);\n const decryptedText = new TextDecoder().decode(decrypted);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: decryptedText === 'Hello, World!',\n durationMs: duration,\n details: {\n plaintextSize: plaintext.byteLength,\n ciphertextSize: ciphertext.byteLength,\n decryptedCorrectly: decryptedText === 'Hello, World!',\n },\n });\n } catch (error) {\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = performance.now() - startTime;\n const allSuccess = operations.every(op => op.success);\n\n return {\n provider: providerType,\n available: true,\n success: allSuccess,\n operations,\n totalDurationMs: totalDuration,\n };\n}\n\n/**\n * Benchmark a crypto provider's performance\n *\n * @param providerType - The provider type to benchmark\n * @param iterations - Number of iterations for each operation (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Benchmark results with timing statistics\n *\n * @example\n * ```typescript\n * const bench = await benchmarkProvider('noble', 20);\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms (min: ${bench.ecdh.minMs}ms, max: ${bench.ecdh.maxMs}ms)`);\n * console.log(`Random: ${bench.randomBytes.avgMs}ms`);\n * console.log(`AES-GCM: ${bench.aesGcm.avgMs}ms`);\n * ```\n */\nexport async function benchmarkProvider(\n providerType: CryptoProviderType,\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark> {\n // Create the specific provider without fallback to test it directly\n let provider: CryptoProvider;\n try {\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n } catch (error) {\n throw new Error(\n `Provider ${providerType} failed to initialize: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (!provider.isAvailable) {\n throw new Error(`Provider ${providerType} not available for benchmarking`);\n }\n\n // Benchmark ECDH key generation\n const ecdhTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.generateKeyPair();\n ecdhTimes.push(performance.now() - start);\n }\n\n // Benchmark random bytes\n const randomBytesTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n provider.randomBytes(32);\n randomBytesTimes.push(performance.now() - start);\n }\n\n // Benchmark AES-GCM\n const aesGcmTimes: number[] = [];\n // Prepare keys once\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n const plaintext = provider.randomBytes(1024); // 1KB test data\n const iv = provider.randomBytes(12);\n\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.encrypt(encryptionKey, plaintext, iv);\n aesGcmTimes.push(performance.now() - start);\n }\n\n return {\n provider: providerType,\n ecdh: {\n avgMs: ecdhTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...ecdhTimes),\n maxMs: Math.max(...ecdhTimes),\n iterations,\n },\n randomBytes: {\n avgMs: randomBytesTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...randomBytesTimes),\n maxMs: Math.max(...randomBytesTimes),\n iterations,\n },\n aesGcm: {\n avgMs: aesGcmTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...aesGcmTimes),\n maxMs: Math.max(...aesGcmTimes),\n iterations,\n },\n };\n}\n\n/**\n * Get comprehensive environment diagnostics\n *\n * @param logger - Optional logger for debug output\n * @returns Complete diagnostics including registered providers, test results, and recommendations\n *\n * @example\n * ```typescript\n * const diag = await diagnoseEnvironment();\n *\n * // Print markdown report\n * console.log(diag.toMarkdown());\n *\n * // Or access data programmatically\n * console.log('Registered:', diag.registeredProviders);\n * console.log('Recommended:', diag.recommendedProvider);\n * diag.providerTests.forEach(test => {\n * console.log(`${test.provider}: ${test.success ? '✅' : '❌'}`);\n * });\n * ```\n */\nexport async function diagnoseEnvironment(logger?: Logger): Promise<EnvironmentDiagnostics> {\n const platform = detectPlatform();\n const registeredProviders = getRegisteredCryptoProviders();\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n // Test all registered providers\n const providerTests = await Promise.all(\n registeredProviders.map(type => testProvider(type, logger))\n );\n\n // Find recommended provider (first successful test)\n const recommendedProvider = providerTests.find(test => test.success && test.available)?.provider;\n\n // Build provider detection summary\n const capabilities: Record<CryptoProviderType, { available: boolean; tested: boolean; success: boolean }> = {\n webcrypto: { available: false, tested: false, success: false },\n node: { available: false, tested: false, success: false },\n noble: { available: false, tested: false, success: false },\n quickcrypto: { available: false, tested: false, success: false },\n };\n\n providerTests.forEach(test => {\n capabilities[test.provider] = {\n available: test.available,\n tested: true,\n success: test.success,\n };\n });\n\n const detectionRecommendations: string[] = [];\n if (!capabilities.noble.success) {\n detectionRecommendations.push(\"Noble provider should always work as a fallback\");\n }\n if (platform.isNode && !capabilities.node.tested) {\n detectionRecommendations.push(\"Consider testing 'node' provider for optimal Node.js performance\");\n }\n if (platform.isBrowser && !capabilities.webcrypto.tested) {\n detectionRecommendations.push(\"Consider testing 'webcrypto' provider for browser environments\");\n }\n\n const detection: ProviderDetection = {\n webCrypto: capabilities.webcrypto.available && capabilities.webcrypto.success,\n node: capabilities.node.available && capabilities.node.success,\n noble: capabilities.noble.available && capabilities.noble.success,\n quickCrypto: capabilities.quickcrypto.available && capabilities.quickcrypto.success,\n recommended: recommendedProvider,\n capabilities,\n recommendations: detectionRecommendations,\n };\n\n // Generate warnings\n providerTests.forEach(test => {\n if (!test.success && test.available) {\n warnings.push(`${test.provider} provider registered but failed operation tests`);\n }\n });\n\n if (registeredProviders.length === 0) {\n warnings.push('No crypto providers registered. Import at least one provider.');\n }\n\n if (!recommendedProvider) {\n warnings.push('No working crypto provider found. All registered providers failed tests.');\n }\n\n // Generate platform-specific recommendations\n if (platform.isNode) {\n if (!registeredProviders.includes('node')) {\n recommendations.push(\"Consider importing 'node' provider for optimal Node.js performance\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/node' for Node.js\");\n }\n } else if (platform.isBrowser) {\n if (!registeredProviders.includes('webcrypto')) {\n recommendations.push(\"Consider importing 'webcrypto' provider for browsers\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/webcrypto' for browsers\");\n }\n } else if (platform.isReactNative) {\n if (!registeredProviders.includes('quickcrypto')) {\n recommendations.push(\"Consider importing 'quickcrypto' provider for React Native\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/quickcrypto' for React Native\");\n }\n }\n\n // Universal recommendation\n if (!recommendedProvider || registeredProviders.length === 0) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/noble' as a universal fallback\");\n }\n\n const diagnostics: EnvironmentDiagnostics = {\n timestamp: new Date().toISOString(),\n platform,\n detection,\n registeredProviders,\n providerTests,\n recommendedProvider,\n warnings,\n recommendations,\n\n toMarkdown(): string {\n let md = '# Crypto Environment Diagnostics\\n\\n';\n md += `**Generated:** ${this.timestamp}\\n\\n`;\n\n // Platform section\n md += '## Platform\\n\\n';\n const platformType = this.platform.isNode\n ? 'Node.js'\n : this.platform.isBrowser\n ? 'Browser'\n : this.platform.isReactNative\n ? 'React Native'\n : 'Unknown';\n md += `- **Type:** ${platformType}\\n`;\n if (this.platform.platform) {\n md += `- **OS:** ${this.platform.platform}\\n`;\n }\n if (this.platform.userAgent) {\n // Truncate long user agents\n const ua = this.platform.userAgent.length > 80\n ? `${this.platform.userAgent.substring(0, 80)}...`\n : this.platform.userAgent;\n md += `- **User Agent:** ${ua}\\n`;\n }\n md += '\\n';\n\n // Provider Detection section\n md += '## Provider Detection\\n\\n';\n md += `- **WebCrypto:** ${this.detection.webCrypto ? '✅' : '❌'}\\n`;\n md += `- **Node.js Crypto:** ${this.detection.node ? '✅' : '❌'}\\n`;\n md += `- **Noble (Pure JS):** ${this.detection.noble ? '✅' : '❌'}\\n`;\n md += `- **QuickCrypto (RN):** ${this.detection.quickCrypto ? '✅' : '❌'}\\n`;\n if (this.detection.recommended) {\n md += `- **Recommended:** ${this.detection.recommended}\\n`;\n }\n md += '\\n';\n\n // Capabilities section\n md += '## Capabilities\\n\\n';\n Object.entries(this.detection.capabilities).forEach(([provider, capability]) => {\n const status = capability.tested\n ? capability.success ? '✅ Available' : '❌ Failed'\n : '⚪ Not Tested';\n md += `- **${provider}:** ${status}\\n`;\n });\n md += '\\n';\n\n // Registered providers section\n md += '## Registered Providers\\n\\n';\n if (this.registeredProviders.length === 0) {\n md += 'No providers registered.\\n\\n';\n } else {\n this.registeredProviders.forEach(provider => {\n md += `- ${provider}${provider === this.recommendedProvider ? ' (recommended)' : ''}\\n`;\n });\n md += '\\n';\n }\n\n // Provider tests section\n md += '## Provider Tests\\n\\n';\n if (this.providerTests.length === 0) {\n md += 'No tests run (no providers registered).\\n\\n';\n } else {\n this.providerTests.forEach(test => {\n md += `### ${test.provider}\\n\\n`;\n md += `- **Available:** ${test.available ? '✅' : '❌'}\\n`;\n if (!test.available) {\n md += `- **Reason:** ${test.unavailableReason}\\n`;\n } else {\n md += `- **Overall Success:** ${test.success ? '✅' : '❌'}\\n`;\n md += `- **Total Duration:** ${test.totalDurationMs.toFixed(2)}ms\\n\\n`;\n md += '**Operations:**\\n\\n';\n test.operations.forEach(op => {\n md += `- **${op.operation}:** ${op.success ? '✅' : '❌'}`;\n if (op.durationMs) md += ` (${op.durationMs.toFixed(2)}ms)`;\n if (op.error) md += ` - ${op.error}`;\n md += '\\n';\n });\n }\n md += '\\n';\n });\n }\n\n // Recommendations section\n md += '## Recommendations\\n\\n';\n if (this.recommendedProvider) {\n md += `- Recommended: Use '${this.recommendedProvider}' provider (passed all tests)\\n`;\n }\n if (this.recommendations.length > 0) {\n this.recommendations.forEach(rec => {\n md += `- ${rec}\\n`;\n });\n }\n md += '\\n';\n\n // Warnings section\n if (this.warnings.length > 0) {\n md += '## Warnings\\n\\n';\n this.warnings.forEach(warning => {\n md += `⚠️ ${warning}\\n\\n`;\n });\n }\n\n return md;\n },\n\n toJSON(): string {\n return JSON.stringify(\n {\n timestamp: this.timestamp,\n platform: this.platform,\n detection: this.detection,\n registeredProviders: this.registeredProviders,\n providerTests: this.providerTests,\n recommendedProvider: this.recommendedProvider,\n warnings: this.warnings,\n recommendations: this.recommendations,\n },\n null,\n 2\n );\n },\n };\n\n return diagnostics;\n}\n\n/**\n * Compare performance of multiple providers\n *\n * @param providers - Array of provider types to compare\n * @param iterations - Number of iterations for each benchmark (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Array of benchmark results for comparison\n *\n * @example\n * ```typescript\n * const results = await compareProviders(['webcrypto', 'noble'], 20);\n * results.forEach(result => {\n * console.log(`\\n${result.provider}:`);\n * console.log(` ECDH: ${result.ecdh.avgMs.toFixed(2)}ms`);\n * console.log(` Random: ${result.randomBytes.avgMs.toFixed(2)}ms`);\n * console.log(` AES: ${result.aesGcm.avgMs.toFixed(2)}ms`);\n * });\n * ```\n */\nexport async function compareProviders(\n providers: CryptoProviderType[],\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark[]> {\n const results: ProviderBenchmark[] = [];\n\n for (const provider of providers) {\n try {\n const benchmark = await benchmarkProvider(provider, iterations, logger);\n results.push(benchmark);\n } catch (error) {\n logger?.warn(`Failed to benchmark ${provider}:`, {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n }\n }\n\n return results;\n}\n"]}
1
+ {"version":3,"sources":["../src/crypto/session-security.ts","../src/crypto/payload-handler.ts","../src/crypto/diagnostics.ts"],"names":["createCryptoProvider","arrayBufferToBase64","base64ToArrayBuffer","stringToArrayBuffer","arrayBufferToString","__name","randomBytes","detectPlatform","getRegisteredCryptoProviders"],"mappings":"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","file":"crypto-export.cjs","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { SessionKeys, EncryptedMessage, CryptoConfig } from './types';\nimport { arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString } from './utils';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from './providers';\nimport { createCryptoProvider } from './providers';\n\nconst CRYPTO_CONFIG: CryptoConfig = {\n algorithm: 'AES-GCM',\n keyLength: 256,\n ivLength: 12,\n tagLength: 128, // tagLength is in bits for Web Crypto API (128 bits = 16 bytes)\n curve: 'P-256',\n};\n\nexport class SessionSecurity {\n private keyPair?: ProviderKeyPair;\n private sharedSecret?: CryptoKeyLike;\n private sessionId: string;\n private encryptionKey?: CryptoKeyLike; // For AES-GCM\n private provider: CryptoProvider;\n\n constructor(sessionId?: string, provider?: CryptoProvider, logger?: Logger) {\n this.provider = provider || createCryptoProvider(undefined, logger);\n this.sessionId = sessionId || this.generateSessionId();\n }\n\n /**\n * Get the crypto provider used by this session\n */\n getCryptoProvider(): CryptoProvider {\n return this.provider;\n }\n\n /**\n * Establish a new session with ephemeral key generation\n */\n static async establishSession(sessionId?: string, provider?: CryptoProvider, logger?: Logger): Promise<SessionSecurity> {\n const session = new SessionSecurity(sessionId, provider, logger);\n await session.generateKeyPair();\n return session;\n }\n\n /**\n * Generate ECDH key pair for this session\n */\n private async generateKeyPair(): Promise<void> {\n this.keyPair = await this.provider.generateKeyPair();\n }\n\n /**\n * Get the public key for sharing (base64 encoded)\n */\n async getPublicKey(): Promise<string> {\n if (!this.keyPair?.publicKey) {\n throw new Error('Key pair not generated. Call generateKeyPair() first.');\n }\n\n const exported = await this.provider.exportPublicKey(this.keyPair.publicKey);\n return arrayBufferToBase64(exported);\n }\n\n /**\n * Derive shared secret from peer's public key\n */\n async deriveSharedSecret(peerPublicKeyBase64: string): Promise<void> {\n if (!this.keyPair?.privateKey) {\n throw new Error('Key pair not generated');\n }\n\n const peerPublicKeyBuffer = base64ToArrayBuffer(peerPublicKeyBase64);\n const importedPeerKey = await this.provider.importPublicKey(peerPublicKeyBuffer);\n\n this.sharedSecret = await this.provider.deriveSharedSecret(this.keyPair.privateKey, importedPeerKey);\n }\n\n /**\n * Derives an encryption key from the shared secret using HKDF.\n * @param salt - A non-secret random value.\n * @param info - Context-specific information.\n */\n async deriveEncryptionKey(salt: ArrayBuffer, info: ArrayBuffer): Promise<void> {\n if (!this.sharedSecret) {\n throw new Error('Shared secret not derived yet.');\n }\n\n this.encryptionKey = await this.provider.deriveEncryptionKey(this.sharedSecret, salt, info);\n }\n\n /**\n * Encrypt a message using the derived session key\n */\n async encrypt(message: Record<string, unknown>): Promise<EncryptedMessage> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = this.provider.randomBytes(CRYPTO_CONFIG.ivLength);\n const plaintext = stringToArrayBuffer(JSON.stringify(message));\n\n const ciphertext = await this.provider.encrypt(this.encryptionKey, plaintext, iv);\n\n // Generate HMAC for authentication\n const dataToSign = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const macBuffer = await this.provider.generateHMAC(this.encryptionKey, dataToSign.buffer);\n\n return {\n iv: arrayBufferToBase64(iv),\n ciphertext: arrayBufferToBase64(ciphertext),\n mac: arrayBufferToBase64(macBuffer),\n };\n }\n\n /**\n * Decrypt a message using the derived session key\n */\n async decrypt(encryptedMessage: EncryptedMessage): Promise<Record<string, unknown>> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = base64ToArrayBuffer(encryptedMessage.iv);\n const ciphertext = base64ToArrayBuffer(encryptedMessage.ciphertext);\n const receivedMac = base64ToArrayBuffer(encryptedMessage.mac);\n\n // Verify HMAC first\n const dataToVerify = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const isValidMac = await this.provider.verifyHMAC(this.encryptionKey, dataToVerify.buffer, receivedMac);\n if (!isValidMac) {\n throw new Error('Message authentication failed');\n }\n\n // Decrypt the message\n const plaintextBuffer = await this.provider.decrypt(this.encryptionKey, ciphertext, iv);\n const plaintextString = arrayBufferToString(plaintextBuffer);\n return JSON.parse(plaintextString) as Record<string, unknown>;\n }\n\n /**\n * Get session information\n */\n async getSessionKeys(): Promise<SessionKeys> {\n if (!this.keyPair || !this.sharedSecret) {\n throw new Error('Session not properly initialized');\n }\n\n return {\n sessionId: this.sessionId,\n publicKey: await this.getPublicKey(),\n sharedSecret: this.sharedSecret, // We know it exists due to the check above\n };\n }\n\n /**\n * Generate a random session ID\n */\n private generateSessionId(): string {\n const sessionBytes = this.provider.randomBytes(16); // 128 bits\n return arrayBufferToBase64(sessionBytes);\n }\n\n /**\n * Get provider information\n */\n getProviderInfo(): { name: string; isAvailable: boolean } {\n return {\n name: this.provider.name,\n isAvailable: this.provider.isAvailable,\n };\n }\n\n /**\n * Check if session is ready for encryption/decryption\n */\n get isReady(): boolean {\n return !!(this.keyPair && this.sharedSecret && this.encryptionKey);\n }\n}\n","import type { CreatePayloadOptions } from './types';\nimport type { CryptoPayload } from '../types/crypto';\nimport { randomBytes, arrayBufferToBase64, base64ToArrayBuffer } from './utils';\n\n/**\n * Parses a raw uncompressed P-256 public key.\n * The key should be 65 bytes: [0x04, 32-byte X, 32-byte Y]\n */\nfunction parsePublicKey(publicKey: ArrayBuffer): { x: ArrayBuffer; y: ArrayBuffer } {\n if (publicKey.byteLength !== 65 || new Uint8Array(publicKey)[0] !== 4) {\n throw new Error('Invalid P-256 public key format');\n }\n const x = publicKey.slice(1, 33);\n const y = publicKey.slice(33, 65);\n return { x, y };\n}\n\nexport class CryptoPayloadHandler {\n static createPayload(options: CreatePayloadOptions): CryptoPayload {\n if (options.encAlgo === 'plaintext') {\n return {\n version: '1.0',\n encryption: {\n algorithm: 'plaintext',\n },\n parameters: {\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n };\n }\n\n if (options.encAlgo === 'AES-GCM') {\n const iv = randomBytes(12);\n const salt = randomBytes(32);\n const publicKeyRaw = base64ToArrayBuffer(options.publicKeyB64);\n const { x, y } = parsePublicKey(publicKeyRaw);\n\n return {\n version: '1.0',\n keyExchange: {\n algorithm: 'ECDH',\n namedCurve: 'P-256',\n },\n encryption: {\n algorithm: 'AES-GCM',\n keyLength: 256,\n tagLength: 128,\n },\n publicKey: {\n kty: 'EC',\n crv: 'P-256',\n x: arrayBufferToBase64(x),\n y: arrayBufferToBase64(y),\n use: 'enc',\n key_ops: ['deriveKey'],\n },\n parameters: {\n iv: arrayBufferToBase64(iv.buffer),\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n derivation: {\n algorithm: 'HKDF',\n hash: 'SHA-256',\n info: 'message-exchange-v1',\n salt: arrayBufferToBase64(salt.buffer),\n },\n };\n }\n\n // This part should be unreachable with TypeScript's type checking\n throw new Error('Invalid encryption algorithm specified.');\n }\n\n /**\n * Validate crypto payload format\n */\n static validatePayload(payload: CryptoPayload): boolean {\n try {\n if (payload.version !== '1.0') {\n return false;\n }\n\n if (!payload.parameters?.sessionId || !payload.parameters?.timestamp) {\n return false;\n }\n\n if (payload.encryption?.algorithm === 'AES-GCM') {\n return !!(payload.keyExchange && payload.publicKey && payload.derivation);\n }\n\n if (payload.encryption?.algorithm === 'plaintext') {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Crypto Provider Diagnostics\n *\n * Utilities for testing, benchmarking, and diagnosing crypto provider issues.\n * These tools help developers understand provider availability and performance.\n *\n * @example\n * ```typescript\n * // Test if a provider actually works\n * const result = await testProvider('webcrypto');\n * if (result.success) {\n * console.log('WebCrypto is working!');\n * } else {\n * console.error('WebCrypto failed:', result.error);\n * }\n *\n * // Get detailed environment diagnostics\n * const diag = await diagnoseEnvironment();\n * console.log(diag.toMarkdown());\n *\n * // Benchmark providers\n * const bench = await benchmarkProvider('webcrypto');\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms`);\n * ```\n */\n\nimport type { Logger } from '@bananalink-sdk/logger';\nimport type {\n CryptoProvider,\n CryptoProviderType,\n PlatformDetectionResult,\n} from '../types/crypto-provider';\nimport { getRegisteredCryptoProviders } from './providers';\nimport { detectPlatform } from './utils';\n\n/**\n * Result of testing a specific crypto operation\n */\nexport interface OperationTestResult {\n /** Operation name */\n operation: string;\n /** Whether the operation succeeded */\n success: boolean;\n /** Execution time in milliseconds */\n durationMs?: number;\n /** Error message if failed */\n error?: string;\n /** Additional details */\n details?: Record<string, unknown>;\n}\n\n/**\n * Result of testing a crypto provider\n */\nexport interface ProviderTestResult {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** Whether the provider is available */\n available: boolean;\n /** Overall success (all operations passed) */\n success: boolean;\n /** Individual operation test results */\n operations: OperationTestResult[];\n /** Total test duration in milliseconds */\n totalDurationMs: number;\n /** Error message if provider not available */\n unavailableReason?: string;\n}\n\n/**\n * Performance benchmark result for a provider\n */\nexport interface ProviderBenchmark {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** ECDH key generation benchmark */\n ecdh: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** Random bytes generation benchmark */\n randomBytes: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** AES-GCM encryption benchmark */\n aesGcm: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n}\n\n/**\n * Provider detection summary\n */\nexport interface ProviderDetection {\n /** WebCrypto provider available */\n webCrypto: boolean;\n /** Node.js crypto provider available */\n node: boolean;\n /** Noble provider available (pure JS fallback) */\n noble: boolean;\n /** QuickCrypto provider available (React Native) */\n quickCrypto: boolean;\n /** Recommended provider for this environment */\n recommended?: CryptoProviderType;\n /** Detailed capability information */\n capabilities: Record<CryptoProviderType, {\n available: boolean;\n tested: boolean;\n success: boolean;\n }>;\n /** Provider-specific recommendations */\n recommendations: string[];\n}\n\n/**\n * Comprehensive environment diagnostics\n */\nexport interface EnvironmentDiagnostics {\n /** Timestamp of diagnostics */\n timestamp: string;\n /** Platform detection information */\n platform: PlatformDetectionResult;\n /** Provider detection summary */\n detection: ProviderDetection;\n /** List of registered providers */\n registeredProviders: CryptoProviderType[];\n /** Provider test results */\n providerTests: ProviderTestResult[];\n /** Recommended provider (first successful test) */\n recommendedProvider?: CryptoProviderType;\n /** Warnings and recommendations */\n warnings: string[];\n /** Platform-specific recommendations */\n recommendations: string[];\n /** Convert to human-readable markdown */\n toMarkdown(): string;\n /** Convert to JSON string */\n toJSON(): string;\n}\n\n/**\n * Test a specific crypto provider with real operations\n *\n * @param providerType - The provider type to test\n * @param logger - Optional logger for debug output\n * @returns Test result with success status and operation details\n *\n * @example\n * ```typescript\n * const result = await testProvider('webcrypto');\n * if (!result.success) {\n * console.error('Provider test failed:', result);\n * result.operations.forEach(op => {\n * if (!op.success) {\n * console.error(` ${op.operation}: ${op.error}`);\n * }\n * });\n * }\n * ```\n */\nexport async function testProvider(\n providerType: CryptoProviderType,\n logger?: Logger\n): Promise<ProviderTestResult> {\n const startTime = performance.now();\n const operations: OperationTestResult[] = [];\n\n let provider: CryptoProvider;\n try {\n // Create the specific provider without fallback to test it directly\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n\n if (!provider.isAvailable) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: `Provider ${providerType} not available in this environment`,\n };\n }\n } catch (error) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: error instanceof Error ? error.message : String(error),\n };\n }\n\n // Test 1: Random bytes generation\n try {\n const opStart = performance.now();\n const bytes = provider.randomBytes(32);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'randomBytes',\n success: true,\n durationMs: duration,\n details: {\n bytesLength: bytes.byteLength,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'randomBytes',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 2: ECDH key pair generation\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'generateKeyPair',\n success: true,\n durationMs: duration,\n details: {\n publicKeyType: keyPair.publicKey.type,\n privateKeyType: keyPair.privateKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'generateKeyPair',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 3: Key export/import\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const publicKeyData = await provider.exportPublicKey(keyPair.publicKey);\n const importedPublicKey = await provider.importPublicKey(publicKeyData);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'exportImportKey',\n success: true,\n durationMs: duration,\n details: {\n exportedKeySize: publicKeyData.byteLength,\n importedKeyType: importedPublicKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'exportImportKey',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 4: ECDH key agreement\n try {\n const opStart = performance.now();\n const keyPair1 = await provider.generateKeyPair();\n const keyPair2 = await provider.generateKeyPair();\n // Derive shared secrets from both sides (just verify they can be derived)\n await provider.deriveSharedSecret(keyPair1.privateKey, keyPair2.publicKey);\n await provider.deriveSharedSecret(keyPair2.privateKey, keyPair1.publicKey);\n const duration = performance.now() - opStart;\n\n // Both shared secrets were derived successfully\n operations.push({\n operation: 'deriveSharedSecret',\n success: true,\n durationMs: duration,\n details: {\n sharedSecretsGenerated: 2,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'deriveSharedSecret',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 5: AES-GCM encryption/decryption\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n\n const plaintext = new TextEncoder().encode('Hello, World!');\n const iv = provider.randomBytes(12);\n const ciphertext = await provider.encrypt(encryptionKey, plaintext, iv);\n const decrypted = await provider.decrypt(encryptionKey, ciphertext, iv);\n const decryptedText = new TextDecoder().decode(decrypted);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: decryptedText === 'Hello, World!',\n durationMs: duration,\n details: {\n plaintextSize: plaintext.byteLength,\n ciphertextSize: ciphertext.byteLength,\n decryptedCorrectly: decryptedText === 'Hello, World!',\n },\n });\n } catch (error) {\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = performance.now() - startTime;\n const allSuccess = operations.every(op => op.success);\n\n return {\n provider: providerType,\n available: true,\n success: allSuccess,\n operations,\n totalDurationMs: totalDuration,\n };\n}\n\n/**\n * Benchmark a crypto provider's performance\n *\n * @param providerType - The provider type to benchmark\n * @param iterations - Number of iterations for each operation (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Benchmark results with timing statistics\n *\n * @example\n * ```typescript\n * const bench = await benchmarkProvider('noble', 20);\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms (min: ${bench.ecdh.minMs}ms, max: ${bench.ecdh.maxMs}ms)`);\n * console.log(`Random: ${bench.randomBytes.avgMs}ms`);\n * console.log(`AES-GCM: ${bench.aesGcm.avgMs}ms`);\n * ```\n */\nexport async function benchmarkProvider(\n providerType: CryptoProviderType,\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark> {\n // Create the specific provider without fallback to test it directly\n let provider: CryptoProvider;\n try {\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n } catch (error) {\n throw new Error(\n `Provider ${providerType} failed to initialize: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (!provider.isAvailable) {\n throw new Error(`Provider ${providerType} not available for benchmarking`);\n }\n\n // Benchmark ECDH key generation\n const ecdhTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.generateKeyPair();\n ecdhTimes.push(performance.now() - start);\n }\n\n // Benchmark random bytes\n const randomBytesTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n provider.randomBytes(32);\n randomBytesTimes.push(performance.now() - start);\n }\n\n // Benchmark AES-GCM\n const aesGcmTimes: number[] = [];\n // Prepare keys once\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n const plaintext = provider.randomBytes(1024); // 1KB test data\n const iv = provider.randomBytes(12);\n\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.encrypt(encryptionKey, plaintext, iv);\n aesGcmTimes.push(performance.now() - start);\n }\n\n return {\n provider: providerType,\n ecdh: {\n avgMs: ecdhTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...ecdhTimes),\n maxMs: Math.max(...ecdhTimes),\n iterations,\n },\n randomBytes: {\n avgMs: randomBytesTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...randomBytesTimes),\n maxMs: Math.max(...randomBytesTimes),\n iterations,\n },\n aesGcm: {\n avgMs: aesGcmTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...aesGcmTimes),\n maxMs: Math.max(...aesGcmTimes),\n iterations,\n },\n };\n}\n\n/**\n * Get comprehensive environment diagnostics\n *\n * @param logger - Optional logger for debug output\n * @returns Complete diagnostics including registered providers, test results, and recommendations\n *\n * @example\n * ```typescript\n * const diag = await diagnoseEnvironment();\n *\n * // Print markdown report\n * console.log(diag.toMarkdown());\n *\n * // Or access data programmatically\n * console.log('Registered:', diag.registeredProviders);\n * console.log('Recommended:', diag.recommendedProvider);\n * diag.providerTests.forEach(test => {\n * console.log(`${test.provider}: ${test.success ? '✅' : '❌'}`);\n * });\n * ```\n */\nexport async function diagnoseEnvironment(logger?: Logger): Promise<EnvironmentDiagnostics> {\n const platform = detectPlatform();\n const registeredProviders = getRegisteredCryptoProviders();\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n // Test all registered providers\n const providerTests = await Promise.all(\n registeredProviders.map(type => testProvider(type, logger))\n );\n\n // Find recommended provider (first successful test)\n const recommendedProvider = providerTests.find(test => test.success && test.available)?.provider;\n\n // Build provider detection summary\n const capabilities: Record<CryptoProviderType, { available: boolean; tested: boolean; success: boolean }> = {\n webcrypto: { available: false, tested: false, success: false },\n node: { available: false, tested: false, success: false },\n noble: { available: false, tested: false, success: false },\n quickcrypto: { available: false, tested: false, success: false },\n };\n\n providerTests.forEach(test => {\n capabilities[test.provider] = {\n available: test.available,\n tested: true,\n success: test.success,\n };\n });\n\n const detectionRecommendations: string[] = [];\n if (!capabilities.noble.success) {\n detectionRecommendations.push(\"Noble provider should always work as a fallback\");\n }\n if (platform.isNode && !capabilities.node.tested) {\n detectionRecommendations.push(\"Consider testing 'node' provider for optimal Node.js performance\");\n }\n if (platform.isBrowser && !capabilities.webcrypto.tested) {\n detectionRecommendations.push(\"Consider testing 'webcrypto' provider for browser environments\");\n }\n\n const detection: ProviderDetection = {\n webCrypto: capabilities.webcrypto.available && capabilities.webcrypto.success,\n node: capabilities.node.available && capabilities.node.success,\n noble: capabilities.noble.available && capabilities.noble.success,\n quickCrypto: capabilities.quickcrypto.available && capabilities.quickcrypto.success,\n recommended: recommendedProvider,\n capabilities,\n recommendations: detectionRecommendations,\n };\n\n // Generate warnings\n providerTests.forEach(test => {\n if (!test.success && test.available) {\n warnings.push(`${test.provider} provider registered but failed operation tests`);\n }\n });\n\n if (registeredProviders.length === 0) {\n warnings.push('No crypto providers registered. Import at least one provider.');\n }\n\n if (!recommendedProvider) {\n warnings.push('No working crypto provider found. All registered providers failed tests.');\n }\n\n // Generate platform-specific recommendations\n if (platform.isNode) {\n if (!registeredProviders.includes('node')) {\n recommendations.push(\"Consider importing 'node' provider for optimal Node.js performance\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/node' for Node.js\");\n }\n } else if (platform.isBrowser) {\n if (!registeredProviders.includes('webcrypto')) {\n recommendations.push(\"Consider importing 'webcrypto' provider for browsers\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/webcrypto' for browsers\");\n }\n } else if (platform.isReactNative) {\n if (!registeredProviders.includes('quickcrypto')) {\n recommendations.push(\"Consider importing 'quickcrypto' provider for React Native\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/quickcrypto' for React Native\");\n }\n }\n\n // Universal recommendation\n if (!recommendedProvider || registeredProviders.length === 0) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/noble' as a universal fallback\");\n }\n\n const diagnostics: EnvironmentDiagnostics = {\n timestamp: new Date().toISOString(),\n platform,\n detection,\n registeredProviders,\n providerTests,\n recommendedProvider,\n warnings,\n recommendations,\n\n toMarkdown(): string {\n let md = '# Crypto Environment Diagnostics\\n\\n';\n md += `**Generated:** ${this.timestamp}\\n\\n`;\n\n // Platform section\n md += '## Platform\\n\\n';\n const platformType = this.platform.isNode\n ? 'Node.js'\n : this.platform.isBrowser\n ? 'Browser'\n : this.platform.isReactNative\n ? 'React Native'\n : 'Unknown';\n md += `- **Type:** ${platformType}\\n`;\n if (this.platform.platform) {\n md += `- **OS:** ${this.platform.platform}\\n`;\n }\n if (this.platform.userAgent) {\n // Truncate long user agents\n const ua = this.platform.userAgent.length > 80\n ? `${this.platform.userAgent.substring(0, 80)}...`\n : this.platform.userAgent;\n md += `- **User Agent:** ${ua}\\n`;\n }\n md += '\\n';\n\n // Provider Detection section\n md += '## Provider Detection\\n\\n';\n md += `- **WebCrypto:** ${this.detection.webCrypto ? '✅' : '❌'}\\n`;\n md += `- **Node.js Crypto:** ${this.detection.node ? '✅' : '❌'}\\n`;\n md += `- **Noble (Pure JS):** ${this.detection.noble ? '✅' : '❌'}\\n`;\n md += `- **QuickCrypto (RN):** ${this.detection.quickCrypto ? '✅' : '❌'}\\n`;\n if (this.detection.recommended) {\n md += `- **Recommended:** ${this.detection.recommended}\\n`;\n }\n md += '\\n';\n\n // Capabilities section\n md += '## Capabilities\\n\\n';\n Object.entries(this.detection.capabilities).forEach(([provider, capability]) => {\n const status = capability.tested\n ? capability.success ? '✅ Available' : '❌ Failed'\n : '⚪ Not Tested';\n md += `- **${provider}:** ${status}\\n`;\n });\n md += '\\n';\n\n // Registered providers section\n md += '## Registered Providers\\n\\n';\n if (this.registeredProviders.length === 0) {\n md += 'No providers registered.\\n\\n';\n } else {\n this.registeredProviders.forEach(provider => {\n md += `- ${provider}${provider === this.recommendedProvider ? ' (recommended)' : ''}\\n`;\n });\n md += '\\n';\n }\n\n // Provider tests section\n md += '## Provider Tests\\n\\n';\n if (this.providerTests.length === 0) {\n md += 'No tests run (no providers registered).\\n\\n';\n } else {\n this.providerTests.forEach(test => {\n md += `### ${test.provider}\\n\\n`;\n md += `- **Available:** ${test.available ? '✅' : '❌'}\\n`;\n if (!test.available) {\n md += `- **Reason:** ${test.unavailableReason}\\n`;\n } else {\n md += `- **Overall Success:** ${test.success ? '✅' : '❌'}\\n`;\n md += `- **Total Duration:** ${test.totalDurationMs.toFixed(2)}ms\\n\\n`;\n md += '**Operations:**\\n\\n';\n test.operations.forEach(op => {\n md += `- **${op.operation}:** ${op.success ? '✅' : '❌'}`;\n if (op.durationMs) md += ` (${op.durationMs.toFixed(2)}ms)`;\n if (op.error) md += ` - ${op.error}`;\n md += '\\n';\n });\n }\n md += '\\n';\n });\n }\n\n // Recommendations section\n md += '## Recommendations\\n\\n';\n if (this.recommendedProvider) {\n md += `- Recommended: Use '${this.recommendedProvider}' provider (passed all tests)\\n`;\n }\n if (this.recommendations.length > 0) {\n this.recommendations.forEach(rec => {\n md += `- ${rec}\\n`;\n });\n }\n md += '\\n';\n\n // Warnings section\n if (this.warnings.length > 0) {\n md += '## Warnings\\n\\n';\n this.warnings.forEach(warning => {\n md += `⚠️ ${warning}\\n\\n`;\n });\n }\n\n return md;\n },\n\n toJSON(): string {\n return JSON.stringify(\n {\n timestamp: this.timestamp,\n platform: this.platform,\n detection: this.detection,\n registeredProviders: this.registeredProviders,\n providerTests: this.providerTests,\n recommendedProvider: this.recommendedProvider,\n warnings: this.warnings,\n recommendations: this.recommendations,\n },\n null,\n 2\n );\n },\n };\n\n return diagnostics;\n}\n\n/**\n * Compare performance of multiple providers\n *\n * @param providers - Array of provider types to compare\n * @param iterations - Number of iterations for each benchmark (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Array of benchmark results for comparison\n *\n * @example\n * ```typescript\n * const results = await compareProviders(['webcrypto', 'noble'], 20);\n * results.forEach(result => {\n * console.log(`\\n${result.provider}:`);\n * console.log(` ECDH: ${result.ecdh.avgMs.toFixed(2)}ms`);\n * console.log(` Random: ${result.randomBytes.avgMs.toFixed(2)}ms`);\n * console.log(` AES: ${result.aesGcm.avgMs.toFixed(2)}ms`);\n * });\n * ```\n */\nexport async function compareProviders(\n providers: CryptoProviderType[],\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark[]> {\n const results: ProviderBenchmark[] = [];\n\n for (const provider of providers) {\n try {\n const benchmark = await benchmarkProvider(provider, iterations, logger);\n results.push(benchmark);\n } catch (error) {\n logger?.warn(`Failed to benchmark ${provider}:`, {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n }\n }\n\n return results;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Logger } from '@bananalink-sdk/logger';
2
2
  import { a as CryptoKeyLike, C as CryptoProvider, P as ProviderKeyPair, b as CryptoProviderType, c as PlatformDetectionResult } from './crypto-provider-deYoVIxi.cjs';
3
- import { b as CryptoPayload } from './crypto-BUS06Qz-.cjs';
3
+ import { C as CryptoPayload } from './crypto-BK0Ile6V.cjs';
4
4
 
5
5
  type EncryptionAlgorithm = 'AES-GCM' | 'plaintext';
6
6
  interface EncryptedMessage {
@@ -1,6 +1,6 @@
1
1
  import { Logger } from '@bananalink-sdk/logger';
2
2
  import { a as CryptoKeyLike, C as CryptoProvider, P as ProviderKeyPair, b as CryptoProviderType, c as PlatformDetectionResult } from './crypto-provider-deYoVIxi.js';
3
- import { b as CryptoPayload } from './crypto-BUS06Qz-.js';
3
+ import { C as CryptoPayload } from './crypto-BK0Ile6V.js';
4
4
 
5
5
  type EncryptionAlgorithm = 'AES-GCM' | 'plaintext';
6
6
  interface EncryptedMessage {
@@ -1,7 +1,5 @@
1
- import { createCryptoProvider, arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString, randomBytes, detectPlatform } from './chunk-LELPCIE7.js';
2
- export { ComplianceCryptoProvider, CryptoCapabilityMissingError, CryptoContext, CryptoError, CryptoProviderUnavailableError, DefaultComplianceAuditor, arrayBufferToBase64, arrayBufferToString, base64ToArrayBuffer, createCryptoProvider, generateNonce, generateUUID, randomBytes, stringToArrayBuffer } from './chunk-LELPCIE7.js';
3
- import { getRegisteredCryptoProviders } from './chunk-TCVKC227.js';
4
- export { clearCryptoProviderRegistry, getCryptoProviderFactory, getRegisteredCryptoProviders, isCryptoProviderRegistered, registerCryptoProvider } from './chunk-TCVKC227.js';
1
+ import { createCryptoProvider, arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString, randomBytes, detectPlatform, getRegisteredCryptoProviders } from './chunk-OBJR2TL4.js';
2
+ export { ComplianceCryptoProvider, CryptoCapabilityMissingError, CryptoContext, CryptoError, CryptoProviderUnavailableError, DefaultComplianceAuditor, arrayBufferToBase64, arrayBufferToString, base64ToArrayBuffer, clearCryptoProviderRegistry, createCryptoProvider, generateNonce, generateUUID, getCryptoProviderFactory, getRegisteredCryptoProviders, isCryptoProviderRegistered, randomBytes, registerCryptoProvider, stringToArrayBuffer } from './chunk-OBJR2TL4.js';
5
3
  import { __name } from './chunk-WCQVDF3K.js';
6
4
 
7
5
  // src/crypto/session-security.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/crypto/session-security.ts","../src/crypto/payload-handler.ts","../src/crypto/diagnostics.ts"],"names":[],"mappings":"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","file":"crypto-export.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { SessionKeys, EncryptedMessage, CryptoConfig } from './types';\nimport { arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString } from './utils';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from './providers';\nimport { createCryptoProvider } from './providers';\n\nconst CRYPTO_CONFIG: CryptoConfig = {\n algorithm: 'AES-GCM',\n keyLength: 256,\n ivLength: 12,\n tagLength: 128, // tagLength is in bits for Web Crypto API (128 bits = 16 bytes)\n curve: 'P-256',\n};\n\nexport class SessionSecurity {\n private keyPair?: ProviderKeyPair;\n private sharedSecret?: CryptoKeyLike;\n private sessionId: string;\n private encryptionKey?: CryptoKeyLike; // For AES-GCM\n private provider: CryptoProvider;\n\n constructor(sessionId?: string, provider?: CryptoProvider, logger?: Logger) {\n this.provider = provider || createCryptoProvider(undefined, logger);\n this.sessionId = sessionId || this.generateSessionId();\n }\n\n /**\n * Get the crypto provider used by this session\n */\n getCryptoProvider(): CryptoProvider {\n return this.provider;\n }\n\n /**\n * Establish a new session with ephemeral key generation\n */\n static async establishSession(sessionId?: string, provider?: CryptoProvider, logger?: Logger): Promise<SessionSecurity> {\n const session = new SessionSecurity(sessionId, provider, logger);\n await session.generateKeyPair();\n return session;\n }\n\n /**\n * Generate ECDH key pair for this session\n */\n private async generateKeyPair(): Promise<void> {\n this.keyPair = await this.provider.generateKeyPair();\n }\n\n /**\n * Get the public key for sharing (base64 encoded)\n */\n async getPublicKey(): Promise<string> {\n if (!this.keyPair?.publicKey) {\n throw new Error('Key pair not generated. Call generateKeyPair() first.');\n }\n\n const exported = await this.provider.exportPublicKey(this.keyPair.publicKey);\n return arrayBufferToBase64(exported);\n }\n\n /**\n * Derive shared secret from peer's public key\n */\n async deriveSharedSecret(peerPublicKeyBase64: string): Promise<void> {\n if (!this.keyPair?.privateKey) {\n throw new Error('Key pair not generated');\n }\n\n const peerPublicKeyBuffer = base64ToArrayBuffer(peerPublicKeyBase64);\n const importedPeerKey = await this.provider.importPublicKey(peerPublicKeyBuffer);\n\n this.sharedSecret = await this.provider.deriveSharedSecret(this.keyPair.privateKey, importedPeerKey);\n }\n\n /**\n * Derives an encryption key from the shared secret using HKDF.\n * @param salt - A non-secret random value.\n * @param info - Context-specific information.\n */\n async deriveEncryptionKey(salt: ArrayBuffer, info: ArrayBuffer): Promise<void> {\n if (!this.sharedSecret) {\n throw new Error('Shared secret not derived yet.');\n }\n\n this.encryptionKey = await this.provider.deriveEncryptionKey(this.sharedSecret, salt, info);\n }\n\n /**\n * Encrypt a message using the derived session key\n */\n async encrypt(message: Record<string, unknown>): Promise<EncryptedMessage> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = this.provider.randomBytes(CRYPTO_CONFIG.ivLength);\n const plaintext = stringToArrayBuffer(JSON.stringify(message));\n\n const ciphertext = await this.provider.encrypt(this.encryptionKey, plaintext, iv);\n\n // Generate HMAC for authentication\n const dataToSign = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const macBuffer = await this.provider.generateHMAC(this.encryptionKey, dataToSign.buffer);\n\n return {\n iv: arrayBufferToBase64(iv),\n ciphertext: arrayBufferToBase64(ciphertext),\n mac: arrayBufferToBase64(macBuffer),\n };\n }\n\n /**\n * Decrypt a message using the derived session key\n */\n async decrypt(encryptedMessage: EncryptedMessage): Promise<Record<string, unknown>> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = base64ToArrayBuffer(encryptedMessage.iv);\n const ciphertext = base64ToArrayBuffer(encryptedMessage.ciphertext);\n const receivedMac = base64ToArrayBuffer(encryptedMessage.mac);\n\n // Verify HMAC first\n const dataToVerify = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const isValidMac = await this.provider.verifyHMAC(this.encryptionKey, dataToVerify.buffer, receivedMac);\n if (!isValidMac) {\n throw new Error('Message authentication failed');\n }\n\n // Decrypt the message\n const plaintextBuffer = await this.provider.decrypt(this.encryptionKey, ciphertext, iv);\n const plaintextString = arrayBufferToString(plaintextBuffer);\n return JSON.parse(plaintextString) as Record<string, unknown>;\n }\n\n /**\n * Get session information\n */\n async getSessionKeys(): Promise<SessionKeys> {\n if (!this.keyPair || !this.sharedSecret) {\n throw new Error('Session not properly initialized');\n }\n\n return {\n sessionId: this.sessionId,\n publicKey: await this.getPublicKey(),\n sharedSecret: this.sharedSecret, // We know it exists due to the check above\n };\n }\n\n /**\n * Generate a random session ID\n */\n private generateSessionId(): string {\n const sessionBytes = this.provider.randomBytes(16); // 128 bits\n return arrayBufferToBase64(sessionBytes);\n }\n\n /**\n * Get provider information\n */\n getProviderInfo(): { name: string; isAvailable: boolean } {\n return {\n name: this.provider.name,\n isAvailable: this.provider.isAvailable,\n };\n }\n\n /**\n * Check if session is ready for encryption/decryption\n */\n get isReady(): boolean {\n return !!(this.keyPair && this.sharedSecret && this.encryptionKey);\n }\n}\n","import type { CreatePayloadOptions } from './types';\nimport type { CryptoPayload } from '../types/crypto';\nimport { randomBytes, arrayBufferToBase64, base64ToArrayBuffer } from './utils';\n\n/**\n * Parses a raw uncompressed P-256 public key.\n * The key should be 65 bytes: [0x04, 32-byte X, 32-byte Y]\n */\nfunction parsePublicKey(publicKey: ArrayBuffer): { x: ArrayBuffer; y: ArrayBuffer } {\n if (publicKey.byteLength !== 65 || new Uint8Array(publicKey)[0] !== 4) {\n throw new Error('Invalid P-256 public key format');\n }\n const x = publicKey.slice(1, 33);\n const y = publicKey.slice(33, 65);\n return { x, y };\n}\n\nexport class CryptoPayloadHandler {\n static createPayload(options: CreatePayloadOptions): CryptoPayload {\n if (options.encAlgo === 'plaintext') {\n return {\n version: '1.0',\n encryption: {\n algorithm: 'plaintext',\n },\n parameters: {\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n };\n }\n\n if (options.encAlgo === 'AES-GCM') {\n const iv = randomBytes(12);\n const salt = randomBytes(32);\n const publicKeyRaw = base64ToArrayBuffer(options.publicKeyB64);\n const { x, y } = parsePublicKey(publicKeyRaw);\n\n return {\n version: '1.0',\n keyExchange: {\n algorithm: 'ECDH',\n namedCurve: 'P-256',\n },\n encryption: {\n algorithm: 'AES-GCM',\n keyLength: 256,\n tagLength: 128,\n },\n publicKey: {\n kty: 'EC',\n crv: 'P-256',\n x: arrayBufferToBase64(x),\n y: arrayBufferToBase64(y),\n use: 'enc',\n key_ops: ['deriveKey'],\n },\n parameters: {\n iv: arrayBufferToBase64(iv.buffer),\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n derivation: {\n algorithm: 'HKDF',\n hash: 'SHA-256',\n info: 'message-exchange-v1',\n salt: arrayBufferToBase64(salt.buffer),\n },\n };\n }\n\n // This part should be unreachable with TypeScript's type checking\n throw new Error('Invalid encryption algorithm specified.');\n }\n\n /**\n * Validate crypto payload format\n */\n static validatePayload(payload: CryptoPayload): boolean {\n try {\n if (payload.version !== '1.0') {\n return false;\n }\n\n if (!payload.parameters?.sessionId || !payload.parameters?.timestamp) {\n return false;\n }\n\n if (payload.encryption?.algorithm === 'AES-GCM') {\n return !!(payload.keyExchange && payload.publicKey && payload.derivation);\n }\n\n if (payload.encryption?.algorithm === 'plaintext') {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Crypto Provider Diagnostics\n *\n * Utilities for testing, benchmarking, and diagnosing crypto provider issues.\n * These tools help developers understand provider availability and performance.\n *\n * @example\n * ```typescript\n * // Test if a provider actually works\n * const result = await testProvider('webcrypto');\n * if (result.success) {\n * console.log('WebCrypto is working!');\n * } else {\n * console.error('WebCrypto failed:', result.error);\n * }\n *\n * // Get detailed environment diagnostics\n * const diag = await diagnoseEnvironment();\n * console.log(diag.toMarkdown());\n *\n * // Benchmark providers\n * const bench = await benchmarkProvider('webcrypto');\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms`);\n * ```\n */\n\nimport type { Logger } from '@bananalink-sdk/logger';\nimport type {\n CryptoProvider,\n CryptoProviderType,\n PlatformDetectionResult,\n} from '../types/crypto-provider';\nimport { getRegisteredCryptoProviders } from './providers';\nimport { detectPlatform } from './utils';\n\n/**\n * Result of testing a specific crypto operation\n */\nexport interface OperationTestResult {\n /** Operation name */\n operation: string;\n /** Whether the operation succeeded */\n success: boolean;\n /** Execution time in milliseconds */\n durationMs?: number;\n /** Error message if failed */\n error?: string;\n /** Additional details */\n details?: Record<string, unknown>;\n}\n\n/**\n * Result of testing a crypto provider\n */\nexport interface ProviderTestResult {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** Whether the provider is available */\n available: boolean;\n /** Overall success (all operations passed) */\n success: boolean;\n /** Individual operation test results */\n operations: OperationTestResult[];\n /** Total test duration in milliseconds */\n totalDurationMs: number;\n /** Error message if provider not available */\n unavailableReason?: string;\n}\n\n/**\n * Performance benchmark result for a provider\n */\nexport interface ProviderBenchmark {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** ECDH key generation benchmark */\n ecdh: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** Random bytes generation benchmark */\n randomBytes: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** AES-GCM encryption benchmark */\n aesGcm: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n}\n\n/**\n * Provider detection summary\n */\nexport interface ProviderDetection {\n /** WebCrypto provider available */\n webCrypto: boolean;\n /** Node.js crypto provider available */\n node: boolean;\n /** Noble provider available (pure JS fallback) */\n noble: boolean;\n /** QuickCrypto provider available (React Native) */\n quickCrypto: boolean;\n /** Recommended provider for this environment */\n recommended?: CryptoProviderType;\n /** Detailed capability information */\n capabilities: Record<CryptoProviderType, {\n available: boolean;\n tested: boolean;\n success: boolean;\n }>;\n /** Provider-specific recommendations */\n recommendations: string[];\n}\n\n/**\n * Comprehensive environment diagnostics\n */\nexport interface EnvironmentDiagnostics {\n /** Timestamp of diagnostics */\n timestamp: string;\n /** Platform detection information */\n platform: PlatformDetectionResult;\n /** Provider detection summary */\n detection: ProviderDetection;\n /** List of registered providers */\n registeredProviders: CryptoProviderType[];\n /** Provider test results */\n providerTests: ProviderTestResult[];\n /** Recommended provider (first successful test) */\n recommendedProvider?: CryptoProviderType;\n /** Warnings and recommendations */\n warnings: string[];\n /** Platform-specific recommendations */\n recommendations: string[];\n /** Convert to human-readable markdown */\n toMarkdown(): string;\n /** Convert to JSON string */\n toJSON(): string;\n}\n\n/**\n * Test a specific crypto provider with real operations\n *\n * @param providerType - The provider type to test\n * @param logger - Optional logger for debug output\n * @returns Test result with success status and operation details\n *\n * @example\n * ```typescript\n * const result = await testProvider('webcrypto');\n * if (!result.success) {\n * console.error('Provider test failed:', result);\n * result.operations.forEach(op => {\n * if (!op.success) {\n * console.error(` ${op.operation}: ${op.error}`);\n * }\n * });\n * }\n * ```\n */\nexport async function testProvider(\n providerType: CryptoProviderType,\n logger?: Logger\n): Promise<ProviderTestResult> {\n const startTime = performance.now();\n const operations: OperationTestResult[] = [];\n\n let provider: CryptoProvider;\n try {\n // Create the specific provider without fallback to test it directly\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n\n if (!provider.isAvailable) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: `Provider ${providerType} not available in this environment`,\n };\n }\n } catch (error) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: error instanceof Error ? error.message : String(error),\n };\n }\n\n // Test 1: Random bytes generation\n try {\n const opStart = performance.now();\n const bytes = provider.randomBytes(32);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'randomBytes',\n success: true,\n durationMs: duration,\n details: {\n bytesLength: bytes.byteLength,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'randomBytes',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 2: ECDH key pair generation\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'generateKeyPair',\n success: true,\n durationMs: duration,\n details: {\n publicKeyType: keyPair.publicKey.type,\n privateKeyType: keyPair.privateKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'generateKeyPair',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 3: Key export/import\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const publicKeyData = await provider.exportPublicKey(keyPair.publicKey);\n const importedPublicKey = await provider.importPublicKey(publicKeyData);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'exportImportKey',\n success: true,\n durationMs: duration,\n details: {\n exportedKeySize: publicKeyData.byteLength,\n importedKeyType: importedPublicKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'exportImportKey',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 4: ECDH key agreement\n try {\n const opStart = performance.now();\n const keyPair1 = await provider.generateKeyPair();\n const keyPair2 = await provider.generateKeyPair();\n // Derive shared secrets from both sides (just verify they can be derived)\n await provider.deriveSharedSecret(keyPair1.privateKey, keyPair2.publicKey);\n await provider.deriveSharedSecret(keyPair2.privateKey, keyPair1.publicKey);\n const duration = performance.now() - opStart;\n\n // Both shared secrets were derived successfully\n operations.push({\n operation: 'deriveSharedSecret',\n success: true,\n durationMs: duration,\n details: {\n sharedSecretsGenerated: 2,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'deriveSharedSecret',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 5: AES-GCM encryption/decryption\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n\n const plaintext = new TextEncoder().encode('Hello, World!');\n const iv = provider.randomBytes(12);\n const ciphertext = await provider.encrypt(encryptionKey, plaintext, iv);\n const decrypted = await provider.decrypt(encryptionKey, ciphertext, iv);\n const decryptedText = new TextDecoder().decode(decrypted);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: decryptedText === 'Hello, World!',\n durationMs: duration,\n details: {\n plaintextSize: plaintext.byteLength,\n ciphertextSize: ciphertext.byteLength,\n decryptedCorrectly: decryptedText === 'Hello, World!',\n },\n });\n } catch (error) {\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = performance.now() - startTime;\n const allSuccess = operations.every(op => op.success);\n\n return {\n provider: providerType,\n available: true,\n success: allSuccess,\n operations,\n totalDurationMs: totalDuration,\n };\n}\n\n/**\n * Benchmark a crypto provider's performance\n *\n * @param providerType - The provider type to benchmark\n * @param iterations - Number of iterations for each operation (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Benchmark results with timing statistics\n *\n * @example\n * ```typescript\n * const bench = await benchmarkProvider('noble', 20);\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms (min: ${bench.ecdh.minMs}ms, max: ${bench.ecdh.maxMs}ms)`);\n * console.log(`Random: ${bench.randomBytes.avgMs}ms`);\n * console.log(`AES-GCM: ${bench.aesGcm.avgMs}ms`);\n * ```\n */\nexport async function benchmarkProvider(\n providerType: CryptoProviderType,\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark> {\n // Create the specific provider without fallback to test it directly\n let provider: CryptoProvider;\n try {\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n } catch (error) {\n throw new Error(\n `Provider ${providerType} failed to initialize: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (!provider.isAvailable) {\n throw new Error(`Provider ${providerType} not available for benchmarking`);\n }\n\n // Benchmark ECDH key generation\n const ecdhTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.generateKeyPair();\n ecdhTimes.push(performance.now() - start);\n }\n\n // Benchmark random bytes\n const randomBytesTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n provider.randomBytes(32);\n randomBytesTimes.push(performance.now() - start);\n }\n\n // Benchmark AES-GCM\n const aesGcmTimes: number[] = [];\n // Prepare keys once\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n const plaintext = provider.randomBytes(1024); // 1KB test data\n const iv = provider.randomBytes(12);\n\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.encrypt(encryptionKey, plaintext, iv);\n aesGcmTimes.push(performance.now() - start);\n }\n\n return {\n provider: providerType,\n ecdh: {\n avgMs: ecdhTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...ecdhTimes),\n maxMs: Math.max(...ecdhTimes),\n iterations,\n },\n randomBytes: {\n avgMs: randomBytesTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...randomBytesTimes),\n maxMs: Math.max(...randomBytesTimes),\n iterations,\n },\n aesGcm: {\n avgMs: aesGcmTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...aesGcmTimes),\n maxMs: Math.max(...aesGcmTimes),\n iterations,\n },\n };\n}\n\n/**\n * Get comprehensive environment diagnostics\n *\n * @param logger - Optional logger for debug output\n * @returns Complete diagnostics including registered providers, test results, and recommendations\n *\n * @example\n * ```typescript\n * const diag = await diagnoseEnvironment();\n *\n * // Print markdown report\n * console.log(diag.toMarkdown());\n *\n * // Or access data programmatically\n * console.log('Registered:', diag.registeredProviders);\n * console.log('Recommended:', diag.recommendedProvider);\n * diag.providerTests.forEach(test => {\n * console.log(`${test.provider}: ${test.success ? '✅' : '❌'}`);\n * });\n * ```\n */\nexport async function diagnoseEnvironment(logger?: Logger): Promise<EnvironmentDiagnostics> {\n const platform = detectPlatform();\n const registeredProviders = getRegisteredCryptoProviders();\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n // Test all registered providers\n const providerTests = await Promise.all(\n registeredProviders.map(type => testProvider(type, logger))\n );\n\n // Find recommended provider (first successful test)\n const recommendedProvider = providerTests.find(test => test.success && test.available)?.provider;\n\n // Build provider detection summary\n const capabilities: Record<CryptoProviderType, { available: boolean; tested: boolean; success: boolean }> = {\n webcrypto: { available: false, tested: false, success: false },\n node: { available: false, tested: false, success: false },\n noble: { available: false, tested: false, success: false },\n quickcrypto: { available: false, tested: false, success: false },\n };\n\n providerTests.forEach(test => {\n capabilities[test.provider] = {\n available: test.available,\n tested: true,\n success: test.success,\n };\n });\n\n const detectionRecommendations: string[] = [];\n if (!capabilities.noble.success) {\n detectionRecommendations.push(\"Noble provider should always work as a fallback\");\n }\n if (platform.isNode && !capabilities.node.tested) {\n detectionRecommendations.push(\"Consider testing 'node' provider for optimal Node.js performance\");\n }\n if (platform.isBrowser && !capabilities.webcrypto.tested) {\n detectionRecommendations.push(\"Consider testing 'webcrypto' provider for browser environments\");\n }\n\n const detection: ProviderDetection = {\n webCrypto: capabilities.webcrypto.available && capabilities.webcrypto.success,\n node: capabilities.node.available && capabilities.node.success,\n noble: capabilities.noble.available && capabilities.noble.success,\n quickCrypto: capabilities.quickcrypto.available && capabilities.quickcrypto.success,\n recommended: recommendedProvider,\n capabilities,\n recommendations: detectionRecommendations,\n };\n\n // Generate warnings\n providerTests.forEach(test => {\n if (!test.success && test.available) {\n warnings.push(`${test.provider} provider registered but failed operation tests`);\n }\n });\n\n if (registeredProviders.length === 0) {\n warnings.push('No crypto providers registered. Import at least one provider.');\n }\n\n if (!recommendedProvider) {\n warnings.push('No working crypto provider found. All registered providers failed tests.');\n }\n\n // Generate platform-specific recommendations\n if (platform.isNode) {\n if (!registeredProviders.includes('node')) {\n recommendations.push(\"Consider importing 'node' provider for optimal Node.js performance\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/node' for Node.js\");\n }\n } else if (platform.isBrowser) {\n if (!registeredProviders.includes('webcrypto')) {\n recommendations.push(\"Consider importing 'webcrypto' provider for browsers\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/webcrypto' for browsers\");\n }\n } else if (platform.isReactNative) {\n if (!registeredProviders.includes('quickcrypto')) {\n recommendations.push(\"Consider importing 'quickcrypto' provider for React Native\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/quickcrypto' for React Native\");\n }\n }\n\n // Universal recommendation\n if (!recommendedProvider || registeredProviders.length === 0) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/noble' as a universal fallback\");\n }\n\n const diagnostics: EnvironmentDiagnostics = {\n timestamp: new Date().toISOString(),\n platform,\n detection,\n registeredProviders,\n providerTests,\n recommendedProvider,\n warnings,\n recommendations,\n\n toMarkdown(): string {\n let md = '# Crypto Environment Diagnostics\\n\\n';\n md += `**Generated:** ${this.timestamp}\\n\\n`;\n\n // Platform section\n md += '## Platform\\n\\n';\n const platformType = this.platform.isNode\n ? 'Node.js'\n : this.platform.isBrowser\n ? 'Browser'\n : this.platform.isReactNative\n ? 'React Native'\n : 'Unknown';\n md += `- **Type:** ${platformType}\\n`;\n if (this.platform.platform) {\n md += `- **OS:** ${this.platform.platform}\\n`;\n }\n if (this.platform.userAgent) {\n // Truncate long user agents\n const ua = this.platform.userAgent.length > 80\n ? `${this.platform.userAgent.substring(0, 80)}...`\n : this.platform.userAgent;\n md += `- **User Agent:** ${ua}\\n`;\n }\n md += '\\n';\n\n // Provider Detection section\n md += '## Provider Detection\\n\\n';\n md += `- **WebCrypto:** ${this.detection.webCrypto ? '✅' : '❌'}\\n`;\n md += `- **Node.js Crypto:** ${this.detection.node ? '✅' : '❌'}\\n`;\n md += `- **Noble (Pure JS):** ${this.detection.noble ? '✅' : '❌'}\\n`;\n md += `- **QuickCrypto (RN):** ${this.detection.quickCrypto ? '✅' : '❌'}\\n`;\n if (this.detection.recommended) {\n md += `- **Recommended:** ${this.detection.recommended}\\n`;\n }\n md += '\\n';\n\n // Capabilities section\n md += '## Capabilities\\n\\n';\n Object.entries(this.detection.capabilities).forEach(([provider, capability]) => {\n const status = capability.tested\n ? capability.success ? '✅ Available' : '❌ Failed'\n : '⚪ Not Tested';\n md += `- **${provider}:** ${status}\\n`;\n });\n md += '\\n';\n\n // Registered providers section\n md += '## Registered Providers\\n\\n';\n if (this.registeredProviders.length === 0) {\n md += 'No providers registered.\\n\\n';\n } else {\n this.registeredProviders.forEach(provider => {\n md += `- ${provider}${provider === this.recommendedProvider ? ' (recommended)' : ''}\\n`;\n });\n md += '\\n';\n }\n\n // Provider tests section\n md += '## Provider Tests\\n\\n';\n if (this.providerTests.length === 0) {\n md += 'No tests run (no providers registered).\\n\\n';\n } else {\n this.providerTests.forEach(test => {\n md += `### ${test.provider}\\n\\n`;\n md += `- **Available:** ${test.available ? '✅' : '❌'}\\n`;\n if (!test.available) {\n md += `- **Reason:** ${test.unavailableReason}\\n`;\n } else {\n md += `- **Overall Success:** ${test.success ? '✅' : '❌'}\\n`;\n md += `- **Total Duration:** ${test.totalDurationMs.toFixed(2)}ms\\n\\n`;\n md += '**Operations:**\\n\\n';\n test.operations.forEach(op => {\n md += `- **${op.operation}:** ${op.success ? '✅' : '❌'}`;\n if (op.durationMs) md += ` (${op.durationMs.toFixed(2)}ms)`;\n if (op.error) md += ` - ${op.error}`;\n md += '\\n';\n });\n }\n md += '\\n';\n });\n }\n\n // Recommendations section\n md += '## Recommendations\\n\\n';\n if (this.recommendedProvider) {\n md += `- Recommended: Use '${this.recommendedProvider}' provider (passed all tests)\\n`;\n }\n if (this.recommendations.length > 0) {\n this.recommendations.forEach(rec => {\n md += `- ${rec}\\n`;\n });\n }\n md += '\\n';\n\n // Warnings section\n if (this.warnings.length > 0) {\n md += '## Warnings\\n\\n';\n this.warnings.forEach(warning => {\n md += `⚠️ ${warning}\\n\\n`;\n });\n }\n\n return md;\n },\n\n toJSON(): string {\n return JSON.stringify(\n {\n timestamp: this.timestamp,\n platform: this.platform,\n detection: this.detection,\n registeredProviders: this.registeredProviders,\n providerTests: this.providerTests,\n recommendedProvider: this.recommendedProvider,\n warnings: this.warnings,\n recommendations: this.recommendations,\n },\n null,\n 2\n );\n },\n };\n\n return diagnostics;\n}\n\n/**\n * Compare performance of multiple providers\n *\n * @param providers - Array of provider types to compare\n * @param iterations - Number of iterations for each benchmark (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Array of benchmark results for comparison\n *\n * @example\n * ```typescript\n * const results = await compareProviders(['webcrypto', 'noble'], 20);\n * results.forEach(result => {\n * console.log(`\\n${result.provider}:`);\n * console.log(` ECDH: ${result.ecdh.avgMs.toFixed(2)}ms`);\n * console.log(` Random: ${result.randomBytes.avgMs.toFixed(2)}ms`);\n * console.log(` AES: ${result.aesGcm.avgMs.toFixed(2)}ms`);\n * });\n * ```\n */\nexport async function compareProviders(\n providers: CryptoProviderType[],\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark[]> {\n const results: ProviderBenchmark[] = [];\n\n for (const provider of providers) {\n try {\n const benchmark = await benchmarkProvider(provider, iterations, logger);\n results.push(benchmark);\n } catch (error) {\n logger?.warn(`Failed to benchmark ${provider}:`, {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n }\n }\n\n return results;\n}\n"]}
1
+ {"version":3,"sources":["../src/crypto/session-security.ts","../src/crypto/payload-handler.ts","../src/crypto/diagnostics.ts"],"names":[],"mappings":"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","file":"crypto-export.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { SessionKeys, EncryptedMessage, CryptoConfig } from './types';\nimport { arrayBufferToBase64, base64ToArrayBuffer, stringToArrayBuffer, arrayBufferToString } from './utils';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from './providers';\nimport { createCryptoProvider } from './providers';\n\nconst CRYPTO_CONFIG: CryptoConfig = {\n algorithm: 'AES-GCM',\n keyLength: 256,\n ivLength: 12,\n tagLength: 128, // tagLength is in bits for Web Crypto API (128 bits = 16 bytes)\n curve: 'P-256',\n};\n\nexport class SessionSecurity {\n private keyPair?: ProviderKeyPair;\n private sharedSecret?: CryptoKeyLike;\n private sessionId: string;\n private encryptionKey?: CryptoKeyLike; // For AES-GCM\n private provider: CryptoProvider;\n\n constructor(sessionId?: string, provider?: CryptoProvider, logger?: Logger) {\n this.provider = provider || createCryptoProvider(undefined, logger);\n this.sessionId = sessionId || this.generateSessionId();\n }\n\n /**\n * Get the crypto provider used by this session\n */\n getCryptoProvider(): CryptoProvider {\n return this.provider;\n }\n\n /**\n * Establish a new session with ephemeral key generation\n */\n static async establishSession(sessionId?: string, provider?: CryptoProvider, logger?: Logger): Promise<SessionSecurity> {\n const session = new SessionSecurity(sessionId, provider, logger);\n await session.generateKeyPair();\n return session;\n }\n\n /**\n * Generate ECDH key pair for this session\n */\n private async generateKeyPair(): Promise<void> {\n this.keyPair = await this.provider.generateKeyPair();\n }\n\n /**\n * Get the public key for sharing (base64 encoded)\n */\n async getPublicKey(): Promise<string> {\n if (!this.keyPair?.publicKey) {\n throw new Error('Key pair not generated. Call generateKeyPair() first.');\n }\n\n const exported = await this.provider.exportPublicKey(this.keyPair.publicKey);\n return arrayBufferToBase64(exported);\n }\n\n /**\n * Derive shared secret from peer's public key\n */\n async deriveSharedSecret(peerPublicKeyBase64: string): Promise<void> {\n if (!this.keyPair?.privateKey) {\n throw new Error('Key pair not generated');\n }\n\n const peerPublicKeyBuffer = base64ToArrayBuffer(peerPublicKeyBase64);\n const importedPeerKey = await this.provider.importPublicKey(peerPublicKeyBuffer);\n\n this.sharedSecret = await this.provider.deriveSharedSecret(this.keyPair.privateKey, importedPeerKey);\n }\n\n /**\n * Derives an encryption key from the shared secret using HKDF.\n * @param salt - A non-secret random value.\n * @param info - Context-specific information.\n */\n async deriveEncryptionKey(salt: ArrayBuffer, info: ArrayBuffer): Promise<void> {\n if (!this.sharedSecret) {\n throw new Error('Shared secret not derived yet.');\n }\n\n this.encryptionKey = await this.provider.deriveEncryptionKey(this.sharedSecret, salt, info);\n }\n\n /**\n * Encrypt a message using the derived session key\n */\n async encrypt(message: Record<string, unknown>): Promise<EncryptedMessage> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = this.provider.randomBytes(CRYPTO_CONFIG.ivLength);\n const plaintext = stringToArrayBuffer(JSON.stringify(message));\n\n const ciphertext = await this.provider.encrypt(this.encryptionKey, plaintext, iv);\n\n // Generate HMAC for authentication\n const dataToSign = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const macBuffer = await this.provider.generateHMAC(this.encryptionKey, dataToSign.buffer);\n\n return {\n iv: arrayBufferToBase64(iv),\n ciphertext: arrayBufferToBase64(ciphertext),\n mac: arrayBufferToBase64(macBuffer),\n };\n }\n\n /**\n * Decrypt a message using the derived session key\n */\n async decrypt(encryptedMessage: EncryptedMessage): Promise<Record<string, unknown>> {\n if (!this.encryptionKey) {\n throw new Error('Encryption key not derived');\n }\n\n const iv = base64ToArrayBuffer(encryptedMessage.iv);\n const ciphertext = base64ToArrayBuffer(encryptedMessage.ciphertext);\n const receivedMac = base64ToArrayBuffer(encryptedMessage.mac);\n\n // Verify HMAC first\n const dataToVerify = new Uint8Array([\n ...new Uint8Array(iv),\n ...new Uint8Array(ciphertext)\n ]);\n\n const isValidMac = await this.provider.verifyHMAC(this.encryptionKey, dataToVerify.buffer, receivedMac);\n if (!isValidMac) {\n throw new Error('Message authentication failed');\n }\n\n // Decrypt the message\n const plaintextBuffer = await this.provider.decrypt(this.encryptionKey, ciphertext, iv);\n const plaintextString = arrayBufferToString(plaintextBuffer);\n return JSON.parse(plaintextString) as Record<string, unknown>;\n }\n\n /**\n * Get session information\n */\n async getSessionKeys(): Promise<SessionKeys> {\n if (!this.keyPair || !this.sharedSecret) {\n throw new Error('Session not properly initialized');\n }\n\n return {\n sessionId: this.sessionId,\n publicKey: await this.getPublicKey(),\n sharedSecret: this.sharedSecret, // We know it exists due to the check above\n };\n }\n\n /**\n * Generate a random session ID\n */\n private generateSessionId(): string {\n const sessionBytes = this.provider.randomBytes(16); // 128 bits\n return arrayBufferToBase64(sessionBytes);\n }\n\n /**\n * Get provider information\n */\n getProviderInfo(): { name: string; isAvailable: boolean } {\n return {\n name: this.provider.name,\n isAvailable: this.provider.isAvailable,\n };\n }\n\n /**\n * Check if session is ready for encryption/decryption\n */\n get isReady(): boolean {\n return !!(this.keyPair && this.sharedSecret && this.encryptionKey);\n }\n}\n","import type { CreatePayloadOptions } from './types';\nimport type { CryptoPayload } from '../types/crypto';\nimport { randomBytes, arrayBufferToBase64, base64ToArrayBuffer } from './utils';\n\n/**\n * Parses a raw uncompressed P-256 public key.\n * The key should be 65 bytes: [0x04, 32-byte X, 32-byte Y]\n */\nfunction parsePublicKey(publicKey: ArrayBuffer): { x: ArrayBuffer; y: ArrayBuffer } {\n if (publicKey.byteLength !== 65 || new Uint8Array(publicKey)[0] !== 4) {\n throw new Error('Invalid P-256 public key format');\n }\n const x = publicKey.slice(1, 33);\n const y = publicKey.slice(33, 65);\n return { x, y };\n}\n\nexport class CryptoPayloadHandler {\n static createPayload(options: CreatePayloadOptions): CryptoPayload {\n if (options.encAlgo === 'plaintext') {\n return {\n version: '1.0',\n encryption: {\n algorithm: 'plaintext',\n },\n parameters: {\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n };\n }\n\n if (options.encAlgo === 'AES-GCM') {\n const iv = randomBytes(12);\n const salt = randomBytes(32);\n const publicKeyRaw = base64ToArrayBuffer(options.publicKeyB64);\n const { x, y } = parsePublicKey(publicKeyRaw);\n\n return {\n version: '1.0',\n keyExchange: {\n algorithm: 'ECDH',\n namedCurve: 'P-256',\n },\n encryption: {\n algorithm: 'AES-GCM',\n keyLength: 256,\n tagLength: 128,\n },\n publicKey: {\n kty: 'EC',\n crv: 'P-256',\n x: arrayBufferToBase64(x),\n y: arrayBufferToBase64(y),\n use: 'enc',\n key_ops: ['deriveKey'],\n },\n parameters: {\n iv: arrayBufferToBase64(iv.buffer),\n timestamp: new Date().toISOString(),\n sessionId: options.sessionId,\n },\n derivation: {\n algorithm: 'HKDF',\n hash: 'SHA-256',\n info: 'message-exchange-v1',\n salt: arrayBufferToBase64(salt.buffer),\n },\n };\n }\n\n // This part should be unreachable with TypeScript's type checking\n throw new Error('Invalid encryption algorithm specified.');\n }\n\n /**\n * Validate crypto payload format\n */\n static validatePayload(payload: CryptoPayload): boolean {\n try {\n if (payload.version !== '1.0') {\n return false;\n }\n\n if (!payload.parameters?.sessionId || !payload.parameters?.timestamp) {\n return false;\n }\n\n if (payload.encryption?.algorithm === 'AES-GCM') {\n return !!(payload.keyExchange && payload.publicKey && payload.derivation);\n }\n\n if (payload.encryption?.algorithm === 'plaintext') {\n return true;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * Crypto Provider Diagnostics\n *\n * Utilities for testing, benchmarking, and diagnosing crypto provider issues.\n * These tools help developers understand provider availability and performance.\n *\n * @example\n * ```typescript\n * // Test if a provider actually works\n * const result = await testProvider('webcrypto');\n * if (result.success) {\n * console.log('WebCrypto is working!');\n * } else {\n * console.error('WebCrypto failed:', result.error);\n * }\n *\n * // Get detailed environment diagnostics\n * const diag = await diagnoseEnvironment();\n * console.log(diag.toMarkdown());\n *\n * // Benchmark providers\n * const bench = await benchmarkProvider('webcrypto');\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms`);\n * ```\n */\n\nimport type { Logger } from '@bananalink-sdk/logger';\nimport type {\n CryptoProvider,\n CryptoProviderType,\n PlatformDetectionResult,\n} from '../types/crypto-provider';\nimport { getRegisteredCryptoProviders } from './providers';\nimport { detectPlatform } from './utils';\n\n/**\n * Result of testing a specific crypto operation\n */\nexport interface OperationTestResult {\n /** Operation name */\n operation: string;\n /** Whether the operation succeeded */\n success: boolean;\n /** Execution time in milliseconds */\n durationMs?: number;\n /** Error message if failed */\n error?: string;\n /** Additional details */\n details?: Record<string, unknown>;\n}\n\n/**\n * Result of testing a crypto provider\n */\nexport interface ProviderTestResult {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** Whether the provider is available */\n available: boolean;\n /** Overall success (all operations passed) */\n success: boolean;\n /** Individual operation test results */\n operations: OperationTestResult[];\n /** Total test duration in milliseconds */\n totalDurationMs: number;\n /** Error message if provider not available */\n unavailableReason?: string;\n}\n\n/**\n * Performance benchmark result for a provider\n */\nexport interface ProviderBenchmark {\n /** Provider type tested */\n provider: CryptoProviderType;\n /** ECDH key generation benchmark */\n ecdh: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** Random bytes generation benchmark */\n randomBytes: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n /** AES-GCM encryption benchmark */\n aesGcm: {\n /** Average time in milliseconds */\n avgMs: number;\n /** Minimum time in milliseconds */\n minMs: number;\n /** Maximum time in milliseconds */\n maxMs: number;\n /** Number of iterations */\n iterations: number;\n };\n}\n\n/**\n * Provider detection summary\n */\nexport interface ProviderDetection {\n /** WebCrypto provider available */\n webCrypto: boolean;\n /** Node.js crypto provider available */\n node: boolean;\n /** Noble provider available (pure JS fallback) */\n noble: boolean;\n /** QuickCrypto provider available (React Native) */\n quickCrypto: boolean;\n /** Recommended provider for this environment */\n recommended?: CryptoProviderType;\n /** Detailed capability information */\n capabilities: Record<CryptoProviderType, {\n available: boolean;\n tested: boolean;\n success: boolean;\n }>;\n /** Provider-specific recommendations */\n recommendations: string[];\n}\n\n/**\n * Comprehensive environment diagnostics\n */\nexport interface EnvironmentDiagnostics {\n /** Timestamp of diagnostics */\n timestamp: string;\n /** Platform detection information */\n platform: PlatformDetectionResult;\n /** Provider detection summary */\n detection: ProviderDetection;\n /** List of registered providers */\n registeredProviders: CryptoProviderType[];\n /** Provider test results */\n providerTests: ProviderTestResult[];\n /** Recommended provider (first successful test) */\n recommendedProvider?: CryptoProviderType;\n /** Warnings and recommendations */\n warnings: string[];\n /** Platform-specific recommendations */\n recommendations: string[];\n /** Convert to human-readable markdown */\n toMarkdown(): string;\n /** Convert to JSON string */\n toJSON(): string;\n}\n\n/**\n * Test a specific crypto provider with real operations\n *\n * @param providerType - The provider type to test\n * @param logger - Optional logger for debug output\n * @returns Test result with success status and operation details\n *\n * @example\n * ```typescript\n * const result = await testProvider('webcrypto');\n * if (!result.success) {\n * console.error('Provider test failed:', result);\n * result.operations.forEach(op => {\n * if (!op.success) {\n * console.error(` ${op.operation}: ${op.error}`);\n * }\n * });\n * }\n * ```\n */\nexport async function testProvider(\n providerType: CryptoProviderType,\n logger?: Logger\n): Promise<ProviderTestResult> {\n const startTime = performance.now();\n const operations: OperationTestResult[] = [];\n\n let provider: CryptoProvider;\n try {\n // Create the specific provider without fallback to test it directly\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n\n if (!provider.isAvailable) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: `Provider ${providerType} not available in this environment`,\n };\n }\n } catch (error) {\n return {\n provider: providerType,\n available: false,\n success: false,\n operations: [],\n totalDurationMs: performance.now() - startTime,\n unavailableReason: error instanceof Error ? error.message : String(error),\n };\n }\n\n // Test 1: Random bytes generation\n try {\n const opStart = performance.now();\n const bytes = provider.randomBytes(32);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'randomBytes',\n success: true,\n durationMs: duration,\n details: {\n bytesLength: bytes.byteLength,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'randomBytes',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 2: ECDH key pair generation\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'generateKeyPair',\n success: true,\n durationMs: duration,\n details: {\n publicKeyType: keyPair.publicKey.type,\n privateKeyType: keyPair.privateKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'generateKeyPair',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 3: Key export/import\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const publicKeyData = await provider.exportPublicKey(keyPair.publicKey);\n const importedPublicKey = await provider.importPublicKey(publicKeyData);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'exportImportKey',\n success: true,\n durationMs: duration,\n details: {\n exportedKeySize: publicKeyData.byteLength,\n importedKeyType: importedPublicKey.type,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'exportImportKey',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 4: ECDH key agreement\n try {\n const opStart = performance.now();\n const keyPair1 = await provider.generateKeyPair();\n const keyPair2 = await provider.generateKeyPair();\n // Derive shared secrets from both sides (just verify they can be derived)\n await provider.deriveSharedSecret(keyPair1.privateKey, keyPair2.publicKey);\n await provider.deriveSharedSecret(keyPair2.privateKey, keyPair1.publicKey);\n const duration = performance.now() - opStart;\n\n // Both shared secrets were derived successfully\n operations.push({\n operation: 'deriveSharedSecret',\n success: true,\n durationMs: duration,\n details: {\n sharedSecretsGenerated: 2,\n },\n });\n } catch (error) {\n operations.push({\n operation: 'deriveSharedSecret',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n // Test 5: AES-GCM encryption/decryption\n try {\n const opStart = performance.now();\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n\n const plaintext = new TextEncoder().encode('Hello, World!');\n const iv = provider.randomBytes(12);\n const ciphertext = await provider.encrypt(encryptionKey, plaintext, iv);\n const decrypted = await provider.decrypt(encryptionKey, ciphertext, iv);\n const decryptedText = new TextDecoder().decode(decrypted);\n const duration = performance.now() - opStart;\n\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: decryptedText === 'Hello, World!',\n durationMs: duration,\n details: {\n plaintextSize: plaintext.byteLength,\n ciphertextSize: ciphertext.byteLength,\n decryptedCorrectly: decryptedText === 'Hello, World!',\n },\n });\n } catch (error) {\n operations.push({\n operation: 'aesGcmEncryptDecrypt',\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n const totalDuration = performance.now() - startTime;\n const allSuccess = operations.every(op => op.success);\n\n return {\n provider: providerType,\n available: true,\n success: allSuccess,\n operations,\n totalDurationMs: totalDuration,\n };\n}\n\n/**\n * Benchmark a crypto provider's performance\n *\n * @param providerType - The provider type to benchmark\n * @param iterations - Number of iterations for each operation (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Benchmark results with timing statistics\n *\n * @example\n * ```typescript\n * const bench = await benchmarkProvider('noble', 20);\n * console.log(`ECDH: ${bench.ecdh.avgMs}ms (min: ${bench.ecdh.minMs}ms, max: ${bench.ecdh.maxMs}ms)`);\n * console.log(`Random: ${bench.randomBytes.avgMs}ms`);\n * console.log(`AES-GCM: ${bench.aesGcm.avgMs}ms`);\n * ```\n */\nexport async function benchmarkProvider(\n providerType: CryptoProviderType,\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark> {\n // Create the specific provider without fallback to test it directly\n let provider: CryptoProvider;\n try {\n switch (providerType) {\n case 'webcrypto':\n provider = new (await import('./providers/webcrypto-provider')).WebCryptoProvider();\n break;\n case 'noble':\n provider = new (await import('./providers/noble-provider')).NobleCryptoProvider(logger);\n break;\n case 'node':\n provider = new (await import('./providers/node-provider')).NodeCryptoProvider(logger);\n break;\n case 'quickcrypto':\n provider = new (await import('./providers/quickcrypto-provider')).QuickCryptoProvider(logger);\n break;\n default:\n throw new Error(`Unknown provider type: ${String(providerType)}`);\n }\n } catch (error) {\n throw new Error(\n `Provider ${providerType} failed to initialize: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (!provider.isAvailable) {\n throw new Error(`Provider ${providerType} not available for benchmarking`);\n }\n\n // Benchmark ECDH key generation\n const ecdhTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.generateKeyPair();\n ecdhTimes.push(performance.now() - start);\n }\n\n // Benchmark random bytes\n const randomBytesTimes: number[] = [];\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n provider.randomBytes(32);\n randomBytesTimes.push(performance.now() - start);\n }\n\n // Benchmark AES-GCM\n const aesGcmTimes: number[] = [];\n // Prepare keys once\n const keyPair = await provider.generateKeyPair();\n const sharedSecret = await provider.deriveSharedSecret(keyPair.privateKey, keyPair.publicKey);\n const salt = provider.randomBytes(32);\n const info = provider.randomBytes(32);\n const encryptionKey = await provider.deriveEncryptionKey(sharedSecret, salt, info);\n const plaintext = provider.randomBytes(1024); // 1KB test data\n const iv = provider.randomBytes(12);\n\n for (let i = 0; i < iterations; i++) {\n const start = performance.now();\n await provider.encrypt(encryptionKey, plaintext, iv);\n aesGcmTimes.push(performance.now() - start);\n }\n\n return {\n provider: providerType,\n ecdh: {\n avgMs: ecdhTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...ecdhTimes),\n maxMs: Math.max(...ecdhTimes),\n iterations,\n },\n randomBytes: {\n avgMs: randomBytesTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...randomBytesTimes),\n maxMs: Math.max(...randomBytesTimes),\n iterations,\n },\n aesGcm: {\n avgMs: aesGcmTimes.reduce((a, b) => a + b, 0) / iterations,\n minMs: Math.min(...aesGcmTimes),\n maxMs: Math.max(...aesGcmTimes),\n iterations,\n },\n };\n}\n\n/**\n * Get comprehensive environment diagnostics\n *\n * @param logger - Optional logger for debug output\n * @returns Complete diagnostics including registered providers, test results, and recommendations\n *\n * @example\n * ```typescript\n * const diag = await diagnoseEnvironment();\n *\n * // Print markdown report\n * console.log(diag.toMarkdown());\n *\n * // Or access data programmatically\n * console.log('Registered:', diag.registeredProviders);\n * console.log('Recommended:', diag.recommendedProvider);\n * diag.providerTests.forEach(test => {\n * console.log(`${test.provider}: ${test.success ? '✅' : '❌'}`);\n * });\n * ```\n */\nexport async function diagnoseEnvironment(logger?: Logger): Promise<EnvironmentDiagnostics> {\n const platform = detectPlatform();\n const registeredProviders = getRegisteredCryptoProviders();\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n // Test all registered providers\n const providerTests = await Promise.all(\n registeredProviders.map(type => testProvider(type, logger))\n );\n\n // Find recommended provider (first successful test)\n const recommendedProvider = providerTests.find(test => test.success && test.available)?.provider;\n\n // Build provider detection summary\n const capabilities: Record<CryptoProviderType, { available: boolean; tested: boolean; success: boolean }> = {\n webcrypto: { available: false, tested: false, success: false },\n node: { available: false, tested: false, success: false },\n noble: { available: false, tested: false, success: false },\n quickcrypto: { available: false, tested: false, success: false },\n };\n\n providerTests.forEach(test => {\n capabilities[test.provider] = {\n available: test.available,\n tested: true,\n success: test.success,\n };\n });\n\n const detectionRecommendations: string[] = [];\n if (!capabilities.noble.success) {\n detectionRecommendations.push(\"Noble provider should always work as a fallback\");\n }\n if (platform.isNode && !capabilities.node.tested) {\n detectionRecommendations.push(\"Consider testing 'node' provider for optimal Node.js performance\");\n }\n if (platform.isBrowser && !capabilities.webcrypto.tested) {\n detectionRecommendations.push(\"Consider testing 'webcrypto' provider for browser environments\");\n }\n\n const detection: ProviderDetection = {\n webCrypto: capabilities.webcrypto.available && capabilities.webcrypto.success,\n node: capabilities.node.available && capabilities.node.success,\n noble: capabilities.noble.available && capabilities.noble.success,\n quickCrypto: capabilities.quickcrypto.available && capabilities.quickcrypto.success,\n recommended: recommendedProvider,\n capabilities,\n recommendations: detectionRecommendations,\n };\n\n // Generate warnings\n providerTests.forEach(test => {\n if (!test.success && test.available) {\n warnings.push(`${test.provider} provider registered but failed operation tests`);\n }\n });\n\n if (registeredProviders.length === 0) {\n warnings.push('No crypto providers registered. Import at least one provider.');\n }\n\n if (!recommendedProvider) {\n warnings.push('No working crypto provider found. All registered providers failed tests.');\n }\n\n // Generate platform-specific recommendations\n if (platform.isNode) {\n if (!registeredProviders.includes('node')) {\n recommendations.push(\"Consider importing 'node' provider for optimal Node.js performance\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/node' for Node.js\");\n }\n } else if (platform.isBrowser) {\n if (!registeredProviders.includes('webcrypto')) {\n recommendations.push(\"Consider importing 'webcrypto' provider for browsers\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/webcrypto' for browsers\");\n }\n } else if (platform.isReactNative) {\n if (!registeredProviders.includes('quickcrypto')) {\n recommendations.push(\"Consider importing 'quickcrypto' provider for React Native\");\n }\n if (!recommendedProvider) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/quickcrypto' for React Native\");\n }\n }\n\n // Universal recommendation\n if (!recommendedProvider || registeredProviders.length === 0) {\n recommendations.push(\"Import '@bananalink-sdk/protocol/crypto/provider/noble' as a universal fallback\");\n }\n\n const diagnostics: EnvironmentDiagnostics = {\n timestamp: new Date().toISOString(),\n platform,\n detection,\n registeredProviders,\n providerTests,\n recommendedProvider,\n warnings,\n recommendations,\n\n toMarkdown(): string {\n let md = '# Crypto Environment Diagnostics\\n\\n';\n md += `**Generated:** ${this.timestamp}\\n\\n`;\n\n // Platform section\n md += '## Platform\\n\\n';\n const platformType = this.platform.isNode\n ? 'Node.js'\n : this.platform.isBrowser\n ? 'Browser'\n : this.platform.isReactNative\n ? 'React Native'\n : 'Unknown';\n md += `- **Type:** ${platformType}\\n`;\n if (this.platform.platform) {\n md += `- **OS:** ${this.platform.platform}\\n`;\n }\n if (this.platform.userAgent) {\n // Truncate long user agents\n const ua = this.platform.userAgent.length > 80\n ? `${this.platform.userAgent.substring(0, 80)}...`\n : this.platform.userAgent;\n md += `- **User Agent:** ${ua}\\n`;\n }\n md += '\\n';\n\n // Provider Detection section\n md += '## Provider Detection\\n\\n';\n md += `- **WebCrypto:** ${this.detection.webCrypto ? '✅' : '❌'}\\n`;\n md += `- **Node.js Crypto:** ${this.detection.node ? '✅' : '❌'}\\n`;\n md += `- **Noble (Pure JS):** ${this.detection.noble ? '✅' : '❌'}\\n`;\n md += `- **QuickCrypto (RN):** ${this.detection.quickCrypto ? '✅' : '❌'}\\n`;\n if (this.detection.recommended) {\n md += `- **Recommended:** ${this.detection.recommended}\\n`;\n }\n md += '\\n';\n\n // Capabilities section\n md += '## Capabilities\\n\\n';\n Object.entries(this.detection.capabilities).forEach(([provider, capability]) => {\n const status = capability.tested\n ? capability.success ? '✅ Available' : '❌ Failed'\n : '⚪ Not Tested';\n md += `- **${provider}:** ${status}\\n`;\n });\n md += '\\n';\n\n // Registered providers section\n md += '## Registered Providers\\n\\n';\n if (this.registeredProviders.length === 0) {\n md += 'No providers registered.\\n\\n';\n } else {\n this.registeredProviders.forEach(provider => {\n md += `- ${provider}${provider === this.recommendedProvider ? ' (recommended)' : ''}\\n`;\n });\n md += '\\n';\n }\n\n // Provider tests section\n md += '## Provider Tests\\n\\n';\n if (this.providerTests.length === 0) {\n md += 'No tests run (no providers registered).\\n\\n';\n } else {\n this.providerTests.forEach(test => {\n md += `### ${test.provider}\\n\\n`;\n md += `- **Available:** ${test.available ? '✅' : '❌'}\\n`;\n if (!test.available) {\n md += `- **Reason:** ${test.unavailableReason}\\n`;\n } else {\n md += `- **Overall Success:** ${test.success ? '✅' : '❌'}\\n`;\n md += `- **Total Duration:** ${test.totalDurationMs.toFixed(2)}ms\\n\\n`;\n md += '**Operations:**\\n\\n';\n test.operations.forEach(op => {\n md += `- **${op.operation}:** ${op.success ? '✅' : '❌'}`;\n if (op.durationMs) md += ` (${op.durationMs.toFixed(2)}ms)`;\n if (op.error) md += ` - ${op.error}`;\n md += '\\n';\n });\n }\n md += '\\n';\n });\n }\n\n // Recommendations section\n md += '## Recommendations\\n\\n';\n if (this.recommendedProvider) {\n md += `- Recommended: Use '${this.recommendedProvider}' provider (passed all tests)\\n`;\n }\n if (this.recommendations.length > 0) {\n this.recommendations.forEach(rec => {\n md += `- ${rec}\\n`;\n });\n }\n md += '\\n';\n\n // Warnings section\n if (this.warnings.length > 0) {\n md += '## Warnings\\n\\n';\n this.warnings.forEach(warning => {\n md += `⚠️ ${warning}\\n\\n`;\n });\n }\n\n return md;\n },\n\n toJSON(): string {\n return JSON.stringify(\n {\n timestamp: this.timestamp,\n platform: this.platform,\n detection: this.detection,\n registeredProviders: this.registeredProviders,\n providerTests: this.providerTests,\n recommendedProvider: this.recommendedProvider,\n warnings: this.warnings,\n recommendations: this.recommendations,\n },\n null,\n 2\n );\n },\n };\n\n return diagnostics;\n}\n\n/**\n * Compare performance of multiple providers\n *\n * @param providers - Array of provider types to compare\n * @param iterations - Number of iterations for each benchmark (default: 10)\n * @param logger - Optional logger for debug output\n * @returns Array of benchmark results for comparison\n *\n * @example\n * ```typescript\n * const results = await compareProviders(['webcrypto', 'noble'], 20);\n * results.forEach(result => {\n * console.log(`\\n${result.provider}:`);\n * console.log(` ECDH: ${result.ecdh.avgMs.toFixed(2)}ms`);\n * console.log(` Random: ${result.randomBytes.avgMs.toFixed(2)}ms`);\n * console.log(` AES: ${result.aesGcm.avgMs.toFixed(2)}ms`);\n * });\n * ```\n */\nexport async function compareProviders(\n providers: CryptoProviderType[],\n iterations: number = 10,\n logger?: Logger\n): Promise<ProviderBenchmark[]> {\n const results: ProviderBenchmark[] = [];\n\n for (const provider of providers) {\n try {\n const benchmark = await benchmarkProvider(provider, iterations, logger);\n results.push(benchmark);\n } catch (error) {\n logger?.warn(`Failed to benchmark ${provider}:`, {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n }\n }\n\n return results;\n}\n"]}