@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.
- package/README.md +604 -0
- package/dist/chunk-32OWUOZ3.js +308 -0
- package/dist/chunk-32OWUOZ3.js.map +1 -0
- package/dist/chunk-65HNHRJK.cjs +123 -0
- package/dist/chunk-65HNHRJK.cjs.map +1 -0
- package/dist/chunk-7KYDLL3B.js +480 -0
- package/dist/chunk-7KYDLL3B.js.map +1 -0
- package/dist/chunk-A6FLEJ7R.cjs +62 -0
- package/dist/chunk-A6FLEJ7R.cjs.map +1 -0
- package/dist/chunk-CUJK7ZTS.js +217 -0
- package/dist/chunk-CUJK7ZTS.js.map +1 -0
- package/dist/chunk-GI3BUPIH.cjs +236 -0
- package/dist/chunk-GI3BUPIH.cjs.map +1 -0
- package/dist/chunk-JXHV66Q4.js +106 -0
- package/dist/chunk-JXHV66Q4.js.map +1 -0
- package/dist/chunk-KNGZKGRS.cjs +552 -0
- package/dist/chunk-KNGZKGRS.cjs.map +1 -0
- package/dist/chunk-LELPCIE7.js +840 -0
- package/dist/chunk-LELPCIE7.js.map +1 -0
- package/dist/chunk-MCZG7QEM.cjs +310 -0
- package/dist/chunk-MCZG7QEM.cjs.map +1 -0
- package/dist/chunk-TCVKC227.js +56 -0
- package/dist/chunk-TCVKC227.js.map +1 -0
- package/dist/chunk-VXLUSU5B.cjs +856 -0
- package/dist/chunk-VXLUSU5B.cjs.map +1 -0
- package/dist/chunk-WCQVDF3K.js +12 -0
- package/dist/chunk-WCQVDF3K.js.map +1 -0
- package/dist/chunk-WGEGR3DF.cjs +15 -0
- package/dist/chunk-WGEGR3DF.cjs.map +1 -0
- package/dist/client-session-claim-3QF3noOr.d.ts +197 -0
- package/dist/client-session-claim-C4lUik3b.d.cts +197 -0
- package/dist/core-DMhuNfoz.d.cts +62 -0
- package/dist/core-DMhuNfoz.d.ts +62 -0
- package/dist/crypto/providers/noble-provider.cjs +14 -0
- package/dist/crypto/providers/noble-provider.cjs.map +1 -0
- package/dist/crypto/providers/noble-provider.d.cts +30 -0
- package/dist/crypto/providers/noble-provider.d.ts +30 -0
- package/dist/crypto/providers/noble-provider.js +5 -0
- package/dist/crypto/providers/noble-provider.js.map +1 -0
- package/dist/crypto/providers/node-provider.cjs +308 -0
- package/dist/crypto/providers/node-provider.cjs.map +1 -0
- package/dist/crypto/providers/node-provider.d.cts +32 -0
- package/dist/crypto/providers/node-provider.d.ts +32 -0
- package/dist/crypto/providers/node-provider.js +306 -0
- package/dist/crypto/providers/node-provider.js.map +1 -0
- package/dist/crypto/providers/quickcrypto-provider.cjs +339 -0
- package/dist/crypto/providers/quickcrypto-provider.cjs.map +1 -0
- package/dist/crypto/providers/quickcrypto-provider.d.cts +34 -0
- package/dist/crypto/providers/quickcrypto-provider.d.ts +34 -0
- package/dist/crypto/providers/quickcrypto-provider.js +337 -0
- package/dist/crypto/providers/quickcrypto-provider.js.map +1 -0
- package/dist/crypto/providers/webcrypto-provider.cjs +310 -0
- package/dist/crypto/providers/webcrypto-provider.cjs.map +1 -0
- package/dist/crypto/providers/webcrypto-provider.d.cts +30 -0
- package/dist/crypto/providers/webcrypto-provider.d.ts +30 -0
- package/dist/crypto/providers/webcrypto-provider.js +308 -0
- package/dist/crypto/providers/webcrypto-provider.js.map +1 -0
- package/dist/crypto-BUS06Qz-.d.cts +40 -0
- package/dist/crypto-BUS06Qz-.d.ts +40 -0
- package/dist/crypto-export.cjs +790 -0
- package/dist/crypto-export.cjs.map +1 -0
- package/dist/crypto-export.d.cts +257 -0
- package/dist/crypto-export.d.ts +257 -0
- package/dist/crypto-export.js +709 -0
- package/dist/crypto-export.js.map +1 -0
- package/dist/crypto-provider-deYoVIxi.d.cts +36 -0
- package/dist/crypto-provider-deYoVIxi.d.ts +36 -0
- package/dist/index.cjs +615 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +379 -0
- package/dist/index.d.ts +379 -0
- package/dist/index.js +504 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas-export.cjs +294 -0
- package/dist/schemas-export.cjs.map +1 -0
- package/dist/schemas-export.d.cts +1598 -0
- package/dist/schemas-export.d.ts +1598 -0
- package/dist/schemas-export.js +5 -0
- package/dist/schemas-export.js.map +1 -0
- package/dist/siwe-export.cjs +237 -0
- package/dist/siwe-export.cjs.map +1 -0
- package/dist/siwe-export.d.cts +27 -0
- package/dist/siwe-export.d.ts +27 -0
- package/dist/siwe-export.js +228 -0
- package/dist/siwe-export.js.map +1 -0
- package/dist/testing.cjs +54 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +20 -0
- package/dist/testing.d.ts +20 -0
- package/dist/testing.js +51 -0
- package/dist/testing.js.map +1 -0
- package/dist/validation-export.cjs +359 -0
- package/dist/validation-export.cjs.map +1 -0
- package/dist/validation-export.d.cts +3 -0
- package/dist/validation-export.d.ts +3 -0
- package/dist/validation-export.js +6 -0
- package/dist/validation-export.js.map +1 -0
- package/dist/validators-export.cjs +73 -0
- package/dist/validators-export.cjs.map +1 -0
- package/dist/validators-export.d.cts +37 -0
- package/dist/validators-export.d.ts +37 -0
- package/dist/validators-export.js +4 -0
- package/dist/validators-export.js.map +1 -0
- package/package.json +140 -0
- package/src/constants/index.ts +205 -0
- package/src/crypto/context.ts +228 -0
- package/src/crypto/diagnostics.ts +772 -0
- package/src/crypto/errors.ts +114 -0
- package/src/crypto/index.ts +89 -0
- package/src/crypto/payload-handler.ts +102 -0
- package/src/crypto/providers/compliance-provider.ts +579 -0
- package/src/crypto/providers/factory.ts +204 -0
- package/src/crypto/providers/index.ts +44 -0
- package/src/crypto/providers/noble-provider.ts +392 -0
- package/src/crypto/providers/node-provider.ts +433 -0
- package/src/crypto/providers/quickcrypto-provider.ts +483 -0
- package/src/crypto/providers/registry.ts +129 -0
- package/src/crypto/providers/webcrypto-provider.ts +364 -0
- package/src/crypto/session-security.ts +185 -0
- package/src/crypto/types.ts +93 -0
- package/src/crypto/utils.ts +190 -0
- package/src/crypto-export.ts +21 -0
- package/src/index.ts +38 -0
- package/src/schemas/auth.ts +60 -0
- package/src/schemas/client-messages.ts +57 -0
- package/src/schemas/core.ts +144 -0
- package/src/schemas/crypto.ts +65 -0
- package/src/schemas/discovery.ts +79 -0
- package/src/schemas/index.ts +239 -0
- package/src/schemas/relay-messages.ts +45 -0
- package/src/schemas/wallet-messages.ts +177 -0
- package/src/schemas-export.ts +23 -0
- package/src/siwe-export.ts +27 -0
- package/src/testing.ts +71 -0
- package/src/types/auth.ts +60 -0
- package/src/types/client-messages.ts +84 -0
- package/src/types/core.ts +131 -0
- package/src/types/crypto-provider.ts +264 -0
- package/src/types/crypto.ts +90 -0
- package/src/types/discovery.ts +50 -0
- package/src/types/errors.ts +87 -0
- package/src/types/index.ts +197 -0
- package/src/types/post-auth-operations.ts +363 -0
- package/src/types/providers.ts +72 -0
- package/src/types/relay-messages.ts +60 -0
- package/src/types/request-lifecycle.ts +161 -0
- package/src/types/signing-operations.ts +99 -0
- package/src/types/wallet-messages.ts +251 -0
- package/src/utils/client-session-claim.ts +188 -0
- package/src/utils/index.ts +54 -0
- package/src/utils/public-keys.ts +49 -0
- package/src/utils/siwe.ts +362 -0
- package/src/utils/url-decoding.ts +126 -0
- package/src/utils/url-encoding.ts +144 -0
- package/src/utils/wallet-session-claim.ts +188 -0
- package/src/validation-export.ts +32 -0
- package/src/validators/index.ts +222 -0
- 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
|
+
import { p256 } from '@noble/curves/nist.js';
|
|
4
|
+
import { gcm } from '@noble/ciphers/aes.js';
|
|
5
|
+
import { randomBytes } from '@noble/ciphers/utils.js';
|
|
6
|
+
import { hkdf } from '@noble/hashes/hkdf.js';
|
|
7
|
+
import { hmac } from '@noble/hashes/hmac.js';
|
|
8
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
9
|
+
|
|
10
|
+
var _NobleKey = class _NobleKey {
|
|
11
|
+
constructor(data, type, algorithm, extractable = true, usages = []) {
|
|
12
|
+
this.data = data;
|
|
13
|
+
this.type = type;
|
|
14
|
+
this.algorithm = algorithm;
|
|
15
|
+
this.extractable = extractable;
|
|
16
|
+
this.usages = usages;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
__name(_NobleKey, "NobleKey");
|
|
20
|
+
var NobleKey = _NobleKey;
|
|
21
|
+
var _NobleCryptoProvider = class _NobleCryptoProvider {
|
|
22
|
+
constructor(logger) {
|
|
23
|
+
this.name = "Noble";
|
|
24
|
+
this.isAvailable = true;
|
|
25
|
+
this.logger = logger?.child({ component: "NobleCryptoProvider" });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generate ECDH P-256 key pair
|
|
29
|
+
*/
|
|
30
|
+
generateKeyPair() {
|
|
31
|
+
this.logger?.debug("Generating ECDH P-256 key pair using Noble");
|
|
32
|
+
try {
|
|
33
|
+
const privateKeyBytes = p256.utils.randomSecretKey();
|
|
34
|
+
const publicKeyUncompressed = p256.getPublicKey(privateKeyBytes, false);
|
|
35
|
+
this.logger?.debug("Key pair generation completed", {
|
|
36
|
+
publicKeyLength: publicKeyUncompressed.length
|
|
37
|
+
});
|
|
38
|
+
return Promise.resolve({
|
|
39
|
+
privateKey: new NobleKey(privateKeyBytes, "private", "ECDH-P256", true, ["deriveKey"]),
|
|
40
|
+
publicKey: new NobleKey(publicKeyUncompressed, "public", "ECDH-P256", true, [])
|
|
41
|
+
});
|
|
42
|
+
} catch (error) {
|
|
43
|
+
this.logger?.error("Key pair generation failed", {
|
|
44
|
+
error: {
|
|
45
|
+
message: error instanceof Error ? error.message : String(error),
|
|
46
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Export public key to ArrayBuffer (raw format)
|
|
54
|
+
*/
|
|
55
|
+
exportPublicKey(publicKey) {
|
|
56
|
+
const nobleKey = publicKey;
|
|
57
|
+
if (nobleKey.type !== "public") {
|
|
58
|
+
throw new Error("Expected public key");
|
|
59
|
+
}
|
|
60
|
+
return Promise.resolve(nobleKey.data.buffer.slice(nobleKey.data.byteOffset, nobleKey.data.byteOffset + nobleKey.data.byteLength));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Export private key to ArrayBuffer (raw format)
|
|
64
|
+
*/
|
|
65
|
+
exportPrivateKey(privateKey) {
|
|
66
|
+
const nobleKey = privateKey;
|
|
67
|
+
if (nobleKey.type !== "private") {
|
|
68
|
+
throw new Error("Expected private key");
|
|
69
|
+
}
|
|
70
|
+
return Promise.resolve(nobleKey.data.buffer.slice(nobleKey.data.byteOffset, nobleKey.data.byteOffset + nobleKey.data.byteLength));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Import public key from ArrayBuffer (raw format)
|
|
74
|
+
*/
|
|
75
|
+
importPublicKey(keyData) {
|
|
76
|
+
const keyBytes = new Uint8Array(keyData);
|
|
77
|
+
this.logger?.debug("importPublicKey called", {
|
|
78
|
+
keyLength: keyBytes.length,
|
|
79
|
+
keyBytesFirst20: Array.from(keyBytes.slice(0, 20)).map((b) => b.toString(16).padStart(2, "0")).join(" "),
|
|
80
|
+
keyBytesHex: Array.from(keyBytes).map((b) => b.toString(16).padStart(2, "0")).join("")
|
|
81
|
+
});
|
|
82
|
+
try {
|
|
83
|
+
let processedKeyBytes;
|
|
84
|
+
if (keyBytes.length === 65) {
|
|
85
|
+
this.logger?.debug("Processing 65-byte key", {
|
|
86
|
+
firstByte: `0x${keyBytes[0].toString(16)}`
|
|
87
|
+
});
|
|
88
|
+
if (keyBytes[0] !== 4) {
|
|
89
|
+
throw new Error(`Expected uncompressed key (0x04 prefix), got 0x${keyBytes[0].toString(16)}`);
|
|
90
|
+
}
|
|
91
|
+
processedKeyBytes = keyBytes;
|
|
92
|
+
} else if (keyBytes.length === 64) {
|
|
93
|
+
this.logger?.debug("Processing 64-byte key", {
|
|
94
|
+
action: "adding 0x04 prefix"
|
|
95
|
+
});
|
|
96
|
+
processedKeyBytes = new Uint8Array(65);
|
|
97
|
+
processedKeyBytes[0] = 4;
|
|
98
|
+
processedKeyBytes.set(keyBytes, 1);
|
|
99
|
+
} else {
|
|
100
|
+
throw new Error(`Invalid key length: expected 64 or 65 bytes, got ${keyBytes.length} bytes`);
|
|
101
|
+
}
|
|
102
|
+
this.logger?.debug("Key processing completed", {
|
|
103
|
+
processedLength: processedKeyBytes.length,
|
|
104
|
+
processedFirst20: Array.from(processedKeyBytes.slice(0, 20)).map((b) => b.toString(16).padStart(2, "0")).join(" ")
|
|
105
|
+
});
|
|
106
|
+
const isValid = p256.utils.isValidPublicKey(processedKeyBytes, false);
|
|
107
|
+
this.logger?.debug("Noble key validation completed", {
|
|
108
|
+
isValid
|
|
109
|
+
});
|
|
110
|
+
if (!isValid) {
|
|
111
|
+
this.logger?.debug("Key validation failed, trying alternative approaches", {
|
|
112
|
+
originalValidation: false
|
|
113
|
+
});
|
|
114
|
+
const isValidCompressed = p256.utils.isValidPublicKey(processedKeyBytes, true);
|
|
115
|
+
this.logger?.debug("Alternative validation attempted", {
|
|
116
|
+
compressedFormatValid: isValidCompressed
|
|
117
|
+
});
|
|
118
|
+
throw new Error("Key failed Noble validation");
|
|
119
|
+
}
|
|
120
|
+
return Promise.resolve(new NobleKey(processedKeyBytes, "public", "ECDH-P256", true, []));
|
|
121
|
+
} catch (error) {
|
|
122
|
+
this.logger?.error("Public key import failed", {
|
|
123
|
+
error: {
|
|
124
|
+
message: error instanceof Error ? error.message : String(error),
|
|
125
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
throw new Error(`Invalid P-256 public key: ${String(error)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Import private key from ArrayBuffer (raw format)
|
|
133
|
+
*/
|
|
134
|
+
importPrivateKey(keyData) {
|
|
135
|
+
const keyBytes = new Uint8Array(keyData);
|
|
136
|
+
try {
|
|
137
|
+
if (!p256.utils.isValidSecretKey(keyBytes)) {
|
|
138
|
+
throw new Error("Invalid secret key");
|
|
139
|
+
}
|
|
140
|
+
} catch (error) {
|
|
141
|
+
throw new Error(`Invalid P-256 private key: ${String(error)}`);
|
|
142
|
+
}
|
|
143
|
+
return Promise.resolve(new NobleKey(keyBytes, "private", "ECDH-P256", true, ["deriveKey"]));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Derive shared secret from ECDH key agreement
|
|
147
|
+
*/
|
|
148
|
+
deriveSharedSecret(privateKey, publicKey) {
|
|
149
|
+
this.logger?.debug("Deriving shared secret using ECDH with Noble");
|
|
150
|
+
const privKey = privateKey;
|
|
151
|
+
const pubKey = publicKey;
|
|
152
|
+
if (privKey.type !== "private") {
|
|
153
|
+
const error = new Error("Expected private key");
|
|
154
|
+
this.logger?.error("Shared secret derivation failed - invalid private key type", {
|
|
155
|
+
actualType: privKey.type
|
|
156
|
+
});
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
if (pubKey.type !== "public") {
|
|
160
|
+
const error = new Error("Expected public key");
|
|
161
|
+
this.logger?.error("Shared secret derivation failed - invalid public key type", {
|
|
162
|
+
actualType: pubKey.type
|
|
163
|
+
});
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
const sharedSecret = p256.getSharedSecret(privKey.data, pubKey.data, false);
|
|
168
|
+
const xCoordinate = sharedSecret.slice(1, 33);
|
|
169
|
+
this.logger?.debug("Shared secret derivation completed", {
|
|
170
|
+
sharedSecretLength: xCoordinate.length
|
|
171
|
+
});
|
|
172
|
+
return Promise.resolve(new NobleKey(xCoordinate, "secret", "AES-GCM", true, ["encrypt", "decrypt"]));
|
|
173
|
+
} catch (error) {
|
|
174
|
+
this.logger?.error("Shared secret derivation failed", {
|
|
175
|
+
error: {
|
|
176
|
+
message: error instanceof Error ? error.message : String(error),
|
|
177
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Derive AES-GCM key from shared secret using HKDF
|
|
185
|
+
*/
|
|
186
|
+
deriveEncryptionKey(sharedSecret, salt, info) {
|
|
187
|
+
const secretKey = sharedSecret;
|
|
188
|
+
if (secretKey.type !== "secret") {
|
|
189
|
+
throw new Error("Expected secret key");
|
|
190
|
+
}
|
|
191
|
+
const derivedKey = hkdf(sha256, secretKey.data, new Uint8Array(salt), new Uint8Array(info), 32);
|
|
192
|
+
return Promise.resolve(new NobleKey(derivedKey, "secret", "AES-GCM", true, ["encrypt", "decrypt"]));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Generate random bytes
|
|
196
|
+
*/
|
|
197
|
+
randomBytes(length) {
|
|
198
|
+
const bytes = randomBytes(length);
|
|
199
|
+
return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Encrypt data using AES-GCM
|
|
203
|
+
*/
|
|
204
|
+
encrypt(key, data, iv) {
|
|
205
|
+
this.logger?.debug("Encrypting data with AES-GCM using Noble", {
|
|
206
|
+
dataSize: data.byteLength,
|
|
207
|
+
ivSize: iv.byteLength
|
|
208
|
+
});
|
|
209
|
+
const secretKey = key;
|
|
210
|
+
if (secretKey.type !== "secret") {
|
|
211
|
+
const error = new Error("Expected secret key");
|
|
212
|
+
this.logger?.error("Encryption failed - invalid key type", {
|
|
213
|
+
actualType: secretKey.type
|
|
214
|
+
});
|
|
215
|
+
throw error;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const aesGcm = gcm(secretKey.data, new Uint8Array(iv));
|
|
219
|
+
const ciphertext = aesGcm.encrypt(new Uint8Array(data));
|
|
220
|
+
this.logger?.debug("Encryption completed", {
|
|
221
|
+
ciphertextSize: ciphertext.byteLength
|
|
222
|
+
});
|
|
223
|
+
return Promise.resolve(ciphertext.buffer.slice(ciphertext.byteOffset, ciphertext.byteOffset + ciphertext.byteLength));
|
|
224
|
+
} catch (error) {
|
|
225
|
+
this.logger?.error("Encryption failed", {
|
|
226
|
+
error: {
|
|
227
|
+
message: error instanceof Error ? error.message : String(error),
|
|
228
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Decrypt data using AES-GCM
|
|
236
|
+
*/
|
|
237
|
+
decrypt(key, data, iv) {
|
|
238
|
+
this.logger?.debug("Decrypting data with AES-GCM using Noble", {
|
|
239
|
+
dataSize: data.byteLength,
|
|
240
|
+
ivSize: iv.byteLength
|
|
241
|
+
});
|
|
242
|
+
const secretKey = key;
|
|
243
|
+
if (secretKey.type !== "secret") {
|
|
244
|
+
const error = new Error("Expected secret key");
|
|
245
|
+
this.logger?.error("Decryption failed - invalid key type", {
|
|
246
|
+
actualType: secretKey.type
|
|
247
|
+
});
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const aesGcm = gcm(secretKey.data, new Uint8Array(iv));
|
|
252
|
+
const plaintext = aesGcm.decrypt(new Uint8Array(data));
|
|
253
|
+
this.logger?.debug("Decryption completed", {
|
|
254
|
+
plaintextSize: plaintext.byteLength
|
|
255
|
+
});
|
|
256
|
+
return Promise.resolve(plaintext.buffer.slice(plaintext.byteOffset, plaintext.byteOffset + plaintext.byteLength));
|
|
257
|
+
} catch (error) {
|
|
258
|
+
this.logger?.error("Decryption failed", {
|
|
259
|
+
error: {
|
|
260
|
+
message: error instanceof Error ? error.message : String(error),
|
|
261
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Generate HMAC-SHA256
|
|
269
|
+
*/
|
|
270
|
+
generateHMAC(key, data) {
|
|
271
|
+
const secretKey = key;
|
|
272
|
+
if (secretKey.type !== "secret") {
|
|
273
|
+
throw new Error("Expected secret key");
|
|
274
|
+
}
|
|
275
|
+
const mac = hmac(sha256, secretKey.data, new Uint8Array(data));
|
|
276
|
+
return Promise.resolve(mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Verify HMAC-SHA256
|
|
280
|
+
*/
|
|
281
|
+
verifyHMAC(key, data, mac) {
|
|
282
|
+
const secretKey = key;
|
|
283
|
+
if (secretKey.type !== "secret") {
|
|
284
|
+
throw new Error("Expected secret key");
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
const expectedMac = hmac(sha256, secretKey.data, new Uint8Array(data));
|
|
288
|
+
const providedMac = new Uint8Array(mac);
|
|
289
|
+
if (expectedMac.length !== providedMac.length) {
|
|
290
|
+
return Promise.resolve(false);
|
|
291
|
+
}
|
|
292
|
+
let result = 0;
|
|
293
|
+
for (let i = 0; i < expectedMac.length; i++) {
|
|
294
|
+
result |= expectedMac[i] ^ providedMac[i];
|
|
295
|
+
}
|
|
296
|
+
return Promise.resolve(result === 0);
|
|
297
|
+
} catch {
|
|
298
|
+
return Promise.resolve(false);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
__name(_NobleCryptoProvider, "NobleCryptoProvider");
|
|
303
|
+
var NobleCryptoProvider = _NobleCryptoProvider;
|
|
304
|
+
registerCryptoProvider("noble", (logger) => new NobleCryptoProvider(logger));
|
|
305
|
+
|
|
306
|
+
export { NobleCryptoProvider };
|
|
307
|
+
//# sourceMappingURL=chunk-32OWUOZ3.js.map
|
|
308
|
+
//# sourceMappingURL=chunk-32OWUOZ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crypto/providers/noble-provider.ts"],"names":["nobleRandomBytes"],"mappings":"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","file":"chunk-32OWUOZ3.js","sourcesContent":["import { p256 } from '@noble/curves/nist.js';\nimport { gcm } from '@noble/ciphers/aes.js';\nimport { randomBytes as nobleRandomBytes } from '@noble/ciphers/utils.js';\nimport { hkdf } from '@noble/hashes/hkdf.js';\nimport { hmac } from '@noble/hashes/hmac.js';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport type { Logger } from '@bananalink-sdk/logger';\nimport type { CryptoProvider, CryptoKeyLike, ProviderKeyPair } from '../../types/crypto-provider';\nimport { registerCryptoProvider } from './registry';\n\n/**\n * Noble library implementation of CryptoKeyLike\n */\nclass NobleKey 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 * Noble cryptography implementation of CryptoProvider\n * Pure JavaScript implementation that works in all environments\n */\nexport class NobleCryptoProvider implements CryptoProvider {\n public readonly name = 'Noble';\n public readonly isAvailable = true; // Noble libraries work everywhere\n private readonly logger?: Logger;\n\n constructor(logger?: Logger) {\n this.logger = logger?.child({ component: 'NobleCryptoProvider' });\n }\n\n /**\n * Generate ECDH P-256 key pair\n */\n generateKeyPair(): Promise<ProviderKeyPair> {\n this.logger?.debug('Generating ECDH P-256 key pair using Noble');\n\n try {\n const privateKeyBytes = p256.utils.randomSecretKey();\n // Generate uncompressed public key to match WebCrypto format (65 bytes)\n const publicKeyUncompressed = p256.getPublicKey(privateKeyBytes, false); // false = uncompressed\n\n this.logger?.debug('Key pair generation completed', {\n publicKeyLength: publicKeyUncompressed.length\n });\n\n return Promise.resolve({\n privateKey: new NobleKey(privateKeyBytes, 'private', 'ECDH-P256', true, ['deriveKey']),\n publicKey: new NobleKey(publicKeyUncompressed, 'public', 'ECDH-P256', true, []),\n });\n } catch (error) {\n this.logger?.error('Key pair generation 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 * Export public key to ArrayBuffer (raw format)\n */\n exportPublicKey(publicKey: CryptoKeyLike): Promise<ArrayBuffer> {\n const nobleKey = publicKey as NobleKey;\n if (nobleKey.type !== 'public') {\n throw new Error('Expected public key');\n }\n return Promise.resolve(nobleKey.data.buffer.slice(nobleKey.data.byteOffset, nobleKey.data.byteOffset + nobleKey.data.byteLength));\n }\n\n /**\n * Export private key to ArrayBuffer (raw format)\n */\n exportPrivateKey(privateKey: CryptoKeyLike): Promise<ArrayBuffer> {\n const nobleKey = privateKey as NobleKey;\n if (nobleKey.type !== 'private') {\n throw new Error('Expected private key');\n }\n return Promise.resolve(nobleKey.data.buffer.slice(nobleKey.data.byteOffset, nobleKey.data.byteOffset + nobleKey.data.byteLength));\n }\n\n /**\n * Import public key from ArrayBuffer (raw format)\n */\n importPublicKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const keyBytes = new Uint8Array(keyData);\n\n // Debug logging\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 keyBytesHex: Array.from(keyBytes).map(b => b.toString(16).padStart(2, '0')).join('')\n });\n\n // Validate public key using Noble's validation\n try {\n let processedKeyBytes: Uint8Array;\n\n // Handle different key formats\n if (keyBytes.length === 65) {\n // Already in uncompressed format (0x04 + 32 + 32)\n this.logger?.debug('Processing 65-byte key', {\n firstByte: `0x${keyBytes[0].toString(16)}`\n });\n if (keyBytes[0] !== 0x04) {\n throw new Error(`Expected uncompressed key (0x04 prefix), got 0x${keyBytes[0].toString(16)}`);\n }\n processedKeyBytes = keyBytes;\n } else if (keyBytes.length === 64) {\n // Raw format (32 + 32) - needs 0x04 prefix for Noble\n // This is the WebCrypto export format\n this.logger?.debug('Processing 64-byte key', {\n action: 'adding 0x04 prefix'\n });\n processedKeyBytes = new Uint8Array(65);\n processedKeyBytes[0] = 0x04; // Uncompressed point indicator\n processedKeyBytes.set(keyBytes, 1); // Copy the 64 bytes after the prefix\n } else {\n throw new Error(`Invalid key length: expected 64 or 65 bytes, got ${keyBytes.length} bytes`);\n }\n\n this.logger?.debug('Key processing completed', {\n processedLength: processedKeyBytes.length,\n processedFirst20: Array.from(processedKeyBytes.slice(0, 20)).map(b => b.toString(16).padStart(2, '0')).join(' ')\n });\n\n // Validate using Noble's validation\n const isValid = p256.utils.isValidPublicKey(processedKeyBytes, false); // false = allow uncompressed\n this.logger?.debug('Noble key validation completed', {\n isValid\n });\n\n if (!isValid) {\n // Try additional debugging\n this.logger?.debug('Key validation failed, trying alternative approaches', {\n originalValidation: false\n });\n\n // Try with compressed format check\n const isValidCompressed = p256.utils.isValidPublicKey(processedKeyBytes, true);\n this.logger?.debug('Alternative validation attempted', {\n compressedFormatValid: isValidCompressed\n });\n\n throw new Error('Key failed Noble validation');\n }\n\n return Promise.resolve(new NobleKey(processedKeyBytes, 'public', 'ECDH-P256', true, []));\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 importPrivateKey(keyData: ArrayBuffer): Promise<CryptoKeyLike> {\n const keyBytes = new Uint8Array(keyData);\n\n // Validate private key (Noble will throw if invalid)\n try {\n if (!p256.utils.isValidSecretKey(keyBytes)) {\n throw new Error('Invalid secret key');\n }\n } catch (error) {\n throw new Error(`Invalid P-256 private key: ${String(error)}`);\n }\n\n return Promise.resolve(new NobleKey(keyBytes, 'private', 'ECDH-P256', true, ['deriveKey']));\n }\n\n /**\n * Derive shared secret from ECDH key agreement\n */\n deriveSharedSecret(privateKey: CryptoKeyLike, publicKey: CryptoKeyLike): Promise<CryptoKeyLike> {\n this.logger?.debug('Deriving shared secret using ECDH with Noble');\n\n const privKey = privateKey as NobleKey;\n const pubKey = publicKey as NobleKey;\n\n if (privKey.type !== 'private') {\n const error = new Error('Expected private key');\n this.logger?.error('Shared secret derivation failed - invalid private key type', {\n actualType: privKey.type\n });\n throw error;\n }\n if (pubKey.type !== 'public') {\n const error = new Error('Expected public key');\n this.logger?.error('Shared secret derivation failed - invalid public key type', {\n actualType: pubKey.type\n });\n throw error;\n }\n\n try {\n // Perform ECDH key agreement - return x-coordinate only to match WebCrypto\n const sharedSecret = p256.getSharedSecret(privKey.data, pubKey.data, false); // uncompressed\n // Extract only the x-coordinate (32 bytes) to match WebCrypto behavior\n const xCoordinate = sharedSecret.slice(1, 33); // Skip 0x04 prefix, take next 32 bytes\n\n this.logger?.debug('Shared secret derivation completed', {\n sharedSecretLength: xCoordinate.length\n });\n\n return Promise.resolve(new NobleKey(xCoordinate, 'secret', 'AES-GCM', true, ['encrypt', 'decrypt']));\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 deriveEncryptionKey(sharedSecret: CryptoKeyLike, salt: ArrayBuffer, info: ArrayBuffer): Promise<CryptoKeyLike> {\n const secretKey = sharedSecret as NobleKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n // Perform HKDF with SHA-256\n const derivedKey = hkdf(sha256, secretKey.data, new Uint8Array(salt), new Uint8Array(info), 32); // 32 bytes = 256 bits\n\n return Promise.resolve(new NobleKey(derivedKey, 'secret', 'AES-GCM', true, ['encrypt', 'decrypt']));\n }\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): ArrayBuffer {\n const bytes = nobleRandomBytes(length);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n }\n\n /**\n * Encrypt data using AES-GCM\n */\n encrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Encrypting data with AES-GCM using Noble', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as NobleKey;\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 const aesGcm = gcm(secretKey.data, new Uint8Array(iv));\n const ciphertext = aesGcm.encrypt(new Uint8Array(data));\n\n this.logger?.debug('Encryption completed', {\n ciphertextSize: ciphertext.byteLength\n });\n\n return Promise.resolve(ciphertext.buffer.slice(ciphertext.byteOffset, ciphertext.byteOffset + ciphertext.byteLength));\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 decrypt(key: CryptoKeyLike, data: ArrayBuffer, iv: ArrayBuffer): Promise<ArrayBuffer> {\n this.logger?.debug('Decrypting data with AES-GCM using Noble', {\n dataSize: data.byteLength,\n ivSize: iv.byteLength\n });\n\n const secretKey = key as NobleKey;\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 aesGcm = gcm(secretKey.data, new Uint8Array(iv));\n const plaintext = aesGcm.decrypt(new Uint8Array(data));\n\n this.logger?.debug('Decryption completed', {\n plaintextSize: plaintext.byteLength\n });\n\n return Promise.resolve(plaintext.buffer.slice(plaintext.byteOffset, plaintext.byteOffset + plaintext.byteLength));\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 generateHMAC(key: CryptoKeyLike, data: ArrayBuffer): Promise<ArrayBuffer> {\n const secretKey = key as NobleKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n const mac = hmac(sha256, secretKey.data, new Uint8Array(data));\n return Promise.resolve(mac.buffer.slice(mac.byteOffset, mac.byteOffset + mac.byteLength));\n }\n\n /**\n * Verify HMAC-SHA256\n */\n verifyHMAC(key: CryptoKeyLike, data: ArrayBuffer, mac: ArrayBuffer): Promise<boolean> {\n const secretKey = key as NobleKey;\n\n if (secretKey.type !== 'secret') {\n throw new Error('Expected secret key');\n }\n\n try {\n const expectedMac = hmac(sha256, secretKey.data, new Uint8Array(data));\n const providedMac = new Uint8Array(mac);\n\n // Constant-time comparison\n if (expectedMac.length !== providedMac.length) {\n return Promise.resolve(false);\n }\n\n let result = 0;\n for (let i = 0; i < expectedMac.length; i++) {\n result |= expectedMac[i] ^ providedMac[i];\n }\n\n return Promise.resolve(result === 0);\n } catch {\n return Promise.resolve(false);\n }\n }\n}\n\n/**\n * Self-register Noble provider on import\n * This allows the provider to be available when explicitly imported\n */\nregisterCryptoProvider('noble', (logger) => new NobleCryptoProvider(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 noble: true;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
|
|
4
|
+
|
|
5
|
+
// src/validators/index.ts
|
|
6
|
+
function isValidAddress(address) {
|
|
7
|
+
return typeof address === "string" && /^0x[0-9a-fA-F]{40}$/.test(address);
|
|
8
|
+
}
|
|
9
|
+
chunkWGEGR3DF_cjs.__name(isValidAddress, "isValidAddress");
|
|
10
|
+
function isValidUrl(url) {
|
|
11
|
+
if (typeof url !== "string") return false;
|
|
12
|
+
try {
|
|
13
|
+
new URL(url);
|
|
14
|
+
return true;
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
chunkWGEGR3DF_cjs.__name(isValidUrl, "isValidUrl");
|
|
20
|
+
function isValidTimestamp(timestamp) {
|
|
21
|
+
if (typeof timestamp !== "string") return false;
|
|
22
|
+
try {
|
|
23
|
+
const date = new Date(timestamp);
|
|
24
|
+
return !isNaN(date.getTime()) && timestamp === date.toISOString();
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
chunkWGEGR3DF_cjs.__name(isValidTimestamp, "isValidTimestamp");
|
|
30
|
+
function isValidChainId(chainId) {
|
|
31
|
+
return typeof chainId === "number" && Number.isInteger(chainId) && chainId > 0;
|
|
32
|
+
}
|
|
33
|
+
chunkWGEGR3DF_cjs.__name(isValidChainId, "isValidChainId");
|
|
34
|
+
function isValidNonce(nonce) {
|
|
35
|
+
return typeof nonce === "string" && /^[a-fA-F0-9]{64}$/.test(nonce);
|
|
36
|
+
}
|
|
37
|
+
chunkWGEGR3DF_cjs.__name(isValidNonce, "isValidNonce");
|
|
38
|
+
function isValidSessionId(sessionId) {
|
|
39
|
+
return typeof sessionId === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(sessionId);
|
|
40
|
+
}
|
|
41
|
+
chunkWGEGR3DF_cjs.__name(isValidSessionId, "isValidSessionId");
|
|
42
|
+
function isValidBase64(str) {
|
|
43
|
+
if (typeof str !== "string" || str.length === 0) return false;
|
|
44
|
+
const base64Pattern = /^[A-Za-z0-9+/\-_]+(={0,2})$/;
|
|
45
|
+
if (!base64Pattern.test(str)) return false;
|
|
46
|
+
const paddingMatch = str.match(/=*$/);
|
|
47
|
+
const padding = paddingMatch ? paddingMatch[0].length : 0;
|
|
48
|
+
return padding === 0 || padding <= 2 && str.length % 4 === 0;
|
|
49
|
+
}
|
|
50
|
+
chunkWGEGR3DF_cjs.__name(isValidBase64, "isValidBase64");
|
|
51
|
+
function isValidHex(hex) {
|
|
52
|
+
return typeof hex === "string" && /^(0x)?[0-9a-fA-F]+$/.test(hex);
|
|
53
|
+
}
|
|
54
|
+
chunkWGEGR3DF_cjs.__name(isValidHex, "isValidHex");
|
|
55
|
+
function isValidMessageType(type) {
|
|
56
|
+
return type === "auth" || type === "tx" || type === "sign";
|
|
57
|
+
}
|
|
58
|
+
chunkWGEGR3DF_cjs.__name(isValidMessageType, "isValidMessageType");
|
|
59
|
+
function isValidEncryptionAlgorithm(algo) {
|
|
60
|
+
return algo === "AES-GCM" || algo === "plaintext";
|
|
61
|
+
}
|
|
62
|
+
chunkWGEGR3DF_cjs.__name(isValidEncryptionAlgorithm, "isValidEncryptionAlgorithm");
|
|
63
|
+
function isValidDomain(domain) {
|
|
64
|
+
if (typeof domain !== "string" || domain.length === 0) return false;
|
|
65
|
+
return /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(
|
|
66
|
+
domain
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
chunkWGEGR3DF_cjs.__name(isValidDomain, "isValidDomain");
|
|
70
|
+
function isValidPublicKey(publicKey) {
|
|
71
|
+
if (typeof publicKey !== "string") return false;
|
|
72
|
+
const parts = publicKey.split(":");
|
|
73
|
+
if (parts.length !== 2) return false;
|
|
74
|
+
const [algorithm, key] = parts;
|
|
75
|
+
return (algorithm === "AES-GCM" || algorithm === "cleartext") && (algorithm === "cleartext" || isValidBase64(key));
|
|
76
|
+
}
|
|
77
|
+
chunkWGEGR3DF_cjs.__name(isValidPublicKey, "isValidPublicKey");
|
|
78
|
+
function isValidEncryptedPayload(payload) {
|
|
79
|
+
if (!payload || typeof payload !== "object") return false;
|
|
80
|
+
const p = payload;
|
|
81
|
+
return isValidBase64(p.iv) && isValidBase64(p.ciphertext) && isValidBase64(p.mac);
|
|
82
|
+
}
|
|
83
|
+
chunkWGEGR3DF_cjs.__name(isValidEncryptedPayload, "isValidEncryptedPayload");
|
|
84
|
+
function createValidationResult(valid, data, error) {
|
|
85
|
+
if (valid) {
|
|
86
|
+
return { valid: true, data };
|
|
87
|
+
}
|
|
88
|
+
return { valid: false, error };
|
|
89
|
+
}
|
|
90
|
+
chunkWGEGR3DF_cjs.__name(createValidationResult, "createValidationResult");
|
|
91
|
+
function hasRequiredFields(obj, fields) {
|
|
92
|
+
if (!obj || typeof obj !== "object") return false;
|
|
93
|
+
const o = obj;
|
|
94
|
+
return fields.every(
|
|
95
|
+
(field) => field in o && o[field] !== null && o[field] !== void 0 && o[field] !== ""
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
chunkWGEGR3DF_cjs.__name(hasRequiredFields, "hasRequiredFields");
|
|
99
|
+
function isValidSIWEMessage(message) {
|
|
100
|
+
if (!message || typeof message !== "object") return false;
|
|
101
|
+
const m = message;
|
|
102
|
+
return isValidDomain(m.domain) && isValidAddress(m.address) && isValidUrl(m.uri) && m.version === "1" && isValidChainId(m.chainId) && isValidNonce(m.nonce) && isValidTimestamp(m.issuedAt);
|
|
103
|
+
}
|
|
104
|
+
chunkWGEGR3DF_cjs.__name(isValidSIWEMessage, "isValidSIWEMessage");
|
|
105
|
+
|
|
106
|
+
exports.createValidationResult = createValidationResult;
|
|
107
|
+
exports.hasRequiredFields = hasRequiredFields;
|
|
108
|
+
exports.isValidAddress = isValidAddress;
|
|
109
|
+
exports.isValidBase64 = isValidBase64;
|
|
110
|
+
exports.isValidChainId = isValidChainId;
|
|
111
|
+
exports.isValidDomain = isValidDomain;
|
|
112
|
+
exports.isValidEncryptedPayload = isValidEncryptedPayload;
|
|
113
|
+
exports.isValidEncryptionAlgorithm = isValidEncryptionAlgorithm;
|
|
114
|
+
exports.isValidHex = isValidHex;
|
|
115
|
+
exports.isValidMessageType = isValidMessageType;
|
|
116
|
+
exports.isValidNonce = isValidNonce;
|
|
117
|
+
exports.isValidPublicKey = isValidPublicKey;
|
|
118
|
+
exports.isValidSIWEMessage = isValidSIWEMessage;
|
|
119
|
+
exports.isValidSessionId = isValidSessionId;
|
|
120
|
+
exports.isValidTimestamp = isValidTimestamp;
|
|
121
|
+
exports.isValidUrl = isValidUrl;
|
|
122
|
+
//# sourceMappingURL=chunk-65HNHRJK.cjs.map
|
|
123
|
+
//# sourceMappingURL=chunk-65HNHRJK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/validators/index.ts"],"names":["__name"],"mappings":"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","file":"chunk-65HNHRJK.cjs","sourcesContent":["/**\n * Lightweight validation utilities for BananaLink protocol types\n *\n * Zero dependencies, minimal bundle size (~3KB)\n * Suitable for browsers, React Native, and Node.js\n *\n * For full Zod-based validation, use: @bananalink-sdk/protocol/validation\n */\n\n/**\n * Validate Ethereum address format (0x + 40 hex characters)\n */\nexport function isValidAddress(address: unknown): address is string {\n return typeof address === 'string' && /^0x[0-9a-fA-F]{40}$/.test(address);\n}\n\n/**\n * Validate URL format\n */\nexport function isValidUrl(url: unknown): url is string {\n if (typeof url !== 'string') return false;\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate ISO 8601 timestamp format\n */\nexport function isValidTimestamp(timestamp: unknown): timestamp is string {\n if (typeof timestamp !== 'string') return false;\n try {\n const date = new Date(timestamp);\n return !isNaN(date.getTime()) && timestamp === date.toISOString();\n } catch {\n return false;\n }\n}\n\n/**\n * Validate chain ID (positive integer)\n */\nexport function isValidChainId(chainId: unknown): chainId is number {\n return typeof chainId === 'number' && Number.isInteger(chainId) && chainId > 0;\n}\n\n/**\n * Validate nonce format (64 hex characters = 32 bytes)\n * Protocol v2.0 standard\n */\nexport function isValidNonce(nonce: unknown): nonce is string {\n return typeof nonce === 'string' && /^[a-fA-F0-9]{64}$/.test(nonce);\n}\n\n/**\n * Validate session ID format (UUID v4)\n */\nexport function isValidSessionId(sessionId: unknown): sessionId is string {\n return (\n typeof sessionId === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(sessionId)\n );\n}\n\n/**\n * Validate base64 string format\n * Accepts standard base64 (with padding) and base64url variants\n */\nexport function isValidBase64(str: unknown): str is string {\n if (typeof str !== 'string' || str.length === 0) return false;\n\n // RFC 4648 base64 pattern: A-Z, a-z, 0-9, +, /, = (padding)\n // Also accepts base64url variant: A-Z, a-z, 0-9, -, _\n const base64Pattern = /^[A-Za-z0-9+/\\-_]+(={0,2})$/;\n\n if (!base64Pattern.test(str)) return false;\n\n // Validate padding - must be 0, 1, or 2 '=' characters at the end\n // Length must be multiple of 4 for standard base64 with padding\n const paddingMatch = str.match(/=*$/);\n const padding = paddingMatch ? paddingMatch[0].length : 0;\n\n // For base64url (no padding) or standard base64 (proper padding)\n return padding === 0 || (padding <= 2 && (str.length % 4 === 0));\n}\n\n/**\n * Validate hex string format\n */\nexport function isValidHex(hex: unknown): hex is string {\n return typeof hex === 'string' && /^(0x)?[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Validation result with detailed error information\n */\nexport interface ValidationResult<T = unknown> {\n valid: boolean;\n error?: string;\n data?: T;\n}\n\n/**\n * Validate message type enum\n */\nexport function isValidMessageType(type: unknown): type is 'auth' | 'tx' | 'sign' {\n return type === 'auth' || type === 'tx' || type === 'sign';\n}\n\n/**\n * Validate encryption algorithm\n */\nexport function isValidEncryptionAlgorithm(algo: unknown): algo is 'AES-GCM' | 'plaintext' {\n return algo === 'AES-GCM' || algo === 'plaintext';\n}\n\n/**\n * Validate domain name format\n */\nexport function isValidDomain(domain: unknown): domain is string {\n if (typeof domain !== 'string' || domain.length === 0) return false;\n // Basic domain validation (not comprehensive, but sufficient for protocol)\n return /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(\n domain\n );\n}\n\n/**\n * Validate public key format (algorithm:base64)\n */\nexport function isValidPublicKey(publicKey: unknown): publicKey is string {\n if (typeof publicKey !== 'string') return false;\n const parts = publicKey.split(':');\n if (parts.length !== 2) return false;\n const [algorithm, key] = parts;\n return (\n (algorithm === 'AES-GCM' || algorithm === 'cleartext') &&\n (algorithm === 'cleartext' || isValidBase64(key))\n );\n}\n\n/**\n * Validate encrypted payload structure\n */\nexport interface EncryptedPayload {\n iv: string;\n ciphertext: string;\n mac: string;\n}\n\nexport function isValidEncryptedPayload(payload: unknown): payload is EncryptedPayload {\n if (!payload || typeof payload !== 'object') return false;\n const p = payload as Record<string, unknown>;\n return (\n isValidBase64(p.iv) &&\n isValidBase64(p.ciphertext) &&\n isValidBase64(p.mac)\n );\n}\n\n/**\n * Create a validation result\n */\nexport function createValidationResult<T = unknown>(\n valid: boolean,\n data?: T,\n error?: string\n): ValidationResult<T> {\n if (valid) {\n return { valid: true, data };\n }\n return { valid: false, error };\n}\n\n/**\n * Validate required fields are present and non-empty\n */\nexport function hasRequiredFields<T extends object>(\n obj: unknown,\n fields: (keyof T)[]\n): obj is T {\n if (!obj || typeof obj !== 'object') return false;\n const o = obj as Record<string, unknown>;\n return fields.every(\n (field) =>\n field in o &&\n o[field as string] !== null &&\n o[field as string] !== undefined &&\n o[field as string] !== ''\n );\n}\n\n/**\n * Validate SIWE message structure (minimal check)\n */\nexport interface SIWEMessage {\n domain: string;\n address: string;\n uri: string;\n version: string;\n chainId: number;\n nonce: string;\n issuedAt: string;\n}\n\nexport function isValidSIWEMessage(message: unknown): message is SIWEMessage {\n if (!message || typeof message !== 'object') return false;\n const m = message as Record<string, unknown>;\n\n return (\n isValidDomain(m.domain) &&\n isValidAddress(m.address) &&\n isValidUrl(m.uri) &&\n m.version === '1' &&\n isValidChainId(m.chainId) &&\n isValidNonce(m.nonce) &&\n isValidTimestamp(m.issuedAt)\n );\n}\n"]}
|