@bananalink-sdk/protocol 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +604 -0
  2. package/dist/chunk-32OWUOZ3.js +308 -0
  3. package/dist/chunk-32OWUOZ3.js.map +1 -0
  4. package/dist/chunk-65HNHRJK.cjs +123 -0
  5. package/dist/chunk-65HNHRJK.cjs.map +1 -0
  6. package/dist/chunk-7KYDLL3B.js +480 -0
  7. package/dist/chunk-7KYDLL3B.js.map +1 -0
  8. package/dist/chunk-A6FLEJ7R.cjs +62 -0
  9. package/dist/chunk-A6FLEJ7R.cjs.map +1 -0
  10. package/dist/chunk-CUJK7ZTS.js +217 -0
  11. package/dist/chunk-CUJK7ZTS.js.map +1 -0
  12. package/dist/chunk-GI3BUPIH.cjs +236 -0
  13. package/dist/chunk-GI3BUPIH.cjs.map +1 -0
  14. package/dist/chunk-JXHV66Q4.js +106 -0
  15. package/dist/chunk-JXHV66Q4.js.map +1 -0
  16. package/dist/chunk-KNGZKGRS.cjs +552 -0
  17. package/dist/chunk-KNGZKGRS.cjs.map +1 -0
  18. package/dist/chunk-LELPCIE7.js +840 -0
  19. package/dist/chunk-LELPCIE7.js.map +1 -0
  20. package/dist/chunk-MCZG7QEM.cjs +310 -0
  21. package/dist/chunk-MCZG7QEM.cjs.map +1 -0
  22. package/dist/chunk-TCVKC227.js +56 -0
  23. package/dist/chunk-TCVKC227.js.map +1 -0
  24. package/dist/chunk-VXLUSU5B.cjs +856 -0
  25. package/dist/chunk-VXLUSU5B.cjs.map +1 -0
  26. package/dist/chunk-WCQVDF3K.js +12 -0
  27. package/dist/chunk-WCQVDF3K.js.map +1 -0
  28. package/dist/chunk-WGEGR3DF.cjs +15 -0
  29. package/dist/chunk-WGEGR3DF.cjs.map +1 -0
  30. package/dist/client-session-claim-3QF3noOr.d.ts +197 -0
  31. package/dist/client-session-claim-C4lUik3b.d.cts +197 -0
  32. package/dist/core-DMhuNfoz.d.cts +62 -0
  33. package/dist/core-DMhuNfoz.d.ts +62 -0
  34. package/dist/crypto/providers/noble-provider.cjs +14 -0
  35. package/dist/crypto/providers/noble-provider.cjs.map +1 -0
  36. package/dist/crypto/providers/noble-provider.d.cts +30 -0
  37. package/dist/crypto/providers/noble-provider.d.ts +30 -0
  38. package/dist/crypto/providers/noble-provider.js +5 -0
  39. package/dist/crypto/providers/noble-provider.js.map +1 -0
  40. package/dist/crypto/providers/node-provider.cjs +308 -0
  41. package/dist/crypto/providers/node-provider.cjs.map +1 -0
  42. package/dist/crypto/providers/node-provider.d.cts +32 -0
  43. package/dist/crypto/providers/node-provider.d.ts +32 -0
  44. package/dist/crypto/providers/node-provider.js +306 -0
  45. package/dist/crypto/providers/node-provider.js.map +1 -0
  46. package/dist/crypto/providers/quickcrypto-provider.cjs +339 -0
  47. package/dist/crypto/providers/quickcrypto-provider.cjs.map +1 -0
  48. package/dist/crypto/providers/quickcrypto-provider.d.cts +34 -0
  49. package/dist/crypto/providers/quickcrypto-provider.d.ts +34 -0
  50. package/dist/crypto/providers/quickcrypto-provider.js +337 -0
  51. package/dist/crypto/providers/quickcrypto-provider.js.map +1 -0
  52. package/dist/crypto/providers/webcrypto-provider.cjs +310 -0
  53. package/dist/crypto/providers/webcrypto-provider.cjs.map +1 -0
  54. package/dist/crypto/providers/webcrypto-provider.d.cts +30 -0
  55. package/dist/crypto/providers/webcrypto-provider.d.ts +30 -0
  56. package/dist/crypto/providers/webcrypto-provider.js +308 -0
  57. package/dist/crypto/providers/webcrypto-provider.js.map +1 -0
  58. package/dist/crypto-BUS06Qz-.d.cts +40 -0
  59. package/dist/crypto-BUS06Qz-.d.ts +40 -0
  60. package/dist/crypto-export.cjs +790 -0
  61. package/dist/crypto-export.cjs.map +1 -0
  62. package/dist/crypto-export.d.cts +257 -0
  63. package/dist/crypto-export.d.ts +257 -0
  64. package/dist/crypto-export.js +709 -0
  65. package/dist/crypto-export.js.map +1 -0
  66. package/dist/crypto-provider-deYoVIxi.d.cts +36 -0
  67. package/dist/crypto-provider-deYoVIxi.d.ts +36 -0
  68. package/dist/index.cjs +615 -0
  69. package/dist/index.cjs.map +1 -0
  70. package/dist/index.d.cts +379 -0
  71. package/dist/index.d.ts +379 -0
  72. package/dist/index.js +504 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/schemas-export.cjs +294 -0
  75. package/dist/schemas-export.cjs.map +1 -0
  76. package/dist/schemas-export.d.cts +1598 -0
  77. package/dist/schemas-export.d.ts +1598 -0
  78. package/dist/schemas-export.js +5 -0
  79. package/dist/schemas-export.js.map +1 -0
  80. package/dist/siwe-export.cjs +237 -0
  81. package/dist/siwe-export.cjs.map +1 -0
  82. package/dist/siwe-export.d.cts +27 -0
  83. package/dist/siwe-export.d.ts +27 -0
  84. package/dist/siwe-export.js +228 -0
  85. package/dist/siwe-export.js.map +1 -0
  86. package/dist/testing.cjs +54 -0
  87. package/dist/testing.cjs.map +1 -0
  88. package/dist/testing.d.cts +20 -0
  89. package/dist/testing.d.ts +20 -0
  90. package/dist/testing.js +51 -0
  91. package/dist/testing.js.map +1 -0
  92. package/dist/validation-export.cjs +359 -0
  93. package/dist/validation-export.cjs.map +1 -0
  94. package/dist/validation-export.d.cts +3 -0
  95. package/dist/validation-export.d.ts +3 -0
  96. package/dist/validation-export.js +6 -0
  97. package/dist/validation-export.js.map +1 -0
  98. package/dist/validators-export.cjs +73 -0
  99. package/dist/validators-export.cjs.map +1 -0
  100. package/dist/validators-export.d.cts +37 -0
  101. package/dist/validators-export.d.ts +37 -0
  102. package/dist/validators-export.js +4 -0
  103. package/dist/validators-export.js.map +1 -0
  104. package/package.json +140 -0
  105. package/src/constants/index.ts +205 -0
  106. package/src/crypto/context.ts +228 -0
  107. package/src/crypto/diagnostics.ts +772 -0
  108. package/src/crypto/errors.ts +114 -0
  109. package/src/crypto/index.ts +89 -0
  110. package/src/crypto/payload-handler.ts +102 -0
  111. package/src/crypto/providers/compliance-provider.ts +579 -0
  112. package/src/crypto/providers/factory.ts +204 -0
  113. package/src/crypto/providers/index.ts +44 -0
  114. package/src/crypto/providers/noble-provider.ts +392 -0
  115. package/src/crypto/providers/node-provider.ts +433 -0
  116. package/src/crypto/providers/quickcrypto-provider.ts +483 -0
  117. package/src/crypto/providers/registry.ts +129 -0
  118. package/src/crypto/providers/webcrypto-provider.ts +364 -0
  119. package/src/crypto/session-security.ts +185 -0
  120. package/src/crypto/types.ts +93 -0
  121. package/src/crypto/utils.ts +190 -0
  122. package/src/crypto-export.ts +21 -0
  123. package/src/index.ts +38 -0
  124. package/src/schemas/auth.ts +60 -0
  125. package/src/schemas/client-messages.ts +57 -0
  126. package/src/schemas/core.ts +144 -0
  127. package/src/schemas/crypto.ts +65 -0
  128. package/src/schemas/discovery.ts +79 -0
  129. package/src/schemas/index.ts +239 -0
  130. package/src/schemas/relay-messages.ts +45 -0
  131. package/src/schemas/wallet-messages.ts +177 -0
  132. package/src/schemas-export.ts +23 -0
  133. package/src/siwe-export.ts +27 -0
  134. package/src/testing.ts +71 -0
  135. package/src/types/auth.ts +60 -0
  136. package/src/types/client-messages.ts +84 -0
  137. package/src/types/core.ts +131 -0
  138. package/src/types/crypto-provider.ts +264 -0
  139. package/src/types/crypto.ts +90 -0
  140. package/src/types/discovery.ts +50 -0
  141. package/src/types/errors.ts +87 -0
  142. package/src/types/index.ts +197 -0
  143. package/src/types/post-auth-operations.ts +363 -0
  144. package/src/types/providers.ts +72 -0
  145. package/src/types/relay-messages.ts +60 -0
  146. package/src/types/request-lifecycle.ts +161 -0
  147. package/src/types/signing-operations.ts +99 -0
  148. package/src/types/wallet-messages.ts +251 -0
  149. package/src/utils/client-session-claim.ts +188 -0
  150. package/src/utils/index.ts +54 -0
  151. package/src/utils/public-keys.ts +49 -0
  152. package/src/utils/siwe.ts +362 -0
  153. package/src/utils/url-decoding.ts +126 -0
  154. package/src/utils/url-encoding.ts +144 -0
  155. package/src/utils/wallet-session-claim.ts +188 -0
  156. package/src/validation-export.ts +32 -0
  157. package/src/validators/index.ts +222 -0
  158. package/src/validators-export.ts +8 -0
@@ -0,0 +1,308 @@
1
+ import { registerCryptoProvider } from '../../chunk-TCVKC227.js';
2
+ import { __name } from '../../chunk-WCQVDF3K.js';
3
+
4
+ // src/crypto/providers/webcrypto-provider.ts
5
+ var _WebCryptoKeyWrapper = class _WebCryptoKeyWrapper {
6
+ constructor(cryptoKey) {
7
+ this.cryptoKey = cryptoKey;
8
+ }
9
+ get type() {
10
+ return this.cryptoKey.type;
11
+ }
12
+ get algorithm() {
13
+ if (typeof this.cryptoKey.algorithm === "string") {
14
+ return this.cryptoKey.algorithm;
15
+ }
16
+ return this.cryptoKey.algorithm.name;
17
+ }
18
+ get extractable() {
19
+ return this.cryptoKey.extractable;
20
+ }
21
+ get usages() {
22
+ return this.cryptoKey.usages;
23
+ }
24
+ get nativeKey() {
25
+ return this.cryptoKey;
26
+ }
27
+ };
28
+ __name(_WebCryptoKeyWrapper, "WebCryptoKeyWrapper");
29
+ var WebCryptoKeyWrapper = _WebCryptoKeyWrapper;
30
+ function unwrapCryptoKey(keyLike) {
31
+ if (keyLike instanceof WebCryptoKeyWrapper) {
32
+ return keyLike.nativeKey;
33
+ }
34
+ return keyLike;
35
+ }
36
+ __name(unwrapCryptoKey, "unwrapCryptoKey");
37
+ var _WebCryptoProvider = class _WebCryptoProvider {
38
+ constructor(logger) {
39
+ this.name = "WebCrypto";
40
+ if (!this.isAvailable) {
41
+ throw new Error("Web Crypto API not available in this environment");
42
+ }
43
+ this.logger = logger?.child({ component: "WebCryptoProvider" });
44
+ }
45
+ get isAvailable() {
46
+ return typeof crypto !== "undefined" && typeof crypto.subtle !== "undefined";
47
+ }
48
+ /**
49
+ * Generate ECDH P-256 key pair
50
+ */
51
+ async generateKeyPair() {
52
+ this.logger?.debug("Generating ECDH P-256 key pair");
53
+ const keyPair = await crypto.subtle.generateKey(
54
+ {
55
+ name: "ECDH",
56
+ namedCurve: "P-256"
57
+ },
58
+ true,
59
+ // extractable
60
+ ["deriveKey"]
61
+ );
62
+ this.logger?.debug("Key pair generation completed");
63
+ return {
64
+ publicKey: new WebCryptoKeyWrapper(keyPair.publicKey),
65
+ privateKey: new WebCryptoKeyWrapper(keyPair.privateKey)
66
+ };
67
+ }
68
+ /**
69
+ * Export public key to ArrayBuffer (raw format)
70
+ */
71
+ async exportPublicKey(publicKey) {
72
+ return crypto.subtle.exportKey("raw", unwrapCryptoKey(publicKey));
73
+ }
74
+ /**
75
+ * Export private key to ArrayBuffer (raw format)
76
+ */
77
+ async exportPrivateKey(privateKey) {
78
+ const jwk = await crypto.subtle.exportKey("jwk", unwrapCryptoKey(privateKey));
79
+ const dValue = new Uint8Array(Buffer.from(jwk.d, "base64url"));
80
+ return dValue.buffer.slice(dValue.byteOffset, dValue.byteOffset + dValue.byteLength);
81
+ }
82
+ /**
83
+ * Import public key from ArrayBuffer (raw format)
84
+ */
85
+ async importPublicKey(keyData) {
86
+ const keyBytes = new Uint8Array(keyData);
87
+ this.logger?.debug("importPublicKey called", {
88
+ keyLength: keyBytes.length,
89
+ keyBytesFirst20: Array.from(keyBytes.slice(0, 20)).map((b) => b.toString(16).padStart(2, "0")).join(" ")
90
+ });
91
+ try {
92
+ const cryptoKey = await crypto.subtle.importKey(
93
+ "raw",
94
+ keyData,
95
+ {
96
+ name: "ECDH",
97
+ namedCurve: "P-256"
98
+ },
99
+ true,
100
+ []
101
+ );
102
+ this.logger?.debug("Public key import successful");
103
+ return new WebCryptoKeyWrapper(cryptoKey);
104
+ } catch (error) {
105
+ this.logger?.error("Public key import failed", {
106
+ error: {
107
+ message: error instanceof Error ? error.message : String(error),
108
+ stack: error instanceof Error ? error.stack : void 0
109
+ }
110
+ });
111
+ throw new Error(`Invalid P-256 public key: ${String(error)}`);
112
+ }
113
+ }
114
+ /**
115
+ * Import private key from ArrayBuffer (raw format)
116
+ */
117
+ async importPrivateKey(keyData) {
118
+ this.logger?.debug("Importing private key", {
119
+ keyLength: keyData.byteLength
120
+ });
121
+ try {
122
+ const cryptoKey = await crypto.subtle.importKey(
123
+ "raw",
124
+ keyData,
125
+ {
126
+ name: "ECDH",
127
+ namedCurve: "P-256"
128
+ },
129
+ true,
130
+ ["deriveKey"]
131
+ );
132
+ this.logger?.debug("Private key import successful");
133
+ return new WebCryptoKeyWrapper(cryptoKey);
134
+ } catch (error) {
135
+ this.logger?.error("Private key import failed", {
136
+ error: {
137
+ message: error instanceof Error ? error.message : String(error),
138
+ stack: error instanceof Error ? error.stack : void 0
139
+ }
140
+ });
141
+ throw new Error(`Invalid P-256 private key: ${String(error)}`);
142
+ }
143
+ }
144
+ /**
145
+ * Derive shared secret from ECDH key agreement
146
+ */
147
+ async deriveSharedSecret(privateKey, publicKey) {
148
+ this.logger?.debug("Deriving shared secret using ECDH");
149
+ try {
150
+ const derivedKey = await crypto.subtle.deriveKey(
151
+ {
152
+ name: "ECDH",
153
+ public: unwrapCryptoKey(publicKey)
154
+ },
155
+ unwrapCryptoKey(privateKey),
156
+ {
157
+ name: "AES-GCM",
158
+ length: 256
159
+ },
160
+ true,
161
+ ["encrypt", "decrypt"]
162
+ );
163
+ this.logger?.debug("Shared secret derivation completed");
164
+ return new WebCryptoKeyWrapper(derivedKey);
165
+ } catch (error) {
166
+ this.logger?.error("Shared secret derivation failed", {
167
+ error: {
168
+ message: error instanceof Error ? error.message : String(error),
169
+ stack: error instanceof Error ? error.stack : void 0
170
+ }
171
+ });
172
+ throw error;
173
+ }
174
+ }
175
+ /**
176
+ * Derive AES-GCM key from shared secret using HKDF
177
+ */
178
+ async deriveEncryptionKey(sharedSecret, salt, info) {
179
+ const baseKey = await crypto.subtle.importKey(
180
+ "raw",
181
+ await crypto.subtle.exportKey("raw", unwrapCryptoKey(sharedSecret)),
182
+ { name: "HKDF" },
183
+ false,
184
+ ["deriveKey"]
185
+ );
186
+ const derivedKey = await crypto.subtle.deriveKey(
187
+ {
188
+ name: "HKDF",
189
+ salt,
190
+ info,
191
+ hash: "SHA-256"
192
+ },
193
+ baseKey,
194
+ { name: "AES-GCM", length: 256 },
195
+ true,
196
+ ["encrypt", "decrypt"]
197
+ );
198
+ return new WebCryptoKeyWrapper(derivedKey);
199
+ }
200
+ /**
201
+ * Generate random bytes
202
+ */
203
+ randomBytes(length) {
204
+ const buffer = new ArrayBuffer(length);
205
+ const view = new Uint8Array(buffer);
206
+ crypto.getRandomValues(view);
207
+ return buffer;
208
+ }
209
+ /**
210
+ * Encrypt data using AES-GCM
211
+ */
212
+ async encrypt(key, data, iv) {
213
+ this.logger?.debug("Encrypting data with AES-GCM", {
214
+ dataSize: data.byteLength,
215
+ ivSize: iv.byteLength
216
+ });
217
+ try {
218
+ const ciphertext = await crypto.subtle.encrypt(
219
+ {
220
+ name: "AES-GCM",
221
+ iv,
222
+ tagLength: 128
223
+ // 128-bit tag
224
+ },
225
+ unwrapCryptoKey(key),
226
+ data
227
+ );
228
+ this.logger?.debug("Encryption completed", {
229
+ ciphertextSize: ciphertext.byteLength
230
+ });
231
+ return ciphertext;
232
+ } catch (error) {
233
+ this.logger?.error("Encryption failed", {
234
+ error: {
235
+ message: error instanceof Error ? error.message : String(error),
236
+ stack: error instanceof Error ? error.stack : void 0
237
+ }
238
+ });
239
+ throw error;
240
+ }
241
+ }
242
+ /**
243
+ * Decrypt data using AES-GCM
244
+ */
245
+ async decrypt(key, data, iv) {
246
+ this.logger?.debug("Decrypting data with AES-GCM", {
247
+ dataSize: data.byteLength,
248
+ ivSize: iv.byteLength
249
+ });
250
+ try {
251
+ const plaintext = await crypto.subtle.decrypt(
252
+ {
253
+ name: "AES-GCM",
254
+ iv,
255
+ tagLength: 128
256
+ // 128-bit tag
257
+ },
258
+ unwrapCryptoKey(key),
259
+ data
260
+ );
261
+ this.logger?.debug("Decryption completed", {
262
+ plaintextSize: plaintext.byteLength
263
+ });
264
+ return plaintext;
265
+ } catch (error) {
266
+ this.logger?.error("Decryption failed", {
267
+ error: {
268
+ message: error instanceof Error ? error.message : String(error),
269
+ stack: error instanceof Error ? error.stack : void 0
270
+ }
271
+ });
272
+ throw error;
273
+ }
274
+ }
275
+ /**
276
+ * Generate HMAC-SHA256
277
+ */
278
+ async generateHMAC(key, data) {
279
+ const hmacKey = await crypto.subtle.importKey(
280
+ "raw",
281
+ await crypto.subtle.exportKey("raw", unwrapCryptoKey(key)),
282
+ { name: "HMAC", hash: "SHA-256" },
283
+ false,
284
+ ["sign"]
285
+ );
286
+ return crypto.subtle.sign("HMAC", hmacKey, data);
287
+ }
288
+ /**
289
+ * Verify HMAC-SHA256
290
+ */
291
+ async verifyHMAC(key, data, mac) {
292
+ const hmacKey = await crypto.subtle.importKey(
293
+ "raw",
294
+ await crypto.subtle.exportKey("raw", unwrapCryptoKey(key)),
295
+ { name: "HMAC", hash: "SHA-256" },
296
+ false,
297
+ ["verify"]
298
+ );
299
+ return crypto.subtle.verify("HMAC", hmacKey, mac, data);
300
+ }
301
+ };
302
+ __name(_WebCryptoProvider, "WebCryptoProvider");
303
+ var WebCryptoProvider = _WebCryptoProvider;
304
+ registerCryptoProvider("webcrypto", () => new WebCryptoProvider());
305
+
306
+ export { WebCryptoProvider };
307
+ //# sourceMappingURL=webcrypto-provider.js.map
308
+ //# sourceMappingURL=webcrypto-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/crypto/providers/webcrypto-provider.ts"],"names":[],"mappings":"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","file":"webcrypto-provider.js","sourcesContent":["import type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { registerCryptoProvider } from './registry';\n\n/**\n * 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"]}
@@ -0,0 +1,40 @@
1
+ interface KeyExchange {
2
+ algorithm: 'ECDH';
3
+ namedCurve: 'P-256';
4
+ }
5
+ interface Encryption {
6
+ algorithm: 'AES-GCM' | 'plaintext';
7
+ keyLength?: 256;
8
+ tagLength?: 128;
9
+ }
10
+ interface PublicKeyJWK {
11
+ kty: 'EC';
12
+ crv: 'P-256';
13
+ x: string;
14
+ y: string;
15
+ use: 'enc';
16
+ key_ops: ['deriveKey'];
17
+ }
18
+ interface CryptoParameters {
19
+ iv?: string;
20
+ timestamp: string;
21
+ sessionId: string;
22
+ }
23
+ interface KeyDerivation {
24
+ algorithm: 'HKDF';
25
+ hash: 'SHA-256';
26
+ info: 'message-exchange-v1';
27
+ salt: string;
28
+ }
29
+ interface CryptoPayload {
30
+ version: '1.0';
31
+ keyExchange?: KeyExchange;
32
+ encryption: Encryption & {
33
+ algorithm: 'AES-GCM' | 'plaintext';
34
+ };
35
+ publicKey?: PublicKeyJWK;
36
+ parameters: CryptoParameters;
37
+ derivation?: KeyDerivation;
38
+ }
39
+
40
+ export type { CryptoParameters as C, Encryption as E, KeyExchange as K, PublicKeyJWK as P, KeyDerivation as a, CryptoPayload as b };
@@ -0,0 +1,40 @@
1
+ interface KeyExchange {
2
+ algorithm: 'ECDH';
3
+ namedCurve: 'P-256';
4
+ }
5
+ interface Encryption {
6
+ algorithm: 'AES-GCM' | 'plaintext';
7
+ keyLength?: 256;
8
+ tagLength?: 128;
9
+ }
10
+ interface PublicKeyJWK {
11
+ kty: 'EC';
12
+ crv: 'P-256';
13
+ x: string;
14
+ y: string;
15
+ use: 'enc';
16
+ key_ops: ['deriveKey'];
17
+ }
18
+ interface CryptoParameters {
19
+ iv?: string;
20
+ timestamp: string;
21
+ sessionId: string;
22
+ }
23
+ interface KeyDerivation {
24
+ algorithm: 'HKDF';
25
+ hash: 'SHA-256';
26
+ info: 'message-exchange-v1';
27
+ salt: string;
28
+ }
29
+ interface CryptoPayload {
30
+ version: '1.0';
31
+ keyExchange?: KeyExchange;
32
+ encryption: Encryption & {
33
+ algorithm: 'AES-GCM' | 'plaintext';
34
+ };
35
+ publicKey?: PublicKeyJWK;
36
+ parameters: CryptoParameters;
37
+ derivation?: KeyDerivation;
38
+ }
39
+
40
+ export type { CryptoParameters as C, Encryption as E, KeyExchange as K, PublicKeyJWK as P, KeyDerivation as a, CryptoPayload as b };