@bananalink-sdk/protocol 1.2.8 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-32OWUOZ3.js → chunk-KJ7QIHAY.js} +11 -7
- package/dist/chunk-KJ7QIHAY.js.map +1 -0
- package/dist/{chunk-VXLUSU5B.cjs → chunk-MUYKP6UQ.cjs} +63 -8
- package/dist/chunk-MUYKP6UQ.cjs.map +1 -0
- package/dist/{chunk-MCZG7QEM.cjs → chunk-NGPP7HUR.cjs} +11 -7
- package/dist/chunk-NGPP7HUR.cjs.map +1 -0
- package/dist/{chunk-LELPCIE7.js → chunk-OBJR2TL4.js} +54 -4
- package/dist/chunk-OBJR2TL4.js.map +1 -0
- package/dist/crypto/providers/noble-provider.cjs +2 -3
- package/dist/crypto/providers/noble-provider.d.cts +0 -7
- package/dist/crypto/providers/noble-provider.d.ts +0 -7
- package/dist/crypto/providers/noble-provider.js +1 -2
- package/dist/crypto/providers/node-provider.cjs +7 -29
- package/dist/crypto/providers/node-provider.cjs.map +1 -1
- package/dist/crypto/providers/node-provider.d.cts +0 -7
- package/dist/crypto/providers/node-provider.d.ts +0 -7
- package/dist/crypto/providers/node-provider.js +7 -29
- package/dist/crypto/providers/node-provider.js.map +1 -1
- package/dist/crypto/providers/quickcrypto-provider.cjs +8 -46
- package/dist/crypto/providers/quickcrypto-provider.cjs.map +1 -1
- package/dist/crypto/providers/quickcrypto-provider.d.cts +0 -9
- package/dist/crypto/providers/quickcrypto-provider.d.ts +0 -9
- package/dist/crypto/providers/quickcrypto-provider.js +7 -45
- package/dist/crypto/providers/quickcrypto-provider.js.map +1 -1
- package/dist/crypto/providers/webcrypto-provider.cjs +0 -2
- package/dist/crypto/providers/webcrypto-provider.cjs.map +1 -1
- package/dist/crypto/providers/webcrypto-provider.d.cts +0 -7
- package/dist/crypto/providers/webcrypto-provider.d.ts +0 -7
- package/dist/crypto/providers/webcrypto-provider.js +0 -2
- package/dist/crypto/providers/webcrypto-provider.js.map +1 -1
- package/dist/crypto-export.cjs +50 -51
- package/dist/crypto-export.cjs.map +1 -1
- package/dist/crypto-export.js +2 -4
- package/dist/crypto-export.js.map +1 -1
- package/dist/index.cjs +3 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/crypto/providers/noble-provider.ts +44 -49
- package/src/crypto/providers/node-provider.ts +18 -59
- package/src/crypto/providers/quickcrypto-provider.ts +25 -84
- package/src/crypto/providers/registry.ts +14 -9
- package/src/crypto/providers/webcrypto-provider.ts +28 -43
- package/dist/chunk-32OWUOZ3.js.map +0 -1
- package/dist/chunk-A6FLEJ7R.cjs +0 -62
- package/dist/chunk-A6FLEJ7R.cjs.map +0 -1
- package/dist/chunk-LELPCIE7.js.map +0 -1
- package/dist/chunk-MCZG7QEM.cjs.map +0 -1
- package/dist/chunk-TCVKC227.js +0 -56
- package/dist/chunk-TCVKC227.js.map +0 -1
- package/dist/chunk-VXLUSU5B.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/crypto/providers/node-provider.ts"],"names":[],"mappings":"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","file":"node-provider.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { registerCryptoProvider } from './registry';\n\n/**\n * Type definition for Node.js crypto module (loaded dynamically to prevent Metro bundling)\n */\ntype NodeCrypto = typeof import('crypto');\n\n/**\n * Node.js crypto.KeyObject wrapper to implement CryptoKeyLike interface\n * Note: keyObject type is unknown at compile time (crypto.KeyObject | Buffer at runtime)\n */\nclass NodeCryptoKeyWrapper implements CryptoKeyLike {\n constructor(\n private readonly keyObject: unknown, // crypto.KeyObject | Buffer at runtime\n private readonly keyType: 'public' | 'private' | 'secret'\n ) {}\n\n get type(): 'public' | 'private' | 'secret' {\n return this.keyType;\n }\n\n get algorithm(): string {\n return 'ECDH-P256';\n }\n\n get extractable(): boolean {\n return true;\n }\n\n get usages(): readonly string[] {\n return this.keyType === 'secret' ? ['encrypt', 'decrypt'] : ['deriveKey'];\n }\n\n get nativeKey(): unknown {\n return this.keyObject;\n }\n}\n\n/**\n * Helper function to unwrap CryptoKeyLike to native KeyObject or Buffer\n */\nfunction unwrapKeyObject(keyLike: CryptoKeyLike): unknown {\n if (keyLike instanceof NodeCryptoKeyWrapper) {\n return keyLike.nativeKey;\n }\n // Assume it's already a KeyObject\n return keyLike;\n}\n\n/**\n * Node.js crypto module implementation of CryptoProvider\n * Optimized for backend services with native crypto performance\n *\n * This provider uses the native Node.js crypto module which provides:\n * - Superior performance compared to Web Crypto API in Node.js\n * - Direct access to OpenSSL optimizations\n * - Zero additional dependencies\n * - Full support for ECDH P-256 and AES-256-GCM\n *\n * @example\n * ```typescript\n * import { NodeCryptoProvider } from '@bananalink-sdk/protocol/crypto/provider/node';\n * const provider = new NodeCryptoProvider();\n * const keyPair = await provider.generateKeyPair();\n * ```\n */\nexport class NodeCryptoProvider implements CryptoProvider {\n public readonly name = 'NodeCrypto';\n private readonly logger?: Logger;\n private cryptoModule: NodeCrypto | null = null;\n\n public get isAvailable(): boolean {\n try {\n // Check if we're in Node.js environment\n if (typeof process === 'undefined' || !process.versions?.node) {\n return false;\n }\n // Crypto module availability will be checked when getCrypto() is called\n return true;\n } catch {\n return false;\n }\n }\n\n constructor(logger?: Logger) {\n if (!this.isAvailable) {\n throw new Error('Node.js crypto module not available in this environment');\n }\n this.logger = logger?.child({ component: 'NodeCryptoProvider' });\n }\n\n /**\n * Get crypto module instance via dynamic import\n * This prevents Metro bundler from trying to resolve 'crypto' at build time\n */\n private async getCrypto(): Promise<NodeCrypto> {\n if (!this.cryptoModule) {\n try {\n // Dynamic import prevents static analysis by bundlers\n this.cryptoModule = await import('crypto');\n } catch {\n throw new Error(\n 'Failed to load Node.js crypto module. ' +\n 'This provider requires a Node.js environment.'\n );\n }\n }\n return this.cryptoModule;\n }\n\n /**\n * Generate ECDH P-256 key pair using Node.js crypto\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair with Node.js crypto');\n const cryptoModule = await this.getCrypto();\n\n return new Promise((resolve, reject) => {\n cryptoModule.generateKeyPair(\n 'ec',\n {\n namedCurve: 'prime256v1', // P-256\n publicKeyEncoding: { type: 'spki', format: 'der' },\n privateKeyEncoding: { type: 'pkcs8', format: 'der' },\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (err: Error | null, publicKey: any, privateKey: any) => {\n if (err) {\n this.logger?.error('Key pair generation failed', { error: err });\n reject(err);\n return;\n }\n\n this.logger?.debug('Key pair generation completed');\n resolve({\n publicKey: new NodeCryptoKeyWrapper(publicKey, 'public'),\n privateKey: new NodeCryptoKeyWrapper(privateKey, 'private'),\n });\n }\n );\n });\n }\n\n /**\n * Export public key to raw ArrayBuffer format (65 bytes uncompressed)\n */\n async exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n this.logger?.debug('Exporting public key');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(publicKey);\n\n // If it's a Buffer (DER format from generateKeyPair), convert to KeyObject first\n const keyObj = keyObject instanceof Buffer\n ? cryptoModule.createPublicKey({ key: keyObject, format: 'der', type: 'spki' })\n : keyObject;\n\n // Export as JWK to get X/Y coordinates\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const jwk = (keyObj as any).export({ format: 'jwk' });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const x = Buffer.from(jwk.x as string, 'base64url');\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const y = Buffer.from(jwk.y as string, 'base64url');\n\n // Construct 65-byte uncompressed point: 0x04 + X (32 bytes) + Y (32 bytes)\n const uncompressed = Buffer.concat([Buffer.from([0x04]), x, y]);\n\n return await Promise.resolve(\n uncompressed.buffer.slice(\n uncompressed.byteOffset,\n uncompressed.byteOffset + uncompressed.byteLength\n )\n );\n }\n\n /**\n * Export private key to raw ArrayBuffer format (32 bytes)\n */\n async exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n this.logger?.debug('Exporting private key');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(privateKey);\n\n // Convert KeyObject to raw format\n const keyBuffer = keyObject instanceof Buffer ? keyObject : Buffer.from(keyObject as ArrayBuffer);\n const keyObj = cryptoModule.createPrivateKey({\n key: keyBuffer,\n format: 'der',\n type: 'pkcs8',\n });\n\n // Export as raw scalar (32 bytes)\n const jwk = keyObj.export({ format: 'jwk' });\n const dValue = Buffer.from(jwk.d as string, 'base64url');\n\n return await Promise.resolve(\n dValue.buffer.slice(dValue.byteOffset, dValue.byteOffset + dValue.byteLength)\n );\n }\n\n /**\n * Import public key from raw ArrayBuffer format\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Importing public key');\n const cryptoModule = await this.getCrypto();\n const keyBuffer = Buffer.from(keyData);\n\n // Ensure it's uncompressed format (65 bytes starting with 0x04)\n if (keyBuffer.length !== 65 || keyBuffer[0] !== 0x04) {\n throw new Error('Invalid public key format: expected 65 bytes uncompressed point');\n }\n\n // Create KeyObject from raw uncompressed point\n // We need to wrap it in DER format\n const x = keyBuffer.slice(1, 33);\n const y = keyBuffer.slice(33, 65);\n\n // Create JWK representation\n const jwk = {\n kty: 'EC' as const,\n crv: 'P-256' as const,\n x: x.toString('base64url'),\n y: y.toString('base64url'),\n };\n\n const keyObject = cryptoModule.createPublicKey({ key: jwk, format: 'jwk' });\n return await Promise.resolve(new NodeCryptoKeyWrapper(keyObject, 'public'));\n }\n\n /**\n * Import private key from raw ArrayBuffer format\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Importing private key');\n const cryptoModule = await this.getCrypto();\n const keyBuffer = Buffer.from(keyData);\n\n if (keyBuffer.length !== 32) {\n throw new Error('Invalid private key format: expected 32 bytes');\n }\n\n // Create JWK representation\n const jwk = {\n kty: 'EC' as const,\n crv: 'P-256' as const,\n d: keyBuffer.toString('base64url'),\n };\n\n const keyObject = cryptoModule.createPrivateKey({ key: jwk, format: 'jwk' });\n return await Promise.resolve(new NodeCryptoKeyWrapper(keyObject, 'private'));\n }\n\n /**\n * Derive shared secret using ECDH\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret');\n const cryptoModule = await this.getCrypto();\n\n // Create ECDH object\n const ecdh = cryptoModule.createECDH('prime256v1');\n\n // Set private key\n const privateRaw = await this.exportPrivateKey(privateKey);\n ecdh.setPrivateKey(Buffer.from(privateRaw));\n\n // Compute shared secret\n const publicRaw = await this.exportPublicKey(publicKey);\n const sharedSecret = ecdh.computeSecret(Buffer.from(publicRaw));\n\n // Wrap as secret key\n const keyObject = cryptoModule.createSecretKey(sharedSecret);\n return new NodeCryptoKeyWrapper(keyObject, 'secret');\n }\n\n /**\n * Derive AES-GCM encryption key using HKDF-SHA256\n */\n async deriveEncryptionKey(\n sharedSecret: CryptoKeyLike,\n salt: ArrayBuffer,\n info: ArrayBuffer\n ): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving AES-GCM encryption key');\n const cryptoModule = await this.getCrypto();\n\n // Extract raw shared secret\n const keyObject = unwrapKeyObject(sharedSecret);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const sharedSecretRaw = (keyObject as any).export();\n\n // Use HKDF to derive 32-byte key\n const derivedKey = cryptoModule.hkdfSync(\n 'sha256',\n Buffer.isBuffer(sharedSecretRaw) ? sharedSecretRaw : Buffer.from(sharedSecretRaw),\n Buffer.from(salt),\n Buffer.from(info),\n 32 // 256 bits\n ) as Buffer;\n\n // Create secret key object\n const aesKeyObject = cryptoModule.createSecretKey(derivedKey);\n return await Promise.resolve(new NodeCryptoKeyWrapper(aesKeyObject, 'secret'));\n }\n\n /**\n * Encrypt data using AES-256-GCM\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Encrypting with AES-256-GCM');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(key);\n\n const cipher = cryptoModule.createCipheriv(\n 'aes-256-gcm',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (keyObject as any).export(),\n Buffer.from(iv)\n );\n\n const encrypted = Buffer.concat([\n cipher.update(Buffer.from(data)),\n cipher.final(),\n cipher.getAuthTag(),\n ]);\n\n return await Promise.resolve(\n encrypted.buffer.slice(\n encrypted.byteOffset,\n encrypted.byteOffset + encrypted.byteLength\n )\n );\n }\n\n /**\n * Decrypt data using AES-256-GCM\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Decrypting with AES-256-GCM');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(key);\n const dataBuffer = Buffer.from(data);\n\n // Last 16 bytes are the auth tag\n const authTag = dataBuffer.slice(-16);\n const ciphertext = dataBuffer.slice(0, -16);\n\n const decipher = cryptoModule.createDecipheriv(\n 'aes-256-gcm',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (keyObject as any).export(),\n Buffer.from(iv)\n );\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n\n return await Promise.resolve(\n decrypted.buffer.slice(\n decrypted.byteOffset,\n decrypted.byteOffset + decrypted.byteLength\n )\n );\n }\n\n /**\n * Generate HMAC-SHA256 authentication code\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Generating HMAC-SHA256');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(key);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const hmac = cryptoModule.createHmac('sha256', (keyObject as any).export());\n hmac.update(Buffer.from(data));\n const mac = hmac.digest();\n\n return await Promise.resolve(mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength));\n }\n\n /**\n * Verify HMAC-SHA256 authentication code\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n this.logger?.debug('Verifying HMAC-SHA256');\n const cryptoModule = await this.getCrypto();\n const computed = await this.generateHMAC(key, data);\n const expected = new Uint8Array(mac);\n const actual = new Uint8Array(computed);\n\n if (expected.length !== actual.length) {\n return false;\n }\n\n // Constant-time comparison\n return cryptoModule.timingSafeEqual(\n Buffer.from(expected),\n Buffer.from(actual)\n );\n }\n\n /**\n * Generate cryptographically secure random bytes\n * Note: This is a synchronous method, so it uses require() instead of dynamic import\n */\n randomBytes(length: number): ArrayBuffer {\n // Use cached module if available, otherwise use synchronous require\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const cryptoModule = this.cryptoModule ?? require('crypto') as NodeCrypto;\n const buffer = cryptoModule.randomBytes(length);\n return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n }\n}\n\n/**\n * Self-register Node provider on import\n * This allows the provider to be available when explicitly imported\n */\nregisterCryptoProvider('node', (logger) => new NodeCryptoProvider(logger));\n\n// TypeScript module augmentation to track this provider is available\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace BananaLink {\n interface RegisteredCryptoProviders {\n node: true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/crypto/providers/node-provider.ts"],"names":[],"mappings":"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","file":"node-provider.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\n\n/**\n * Type definition for Node.js crypto module (loaded dynamically to prevent Metro bundling)\n */\ntype NodeCrypto = typeof import('crypto');\n\n/**\n * Node.js crypto.KeyObject wrapper to implement CryptoKeyLike interface\n * Note: keyObject type is unknown at compile time (crypto.KeyObject | Buffer at runtime)\n */\nclass NodeCryptoKeyWrapper implements CryptoKeyLike {\n constructor(\n private readonly keyObject: unknown, // crypto.KeyObject | Buffer at runtime\n private readonly keyType: 'public' | 'private' | 'secret',\n ) {}\n\n get type(): 'public' | 'private' | 'secret' {\n return this.keyType;\n }\n\n get algorithm(): string {\n return 'ECDH-P256';\n }\n\n get extractable(): boolean {\n return true;\n }\n\n get usages(): readonly string[] {\n return this.keyType === 'secret' ? ['encrypt', 'decrypt'] : ['deriveKey'];\n }\n\n get nativeKey(): unknown {\n return this.keyObject;\n }\n}\n\n/**\n * Helper function to unwrap CryptoKeyLike to native KeyObject or Buffer\n */\nfunction unwrapKeyObject(keyLike: CryptoKeyLike): unknown {\n if (keyLike instanceof NodeCryptoKeyWrapper) {\n return keyLike.nativeKey;\n }\n // Assume it's already a KeyObject\n return keyLike;\n}\n\n/**\n * Node.js crypto module implementation of CryptoProvider\n * Optimized for backend services with native crypto performance\n *\n * This provider uses the native Node.js crypto module which provides:\n * - Superior performance compared to Web Crypto API in Node.js\n * - Direct access to OpenSSL optimizations\n * - Zero additional dependencies\n * - Full support for ECDH P-256 and AES-256-GCM\n *\n * @example\n * ```typescript\n * import { NodeCryptoProvider } from '@bananalink-sdk/protocol/crypto/provider/node';\n * const provider = new NodeCryptoProvider();\n * const keyPair = await provider.generateKeyPair();\n * ```\n */\nexport class NodeCryptoProvider implements CryptoProvider {\n public readonly name = 'NodeCrypto';\n private readonly logger?: Logger;\n private cryptoModule: NodeCrypto | null = null;\n\n public get isAvailable(): boolean {\n try {\n // Check if we're in Node.js environment\n if (typeof process === 'undefined' || !process.versions?.node) {\n return false;\n }\n // Crypto module availability will be checked when getCrypto() is called\n return true;\n } catch {\n return false;\n }\n }\n\n constructor(logger?: Logger) {\n if (!this.isAvailable) {\n throw new Error('Node.js crypto module not available in this environment');\n }\n this.logger = logger?.child({ component: 'NodeCryptoProvider' });\n }\n\n /**\n * Get crypto module instance via dynamic import\n * This prevents Metro bundler from trying to resolve 'crypto' at build time\n */\n private async getCrypto(): Promise<NodeCrypto> {\n if (!this.cryptoModule) {\n try {\n // Dynamic import prevents static analysis by bundlers\n this.cryptoModule = await import('crypto');\n } catch {\n throw new Error('Failed to load Node.js crypto module. ' + 'This provider requires a Node.js environment.');\n }\n }\n return this.cryptoModule;\n }\n\n /**\n * Generate ECDH P-256 key pair using Node.js crypto\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair with Node.js crypto');\n const cryptoModule = await this.getCrypto();\n\n return new Promise((resolve, reject) => {\n cryptoModule.generateKeyPair(\n 'ec',\n {\n namedCurve: 'prime256v1', // P-256\n publicKeyEncoding: { type: 'spki', format: 'der' },\n privateKeyEncoding: { type: 'pkcs8', format: 'der' },\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (err: Error | null, publicKey: any, privateKey: any) => {\n if (err) {\n this.logger?.error('Key pair generation failed', { error: err });\n reject(err);\n return;\n }\n\n this.logger?.debug('Key pair generation completed');\n resolve({\n publicKey: new NodeCryptoKeyWrapper(publicKey, 'public'),\n privateKey: new NodeCryptoKeyWrapper(privateKey, 'private'),\n });\n },\n );\n });\n }\n\n /**\n * Export public key to raw ArrayBuffer format (65 bytes uncompressed)\n */\n async exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n this.logger?.debug('Exporting public key');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(publicKey);\n\n // If it's a Buffer (DER format from generateKeyPair), convert to KeyObject first\n const keyObj =\n keyObject instanceof Buffer\n ? cryptoModule.createPublicKey({ key: keyObject, format: 'der', type: 'spki' })\n : keyObject;\n\n // Export as JWK to get X/Y coordinates\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const jwk = (keyObj as any).export({ format: 'jwk' });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const x = Buffer.from(jwk.x as string, 'base64url');\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const y = Buffer.from(jwk.y as string, 'base64url');\n\n // Construct 65-byte uncompressed point: 0x04 + X (32 bytes) + Y (32 bytes)\n const uncompressed = Buffer.concat([Buffer.from([0x04]), x, y]);\n\n return await Promise.resolve(\n uncompressed.buffer.slice(uncompressed.byteOffset, uncompressed.byteOffset + uncompressed.byteLength),\n );\n }\n\n /**\n * Export private key to raw ArrayBuffer format (32 bytes)\n */\n async exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n this.logger?.debug('Exporting private key');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(privateKey);\n\n // Convert KeyObject to raw format\n const keyBuffer = keyObject instanceof Buffer ? keyObject : Buffer.from(keyObject as ArrayBuffer);\n const keyObj = cryptoModule.createPrivateKey({\n key: keyBuffer,\n format: 'der',\n type: 'pkcs8',\n });\n\n // Export as raw scalar (32 bytes)\n const jwk = keyObj.export({ format: 'jwk' });\n const dValue = Buffer.from(jwk.d as string, 'base64url');\n\n return await Promise.resolve(dValue.buffer.slice(dValue.byteOffset, dValue.byteOffset + dValue.byteLength));\n }\n\n /**\n * Import public key from raw ArrayBuffer format\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Importing public key');\n const cryptoModule = await this.getCrypto();\n const keyBuffer = Buffer.from(keyData);\n\n // Ensure it's uncompressed format (65 bytes starting with 0x04)\n if (keyBuffer.length !== 65 || keyBuffer[0] !== 0x04) {\n throw new Error('Invalid public key format: expected 65 bytes uncompressed point');\n }\n\n // Create KeyObject from raw uncompressed point\n // We need to wrap it in DER format\n const x = keyBuffer.slice(1, 33);\n const y = keyBuffer.slice(33, 65);\n\n // Create JWK representation\n const jwk = {\n kty: 'EC' as const,\n crv: 'P-256' as const,\n x: x.toString('base64url'),\n y: y.toString('base64url'),\n };\n\n const keyObject = cryptoModule.createPublicKey({ key: jwk, format: 'jwk' });\n return await Promise.resolve(new NodeCryptoKeyWrapper(keyObject, 'public'));\n }\n\n /**\n * Import private key from raw ArrayBuffer format\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Importing private key');\n const cryptoModule = await this.getCrypto();\n const keyBuffer = Buffer.from(keyData);\n\n if (keyBuffer.length !== 32) {\n throw new Error('Invalid private key format: expected 32 bytes');\n }\n\n // Create JWK representation\n const jwk = {\n kty: 'EC' as const,\n crv: 'P-256' as const,\n d: keyBuffer.toString('base64url'),\n };\n\n const keyObject = cryptoModule.createPrivateKey({ key: jwk, format: 'jwk' });\n return await Promise.resolve(new NodeCryptoKeyWrapper(keyObject, 'private'));\n }\n\n /**\n * Derive shared secret using ECDH\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret');\n const cryptoModule = await this.getCrypto();\n\n // Create ECDH object\n const ecdh = cryptoModule.createECDH('prime256v1');\n\n // Set private key\n const privateRaw = await this.exportPrivateKey(privateKey);\n ecdh.setPrivateKey(Buffer.from(privateRaw));\n\n // Compute shared secret\n const publicRaw = await this.exportPublicKey(publicKey);\n const sharedSecret = ecdh.computeSecret(Buffer.from(publicRaw));\n\n // Wrap as secret key\n const keyObject = cryptoModule.createSecretKey(sharedSecret);\n return new NodeCryptoKeyWrapper(keyObject, 'secret');\n }\n\n /**\n * Derive AES-GCM encryption key using HKDF-SHA256\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving AES-GCM encryption key');\n const cryptoModule = await this.getCrypto();\n\n // Extract raw shared secret\n const keyObject = unwrapKeyObject(sharedSecret);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const sharedSecretRaw = (keyObject as any).export();\n\n // Use HKDF to derive 32-byte key\n const derivedKey = cryptoModule.hkdfSync(\n 'sha256',\n Buffer.isBuffer(sharedSecretRaw) ? sharedSecretRaw : Buffer.from(sharedSecretRaw),\n Buffer.from(salt),\n Buffer.from(info),\n 32, // 256 bits\n ) as Buffer;\n\n // Create secret key object\n const aesKeyObject = cryptoModule.createSecretKey(derivedKey);\n return await Promise.resolve(new NodeCryptoKeyWrapper(aesKeyObject, 'secret'));\n }\n\n /**\n * Encrypt data using AES-256-GCM\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Encrypting with AES-256-GCM');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(key);\n\n const cipher = cryptoModule.createCipheriv(\n 'aes-256-gcm',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (keyObject as any).export(),\n Buffer.from(iv),\n );\n\n const encrypted = Buffer.concat([cipher.update(Buffer.from(data)), cipher.final(), cipher.getAuthTag()]);\n\n return await Promise.resolve(\n encrypted.buffer.slice(encrypted.byteOffset, encrypted.byteOffset + encrypted.byteLength),\n );\n }\n\n /**\n * Decrypt data using AES-256-GCM\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Decrypting with AES-256-GCM');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(key);\n const dataBuffer = Buffer.from(data);\n\n // Last 16 bytes are the auth tag\n const authTag = dataBuffer.slice(-16);\n const ciphertext = dataBuffer.slice(0, -16);\n\n const decipher = cryptoModule.createDecipheriv(\n 'aes-256-gcm',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (keyObject as any).export(),\n Buffer.from(iv),\n );\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n\n return await Promise.resolve(\n decrypted.buffer.slice(decrypted.byteOffset, decrypted.byteOffset + decrypted.byteLength),\n );\n }\n\n /**\n * Generate HMAC-SHA256 authentication code\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Generating HMAC-SHA256');\n const cryptoModule = await this.getCrypto();\n const keyObject = unwrapKeyObject(key);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n const hmac = cryptoModule.createHmac('sha256', (keyObject as any).export());\n hmac.update(Buffer.from(data));\n const mac = hmac.digest();\n\n return await Promise.resolve(mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength));\n }\n\n /**\n * Verify HMAC-SHA256 authentication code\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n this.logger?.debug('Verifying HMAC-SHA256');\n const cryptoModule = await this.getCrypto();\n const computed = await this.generateHMAC(key, data);\n const expected = new Uint8Array(mac);\n const actual = new Uint8Array(computed);\n\n if (expected.length !== actual.length) {\n return false;\n }\n\n // Constant-time comparison\n return cryptoModule.timingSafeEqual(Buffer.from(expected), Buffer.from(actual));\n }\n\n /**\n * Generate cryptographically secure random bytes\n * Note: This is a synchronous method, so it uses require() instead of dynamic import\n */\n randomBytes(length: number): ArrayBuffer {\n // Use cached module if available, otherwise use synchronous require\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const cryptoModule = this.cryptoModule ?? (require('crypto') as NodeCrypto);\n const buffer = cryptoModule.randomBytes(length);\n return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\n }\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var chunkA6FLEJ7R_cjs = require('../../chunk-A6FLEJ7R.cjs');
|
|
3
|
+
var chunkNGPP7HUR_cjs = require('../../chunk-NGPP7HUR.cjs');
|
|
5
4
|
var chunkWGEGR3DF_cjs = require('../../chunk-WGEGR3DF.cjs');
|
|
6
5
|
|
|
7
6
|
// src/crypto/providers/quickcrypto-provider.ts
|
|
@@ -57,7 +56,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
57
56
|
this.isAvailable = false;
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
|
-
this.nobleProvider = new
|
|
59
|
+
this.nobleProvider = new chunkNGPP7HUR_cjs.NobleCryptoProvider(logger);
|
|
61
60
|
}
|
|
62
61
|
/**
|
|
63
62
|
* Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)
|
|
@@ -69,20 +68,8 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
69
68
|
throw new Error("Noble keys missing required data property");
|
|
70
69
|
}
|
|
71
70
|
return {
|
|
72
|
-
privateKey: new QuickCryptoKey(
|
|
73
|
-
|
|
74
|
-
"private",
|
|
75
|
-
"ECDH-P256",
|
|
76
|
-
true,
|
|
77
|
-
["deriveKey"]
|
|
78
|
-
),
|
|
79
|
-
publicKey: new QuickCryptoKey(
|
|
80
|
-
nobleKeyPair.publicKey.data,
|
|
81
|
-
"public",
|
|
82
|
-
"ECDH-P256",
|
|
83
|
-
true,
|
|
84
|
-
[]
|
|
85
|
-
)
|
|
71
|
+
privateKey: new QuickCryptoKey(nobleKeyPair.privateKey.data, "private", "ECDH-P256", true, ["deriveKey"]),
|
|
72
|
+
publicKey: new QuickCryptoKey(nobleKeyPair.publicKey.data, "public", "ECDH-P256", true, [])
|
|
86
73
|
};
|
|
87
74
|
}
|
|
88
75
|
/**
|
|
@@ -105,13 +92,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
105
92
|
if (!hasKeyData(nobleKey)) {
|
|
106
93
|
throw new Error("Noble public key missing required data property");
|
|
107
94
|
}
|
|
108
|
-
return new QuickCryptoKey(
|
|
109
|
-
nobleKey.data,
|
|
110
|
-
"public",
|
|
111
|
-
"ECDH-P256",
|
|
112
|
-
true,
|
|
113
|
-
[]
|
|
114
|
-
);
|
|
95
|
+
return new QuickCryptoKey(nobleKey.data, "public", "ECDH-P256", true, []);
|
|
115
96
|
}
|
|
116
97
|
/**
|
|
117
98
|
* Import private key from ArrayBuffer (delegate to Noble)
|
|
@@ -121,13 +102,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
121
102
|
if (!hasKeyData(nobleKey)) {
|
|
122
103
|
throw new Error("Noble private key missing required data property");
|
|
123
104
|
}
|
|
124
|
-
return new QuickCryptoKey(
|
|
125
|
-
nobleKey.data,
|
|
126
|
-
"private",
|
|
127
|
-
"ECDH-P256",
|
|
128
|
-
true,
|
|
129
|
-
["deriveKey"]
|
|
130
|
-
);
|
|
105
|
+
return new QuickCryptoKey(nobleKey.data, "private", "ECDH-P256", true, ["deriveKey"]);
|
|
131
106
|
}
|
|
132
107
|
/**
|
|
133
108
|
* Derive shared secret from ECDH key agreement (delegate to Noble)
|
|
@@ -138,13 +113,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
138
113
|
if (!hasKeyData(sharedSecret)) {
|
|
139
114
|
throw new Error("Noble shared secret missing required data property");
|
|
140
115
|
}
|
|
141
|
-
return new QuickCryptoKey(
|
|
142
|
-
sharedSecret.data,
|
|
143
|
-
"secret",
|
|
144
|
-
"AES-GCM",
|
|
145
|
-
true,
|
|
146
|
-
["encrypt", "decrypt"]
|
|
147
|
-
);
|
|
116
|
+
return new QuickCryptoKey(sharedSecret.data, "secret", "AES-GCM", true, ["encrypt", "decrypt"]);
|
|
148
117
|
}
|
|
149
118
|
/**
|
|
150
119
|
* Derive AES-GCM key from shared secret using HKDF (delegate to Noble)
|
|
@@ -154,13 +123,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
154
123
|
if (!hasKeyData(encryptionKey)) {
|
|
155
124
|
throw new Error("Noble encryption key missing required data property");
|
|
156
125
|
}
|
|
157
|
-
return new QuickCryptoKey(
|
|
158
|
-
encryptionKey.data,
|
|
159
|
-
"secret",
|
|
160
|
-
"AES-GCM",
|
|
161
|
-
true,
|
|
162
|
-
["encrypt", "decrypt"]
|
|
163
|
-
);
|
|
126
|
+
return new QuickCryptoKey(encryptionKey.data, "secret", "AES-GCM", true, ["encrypt", "decrypt"]);
|
|
164
127
|
}
|
|
165
128
|
/**
|
|
166
129
|
* Generate random bytes using QuickCrypto (58x faster than crypto-browserify)
|
|
@@ -332,7 +295,6 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
332
295
|
};
|
|
333
296
|
chunkWGEGR3DF_cjs.__name(_QuickCryptoProvider, "QuickCryptoProvider");
|
|
334
297
|
var QuickCryptoProvider = _QuickCryptoProvider;
|
|
335
|
-
chunkA6FLEJ7R_cjs.registerCryptoProvider("quickcrypto", (logger) => new QuickCryptoProvider(logger));
|
|
336
298
|
|
|
337
299
|
exports.QuickCryptoProvider = QuickCryptoProvider;
|
|
338
300
|
//# sourceMappingURL=quickcrypto-provider.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/crypto/providers/quickcrypto-provider.ts"],"names":["__name","NobleCryptoProvider","registerCryptoProvider"],"mappings":"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","file":"quickcrypto-provider.cjs","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { NobleCryptoProvider } from './noble-provider';\nimport { registerCryptoProvider } from './registry';\n\n// Global require function type for React Native environments\ntype RequireFunction = (id: string) => unknown;\ntype GlobalWithRequire = typeof globalThis & {\n require?: RequireFunction;\n};\n\n/**\n * Type guard to check if a key has a data property (from Noble provider)\n */\nfunction hasKeyData(key: CryptoKeyLike): key is CryptoKeyLike & { data: Uint8Array } {\n return 'data' in key && key.data instanceof Uint8Array;\n}\n\n// Type definitions for react-native-quick-crypto Node.js-like API\ninterface QuickCryptoHash {\n update(data: Uint8Array): void;\n digest(): Uint8Array;\n}\n\ninterface QuickCryptoCipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n getAuthTag?(): Uint8Array;\n}\n\ninterface QuickCryptoDecipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n setAuthTag?(authTag: Uint8Array): void;\n}\n\ninterface QuickCrypto {\n randomBytes(size: number): Uint8Array;\n createHash(algorithm: string): QuickCryptoHash;\n createHmac(algorithm: string, key: Uint8Array): QuickCryptoHash;\n createCipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoCipher;\n createDecipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoDecipher;\n}\n\n/**\n * QuickCrypto key wrapper to implement CryptoKeyLike interface\n */\nclass QuickCryptoKey implements CryptoKeyLike {\n constructor(\n public readonly data: Uint8Array,\n public readonly type: 'public' | 'private' | 'secret',\n public readonly algorithm: string,\n public readonly extractable: boolean = true,\n public readonly usages: readonly string[] = []\n ) {}\n}\n\n/**\n * Check if react-native-quick-crypto is available\n */\nfunction isQuickCryptoAvailable(): boolean {\n try {\n // Use globalThis.require for React Native compatibility\n const global = globalThis as GlobalWithRequire;\n if (!global.require) return false;\n\n const quickCrypto = global.require('react-native-quick-crypto') as QuickCrypto | undefined;\n if (!quickCrypto) return false;\n\n return (\n typeof quickCrypto.randomBytes === 'function' &&\n typeof quickCrypto.createHash === 'function' &&\n typeof quickCrypto.createHmac === 'function' &&\n typeof quickCrypto.createCipheriv === 'function'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * React Native QuickCrypto implementation of CryptoProvider\n * Hybrid approach: uses Noble for ECDH operations and QuickCrypto for AES/HMAC/hashing\n * This provides optimal performance while maintaining full compatibility\n */\nexport class QuickCryptoProvider implements CryptoProvider {\n public readonly name = 'QuickCrypto';\n public readonly isAvailable: boolean;\n\n private readonly logger?: Logger;\n private readonly quickCrypto?: QuickCrypto;\n private readonly nobleProvider: NobleCryptoProvider;\n\n constructor(logger?: Logger) {\n this.logger = logger?.child({ component: 'QuickCryptoProvider' });\n this.isAvailable = isQuickCryptoAvailable();\n\n if (this.isAvailable) {\n try {\n const global = globalThis as GlobalWithRequire;\n this.quickCrypto = global.require?.('react-native-quick-crypto') as QuickCrypto | undefined;\n if (this.quickCrypto) {\n this.logger?.debug('QuickCrypto initialized successfully');\n } else {\n this.logger?.warn('QuickCrypto require returned undefined');\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n } catch (error) {\n this.logger?.error('Failed to initialize QuickCrypto', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n }\n\n // Always initialize Noble provider as fallback for ECDH operations\n this.nobleProvider = new NobleCryptoProvider(logger);\n }\n\n /**\n * Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair using Noble (fallback)');\n\n // Use Noble for key generation as QuickCrypto doesn't support P-256 ECDH\n const nobleKeyPair = await this.nobleProvider.generateKeyPair();\n\n // Wrap in QuickCryptoKey for consistency\n if (!hasKeyData(nobleKeyPair.privateKey) || !hasKeyData(nobleKeyPair.publicKey)) {\n throw new Error('Noble keys missing required data property');\n }\n\n return {\n privateKey: new QuickCryptoKey(\n nobleKeyPair.privateKey.data,\n 'private',\n 'ECDH-P256',\n true,\n ['deriveKey']\n ),\n publicKey: new QuickCryptoKey(\n nobleKeyPair.publicKey.data,\n 'public',\n 'ECDH-P256',\n true,\n []\n )\n };\n }\n\n /**\n * Export public key to ArrayBuffer (delegate to Noble)\n */\n exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPublicKey(publicKey);\n }\n\n /**\n * Export private key to ArrayBuffer (delegate to Noble)\n */\n exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPrivateKey(privateKey);\n }\n\n /**\n * Import public key from ArrayBuffer (delegate to Noble)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPublicKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble public key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n nobleKey.data,\n 'public',\n 'ECDH-P256',\n true,\n []\n );\n }\n\n /**\n * Import private key from ArrayBuffer (delegate to Noble)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPrivateKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble private key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n nobleKey.data,\n 'private',\n 'ECDH-P256',\n true,\n ['deriveKey']\n );\n }\n\n /**\n * Derive shared secret from ECDH key agreement (delegate to Noble)\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using Noble (fallback)');\n\n const sharedSecret = await this.nobleProvider.deriveSharedSecret(privateKey, publicKey);\n\n if (!hasKeyData(sharedSecret)) {\n throw new Error('Noble shared secret missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n sharedSecret.data,\n 'secret',\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF (delegate to Noble)\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n const encryptionKey = await this.nobleProvider.deriveEncryptionKey(sharedSecret, salt, info);\n\n if (!hasKeyData(encryptionKey)) {\n throw new Error('Noble encryption key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n encryptionKey.data,\n 'secret',\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Generate random bytes using QuickCrypto (58x faster than crypto-browserify)\n */\n randomBytes(length: number): ArrayBuffer {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for randomBytes');\n return this.nobleProvider.randomBytes(length);\n }\n\n try {\n const bytes = this.quickCrypto.randomBytes(length);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto randomBytes failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.randomBytes(length);\n }\n }\n\n /**\n * Encrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for encryption');\n return this.nobleProvider.encrypt(key, data, iv);\n }\n\n this.logger?.debug('Encrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Encryption failed - invalid key type', {\n actualType: secretKey.type\n });\n throw error;\n }\n\n try {\n // Use QuickCrypto's Node.js-compatible AES-GCM implementation\n const cipher = this.quickCrypto.createCipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n const encrypted = cipher.update(new Uint8Array(data));\n const final = cipher.final();\n\n // Get authentication tag (GCM mode)\n const authTag = cipher.getAuthTag?.() || new Uint8Array(16);\n\n // Combine encrypted data + auth tag (standard AES-GCM format)\n const result = new Uint8Array(encrypted.length + final.length + authTag.length);\n result.set(encrypted, 0);\n result.set(final, encrypted.length);\n result.set(authTag, encrypted.length + final.length);\n\n this.logger?.debug('Encryption completed using QuickCrypto', {\n ciphertextSize: result.byteLength\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto encryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n return this.nobleProvider.encrypt(key, data, iv);\n }\n }\n\n /**\n * Decrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for decryption');\n return this.nobleProvider.decrypt(key, data, iv);\n }\n\n this.logger?.debug('Decrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Decryption failed - invalid key type', {\n actualType: secretKey.type\n });\n throw error;\n }\n\n try {\n const dataBytes = new Uint8Array(data);\n\n // Extract auth tag from end of data (last 16 bytes for GCM)\n const authTagLength = 16;\n if (dataBytes.length < authTagLength) {\n throw new Error('Data too short to contain auth tag');\n }\n\n const ciphertext = dataBytes.slice(0, -authTagLength);\n const authTag = dataBytes.slice(-authTagLength);\n\n const decipher = this.quickCrypto.createDecipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n // Set auth tag for verification\n decipher.setAuthTag?.(authTag);\n\n const decrypted = decipher.update(ciphertext);\n const final = decipher.final();\n\n // Combine decrypted chunks\n const result = new Uint8Array(decrypted.length + final.length);\n result.set(decrypted, 0);\n result.set(final, decrypted.length);\n\n this.logger?.debug('Decryption completed using QuickCrypto', {\n plaintextSize: result.byteLength\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto decryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n return this.nobleProvider.decrypt(key, data, iv);\n }\n }\n\n /**\n * Generate HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC');\n return this.nobleProvider.generateHMAC(key, data);\n }\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n try {\n const hmac = this.quickCrypto.createHmac('sha256', secretKey.data);\n hmac.update(new Uint8Array(data));\n const mac = hmac.digest();\n\n return mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.generateHMAC(key, data);\n }\n }\n\n /**\n * Verify HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC verification');\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n\n try {\n const expectedMac = await this.generateHMAC(key, data);\n const providedMac = new Uint8Array(mac);\n const expectedMacBytes = new Uint8Array(expectedMac);\n\n // Constant-time comparison\n if (expectedMacBytes.length !== providedMac.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < expectedMacBytes.length; i++) {\n result |= expectedMacBytes[i] ^ providedMac[i];\n }\n\n return result === 0;\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC verification failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n }\n}\n\n/**\n * Self-register QuickCrypto provider on import\n * This allows the provider to be available when explicitly imported\n *\n * Note: QuickCrypto depends on Noble for ECDH operations, so we auto-register\n * Noble as well to ensure all required functionality is available.\n */\n// Auto-register noble as a dependency (QuickCrypto delegates ECDH to Noble)\nimport './noble-provider';\n\nregisterCryptoProvider('quickcrypto', (logger) => new QuickCryptoProvider(logger));\n\n// TypeScript module augmentation to track this provider is available\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace BananaLink {\n interface RegisteredCryptoProviders {\n quickcrypto: true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/crypto/providers/quickcrypto-provider.ts"],"names":["__name","NobleCryptoProvider"],"mappings":"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","file":"quickcrypto-provider.cjs","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { NobleCryptoProvider } from './noble-provider';\n\n// Global require function type for React Native environments\ntype RequireFunction = (id: string) => unknown;\ntype GlobalWithRequire = typeof globalThis & {\n require?: RequireFunction;\n};\n\n/**\n * Type guard to check if a key has a data property (from Noble provider)\n */\nfunction hasKeyData(key: CryptoKeyLike): key is CryptoKeyLike & { data: Uint8Array } {\n return 'data' in key && key.data instanceof Uint8Array;\n}\n\n// Type definitions for react-native-quick-crypto Node.js-like API\ninterface QuickCryptoHash {\n update(data: Uint8Array): void;\n digest(): Uint8Array;\n}\n\ninterface QuickCryptoCipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n getAuthTag?(): Uint8Array;\n}\n\ninterface QuickCryptoDecipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n setAuthTag?(authTag: Uint8Array): void;\n}\n\ninterface QuickCrypto {\n randomBytes(size: number): Uint8Array;\n createHash(algorithm: string): QuickCryptoHash;\n createHmac(algorithm: string, key: Uint8Array): QuickCryptoHash;\n createCipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoCipher;\n createDecipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoDecipher;\n}\n\n/**\n * QuickCrypto key wrapper to implement CryptoKeyLike interface\n */\nclass QuickCryptoKey implements CryptoKeyLike {\n constructor(\n public readonly data: Uint8Array,\n public readonly type: 'public' | 'private' | 'secret',\n public readonly algorithm: string,\n public readonly extractable: boolean = true,\n public readonly usages: readonly string[] = [],\n ) {}\n}\n\n/**\n * Check if react-native-quick-crypto is available\n */\nfunction isQuickCryptoAvailable(): boolean {\n try {\n // Use globalThis.require for React Native compatibility\n const global = globalThis as GlobalWithRequire;\n if (!global.require) return false;\n\n const quickCrypto = global.require('react-native-quick-crypto') as QuickCrypto | undefined;\n if (!quickCrypto) return false;\n\n return (\n typeof quickCrypto.randomBytes === 'function' &&\n typeof quickCrypto.createHash === 'function' &&\n typeof quickCrypto.createHmac === 'function' &&\n typeof quickCrypto.createCipheriv === 'function'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * React Native QuickCrypto implementation of CryptoProvider\n * Hybrid approach: uses Noble for ECDH operations and QuickCrypto for AES/HMAC/hashing\n * This provides optimal performance while maintaining full compatibility\n */\nexport class QuickCryptoProvider implements CryptoProvider {\n public readonly name = 'QuickCrypto';\n public readonly isAvailable: boolean;\n\n private readonly logger?: Logger;\n private readonly quickCrypto?: QuickCrypto;\n private readonly nobleProvider: NobleCryptoProvider;\n\n constructor(logger?: Logger) {\n this.logger = logger?.child({ component: 'QuickCryptoProvider' });\n this.isAvailable = isQuickCryptoAvailable();\n\n if (this.isAvailable) {\n try {\n const global = globalThis as GlobalWithRequire;\n this.quickCrypto = global.require?.('react-native-quick-crypto') as QuickCrypto | undefined;\n if (this.quickCrypto) {\n this.logger?.debug('QuickCrypto initialized successfully');\n } else {\n this.logger?.warn('QuickCrypto require returned undefined');\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n } catch (error) {\n this.logger?.error('Failed to initialize QuickCrypto', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n }\n\n // Always initialize Noble provider as fallback for ECDH operations\n this.nobleProvider = new NobleCryptoProvider(logger);\n }\n\n /**\n * Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair using Noble (fallback)');\n\n // Use Noble for key generation as QuickCrypto doesn't support P-256 ECDH\n const nobleKeyPair = await this.nobleProvider.generateKeyPair();\n\n // Wrap in QuickCryptoKey for consistency\n if (!hasKeyData(nobleKeyPair.privateKey) || !hasKeyData(nobleKeyPair.publicKey)) {\n throw new Error('Noble keys missing required data property');\n }\n\n return {\n privateKey: new QuickCryptoKey(nobleKeyPair.privateKey.data, 'private', 'ECDH-P256', true, ['deriveKey']),\n publicKey: new QuickCryptoKey(nobleKeyPair.publicKey.data, 'public', 'ECDH-P256', true, []),\n };\n }\n\n /**\n * Export public key to ArrayBuffer (delegate to Noble)\n */\n exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPublicKey(publicKey);\n }\n\n /**\n * Export private key to ArrayBuffer (delegate to Noble)\n */\n exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPrivateKey(privateKey);\n }\n\n /**\n * Import public key from ArrayBuffer (delegate to Noble)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPublicKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble public key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(nobleKey.data, 'public', 'ECDH-P256', true, []);\n }\n\n /**\n * Import private key from ArrayBuffer (delegate to Noble)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPrivateKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble private key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(nobleKey.data, 'private', 'ECDH-P256', true, ['deriveKey']);\n }\n\n /**\n * Derive shared secret from ECDH key agreement (delegate to Noble)\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using Noble (fallback)');\n\n const sharedSecret = await this.nobleProvider.deriveSharedSecret(privateKey, publicKey);\n\n if (!hasKeyData(sharedSecret)) {\n throw new Error('Noble shared secret missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(sharedSecret.data, 'secret', 'AES-GCM', true, ['encrypt', 'decrypt']);\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF (delegate to Noble)\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n const encryptionKey = await this.nobleProvider.deriveEncryptionKey(sharedSecret, salt, info);\n\n if (!hasKeyData(encryptionKey)) {\n throw new Error('Noble encryption key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(encryptionKey.data, 'secret', 'AES-GCM', true, ['encrypt', 'decrypt']);\n }\n\n /**\n * Generate random bytes using QuickCrypto (58x faster than crypto-browserify)\n */\n randomBytes(length: number): ArrayBuffer {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for randomBytes');\n return this.nobleProvider.randomBytes(length);\n }\n\n try {\n const bytes = this.quickCrypto.randomBytes(length);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto randomBytes failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return this.nobleProvider.randomBytes(length);\n }\n }\n\n /**\n * Encrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for encryption');\n return this.nobleProvider.encrypt(key, data, iv);\n }\n\n this.logger?.debug('Encrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength,\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Encryption failed - invalid key type', {\n actualType: secretKey.type,\n });\n throw error;\n }\n\n try {\n // Use QuickCrypto's Node.js-compatible AES-GCM implementation\n const cipher = this.quickCrypto.createCipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n const encrypted = cipher.update(new Uint8Array(data));\n const final = cipher.final();\n\n // Get authentication tag (GCM mode)\n const authTag = cipher.getAuthTag?.() || new Uint8Array(16);\n\n // Combine encrypted data + auth tag (standard AES-GCM format)\n const result = new Uint8Array(encrypted.length + final.length + authTag.length);\n result.set(encrypted, 0);\n result.set(final, encrypted.length);\n result.set(authTag, encrypted.length + final.length);\n\n this.logger?.debug('Encryption completed using QuickCrypto', {\n ciphertextSize: result.byteLength,\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto encryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n return this.nobleProvider.encrypt(key, data, iv);\n }\n }\n\n /**\n * Decrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for decryption');\n return this.nobleProvider.decrypt(key, data, iv);\n }\n\n this.logger?.debug('Decrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength,\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Decryption failed - invalid key type', {\n actualType: secretKey.type,\n });\n throw error;\n }\n\n try {\n const dataBytes = new Uint8Array(data);\n\n // Extract auth tag from end of data (last 16 bytes for GCM)\n const authTagLength = 16;\n if (dataBytes.length < authTagLength) {\n throw new Error('Data too short to contain auth tag');\n }\n\n const ciphertext = dataBytes.slice(0, -authTagLength);\n const authTag = dataBytes.slice(-authTagLength);\n\n const decipher = this.quickCrypto.createDecipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n // Set auth tag for verification\n decipher.setAuthTag?.(authTag);\n\n const decrypted = decipher.update(ciphertext);\n const final = decipher.final();\n\n // Combine decrypted chunks\n const result = new Uint8Array(decrypted.length + final.length);\n result.set(decrypted, 0);\n result.set(final, decrypted.length);\n\n this.logger?.debug('Decryption completed using QuickCrypto', {\n plaintextSize: result.byteLength,\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto decryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n return this.nobleProvider.decrypt(key, data, iv);\n }\n }\n\n /**\n * Generate HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC');\n return this.nobleProvider.generateHMAC(key, data);\n }\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n try {\n const hmac = this.quickCrypto.createHmac('sha256', secretKey.data);\n hmac.update(new Uint8Array(data));\n const mac = hmac.digest();\n\n return mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return this.nobleProvider.generateHMAC(key, data);\n }\n }\n\n /**\n * Verify HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC verification');\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n\n try {\n const expectedMac = await this.generateHMAC(key, data);\n const providedMac = new Uint8Array(mac);\n const expectedMacBytes = new Uint8Array(expectedMac);\n\n // Constant-time comparison\n if (expectedMacBytes.length !== providedMac.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < expectedMacBytes.length; i++) {\n result |= expectedMacBytes[i] ^ providedMac[i];\n }\n\n return result === 0;\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC verification failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Logger } from '@bananalink-sdk/logger';
|
|
2
2
|
import { C as CryptoProvider, P as ProviderKeyPair, a as CryptoKeyLike } from '../../crypto-provider-deYoVIxi.cjs';
|
|
3
|
-
import './noble-provider.cjs';
|
|
4
3
|
|
|
5
4
|
declare class QuickCryptoProvider implements CryptoProvider {
|
|
6
5
|
readonly name = "QuickCrypto";
|
|
@@ -23,12 +22,4 @@ declare class QuickCryptoProvider implements CryptoProvider {
|
|
|
23
22
|
verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean>;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
declare global {
|
|
27
|
-
namespace BananaLink {
|
|
28
|
-
interface RegisteredCryptoProviders {
|
|
29
|
-
quickcrypto: true;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
25
|
export { QuickCryptoProvider };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Logger } from '@bananalink-sdk/logger';
|
|
2
2
|
import { C as CryptoProvider, P as ProviderKeyPair, a as CryptoKeyLike } from '../../crypto-provider-deYoVIxi.js';
|
|
3
|
-
import './noble-provider.js';
|
|
4
3
|
|
|
5
4
|
declare class QuickCryptoProvider implements CryptoProvider {
|
|
6
5
|
readonly name = "QuickCrypto";
|
|
@@ -23,12 +22,4 @@ declare class QuickCryptoProvider implements CryptoProvider {
|
|
|
23
22
|
verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean>;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
declare global {
|
|
27
|
-
namespace BananaLink {
|
|
28
|
-
interface RegisteredCryptoProviders {
|
|
29
|
-
quickcrypto: true;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
25
|
export { QuickCryptoProvider };
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { NobleCryptoProvider } from '../../chunk-
|
|
2
|
-
import { registerCryptoProvider } from '../../chunk-TCVKC227.js';
|
|
1
|
+
import { NobleCryptoProvider } from '../../chunk-KJ7QIHAY.js';
|
|
3
2
|
import { __name } from '../../chunk-WCQVDF3K.js';
|
|
4
3
|
|
|
5
4
|
// src/crypto/providers/quickcrypto-provider.ts
|
|
@@ -67,20 +66,8 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
67
66
|
throw new Error("Noble keys missing required data property");
|
|
68
67
|
}
|
|
69
68
|
return {
|
|
70
|
-
privateKey: new QuickCryptoKey(
|
|
71
|
-
|
|
72
|
-
"private",
|
|
73
|
-
"ECDH-P256",
|
|
74
|
-
true,
|
|
75
|
-
["deriveKey"]
|
|
76
|
-
),
|
|
77
|
-
publicKey: new QuickCryptoKey(
|
|
78
|
-
nobleKeyPair.publicKey.data,
|
|
79
|
-
"public",
|
|
80
|
-
"ECDH-P256",
|
|
81
|
-
true,
|
|
82
|
-
[]
|
|
83
|
-
)
|
|
69
|
+
privateKey: new QuickCryptoKey(nobleKeyPair.privateKey.data, "private", "ECDH-P256", true, ["deriveKey"]),
|
|
70
|
+
publicKey: new QuickCryptoKey(nobleKeyPair.publicKey.data, "public", "ECDH-P256", true, [])
|
|
84
71
|
};
|
|
85
72
|
}
|
|
86
73
|
/**
|
|
@@ -103,13 +90,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
103
90
|
if (!hasKeyData(nobleKey)) {
|
|
104
91
|
throw new Error("Noble public key missing required data property");
|
|
105
92
|
}
|
|
106
|
-
return new QuickCryptoKey(
|
|
107
|
-
nobleKey.data,
|
|
108
|
-
"public",
|
|
109
|
-
"ECDH-P256",
|
|
110
|
-
true,
|
|
111
|
-
[]
|
|
112
|
-
);
|
|
93
|
+
return new QuickCryptoKey(nobleKey.data, "public", "ECDH-P256", true, []);
|
|
113
94
|
}
|
|
114
95
|
/**
|
|
115
96
|
* Import private key from ArrayBuffer (delegate to Noble)
|
|
@@ -119,13 +100,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
119
100
|
if (!hasKeyData(nobleKey)) {
|
|
120
101
|
throw new Error("Noble private key missing required data property");
|
|
121
102
|
}
|
|
122
|
-
return new QuickCryptoKey(
|
|
123
|
-
nobleKey.data,
|
|
124
|
-
"private",
|
|
125
|
-
"ECDH-P256",
|
|
126
|
-
true,
|
|
127
|
-
["deriveKey"]
|
|
128
|
-
);
|
|
103
|
+
return new QuickCryptoKey(nobleKey.data, "private", "ECDH-P256", true, ["deriveKey"]);
|
|
129
104
|
}
|
|
130
105
|
/**
|
|
131
106
|
* Derive shared secret from ECDH key agreement (delegate to Noble)
|
|
@@ -136,13 +111,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
136
111
|
if (!hasKeyData(sharedSecret)) {
|
|
137
112
|
throw new Error("Noble shared secret missing required data property");
|
|
138
113
|
}
|
|
139
|
-
return new QuickCryptoKey(
|
|
140
|
-
sharedSecret.data,
|
|
141
|
-
"secret",
|
|
142
|
-
"AES-GCM",
|
|
143
|
-
true,
|
|
144
|
-
["encrypt", "decrypt"]
|
|
145
|
-
);
|
|
114
|
+
return new QuickCryptoKey(sharedSecret.data, "secret", "AES-GCM", true, ["encrypt", "decrypt"]);
|
|
146
115
|
}
|
|
147
116
|
/**
|
|
148
117
|
* Derive AES-GCM key from shared secret using HKDF (delegate to Noble)
|
|
@@ -152,13 +121,7 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
152
121
|
if (!hasKeyData(encryptionKey)) {
|
|
153
122
|
throw new Error("Noble encryption key missing required data property");
|
|
154
123
|
}
|
|
155
|
-
return new QuickCryptoKey(
|
|
156
|
-
encryptionKey.data,
|
|
157
|
-
"secret",
|
|
158
|
-
"AES-GCM",
|
|
159
|
-
true,
|
|
160
|
-
["encrypt", "decrypt"]
|
|
161
|
-
);
|
|
124
|
+
return new QuickCryptoKey(encryptionKey.data, "secret", "AES-GCM", true, ["encrypt", "decrypt"]);
|
|
162
125
|
}
|
|
163
126
|
/**
|
|
164
127
|
* Generate random bytes using QuickCrypto (58x faster than crypto-browserify)
|
|
@@ -330,7 +293,6 @@ var _QuickCryptoProvider = class _QuickCryptoProvider {
|
|
|
330
293
|
};
|
|
331
294
|
__name(_QuickCryptoProvider, "QuickCryptoProvider");
|
|
332
295
|
var QuickCryptoProvider = _QuickCryptoProvider;
|
|
333
|
-
registerCryptoProvider("quickcrypto", (logger) => new QuickCryptoProvider(logger));
|
|
334
296
|
|
|
335
297
|
export { QuickCryptoProvider };
|
|
336
298
|
//# sourceMappingURL=quickcrypto-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/crypto/providers/quickcrypto-provider.ts"],"names":[],"mappings":"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","file":"quickcrypto-provider.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { NobleCryptoProvider } from './noble-provider';\nimport { registerCryptoProvider } from './registry';\n\n// Global require function type for React Native environments\ntype RequireFunction = (id: string) => unknown;\ntype GlobalWithRequire = typeof globalThis & {\n require?: RequireFunction;\n};\n\n/**\n * Type guard to check if a key has a data property (from Noble provider)\n */\nfunction hasKeyData(key: CryptoKeyLike): key is CryptoKeyLike & { data: Uint8Array } {\n return 'data' in key && key.data instanceof Uint8Array;\n}\n\n// Type definitions for react-native-quick-crypto Node.js-like API\ninterface QuickCryptoHash {\n update(data: Uint8Array): void;\n digest(): Uint8Array;\n}\n\ninterface QuickCryptoCipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n getAuthTag?(): Uint8Array;\n}\n\ninterface QuickCryptoDecipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n setAuthTag?(authTag: Uint8Array): void;\n}\n\ninterface QuickCrypto {\n randomBytes(size: number): Uint8Array;\n createHash(algorithm: string): QuickCryptoHash;\n createHmac(algorithm: string, key: Uint8Array): QuickCryptoHash;\n createCipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoCipher;\n createDecipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoDecipher;\n}\n\n/**\n * QuickCrypto key wrapper to implement CryptoKeyLike interface\n */\nclass QuickCryptoKey implements CryptoKeyLike {\n constructor(\n public readonly data: Uint8Array,\n public readonly type: 'public' | 'private' | 'secret',\n public readonly algorithm: string,\n public readonly extractable: boolean = true,\n public readonly usages: readonly string[] = []\n ) {}\n}\n\n/**\n * Check if react-native-quick-crypto is available\n */\nfunction isQuickCryptoAvailable(): boolean {\n try {\n // Use globalThis.require for React Native compatibility\n const global = globalThis as GlobalWithRequire;\n if (!global.require) return false;\n\n const quickCrypto = global.require('react-native-quick-crypto') as QuickCrypto | undefined;\n if (!quickCrypto) return false;\n\n return (\n typeof quickCrypto.randomBytes === 'function' &&\n typeof quickCrypto.createHash === 'function' &&\n typeof quickCrypto.createHmac === 'function' &&\n typeof quickCrypto.createCipheriv === 'function'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * React Native QuickCrypto implementation of CryptoProvider\n * Hybrid approach: uses Noble for ECDH operations and QuickCrypto for AES/HMAC/hashing\n * This provides optimal performance while maintaining full compatibility\n */\nexport class QuickCryptoProvider implements CryptoProvider {\n public readonly name = 'QuickCrypto';\n public readonly isAvailable: boolean;\n\n private readonly logger?: Logger;\n private readonly quickCrypto?: QuickCrypto;\n private readonly nobleProvider: NobleCryptoProvider;\n\n constructor(logger?: Logger) {\n this.logger = logger?.child({ component: 'QuickCryptoProvider' });\n this.isAvailable = isQuickCryptoAvailable();\n\n if (this.isAvailable) {\n try {\n const global = globalThis as GlobalWithRequire;\n this.quickCrypto = global.require?.('react-native-quick-crypto') as QuickCrypto | undefined;\n if (this.quickCrypto) {\n this.logger?.debug('QuickCrypto initialized successfully');\n } else {\n this.logger?.warn('QuickCrypto require returned undefined');\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n } catch (error) {\n this.logger?.error('Failed to initialize QuickCrypto', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n }\n\n // Always initialize Noble provider as fallback for ECDH operations\n this.nobleProvider = new NobleCryptoProvider(logger);\n }\n\n /**\n * Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair using Noble (fallback)');\n\n // Use Noble for key generation as QuickCrypto doesn't support P-256 ECDH\n const nobleKeyPair = await this.nobleProvider.generateKeyPair();\n\n // Wrap in QuickCryptoKey for consistency\n if (!hasKeyData(nobleKeyPair.privateKey) || !hasKeyData(nobleKeyPair.publicKey)) {\n throw new Error('Noble keys missing required data property');\n }\n\n return {\n privateKey: new QuickCryptoKey(\n nobleKeyPair.privateKey.data,\n 'private',\n 'ECDH-P256',\n true,\n ['deriveKey']\n ),\n publicKey: new QuickCryptoKey(\n nobleKeyPair.publicKey.data,\n 'public',\n 'ECDH-P256',\n true,\n []\n )\n };\n }\n\n /**\n * Export public key to ArrayBuffer (delegate to Noble)\n */\n exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPublicKey(publicKey);\n }\n\n /**\n * Export private key to ArrayBuffer (delegate to Noble)\n */\n exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPrivateKey(privateKey);\n }\n\n /**\n * Import public key from ArrayBuffer (delegate to Noble)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPublicKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble public key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n nobleKey.data,\n 'public',\n 'ECDH-P256',\n true,\n []\n );\n }\n\n /**\n * Import private key from ArrayBuffer (delegate to Noble)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPrivateKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble private key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n nobleKey.data,\n 'private',\n 'ECDH-P256',\n true,\n ['deriveKey']\n );\n }\n\n /**\n * Derive shared secret from ECDH key agreement (delegate to Noble)\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using Noble (fallback)');\n\n const sharedSecret = await this.nobleProvider.deriveSharedSecret(privateKey, publicKey);\n\n if (!hasKeyData(sharedSecret)) {\n throw new Error('Noble shared secret missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n sharedSecret.data,\n 'secret',\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF (delegate to Noble)\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n const encryptionKey = await this.nobleProvider.deriveEncryptionKey(sharedSecret, salt, info);\n\n if (!hasKeyData(encryptionKey)) {\n throw new Error('Noble encryption key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(\n encryptionKey.data,\n 'secret',\n 'AES-GCM',\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n /**\n * Generate random bytes using QuickCrypto (58x faster than crypto-browserify)\n */\n randomBytes(length: number): ArrayBuffer {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for randomBytes');\n return this.nobleProvider.randomBytes(length);\n }\n\n try {\n const bytes = this.quickCrypto.randomBytes(length);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto randomBytes failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.randomBytes(length);\n }\n }\n\n /**\n * Encrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for encryption');\n return this.nobleProvider.encrypt(key, data, iv);\n }\n\n this.logger?.debug('Encrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Encryption failed - invalid key type', {\n actualType: secretKey.type\n });\n throw error;\n }\n\n try {\n // Use QuickCrypto's Node.js-compatible AES-GCM implementation\n const cipher = this.quickCrypto.createCipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n const encrypted = cipher.update(new Uint8Array(data));\n const final = cipher.final();\n\n // Get authentication tag (GCM mode)\n const authTag = cipher.getAuthTag?.() || new Uint8Array(16);\n\n // Combine encrypted data + auth tag (standard AES-GCM format)\n const result = new Uint8Array(encrypted.length + final.length + authTag.length);\n result.set(encrypted, 0);\n result.set(final, encrypted.length);\n result.set(authTag, encrypted.length + final.length);\n\n this.logger?.debug('Encryption completed using QuickCrypto', {\n ciphertextSize: result.byteLength\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto encryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n return this.nobleProvider.encrypt(key, data, iv);\n }\n }\n\n /**\n * Decrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for decryption');\n return this.nobleProvider.decrypt(key, data, iv);\n }\n\n this.logger?.debug('Decrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Decryption failed - invalid key type', {\n actualType: secretKey.type\n });\n throw error;\n }\n\n try {\n const dataBytes = new Uint8Array(data);\n\n // Extract auth tag from end of data (last 16 bytes for GCM)\n const authTagLength = 16;\n if (dataBytes.length < authTagLength) {\n throw new Error('Data too short to contain auth tag');\n }\n\n const ciphertext = dataBytes.slice(0, -authTagLength);\n const authTag = dataBytes.slice(-authTagLength);\n\n const decipher = this.quickCrypto.createDecipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n // Set auth tag for verification\n decipher.setAuthTag?.(authTag);\n\n const decrypted = decipher.update(ciphertext);\n const final = decipher.final();\n\n // Combine decrypted chunks\n const result = new Uint8Array(decrypted.length + final.length);\n result.set(decrypted, 0);\n result.set(final, decrypted.length);\n\n this.logger?.debug('Decryption completed using QuickCrypto', {\n plaintextSize: result.byteLength\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto decryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n return this.nobleProvider.decrypt(key, data, iv);\n }\n }\n\n /**\n * Generate HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC');\n return this.nobleProvider.generateHMAC(key, data);\n }\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n try {\n const hmac = this.quickCrypto.createHmac('sha256', secretKey.data);\n hmac.update(new Uint8Array(data));\n const mac = hmac.digest();\n\n return mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.generateHMAC(key, data);\n }\n }\n\n /**\n * Verify HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC verification');\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n\n try {\n const expectedMac = await this.generateHMAC(key, data);\n const providedMac = new Uint8Array(mac);\n const expectedMacBytes = new Uint8Array(expectedMac);\n\n // Constant-time comparison\n if (expectedMacBytes.length !== providedMac.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < expectedMacBytes.length; i++) {\n result |= expectedMacBytes[i] ^ providedMac[i];\n }\n\n return result === 0;\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC verification failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error)\n }\n });\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n }\n}\n\n/**\n * Self-register QuickCrypto provider on import\n * This allows the provider to be available when explicitly imported\n *\n * Note: QuickCrypto depends on Noble for ECDH operations, so we auto-register\n * Noble as well to ensure all required functionality is available.\n */\n// Auto-register noble as a dependency (QuickCrypto delegates ECDH to Noble)\nimport './noble-provider';\n\nregisterCryptoProvider('quickcrypto', (logger) => new QuickCryptoProvider(logger));\n\n// TypeScript module augmentation to track this provider is available\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace BananaLink {\n interface RegisteredCryptoProviders {\n quickcrypto: true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/crypto/providers/quickcrypto-provider.ts"],"names":[],"mappings":"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","file":"quickcrypto-provider.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { NobleCryptoProvider } from './noble-provider';\n\n// Global require function type for React Native environments\ntype RequireFunction = (id: string) => unknown;\ntype GlobalWithRequire = typeof globalThis & {\n require?: RequireFunction;\n};\n\n/**\n * Type guard to check if a key has a data property (from Noble provider)\n */\nfunction hasKeyData(key: CryptoKeyLike): key is CryptoKeyLike & { data: Uint8Array } {\n return 'data' in key && key.data instanceof Uint8Array;\n}\n\n// Type definitions for react-native-quick-crypto Node.js-like API\ninterface QuickCryptoHash {\n update(data: Uint8Array): void;\n digest(): Uint8Array;\n}\n\ninterface QuickCryptoCipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n getAuthTag?(): Uint8Array;\n}\n\ninterface QuickCryptoDecipher {\n update(data: Uint8Array): Uint8Array;\n final(): Uint8Array;\n setAuthTag?(authTag: Uint8Array): void;\n}\n\ninterface QuickCrypto {\n randomBytes(size: number): Uint8Array;\n createHash(algorithm: string): QuickCryptoHash;\n createHmac(algorithm: string, key: Uint8Array): QuickCryptoHash;\n createCipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoCipher;\n createDecipheriv(algorithm: string, key: Uint8Array, iv: Uint8Array): QuickCryptoDecipher;\n}\n\n/**\n * QuickCrypto key wrapper to implement CryptoKeyLike interface\n */\nclass QuickCryptoKey implements CryptoKeyLike {\n constructor(\n public readonly data: Uint8Array,\n public readonly type: 'public' | 'private' | 'secret',\n public readonly algorithm: string,\n public readonly extractable: boolean = true,\n public readonly usages: readonly string[] = [],\n ) {}\n}\n\n/**\n * Check if react-native-quick-crypto is available\n */\nfunction isQuickCryptoAvailable(): boolean {\n try {\n // Use globalThis.require for React Native compatibility\n const global = globalThis as GlobalWithRequire;\n if (!global.require) return false;\n\n const quickCrypto = global.require('react-native-quick-crypto') as QuickCrypto | undefined;\n if (!quickCrypto) return false;\n\n return (\n typeof quickCrypto.randomBytes === 'function' &&\n typeof quickCrypto.createHash === 'function' &&\n typeof quickCrypto.createHmac === 'function' &&\n typeof quickCrypto.createCipheriv === 'function'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * React Native QuickCrypto implementation of CryptoProvider\n * Hybrid approach: uses Noble for ECDH operations and QuickCrypto for AES/HMAC/hashing\n * This provides optimal performance while maintaining full compatibility\n */\nexport class QuickCryptoProvider implements CryptoProvider {\n public readonly name = 'QuickCrypto';\n public readonly isAvailable: boolean;\n\n private readonly logger?: Logger;\n private readonly quickCrypto?: QuickCrypto;\n private readonly nobleProvider: NobleCryptoProvider;\n\n constructor(logger?: Logger) {\n this.logger = logger?.child({ component: 'QuickCryptoProvider' });\n this.isAvailable = isQuickCryptoAvailable();\n\n if (this.isAvailable) {\n try {\n const global = globalThis as GlobalWithRequire;\n this.quickCrypto = global.require?.('react-native-quick-crypto') as QuickCrypto | undefined;\n if (this.quickCrypto) {\n this.logger?.debug('QuickCrypto initialized successfully');\n } else {\n this.logger?.warn('QuickCrypto require returned undefined');\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n } catch (error) {\n this.logger?.error('Failed to initialize QuickCrypto', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n // Mark as unavailable if we can't actually use it\n (this as { isAvailable: boolean }).isAvailable = false;\n }\n }\n\n // Always initialize Noble provider as fallback for ECDH operations\n this.nobleProvider = new NobleCryptoProvider(logger);\n }\n\n /**\n * Generate ECDH P-256 key pair using Noble (QuickCrypto doesn't support P-256 ECDH)\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair using Noble (fallback)');\n\n // Use Noble for key generation as QuickCrypto doesn't support P-256 ECDH\n const nobleKeyPair = await this.nobleProvider.generateKeyPair();\n\n // Wrap in QuickCryptoKey for consistency\n if (!hasKeyData(nobleKeyPair.privateKey) || !hasKeyData(nobleKeyPair.publicKey)) {\n throw new Error('Noble keys missing required data property');\n }\n\n return {\n privateKey: new QuickCryptoKey(nobleKeyPair.privateKey.data, 'private', 'ECDH-P256', true, ['deriveKey']),\n publicKey: new QuickCryptoKey(nobleKeyPair.publicKey.data, 'public', 'ECDH-P256', true, []),\n };\n }\n\n /**\n * Export public key to ArrayBuffer (delegate to Noble)\n */\n exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPublicKey(publicKey);\n }\n\n /**\n * Export private key to ArrayBuffer (delegate to Noble)\n */\n exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return this.nobleProvider.exportPrivateKey(privateKey);\n }\n\n /**\n * Import public key from ArrayBuffer (delegate to Noble)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPublicKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble public key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(nobleKey.data, 'public', 'ECDH-P256', true, []);\n }\n\n /**\n * Import private key from ArrayBuffer (delegate to Noble)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const nobleKey = await this.nobleProvider.importPrivateKey(keyData);\n\n if (!hasKeyData(nobleKey)) {\n throw new Error('Noble private key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(nobleKey.data, 'private', 'ECDH-P256', true, ['deriveKey']);\n }\n\n /**\n * Derive shared secret from ECDH key agreement (delegate to Noble)\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using Noble (fallback)');\n\n const sharedSecret = await this.nobleProvider.deriveSharedSecret(privateKey, publicKey);\n\n if (!hasKeyData(sharedSecret)) {\n throw new Error('Noble shared secret missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(sharedSecret.data, 'secret', 'AES-GCM', true, ['encrypt', 'decrypt']);\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF (delegate to Noble)\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n const encryptionKey = await this.nobleProvider.deriveEncryptionKey(sharedSecret, salt, info);\n\n if (!hasKeyData(encryptionKey)) {\n throw new Error('Noble encryption key missing required data property');\n }\n\n // Wrap in QuickCryptoKey for consistency\n return new QuickCryptoKey(encryptionKey.data, 'secret', 'AES-GCM', true, ['encrypt', 'decrypt']);\n }\n\n /**\n * Generate random bytes using QuickCrypto (58x faster than crypto-browserify)\n */\n randomBytes(length: number): ArrayBuffer {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for randomBytes');\n return this.nobleProvider.randomBytes(length);\n }\n\n try {\n const bytes = this.quickCrypto.randomBytes(length);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto randomBytes failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return this.nobleProvider.randomBytes(length);\n }\n }\n\n /**\n * Encrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for encryption');\n return this.nobleProvider.encrypt(key, data, iv);\n }\n\n this.logger?.debug('Encrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength,\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Encryption failed - invalid key type', {\n actualType: secretKey.type,\n });\n throw error;\n }\n\n try {\n // Use QuickCrypto's Node.js-compatible AES-GCM implementation\n const cipher = this.quickCrypto.createCipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n const encrypted = cipher.update(new Uint8Array(data));\n const final = cipher.final();\n\n // Get authentication tag (GCM mode)\n const authTag = cipher.getAuthTag?.() || new Uint8Array(16);\n\n // Combine encrypted data + auth tag (standard AES-GCM format)\n const result = new Uint8Array(encrypted.length + final.length + authTag.length);\n result.set(encrypted, 0);\n result.set(final, encrypted.length);\n result.set(authTag, encrypted.length + final.length);\n\n this.logger?.debug('Encryption completed using QuickCrypto', {\n ciphertextSize: result.byteLength,\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto encryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n return this.nobleProvider.encrypt(key, data, iv);\n }\n }\n\n /**\n * Decrypt data using AES-GCM with QuickCrypto (much faster than Noble)\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for decryption');\n return this.nobleProvider.decrypt(key, data, iv);\n }\n\n this.logger?.debug('Decrypting data with AES-GCM using QuickCrypto', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength,\n });\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n const error = new Error('Expected secret key');\n this.logger?.error('Decryption failed - invalid key type', {\n actualType: secretKey.type,\n });\n throw error;\n }\n\n try {\n const dataBytes = new Uint8Array(data);\n\n // Extract auth tag from end of data (last 16 bytes for GCM)\n const authTagLength = 16;\n if (dataBytes.length < authTagLength) {\n throw new Error('Data too short to contain auth tag');\n }\n\n const ciphertext = dataBytes.slice(0, -authTagLength);\n const authTag = dataBytes.slice(-authTagLength);\n\n const decipher = this.quickCrypto.createDecipheriv('aes-256-gcm', secretKey.data, new Uint8Array(iv));\n\n // Set auth tag for verification\n decipher.setAuthTag?.(authTag);\n\n const decrypted = decipher.update(ciphertext);\n const final = decipher.final();\n\n // Combine decrypted chunks\n const result = new Uint8Array(decrypted.length + final.length);\n result.set(decrypted, 0);\n result.set(final, decrypted.length);\n\n this.logger?.debug('Decryption completed using QuickCrypto', {\n plaintextSize: result.byteLength,\n });\n\n return result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto decryption failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n return this.nobleProvider.decrypt(key, data, iv);\n }\n }\n\n /**\n * Generate HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC');\n return this.nobleProvider.generateHMAC(key, data);\n }\n\n const secretKey = key as QuickCryptoKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n try {\n const hmac = this.quickCrypto.createHmac('sha256', secretKey.data);\n hmac.update(new Uint8Array(data));\n const mac = hmac.digest();\n\n return mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength);\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return this.nobleProvider.generateHMAC(key, data);\n }\n }\n\n /**\n * Verify HMAC-SHA256 using QuickCrypto (faster than Noble)\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n if (!this.quickCrypto || !this.isAvailable) {\n this.logger?.debug('QuickCrypto not available, falling back to Noble for HMAC verification');\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n\n try {\n const expectedMac = await this.generateHMAC(key, data);\n const providedMac = new Uint8Array(mac);\n const expectedMacBytes = new Uint8Array(expectedMac);\n\n // Constant-time comparison\n if (expectedMacBytes.length !== providedMac.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < expectedMacBytes.length; i++) {\n result |= expectedMacBytes[i] ^ providedMac[i];\n }\n\n return result === 0;\n } catch (error) {\n this.logger?.error('QuickCrypto HMAC verification failed, falling back to Noble', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n });\n return this.nobleProvider.verifyHMAC(key, data, mac);\n }\n }\n}\n"]}
|