@bananalink-sdk/protocol 1.2.8 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/{chunk-KNGZKGRS.cjs → chunk-RZPN2GDJ.cjs} +13 -4
- package/dist/chunk-RZPN2GDJ.cjs.map +1 -0
- package/dist/{chunk-7KYDLL3B.js → chunk-XCMAKN3P.js} +13 -5
- package/dist/chunk-XCMAKN3P.js.map +1 -0
- package/dist/{client-session-claim-C4lUik3b.d.cts → client-session-claim-CkRKTG50.d.cts} +12 -2
- package/dist/{client-session-claim-3QF3noOr.d.ts → client-session-claim-CrIDASkZ.d.ts} +12 -2
- 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-BUS06Qz-.d.cts → crypto-BK0Ile6V.d.cts} +1 -1
- package/dist/{crypto-BUS06Qz-.d.ts → crypto-BK0Ile6V.d.ts} +1 -1
- package/dist/crypto-export.cjs +50 -51
- package/dist/crypto-export.cjs.map +1 -1
- package/dist/crypto-export.d.cts +1 -1
- package/dist/crypto-export.d.ts +1 -1
- package/dist/crypto-export.js +2 -4
- package/dist/crypto-export.js.map +1 -1
- package/dist/index.cjs +8 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -4
- package/dist/index.d.ts +31 -4
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/schemas-export.cjs +76 -72
- package/dist/schemas-export.d.cts +116 -1
- package/dist/schemas-export.d.ts +116 -1
- package/dist/schemas-export.js +1 -1
- package/dist/testing.d.cts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/validation-export.cjs +76 -72
- package/dist/validation-export.d.cts +1 -1
- package/dist/validation-export.d.ts +1 -1
- package/dist/validation-export.js +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/src/index.ts +1 -0
- package/src/schemas/client-messages.ts +14 -0
- package/src/schemas/wallet-messages.ts +4 -0
- package/src/types/client-messages.ts +26 -1
- package/src/types/index.ts +9 -0
- package/src/types/persistence.ts +32 -0
- package/src/types/wallet-messages.ts +6 -2
- package/dist/chunk-32OWUOZ3.js.map +0 -1
- package/dist/chunk-7KYDLL3B.js.map +0 -1
- package/dist/chunk-A6FLEJ7R.cjs +0 -62
- package/dist/chunk-A6FLEJ7R.cjs.map +0 -1
- package/dist/chunk-KNGZKGRS.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,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":";;;;AAaA,SAAS,WAAW,GAAA,EAAiE;AACnF,EAAA,OAAO,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,IAAA,YAAgB,UAAA;AAC9C;AAFS,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAiCT,IAAM,eAAA,GAAN,MAAM,eAAA,CAAwC;AAAA,EAC5C,WAAA,CACkB,MACA,IAAA,EACA,SAAA,EACA,cAAuB,IAAA,EACvB,MAAA,GAA4B,EAAC,EAC7C;AALgB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACf;AACL,CAAA;AAR8C,MAAA,CAAA,eAAA,EAAA,gBAAA,CAAA;AAA9C,IAAM,cAAA,GAAN,eAAA;AAaA,SAAS,sBAAA,GAAkC;AACzC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,UAAA;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,KAAA;AAE5B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,2BAA2B,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAEzB,IAAA,OACE,OAAO,WAAA,CAAY,WAAA,KAAgB,UAAA,IACnC,OAAO,WAAA,CAAY,UAAA,KAAe,UAAA,IAClC,OAAO,WAAA,CAAY,UAAA,KAAe,UAAA,IAClC,OAAO,YAAY,cAAA,KAAmB,UAAA;AAAA,EAE1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAlBS,MAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AAyBF,IAAM,oBAAA,GAAN,MAAM,oBAAA,CAA8C;AAAA,EAQzD,YAAY,MAAA,EAAiB;AAP7B,IAAA,IAAA,CAAgB,IAAA,GAAO,aAAA;AAQrB,IAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA,CAAM,EAAE,SAAA,EAAW,uBAAuB,CAAA;AAChE,IAAA,IAAA,CAAK,cAAc,sBAAA,EAAuB;AAE1C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,UAAA;AACf,QAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,OAAA,GAAU,2BAA2B,CAAA;AAC/D,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sCAAsC,CAAA;AAAA,QAC3D,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,wCAAwC,CAAA;AAE1D,UAAC,KAAkC,WAAA,GAAc,KAAA;AAAA,QACnD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,kCAAA,EAAoC;AAAA,UACrD,KAAA,EAAO;AAAA,YACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,YAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA;AAChD,SACD,CAAA;AAED,QAAC,KAAkC,WAAA,GAAc,KAAA;AAAA,MACnD;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,mBAAA,CAAoB,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAA4C;AAChD,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,uDAAuD,CAAA;AAG1E,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,aAAA,CAAc,eAAA,EAAgB;AAG9D,IAAA,IAAI,CAAC,WAAW,YAAA,CAAa,UAAU,KAAK,CAAC,UAAA,CAAW,YAAA,CAAa,SAAS,CAAA,EAAG;AAC/E,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAI,cAAA,CAAe,YAAA,CAAa,UAAA,CAAW,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,CAAC,WAAW,CAAC,CAAA;AAAA,MACxG,SAAA,EAAW,IAAI,cAAA,CAAe,YAAA,CAAa,SAAA,CAAU,MAAM,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,EAAE;AAAA,KAC5F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAA,EAAgD;AAC9D,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,SAAS,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAA,EAAiD;AAChE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,UAAU,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAA8C;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAgB,OAAO,CAAA;AAEjE,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAGA,IAAA,OAAO,IAAI,eAAe,QAAA,CAAS,IAAA,EAAM,UAAU,WAAA,EAAa,IAAA,EAAM,EAAE,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAA8C;AACnE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,iBAAiB,OAAO,CAAA;AAElE,IAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AAGA,IAAA,OAAO,IAAI,eAAe,QAAA,CAAS,IAAA,EAAM,WAAW,WAAA,EAAa,IAAA,EAAM,CAAC,WAAW,CAAC,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,UAAA,EAA2B,SAAA,EAAkD;AACpG,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,+CAA+C,CAAA;AAElE,IAAA,MAAM,eAAe,MAAM,IAAA,CAAK,aAAA,CAAc,kBAAA,CAAmB,YAAY,SAAS,CAAA;AAEtF,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AAGA,IAAA,OAAO,IAAI,cAAA,CAAe,YAAA,CAAa,IAAA,EAAM,QAAA,EAAU,WAAW,IAAA,EAAM,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CAAoB,YAAA,EAA6B,IAAA,EAAmB,IAAA,EAA2C;AACnH,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,cAAc,mBAAA,CAAoB,YAAA,EAAc,MAAM,IAAI,CAAA;AAE3F,IAAA,IAAI,CAAC,UAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAGA,IAAA,OAAO,IAAI,cAAA,CAAe,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,WAAW,IAAA,EAAM,CAAC,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,kEAAkE,CAAA;AACrF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,MAAM,CAAA;AACjD,MAAA,OAAO,KAAA,CAAM,OAAO,KAAA,CAAM,KAAA,CAAM,YAAY,KAAA,CAAM,UAAA,GAAa,MAAM,UAAU,CAAA;AAAA,IACjF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,uDAAA,EAAyD;AAAA,QAC1E,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,GAAA,EAAoB,IAAA,EAAmB,EAAA,EAAuC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,iEAAiE,CAAA;AACpF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gDAAA,EAAkD;AAAA,MACnE,UAAU,IAAA,CAAK,UAAA;AAAA,MACf,QAAQ,EAAA,CAAG;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sCAAA,EAAwC;AAAA,QACzD,YAAY,SAAA,CAAU;AAAA,OACvB,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,aAAA,EAAe,UAAU,IAAA,EAAM,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAEhG,MAAA,MAAM,YAAY,MAAA,CAAO,MAAA,CAAO,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AACpD,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAG3B,MAAA,MAAM,UAAU,MAAA,CAAO,UAAA,IAAa,IAAK,IAAI,WAAW,EAAE,CAAA;AAG1D,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,SAAA,CAAU,SAAS,KAAA,CAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC9E,MAAA,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA;AACvB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,SAAA,CAAU,MAAM,CAAA;AAClC,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,SAAA,CAAU,MAAA,GAAS,MAAM,MAAM,CAAA;AAEnD,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,wCAAA,EAA0C;AAAA,QAC3D,gBAAgB,MAAA,CAAO;AAAA,OACxB,CAAA;AAED,MAAA,OAAO,MAAA,CAAO,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,MAAA,CAAO,UAAA,GAAa,OAAO,UAAU,CAAA;AAAA,IACrF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sDAAA,EAAwD;AAAA,QACzE,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA;AAChD,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,GAAA,EAAoB,IAAA,EAAmB,EAAA,EAAuC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,iEAAiE,CAAA;AACpF,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gDAAA,EAAkD;AAAA,MACnE,UAAU,IAAA,CAAK,UAAA;AAAA,MACf,QAAQ,EAAA,CAAG;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,qBAAqB,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sCAAA,EAAwC;AAAA,QACzD,YAAY,SAAA,CAAU;AAAA,OACvB,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,IAAI,CAAA;AAGrC,MAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,MAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,aAAa,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,CAAC,aAAa,CAAA;AAE9C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,aAAA,EAAe,UAAU,IAAA,EAAM,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAGpG,MAAA,QAAA,CAAS,aAAa,OAAO,CAAA;AAE7B,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,EAAM;AAG7B,MAAA,MAAM,SAAS,IAAI,UAAA,CAAW,SAAA,CAAU,MAAA,GAAS,MAAM,MAAM,CAAA;AAC7D,MAAA,MAAA,CAAO,GAAA,CAAI,WAAW,CAAC,CAAA;AACvB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,SAAA,CAAU,MAAM,CAAA;AAElC,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,wCAAA,EAA0C;AAAA,QAC3D,eAAe,MAAA,CAAO;AAAA,OACvB,CAAA;AAED,MAAA,OAAO,MAAA,CAAO,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,MAAA,CAAO,UAAA,GAAa,OAAO,UAAU,CAAA;AAAA,IACrF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,sDAAA,EAAwD;AAAA,QACzE,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC9D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA;AAChD,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,MAAM,EAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,GAAA,EAAoB,IAAA,EAAyC;AAC9E,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,2DAA2D,CAAA;AAC9E,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,SAAA,GAAY,GAAA;AAElB,IAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,QAAA,EAAU,UAAU,IAAI,CAAA;AACjE,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,EAAO;AAExB,MAAA,OAAO,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,CAAI,YAAY,GAAA,CAAI,UAAA,GAAa,IAAI,UAAU,CAAA;AAAA,IACzE,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gDAAA,EAAkD;AAAA,QACnE,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,GAAA,EAAK,IAAI,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,GAAA,EAAoB,IAAA,EAAmB,GAAA,EAAoC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,wEAAwE,CAAA;AAC3F,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA;AACrD,MAAA,MAAM,WAAA,GAAc,IAAI,UAAA,CAAW,GAAG,CAAA;AACtC,MAAA,MAAM,gBAAA,GAAmB,IAAI,UAAA,CAAW,WAAW,CAAA;AAGnD,MAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,WAAA,CAAY,MAAA,EAAQ;AAClD,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAA,EAAK;AAChD,QAAA,MAAA,IAAU,gBAAA,CAAiB,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAAA,MAC/C;AAEA,MAAA,OAAO,MAAA,KAAW,CAAA;AAAA,IACpB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,6DAAA,EAA+D;AAAA,QAChF,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE,OACD,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IACrD;AAAA,EACF;AACF,CAAA;AAnV2D,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAApD,IAAM,mBAAA,GAAN","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"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var chunkA6FLEJ7R_cjs = require('../../chunk-A6FLEJ7R.cjs');
|
|
4
3
|
var chunkWGEGR3DF_cjs = require('../../chunk-WGEGR3DF.cjs');
|
|
5
4
|
|
|
6
5
|
// src/crypto/providers/webcrypto-provider.ts
|
|
@@ -303,7 +302,6 @@ var _WebCryptoProvider = class _WebCryptoProvider {
|
|
|
303
302
|
};
|
|
304
303
|
chunkWGEGR3DF_cjs.__name(_WebCryptoProvider, "WebCryptoProvider");
|
|
305
304
|
var WebCryptoProvider = _WebCryptoProvider;
|
|
306
|
-
chunkA6FLEJ7R_cjs.registerCryptoProvider("webcrypto", () => new WebCryptoProvider());
|
|
307
305
|
|
|
308
306
|
exports.WebCryptoProvider = WebCryptoProvider;
|
|
309
307
|
//# sourceMappingURL=webcrypto-provider.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/crypto/providers/webcrypto-provider.ts"],"names":["__name","registerCryptoProvider"],"mappings":"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","file":"webcrypto-provider.cjs","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { registerCryptoProvider } from './registry';\n\n/**\n * WebCrypto CryptoKey wrapper to implement CryptoKeyLike interface\n */\nclass WebCryptoKeyWrapper implements CryptoKeyLike {\n constructor(private readonly cryptoKey: CryptoKey) {}\n\n get type(): 'public' | 'private' | 'secret' {\n return this.cryptoKey.type as 'public' | 'private' | 'secret';\n }\n\n get algorithm(): string {\n if (typeof this.cryptoKey.algorithm === 'string') {\n return this.cryptoKey.algorithm;\n }\n return this.cryptoKey.algorithm.name;\n }\n\n get extractable(): boolean {\n return this.cryptoKey.extractable;\n }\n\n get usages(): readonly string[] {\n return this.cryptoKey.usages;\n }\n\n get nativeKey(): CryptoKey {\n return this.cryptoKey;\n }\n}\n\n/**\n * Helper function to unwrap CryptoKeyLike to native CryptoKey\n */\nfunction unwrapCryptoKey(keyLike: CryptoKeyLike): CryptoKey {\n if (keyLike instanceof WebCryptoKeyWrapper) {\n return keyLike.nativeKey;\n }\n // For backward compatibility, assume it's already a CryptoKey\n return keyLike as unknown as CryptoKey;\n}\n\n/**\n * Web Crypto API implementation of CryptoProvider\n * Works in browsers and Node.js environments with Web Crypto support\n */\nexport class WebCryptoProvider implements CryptoProvider {\n public readonly name = 'WebCrypto';\n private readonly logger?: Logger;\n\n public get isAvailable(): boolean {\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n }\n\n constructor(logger?: Logger) {\n if (!this.isAvailable) {\n throw new Error('Web Crypto API not available in this environment');\n }\n this.logger = logger?.child({ component: 'WebCryptoProvider' });\n }\n\n /**\n * Generate ECDH P-256 key pair\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair');\n\n const keyPair = await crypto.subtle.generateKey(\n {\n name: 'ECDH',\n namedCurve: 'P-256',\n },\n true, // extractable\n ['deriveKey']\n );\n\n this.logger?.debug('Key pair generation completed');\n return {\n publicKey: new WebCryptoKeyWrapper(keyPair.publicKey),\n privateKey: new WebCryptoKeyWrapper(keyPair.privateKey),\n };\n }\n\n /**\n * Export public key to ArrayBuffer (raw format)\n */\n async exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return crypto.subtle.exportKey('raw', unwrapCryptoKey(publicKey));\n }\n\n /**\n * Export private key to ArrayBuffer (raw format)\n */\n async exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n // WebCrypto doesn't support 'raw' export for ECDH private keys\n // Use JWK export and extract the d-value (32 bytes)\n const jwk = await crypto.subtle.exportKey('jwk', unwrapCryptoKey(privateKey));\n const dValue = new Uint8Array(Buffer.from(jwk.d as string, 'base64url'));\n return dValue.buffer.slice(dValue.byteOffset, dValue.byteOffset + dValue.byteLength);\n }\n\n /**\n * Import public key from ArrayBuffer (raw format)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const keyBytes = new Uint8Array(keyData);\n\n this.logger?.debug('importPublicKey called', {\n keyLength: keyBytes.length,\n keyBytesFirst20: Array.from(keyBytes.slice(0, 20)).map(b => b.toString(16).padStart(2, '0')).join(' ')\n });\n\n try {\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n {\n name: 'ECDH',\n namedCurve: 'P-256',\n },\n true,\n []\n );\n\n this.logger?.debug('Public key import successful');\n return new WebCryptoKeyWrapper(cryptoKey);\n } catch (error) {\n this.logger?.error('Public key import failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n throw new Error(`Invalid P-256 public key: ${String(error)}`);\n }\n }\n\n /**\n * Import private key from ArrayBuffer (raw format)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Importing private key', {\n keyLength: keyData.byteLength\n });\n\n try {\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n {\n name: 'ECDH',\n namedCurve: 'P-256',\n },\n true,\n ['deriveKey']\n );\n\n this.logger?.debug('Private key import successful');\n return new WebCryptoKeyWrapper(cryptoKey);\n } catch (error) {\n this.logger?.error('Private key import failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n throw new Error(`Invalid P-256 private key: ${String(error)}`);\n }\n }\n\n /**\n * Derive shared secret from ECDH key agreement\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using ECDH');\n\n try {\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'ECDH',\n public: unwrapCryptoKey(publicKey),\n },\n unwrapCryptoKey(privateKey),\n {\n name: 'AES-GCM',\n length: 256,\n },\n true,\n ['encrypt', 'decrypt']\n );\n\n this.logger?.debug('Shared secret derivation completed');\n return new WebCryptoKeyWrapper(derivedKey);\n } catch (error) {\n this.logger?.error('Shared secret derivation failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n throw error;\n }\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n // Import shared secret as HKDF base key\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n await crypto.subtle.exportKey('raw', unwrapCryptoKey(sharedSecret)),\n { name: 'HKDF' },\n false,\n ['deriveKey']\n );\n\n // Derive encryption key using HKDF\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n salt: salt,\n info: info,\n hash: 'SHA-256',\n },\n baseKey,\n { name: 'AES-GCM', length: 256 },\n true,\n ['encrypt', 'decrypt']\n );\n return new WebCryptoKeyWrapper(derivedKey);\n }\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): ArrayBuffer {\n const buffer = new ArrayBuffer(length);\n const view = new Uint8Array(buffer);\n crypto.getRandomValues(view);\n return buffer;\n }\n\n /**\n * Encrypt data using AES-GCM\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Encrypting data with AES-GCM', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n try {\n const ciphertext = await crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n tagLength: 128, // 128-bit tag\n },\n unwrapCryptoKey(key),\n data\n );\n\n this.logger?.debug('Encryption completed', {\n ciphertextSize: ciphertext.byteLength\n });\n return ciphertext;\n } catch (error) {\n this.logger?.error('Encryption failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n throw error;\n }\n }\n\n /**\n * Decrypt data using AES-GCM\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Decrypting data with AES-GCM', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n try {\n const plaintext = await crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n tagLength: 128, // 128-bit tag\n },\n unwrapCryptoKey(key),\n data\n );\n\n this.logger?.debug('Decryption completed', {\n plaintextSize: plaintext.byteLength\n });\n return plaintext;\n } catch (error) {\n this.logger?.error('Decryption failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined\n }\n });\n throw error;\n }\n }\n\n /**\n * Generate HMAC-SHA256\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n // Convert AES key to HMAC key\n const hmacKey = await crypto.subtle.importKey(\n 'raw',\n await crypto.subtle.exportKey('raw', unwrapCryptoKey(key)),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n return crypto.subtle.sign('HMAC', hmacKey, data);\n }\n\n /**\n * Verify HMAC-SHA256\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n // Convert AES key to HMAC key\n const hmacKey = await crypto.subtle.importKey(\n 'raw',\n await crypto.subtle.exportKey('raw', unwrapCryptoKey(key)),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify']\n );\n\n return crypto.subtle.verify('HMAC', hmacKey, mac, data);\n }\n}\n\n/**\n * Self-register WebCrypto provider on import\n * This allows the provider to be available when explicitly imported\n */\nregisterCryptoProvider('webcrypto', () => new WebCryptoProvider());\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 webcrypto: true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/crypto/providers/webcrypto-provider.ts"],"names":["__name"],"mappings":"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","file":"webcrypto-provider.cjs","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\n\n/**\n * WebCrypto CryptoKey wrapper to implement CryptoKeyLike interface\n */\nclass WebCryptoKeyWrapper implements CryptoKeyLike {\n constructor(private readonly cryptoKey: CryptoKey) {}\n\n get type(): 'public' | 'private' | 'secret' {\n return this.cryptoKey.type as 'public' | 'private' | 'secret';\n }\n\n get algorithm(): string {\n if (typeof this.cryptoKey.algorithm === 'string') {\n return this.cryptoKey.algorithm;\n }\n return this.cryptoKey.algorithm.name;\n }\n\n get extractable(): boolean {\n return this.cryptoKey.extractable;\n }\n\n get usages(): readonly string[] {\n return this.cryptoKey.usages;\n }\n\n get nativeKey(): CryptoKey {\n return this.cryptoKey;\n }\n}\n\n/**\n * Helper function to unwrap CryptoKeyLike to native CryptoKey\n */\nfunction unwrapCryptoKey(keyLike: CryptoKeyLike): CryptoKey {\n if (keyLike instanceof WebCryptoKeyWrapper) {\n return keyLike.nativeKey;\n }\n // For backward compatibility, assume it's already a CryptoKey\n return keyLike as unknown as CryptoKey;\n}\n\n/**\n * Web Crypto API implementation of CryptoProvider\n * Works in browsers and Node.js environments with Web Crypto support\n */\nexport class WebCryptoProvider implements CryptoProvider {\n public readonly name = 'WebCrypto';\n private readonly logger?: Logger;\n\n public get isAvailable(): boolean {\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n }\n\n constructor(logger?: Logger) {\n if (!this.isAvailable) {\n throw new Error('Web Crypto API not available in this environment');\n }\n this.logger = logger?.child({ component: 'WebCryptoProvider' });\n }\n\n /**\n * Generate ECDH P-256 key pair\n */\n async generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair');\n\n const keyPair = await crypto.subtle.generateKey(\n {\n name: 'ECDH',\n namedCurve: 'P-256',\n },\n true, // extractable\n ['deriveKey'],\n );\n\n this.logger?.debug('Key pair generation completed');\n return {\n publicKey: new WebCryptoKeyWrapper(keyPair.publicKey),\n privateKey: new WebCryptoKeyWrapper(keyPair.privateKey),\n };\n }\n\n /**\n * Export public key to ArrayBuffer (raw format)\n */\n async exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n return crypto.subtle.exportKey('raw', unwrapCryptoKey(publicKey));\n }\n\n /**\n * Export private key to ArrayBuffer (raw format)\n */\n async exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n // WebCrypto doesn't support 'raw' export for ECDH private keys\n // Use JWK export and extract the d-value (32 bytes)\n const jwk = await crypto.subtle.exportKey('jwk', unwrapCryptoKey(privateKey));\n const dValue = new Uint8Array(Buffer.from(jwk.d as string, 'base64url'));\n return dValue.buffer.slice(dValue.byteOffset, dValue.byteOffset + dValue.byteLength);\n }\n\n /**\n * Import public key from ArrayBuffer (raw format)\n */\n async importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const keyBytes = new Uint8Array(keyData);\n\n this.logger?.debug('importPublicKey called', {\n keyLength: keyBytes.length,\n keyBytesFirst20: Array.from(keyBytes.slice(0, 20))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join(' '),\n });\n\n try {\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n {\n name: 'ECDH',\n namedCurve: 'P-256',\n },\n true,\n [],\n );\n\n this.logger?.debug('Public key import successful');\n return new WebCryptoKeyWrapper(cryptoKey);\n } catch (error) {\n this.logger?.error('Public key import failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n throw new Error(`Invalid P-256 public key: ${String(error)}`);\n }\n }\n\n /**\n * Import private key from ArrayBuffer (raw format)\n */\n async importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n this.logger?.debug('Importing private key', {\n keyLength: keyData.byteLength,\n });\n\n try {\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n {\n name: 'ECDH',\n namedCurve: 'P-256',\n },\n true,\n ['deriveKey'],\n );\n\n this.logger?.debug('Private key import successful');\n return new WebCryptoKeyWrapper(cryptoKey);\n } catch (error) {\n this.logger?.error('Private key import failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n throw new Error(`Invalid P-256 private key: ${String(error)}`);\n }\n }\n\n /**\n * Derive shared secret from ECDH key agreement\n */\n async deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using ECDH');\n\n try {\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'ECDH',\n public: unwrapCryptoKey(publicKey),\n },\n unwrapCryptoKey(privateKey),\n {\n name: 'AES-GCM',\n length: 256,\n },\n true,\n ['encrypt', 'decrypt'],\n );\n\n this.logger?.debug('Shared secret derivation completed');\n return new WebCryptoKeyWrapper(derivedKey);\n } catch (error) {\n this.logger?.error('Shared secret derivation failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n throw error;\n }\n }\n\n /**\n * Derive AES-GCM key from shared secret using HKDF\n */\n async deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n // Import shared secret as HKDF base key\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n await crypto.subtle.exportKey('raw', unwrapCryptoKey(sharedSecret)),\n { name: 'HKDF' },\n false,\n ['deriveKey'],\n );\n\n // Derive encryption key using HKDF\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n salt: salt,\n info: info,\n hash: 'SHA-256',\n },\n baseKey,\n { name: 'AES-GCM', length: 256 },\n true,\n ['encrypt', 'decrypt'],\n );\n return new WebCryptoKeyWrapper(derivedKey);\n }\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): ArrayBuffer {\n const buffer = new ArrayBuffer(length);\n const view = new Uint8Array(buffer);\n crypto.getRandomValues(view);\n return buffer;\n }\n\n /**\n * Encrypt data using AES-GCM\n */\n async encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Encrypting data with AES-GCM', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength,\n });\n\n try {\n const ciphertext = await crypto.subtle.encrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n tagLength: 128, // 128-bit tag\n },\n unwrapCryptoKey(key),\n data,\n );\n\n this.logger?.debug('Encryption completed', {\n ciphertextSize: ciphertext.byteLength,\n });\n return ciphertext;\n } catch (error) {\n this.logger?.error('Encryption failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n throw error;\n }\n }\n\n /**\n * Decrypt data using AES-GCM\n */\n async decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Decrypting data with AES-GCM', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength,\n });\n\n try {\n const plaintext = await crypto.subtle.decrypt(\n {\n name: 'AES-GCM',\n iv: iv,\n tagLength: 128, // 128-bit tag\n },\n unwrapCryptoKey(key),\n data,\n );\n\n this.logger?.debug('Decryption completed', {\n plaintextSize: plaintext.byteLength,\n });\n return plaintext;\n } catch (error) {\n this.logger?.error('Decryption failed', {\n error: {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n });\n throw error;\n }\n }\n\n /**\n * Generate HMAC-SHA256\n */\n async generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n // Convert AES key to HMAC key\n const hmacKey = await crypto.subtle.importKey(\n 'raw',\n await crypto.subtle.exportKey('raw', unwrapCryptoKey(key)),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n return crypto.subtle.sign('HMAC', hmacKey, data);\n }\n\n /**\n * Verify HMAC-SHA256\n */\n async verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n // Convert AES key to HMAC key\n const hmacKey = await crypto.subtle.importKey(\n 'raw',\n await crypto.subtle.exportKey('raw', unwrapCryptoKey(key)),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['verify'],\n );\n\n return crypto.subtle.verify('HMAC', hmacKey, mac, data);\n }\n}\n"]}
|
|
@@ -19,12 +19,5 @@ declare class WebCryptoProvider implements CryptoProvider {
|
|
|
19
19
|
generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer>;
|
|
20
20
|
verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean>;
|
|
21
21
|
}
|
|
22
|
-
declare global {
|
|
23
|
-
namespace BananaLink {
|
|
24
|
-
interface RegisteredCryptoProviders {
|
|
25
|
-
webcrypto: true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
22
|
|
|
30
23
|
export { WebCryptoProvider };
|