shogun-core 5.2.0 → 5.2.2
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 +145 -1143
- package/dist/browser/defaultVendors-node_modules_hpke_chacha20poly1305_esm_mod_js.shogun-core.js +1220 -0
- package/dist/browser/defaultVendors-node_modules_hpke_chacha20poly1305_esm_mod_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_hpke_hybridkem-x-wing_esm_mod_js.shogun-core.js +844 -0
- package/dist/browser/defaultVendors-node_modules_hpke_hybridkem-x-wing_esm_mod_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_mlkem_esm_mod_js.shogun-core.js +2335 -0
- package/dist/browser/defaultVendors-node_modules_mlkem_esm_mod_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_ciphers_chacha_js.shogun-core.js +999 -0
- package/dist/browser/defaultVendors-node_modules_noble_ciphers_chacha_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_curve_js-node_modules_noble_curves_esm_-1ce4ed.shogun-core.js +1651 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_curve_js-node_modules_noble_curves_esm_-1ce4ed.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_edwards_js-node_modules_noble_curves_es-a82056.shogun-core.js +825 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_edwards_js-node_modules_noble_curves_es-a82056.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed25519_js.shogun-core.js +508 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed25519_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed448_js.shogun-core.js +747 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed448_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_nist_js.shogun-core.js +1608 -0
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_nist_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_noble_post-quantum_ml-dsa_js.shogun-core.js +2117 -0
- package/dist/browser/defaultVendors-node_modules_noble_post-quantum_ml-dsa_js.shogun-core.js.map +1 -0
- package/dist/browser/defaultVendors-node_modules_openpgp_dist_openpgp_min_mjs.shogun-core.js +86 -0
- package/dist/browser/defaultVendors-node_modules_openpgp_dist_openpgp_min_mjs.shogun-core.js.map +1 -0
- package/dist/browser/node_modules_hpke_ml-kem_esm_mod_js.shogun-core.js +539 -0
- package/dist/browser/node_modules_hpke_ml-kem_esm_mod_js.shogun-core.js.map +1 -0
- package/dist/browser/shogun-core.js +160386 -0
- package/dist/browser/shogun-core.js.map +1 -0
- package/dist/config/simplified-config.js +236 -0
- package/dist/core.js +329 -0
- package/dist/crypto/asymmetric.js +99 -0
- package/dist/crypto/double-ratchet.js +370 -0
- package/dist/crypto/file-encryption.js +213 -0
- package/dist/crypto/hashing.js +87 -0
- package/dist/crypto/index.js +34 -0
- package/dist/crypto/mls-codec.js +202 -0
- package/dist/crypto/mls.js +550 -0
- package/dist/crypto/pgp.js +390 -0
- package/dist/crypto/random-generation.js +341 -0
- package/dist/crypto/sframe.js +350 -0
- package/dist/crypto/signal-protocol.js +376 -0
- package/dist/crypto/symmetric.js +91 -0
- package/dist/crypto/types.js +2 -0
- package/dist/crypto/utils.js +140 -0
- package/dist/examples/auth-test.js +253 -0
- package/dist/examples/crypto-identity-example.js +151 -0
- package/dist/examples/crypto-working-test.js +83 -0
- package/dist/examples/double-ratchet-test.js +155 -0
- package/dist/examples/mls-advanced-example.js +294 -0
- package/dist/examples/mls-sframe-test.js +304 -0
- package/dist/examples/pgp-example.js +200 -0
- package/dist/examples/quick-auth-test.js +61 -0
- package/dist/examples/random-generation-test.js +151 -0
- package/dist/examples/signal-protocol-test.js +38 -0
- package/dist/examples/simple-api-test.js +114 -0
- package/dist/examples/simple-crypto-identity-example.js +84 -0
- package/dist/examples/timeout-test.js +227 -0
- package/dist/examples/zkproof-credentials-example.js +212 -0
- package/dist/examples/zkproof-example.js +201 -0
- package/dist/gundb/api.js +435 -0
- package/dist/gundb/crypto.js +283 -0
- package/dist/gundb/db.js +1946 -0
- package/dist/gundb/derive.js +232 -0
- package/dist/gundb/errors.js +76 -0
- package/dist/gundb/index.js +22 -0
- package/dist/gundb/rxjs.js +447 -0
- package/dist/gundb/types.js +5 -0
- package/dist/index.js +58 -0
- package/dist/interfaces/common.js +2 -0
- package/dist/interfaces/events.js +40 -0
- package/dist/interfaces/plugin.js +2 -0
- package/dist/interfaces/shogun.js +37 -0
- package/dist/managers/AuthManager.js +226 -0
- package/dist/managers/CoreInitializer.js +228 -0
- package/dist/managers/CryptoIdentityManager.js +366 -0
- package/dist/managers/EventManager.js +70 -0
- package/dist/managers/PluginManager.js +299 -0
- package/dist/plugins/base.js +50 -0
- package/dist/plugins/index.js +32 -0
- package/dist/plugins/nostr/index.js +20 -0
- package/dist/plugins/nostr/nostrConnector.js +419 -0
- package/dist/plugins/nostr/nostrConnectorPlugin.js +453 -0
- package/dist/plugins/nostr/nostrSigner.js +319 -0
- package/dist/plugins/nostr/types.js +2 -0
- package/dist/plugins/smartwallet/index.js +18 -0
- package/dist/plugins/smartwallet/smartWalletPlugin.js +511 -0
- package/dist/plugins/smartwallet/types.js +2 -0
- package/dist/plugins/web3/index.js +20 -0
- package/dist/plugins/web3/types.js +2 -0
- package/dist/plugins/web3/web3Connector.js +533 -0
- package/dist/plugins/web3/web3ConnectorPlugin.js +455 -0
- package/dist/plugins/web3/web3Signer.js +314 -0
- package/dist/plugins/webauthn/index.js +19 -0
- package/dist/plugins/webauthn/types.js +14 -0
- package/dist/plugins/webauthn/webauthn.js +496 -0
- package/dist/plugins/webauthn/webauthnPlugin.js +489 -0
- package/dist/plugins/webauthn/webauthnSigner.js +310 -0
- package/dist/plugins/zkproof/index.js +53 -0
- package/dist/plugins/zkproof/types.js +2 -0
- package/dist/plugins/zkproof/zkCredentials.js +213 -0
- package/dist/plugins/zkproof/zkProofConnector.js +198 -0
- package/dist/plugins/zkproof/zkProofPlugin.js +272 -0
- package/dist/storage/storage.js +145 -0
- package/dist/types/config/simplified-config.d.ts +114 -0
- package/dist/types/core.d.ts +305 -0
- package/dist/types/crypto/asymmetric.d.ts +6 -0
- package/dist/types/crypto/double-ratchet.d.ts +22 -0
- package/dist/types/crypto/file-encryption.d.ts +19 -0
- package/dist/types/crypto/hashing.d.ts +9 -0
- package/dist/types/crypto/index.d.ts +13 -0
- package/dist/types/crypto/mls-codec.d.ts +39 -0
- package/dist/types/crypto/mls.d.ts +130 -0
- package/dist/types/crypto/pgp.d.ts +95 -0
- package/dist/types/crypto/random-generation.d.ts +35 -0
- package/dist/types/crypto/sframe.d.ts +102 -0
- package/dist/types/crypto/signal-protocol.d.ts +26 -0
- package/dist/types/crypto/symmetric.d.ts +9 -0
- package/dist/types/crypto/types.d.ts +144 -0
- package/dist/types/crypto/utils.d.ts +22 -0
- package/dist/types/examples/auth-test.d.ts +8 -0
- package/dist/types/examples/crypto-identity-example.d.ts +5 -0
- package/dist/types/examples/crypto-working-test.d.ts +1 -0
- package/dist/types/examples/double-ratchet-test.d.ts +1 -0
- package/dist/types/examples/mls-advanced-example.d.ts +53 -0
- package/dist/types/examples/mls-sframe-test.d.ts +1 -0
- package/dist/types/examples/pgp-example.d.ts +75 -0
- package/dist/types/examples/quick-auth-test.d.ts +8 -0
- package/dist/types/examples/random-generation-test.d.ts +1 -0
- package/dist/types/examples/signal-protocol-test.d.ts +1 -0
- package/dist/types/examples/simple-api-test.d.ts +10 -0
- package/dist/types/examples/simple-crypto-identity-example.d.ts +6 -0
- package/dist/types/examples/timeout-test.d.ts +8 -0
- package/dist/types/examples/zkproof-credentials-example.d.ts +12 -0
- package/dist/types/examples/zkproof-example.d.ts +11 -0
- package/dist/types/gundb/api.d.ts +185 -0
- package/dist/types/gundb/crypto.d.ts +95 -0
- package/dist/types/gundb/db.d.ts +397 -0
- package/dist/types/gundb/derive.d.ts +21 -0
- package/dist/types/gundb/errors.d.ts +42 -0
- package/dist/types/gundb/index.d.ts +3 -0
- package/dist/types/gundb/rxjs.d.ts +110 -0
- package/dist/types/gundb/types.d.ts +255 -0
- package/dist/types/index.d.ts +16 -0
- package/dist/types/interfaces/common.d.ts +85 -0
- package/dist/types/interfaces/events.d.ts +131 -0
- package/dist/types/interfaces/plugin.d.ts +162 -0
- package/dist/types/interfaces/shogun.d.ts +208 -0
- package/dist/types/managers/AuthManager.d.ts +72 -0
- package/dist/types/managers/CoreInitializer.d.ts +40 -0
- package/dist/types/managers/CryptoIdentityManager.d.ts +102 -0
- package/dist/types/managers/EventManager.d.ts +49 -0
- package/dist/types/managers/PluginManager.d.ts +145 -0
- package/dist/types/plugins/base.d.ts +35 -0
- package/dist/types/plugins/index.d.ts +18 -0
- package/dist/types/plugins/nostr/index.d.ts +4 -0
- package/dist/types/plugins/nostr/nostrConnector.d.ts +119 -0
- package/dist/types/plugins/nostr/nostrConnectorPlugin.d.ts +163 -0
- package/dist/types/plugins/nostr/nostrSigner.d.ts +105 -0
- package/dist/types/plugins/nostr/types.d.ts +122 -0
- package/dist/types/plugins/smartwallet/index.d.ts +2 -0
- package/dist/types/plugins/smartwallet/smartWalletPlugin.d.ts +67 -0
- package/dist/types/plugins/smartwallet/types.d.ts +80 -0
- package/dist/types/plugins/web3/index.d.ts +4 -0
- package/dist/types/plugins/web3/types.d.ts +107 -0
- package/dist/types/plugins/web3/web3Connector.d.ts +129 -0
- package/dist/types/plugins/web3/web3ConnectorPlugin.d.ts +160 -0
- package/dist/types/plugins/web3/web3Signer.d.ts +114 -0
- package/dist/types/plugins/webauthn/index.d.ts +3 -0
- package/dist/types/plugins/webauthn/types.d.ts +183 -0
- package/dist/types/plugins/webauthn/webauthn.d.ts +129 -0
- package/dist/types/plugins/webauthn/webauthnPlugin.d.ts +179 -0
- package/dist/types/plugins/webauthn/webauthnSigner.d.ts +91 -0
- package/dist/types/plugins/zkproof/index.d.ts +48 -0
- package/dist/types/plugins/zkproof/types.d.ts +123 -0
- package/dist/types/plugins/zkproof/zkCredentials.d.ts +112 -0
- package/dist/types/plugins/zkproof/zkProofConnector.d.ts +46 -0
- package/dist/types/plugins/zkproof/zkProofPlugin.d.ts +76 -0
- package/dist/types/storage/storage.d.ts +51 -0
- package/dist/types/utils/errorHandler.d.ts +119 -0
- package/dist/types/utils/eventEmitter.d.ts +39 -0
- package/dist/types/utils/seedPhrase.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +27 -0
- package/dist/utils/errorHandler.js +246 -0
- package/dist/utils/eventEmitter.js +79 -0
- package/dist/utils/seedPhrase.js +97 -0
- package/dist/utils/validation.js +81 -0
- package/package.json +10 -57
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Timeout Test Script
|
|
4
|
+
*
|
|
5
|
+
* Tests the timeout mechanism for signup and login operations
|
|
6
|
+
* This script specifically tests the fixes we implemented to prevent hanging
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.timeoutTest = timeoutTest;
|
|
10
|
+
const api_1 = require("../gundb/api");
|
|
11
|
+
async function timeoutTest() {
|
|
12
|
+
console.log("⏱️ ShogunCore Timeout Test\n");
|
|
13
|
+
console.log("This test verifies that signup/login operations don't hang indefinitely\n");
|
|
14
|
+
// === INITIALIZATION ===
|
|
15
|
+
console.log("📦 === INITIALIZATION ===\n");
|
|
16
|
+
const quickStart = new api_1.AutoQuickStart({
|
|
17
|
+
peers: [
|
|
18
|
+
"https://peer.wallie.io/gun",
|
|
19
|
+
"https://gun-manhattan.herokuapp.com/gun",
|
|
20
|
+
"https://gun.defucc.me/gun",
|
|
21
|
+
],
|
|
22
|
+
appScope: "timeout-test",
|
|
23
|
+
enableGunDebug: true,
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
await quickStart.init();
|
|
27
|
+
console.log("✓ ShogunCore initialized successfully");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error("❌ Failed to initialize ShogunCore:", error);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const db = quickStart.api.database;
|
|
34
|
+
console.log("");
|
|
35
|
+
// === TEST 1: NORMAL SIGNUP (should complete quickly) ===
|
|
36
|
+
console.log("🧪 === TEST 1: NORMAL SIGNUP ===\n");
|
|
37
|
+
const testUsername = `timeouttest_${Date.now()}`;
|
|
38
|
+
const testPassword = "testpass123!@#";
|
|
39
|
+
console.log(`Testing signup with username: ${testUsername}`);
|
|
40
|
+
console.log("Expected: Should complete within 10 seconds\n");
|
|
41
|
+
const signupStartTime = Date.now();
|
|
42
|
+
try {
|
|
43
|
+
const signupResult = await db.signUp(testUsername, testPassword);
|
|
44
|
+
const signupDuration = Date.now() - signupStartTime;
|
|
45
|
+
console.log(`✓ Signup completed in ${signupDuration}ms`);
|
|
46
|
+
if (signupDuration > 10000) {
|
|
47
|
+
console.warn("⚠️ Signup took longer than expected (>10s)");
|
|
48
|
+
}
|
|
49
|
+
else if (signupDuration > 5000) {
|
|
50
|
+
console.warn("⚠️ Signup took longer than ideal (>5s)");
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log("✓ Signup completed in reasonable time");
|
|
54
|
+
}
|
|
55
|
+
console.log("Signup result:", {
|
|
56
|
+
success: signupResult.success,
|
|
57
|
+
error: signupResult.error || "None",
|
|
58
|
+
});
|
|
59
|
+
if (!signupResult.success) {
|
|
60
|
+
console.error("❌ Signup failed:", signupResult.error);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const signupDuration = Date.now() - signupStartTime;
|
|
66
|
+
console.error(`❌ Signup threw exception after ${signupDuration}ms:`, error);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
console.log("");
|
|
70
|
+
// === TEST 2: NORMAL LOGIN (should complete quickly) ===
|
|
71
|
+
console.log("🧪 === TEST 2: NORMAL LOGIN ===\n");
|
|
72
|
+
console.log("Testing login with same credentials");
|
|
73
|
+
console.log("Expected: Should complete within 10 seconds\n");
|
|
74
|
+
const loginStartTime = Date.now();
|
|
75
|
+
try {
|
|
76
|
+
const loginResult = await db.login(testUsername, testPassword);
|
|
77
|
+
const loginDuration = Date.now() - loginStartTime;
|
|
78
|
+
console.log(`✓ Login completed in ${loginDuration}ms`);
|
|
79
|
+
if (loginDuration > 10000) {
|
|
80
|
+
console.warn("⚠️ Login took longer than expected (>10s)");
|
|
81
|
+
}
|
|
82
|
+
else if (loginDuration > 5000) {
|
|
83
|
+
console.warn("⚠️ Login took longer than ideal (>5s)");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log("✓ Login completed in reasonable time");
|
|
87
|
+
}
|
|
88
|
+
console.log("Login result:", {
|
|
89
|
+
success: loginResult.success,
|
|
90
|
+
error: loginResult.error || "None",
|
|
91
|
+
});
|
|
92
|
+
if (!loginResult.success) {
|
|
93
|
+
console.error("❌ Login failed:", loginResult.error);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log("✓ User is now logged in:", db.isLoggedIn());
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const loginDuration = Date.now() - loginStartTime;
|
|
101
|
+
console.error(`❌ Login threw exception after ${loginDuration}ms:`, error);
|
|
102
|
+
}
|
|
103
|
+
console.log("");
|
|
104
|
+
// === TEST 3: INVALID CREDENTIALS (should timeout gracefully) ===
|
|
105
|
+
console.log("🧪 === TEST 3: INVALID CREDENTIALS TIMEOUT ===\n");
|
|
106
|
+
console.log("Testing login with invalid password");
|
|
107
|
+
console.log("Expected: Should timeout after 10 seconds with error message\n");
|
|
108
|
+
const invalidLoginStartTime = Date.now();
|
|
109
|
+
try {
|
|
110
|
+
const invalidLoginResult = await db.login(testUsername, "wrongpassword");
|
|
111
|
+
const invalidLoginDuration = Date.now() - invalidLoginStartTime;
|
|
112
|
+
console.log(`✓ Invalid login completed in ${invalidLoginDuration}ms`);
|
|
113
|
+
console.log("Invalid login result:", {
|
|
114
|
+
success: invalidLoginResult.success,
|
|
115
|
+
error: invalidLoginResult.error || "None",
|
|
116
|
+
});
|
|
117
|
+
if (invalidLoginDuration > 10000) {
|
|
118
|
+
console.log("✓ Timeout mechanism worked - operation completed after timeout period");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log("✓ Invalid credentials were rejected quickly (good)");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const invalidLoginDuration = Date.now() - invalidLoginStartTime;
|
|
126
|
+
console.log(`✓ Invalid login threw exception after ${invalidLoginDuration}ms (expected):`, error instanceof Error ? error.message : String(error));
|
|
127
|
+
if (invalidLoginDuration > 10000) {
|
|
128
|
+
console.log("✓ Timeout mechanism worked - exception thrown after timeout period");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
console.log("");
|
|
132
|
+
// === TEST 4: NON-EXISTENT USER (should timeout gracefully) ===
|
|
133
|
+
console.log("🧪 === TEST 4: NON-EXISTENT USER TIMEOUT ===\n");
|
|
134
|
+
console.log("Testing login with non-existent user");
|
|
135
|
+
console.log("Expected: Should timeout after 10 seconds with error message\n");
|
|
136
|
+
const nonexistentLoginStartTime = Date.now();
|
|
137
|
+
try {
|
|
138
|
+
const nonexistentLoginResult = await db.login("nonexistentuser123456", "password");
|
|
139
|
+
const nonexistentLoginDuration = Date.now() - nonexistentLoginStartTime;
|
|
140
|
+
console.log(`✓ Non-existent user login completed in ${nonexistentLoginDuration}ms`);
|
|
141
|
+
console.log("Non-existent user login result:", {
|
|
142
|
+
success: nonexistentLoginResult.success,
|
|
143
|
+
error: nonexistentLoginResult.error || "None",
|
|
144
|
+
});
|
|
145
|
+
if (nonexistentLoginDuration > 10000) {
|
|
146
|
+
console.log("✓ Timeout mechanism worked - operation completed after timeout period");
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log("✓ Non-existent user was rejected quickly (good)");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
const nonexistentLoginDuration = Date.now() - nonexistentLoginStartTime;
|
|
154
|
+
console.log(`✓ Non-existent user login threw exception after ${nonexistentLoginDuration}ms (expected):`, error instanceof Error ? error.message : String(error));
|
|
155
|
+
if (nonexistentLoginDuration > 10000) {
|
|
156
|
+
console.log("✓ Timeout mechanism worked - exception thrown after timeout period");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
console.log("");
|
|
160
|
+
// === TEST 5: STRESS TEST (multiple rapid operations) ===
|
|
161
|
+
console.log("🧪 === TEST 5: STRESS TEST ===\n");
|
|
162
|
+
console.log("Testing multiple rapid signup/login operations");
|
|
163
|
+
console.log("Expected: All operations should complete or timeout gracefully\n");
|
|
164
|
+
const stressTestPromises = [];
|
|
165
|
+
const stressTestStartTime = Date.now();
|
|
166
|
+
for (let i = 0; i < 3; i++) {
|
|
167
|
+
const username = `stresstest_${Date.now()}_${i}`;
|
|
168
|
+
const password = "testpass123!@#";
|
|
169
|
+
stressTestPromises.push(db
|
|
170
|
+
.signUp(username, password)
|
|
171
|
+
.then((result) => ({
|
|
172
|
+
type: "signup",
|
|
173
|
+
username,
|
|
174
|
+
success: result.success,
|
|
175
|
+
error: result.error,
|
|
176
|
+
}))
|
|
177
|
+
.catch((error) => ({
|
|
178
|
+
type: "signup",
|
|
179
|
+
username,
|
|
180
|
+
success: false,
|
|
181
|
+
error: error.message,
|
|
182
|
+
})));
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
const stressResults = await Promise.all(stressTestPromises);
|
|
186
|
+
const stressTestDuration = Date.now() - stressTestStartTime;
|
|
187
|
+
console.log(`✓ Stress test completed in ${stressTestDuration}ms`);
|
|
188
|
+
console.log("Stress test results:");
|
|
189
|
+
stressResults.forEach((result, index) => {
|
|
190
|
+
console.log(` ${index + 1}. ${result.type} for ${result.username}: ${result.success ? "Success" : "Failed"}`);
|
|
191
|
+
if (!result.success) {
|
|
192
|
+
console.log(` Error: ${result.error}`);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
const successCount = stressResults.filter((r) => r.success).length;
|
|
196
|
+
console.log(`\n✓ ${successCount}/${stressResults.length} operations succeeded`);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
const stressTestDuration = Date.now() - stressTestStartTime;
|
|
200
|
+
console.error(`❌ Stress test failed after ${stressTestDuration}ms:`, error);
|
|
201
|
+
}
|
|
202
|
+
console.log("");
|
|
203
|
+
// === CLEANUP ===
|
|
204
|
+
console.log("🧹 === CLEANUP ===\n");
|
|
205
|
+
try {
|
|
206
|
+
db.logout();
|
|
207
|
+
console.log("✓ Logged out successfully");
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error("❌ Logout failed:", error);
|
|
211
|
+
}
|
|
212
|
+
console.log("\n✅ Timeout test completed!");
|
|
213
|
+
console.log("\n📊 Test Summary:");
|
|
214
|
+
console.log("- ✓ Normal signup completes quickly");
|
|
215
|
+
console.log("- ✓ Normal login completes quickly");
|
|
216
|
+
console.log("- ✓ Invalid credentials timeout gracefully");
|
|
217
|
+
console.log("- ✓ Non-existent user timeout gracefully");
|
|
218
|
+
console.log("- ✓ Multiple operations don't interfere with each other");
|
|
219
|
+
console.log("\n🎯 Key Improvements Verified:");
|
|
220
|
+
console.log("- Timeout mechanism prevents infinite hanging");
|
|
221
|
+
console.log("- Error messages are informative");
|
|
222
|
+
console.log("- Operations complete within reasonable time");
|
|
223
|
+
}
|
|
224
|
+
// Esegui il test
|
|
225
|
+
if (require.main === module) {
|
|
226
|
+
timeoutTest().catch(console.error);
|
|
227
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ZK-Proof Verifiable Credentials Example
|
|
4
|
+
*
|
|
5
|
+
* This demonstrates how to use ZK-Proof for proving attributes
|
|
6
|
+
* about documents and identity without revealing sensitive data
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ageVerificationExample = ageVerificationExample;
|
|
10
|
+
exports.citizenshipExample = citizenshipExample;
|
|
11
|
+
exports.educationExample = educationExample;
|
|
12
|
+
exports.incomeExample = incomeExample;
|
|
13
|
+
exports.customCredentialExample = customCredentialExample;
|
|
14
|
+
const core_1 = require("../core");
|
|
15
|
+
const zkCredentials_1 = require("../plugins/zkproof/zkCredentials");
|
|
16
|
+
const identity_1 = require("@semaphore-protocol/identity");
|
|
17
|
+
// Example 1: Age Verification
|
|
18
|
+
async function ageVerificationExample() {
|
|
19
|
+
console.log("=== Age Verification Example ===\n");
|
|
20
|
+
const shogun = new core_1.ShogunCore({
|
|
21
|
+
gunOptions: { peers: ["https://peer.wallie.io/gun"] },
|
|
22
|
+
zkproof: { enabled: true },
|
|
23
|
+
});
|
|
24
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
25
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
26
|
+
if (!zkPlugin)
|
|
27
|
+
return;
|
|
28
|
+
// Create ZK identity
|
|
29
|
+
const identity = await zkPlugin.generateIdentity();
|
|
30
|
+
const semaphoreIdentity = new identity_1.Identity(identity.trapdoor);
|
|
31
|
+
// Create credentials manager
|
|
32
|
+
const zkCreds = new zkCredentials_1.ZkCredentials();
|
|
33
|
+
console.log("Scenario: User wants to prove they're 18+ without revealing birthdate\n");
|
|
34
|
+
// User's actual birthdate (PRIVATE)
|
|
35
|
+
const birthDate = new Date("1990-05-15");
|
|
36
|
+
const actualAge = Math.floor((Date.now() - birthDate.getTime()) / (365.25 * 24 * 60 * 60 * 1000));
|
|
37
|
+
console.log(`Private data (NOT revealed):`);
|
|
38
|
+
console.log(` Birth date: ${birthDate.toDateString()}`);
|
|
39
|
+
console.log(` Actual age: ${actualAge}\n`);
|
|
40
|
+
try {
|
|
41
|
+
// Generate proof that age >= 18 WITHOUT revealing exact age
|
|
42
|
+
const ageProof = await zkCreds.proveAge(semaphoreIdentity, birthDate, 18);
|
|
43
|
+
console.log(`Public proof generated:`);
|
|
44
|
+
console.log(` Claim: "${ageProof.claim}"`);
|
|
45
|
+
console.log(` Type: ${ageProof.type}`);
|
|
46
|
+
console.log(` ✅ Birth date NOT revealed!`);
|
|
47
|
+
console.log(` ✅ Exact age NOT revealed!`);
|
|
48
|
+
// Anyone can verify the proof
|
|
49
|
+
const verification = await zkCreds.verifyCredential(ageProof);
|
|
50
|
+
console.log(`\nVerification result: ${verification.verified ? "✅ VALID" : "❌ INVALID"}`);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.log(`Note: Full proof generation requires circuit files`);
|
|
54
|
+
console.log(`Run: yarn setup:zkproof`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Example 2: Citizenship Verification
|
|
58
|
+
async function citizenshipExample() {
|
|
59
|
+
console.log("\n=== Citizenship Verification Example ===\n");
|
|
60
|
+
const shogun = new core_1.ShogunCore({
|
|
61
|
+
gunOptions: { peers: ["https://peer.wallie.io/gun"] },
|
|
62
|
+
zkproof: { enabled: true },
|
|
63
|
+
});
|
|
64
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
65
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
66
|
+
if (!zkPlugin)
|
|
67
|
+
return;
|
|
68
|
+
const identity = await zkPlugin.generateIdentity();
|
|
69
|
+
const semaphoreIdentity = new identity_1.Identity(identity.trapdoor);
|
|
70
|
+
const zkCreds = new zkCredentials_1.ZkCredentials();
|
|
71
|
+
console.log("Scenario: Prove EU citizenship without revealing country\n");
|
|
72
|
+
console.log(`Private data (NOT revealed):`);
|
|
73
|
+
console.log(` Country: Italy`);
|
|
74
|
+
console.log(` Passport: IT123456789\n`);
|
|
75
|
+
try {
|
|
76
|
+
const citizenshipProof = await zkCreds.proveCitizenship(semaphoreIdentity, "Italy", "EU");
|
|
77
|
+
console.log(`Public proof:`);
|
|
78
|
+
console.log(` Claim: "${citizenshipProof.claim}"`);
|
|
79
|
+
console.log(` ✅ Specific country NOT revealed!`);
|
|
80
|
+
console.log(` ✅ Passport number NOT revealed!`);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.log(`Note: Full proof requires circuit files`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Example 3: Education Credentials
|
|
87
|
+
async function educationExample() {
|
|
88
|
+
console.log("\n=== Education Credential Example ===\n");
|
|
89
|
+
const shogun = new core_1.ShogunCore({
|
|
90
|
+
gunOptions: { peers: ["https://peer.wallie.io/gun"] },
|
|
91
|
+
zkproof: { enabled: true },
|
|
92
|
+
});
|
|
93
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
94
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
95
|
+
if (!zkPlugin)
|
|
96
|
+
return;
|
|
97
|
+
const identity = await zkPlugin.generateIdentity();
|
|
98
|
+
const semaphoreIdentity = new identity_1.Identity(identity.trapdoor);
|
|
99
|
+
const zkCreds = new zkCredentials_1.ZkCredentials();
|
|
100
|
+
console.log("Scenario: Prove you have a degree without revealing details\n");
|
|
101
|
+
console.log(`Private data (NOT revealed):`);
|
|
102
|
+
console.log(` University: MIT`);
|
|
103
|
+
console.log(` Degree: Computer Science`);
|
|
104
|
+
console.log(` Year: 2020`);
|
|
105
|
+
console.log(` Grade: 110/110\n`);
|
|
106
|
+
try {
|
|
107
|
+
const eduProof = await zkCreds.proveEducation(semaphoreIdentity, "Bachelor of Science", "MIT", 2020);
|
|
108
|
+
console.log(`Public proof:`);
|
|
109
|
+
console.log(` Claim: "${eduProof.claim}"`);
|
|
110
|
+
console.log(` ✅ University name NOT revealed!`);
|
|
111
|
+
console.log(` ✅ Grades NOT revealed!`);
|
|
112
|
+
console.log(` ✅ Only proves you HAVE the degree`);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.log(`Note: Full proof requires circuit files`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Example 4: Income Verification
|
|
119
|
+
async function incomeExample() {
|
|
120
|
+
console.log("\n=== Income Verification Example ===\n");
|
|
121
|
+
const shogun = new core_1.ShogunCore({
|
|
122
|
+
gunOptions: { peers: ["https://peer.wallie.io/gun"] },
|
|
123
|
+
zkproof: { enabled: true },
|
|
124
|
+
});
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
126
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
127
|
+
if (!zkPlugin)
|
|
128
|
+
return;
|
|
129
|
+
const identity = await zkPlugin.generateIdentity();
|
|
130
|
+
const semaphoreIdentity = new identity_1.Identity(identity.trapdoor);
|
|
131
|
+
const zkCreds = new zkCredentials_1.ZkCredentials();
|
|
132
|
+
console.log("Scenario: Apply for loan proving income > 50k without revealing exact salary\n");
|
|
133
|
+
console.log(`Private data (NOT revealed):`);
|
|
134
|
+
console.log(` Actual salary: 75,000 EUR`);
|
|
135
|
+
console.log(` Employer: Tech Company XYZ\n`);
|
|
136
|
+
try {
|
|
137
|
+
const incomeProof = await zkCreds.proveIncome(semaphoreIdentity, 75000, 50000, "EUR");
|
|
138
|
+
console.log(`Public proof sent to bank:`);
|
|
139
|
+
console.log(` Claim: "${incomeProof.claim}"`);
|
|
140
|
+
console.log(` ✅ Exact salary NOT revealed!`);
|
|
141
|
+
console.log(` ✅ Only proves income >= 50,000 EUR`);
|
|
142
|
+
console.log(`\n Bank sees: "This person earns at least 50k"`);
|
|
143
|
+
console.log(` Bank does NOT see: Actual amount or employer`);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.log(`Note: Full proof requires circuit files`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Example 5: Custom Credential
|
|
150
|
+
async function customCredentialExample() {
|
|
151
|
+
console.log("\n=== Custom Credential Example ===\n");
|
|
152
|
+
const shogun = new core_1.ShogunCore({
|
|
153
|
+
gunOptions: { peers: ["https://peer.wallie.io/gun"] },
|
|
154
|
+
zkproof: { enabled: true },
|
|
155
|
+
});
|
|
156
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
157
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
158
|
+
if (!zkPlugin)
|
|
159
|
+
return;
|
|
160
|
+
const identity = await zkPlugin.generateIdentity();
|
|
161
|
+
const semaphoreIdentity = new identity_1.Identity(identity.trapdoor);
|
|
162
|
+
const zkCreds = new zkCredentials_1.ZkCredentials();
|
|
163
|
+
console.log("Scenario: Prove you're a verified developer without revealing GitHub profile\n");
|
|
164
|
+
console.log(`Private data (NOT revealed):`);
|
|
165
|
+
console.log(` GitHub: @johndoe`);
|
|
166
|
+
console.log(` Repositories: 150`);
|
|
167
|
+
console.log(` Stars: 5,234`);
|
|
168
|
+
console.log(` Years active: 8\n`);
|
|
169
|
+
try {
|
|
170
|
+
const devProof = await zkCreds.proveAttribute(semaphoreIdentity, {
|
|
171
|
+
type: zkCredentials_1.CredentialType.CUSTOM,
|
|
172
|
+
claim: "Verified GitHub developer with 5+ years experience",
|
|
173
|
+
privateData: {
|
|
174
|
+
githubUsername: "johndoe",
|
|
175
|
+
repositories: 150,
|
|
176
|
+
stars: 5234,
|
|
177
|
+
yearsActive: 8,
|
|
178
|
+
verified: true,
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
console.log(`Public proof:`);
|
|
182
|
+
console.log(` Claim: "${devProof.claim}"`);
|
|
183
|
+
console.log(` ✅ GitHub username NOT revealed!`);
|
|
184
|
+
console.log(` ✅ Exact stats NOT revealed!`);
|
|
185
|
+
console.log(` ✅ Privacy-preserving reputation proof`);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.log(`Note: Full proof requires circuit files`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Run all examples
|
|
192
|
+
async function main() {
|
|
193
|
+
console.log("🔐 ZK-Proof Verifiable Credentials Examples");
|
|
194
|
+
console.log("==========================================\n");
|
|
195
|
+
try {
|
|
196
|
+
await ageVerificationExample();
|
|
197
|
+
await citizenshipExample();
|
|
198
|
+
await educationExample();
|
|
199
|
+
await incomeExample();
|
|
200
|
+
await customCredentialExample();
|
|
201
|
+
console.log("\n✨ All credential examples completed!");
|
|
202
|
+
console.log("\nℹ️ Note: These examples show the credential structure.");
|
|
203
|
+
console.log(" For full ZK proof generation, run: yarn setup:zkproof");
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.error("\n❌ Error:", error);
|
|
207
|
+
}
|
|
208
|
+
process.exit(0);
|
|
209
|
+
}
|
|
210
|
+
if (require.main === module) {
|
|
211
|
+
main();
|
|
212
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Zero-Knowledge Proof Authentication Example
|
|
4
|
+
*
|
|
5
|
+
* This example demonstrates how to use the ZK-Proof plugin with Shogun Core
|
|
6
|
+
* for privacy-preserving authentication using Semaphore protocol.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.basicExample = basicExample;
|
|
10
|
+
exports.deterministicExample = deterministicExample;
|
|
11
|
+
exports.proofExample = proofExample;
|
|
12
|
+
exports.multiDeviceExample = multiDeviceExample;
|
|
13
|
+
const core_1 = require("../core");
|
|
14
|
+
// Example 1: Basic ZK-Proof signup and login
|
|
15
|
+
async function basicExample() {
|
|
16
|
+
console.log("=== Basic ZK-Proof Authentication Example ===\n");
|
|
17
|
+
// Initialize Shogun with ZK-Proof plugin
|
|
18
|
+
const shogun = new core_1.ShogunCore({
|
|
19
|
+
gunOptions: {
|
|
20
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
21
|
+
},
|
|
22
|
+
zkproof: {
|
|
23
|
+
enabled: true,
|
|
24
|
+
defaultGroupId: "my-app-users",
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
// Wait for plugin initialization
|
|
28
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
29
|
+
// Get the ZK-Proof plugin
|
|
30
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
31
|
+
if (!zkPlugin) {
|
|
32
|
+
console.error("ZK-Proof plugin not available");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// SIGN UP - Generate new anonymous identity
|
|
36
|
+
console.log("1. Creating new ZK identity...");
|
|
37
|
+
const signupResult = await zkPlugin.signUp();
|
|
38
|
+
if (signupResult.success) {
|
|
39
|
+
console.log("✅ Signup successful!");
|
|
40
|
+
console.log(` Username (commitment): ${signupResult.username}`);
|
|
41
|
+
console.log(` User Public Key: ${signupResult.userPub?.slice(0, 16)}...`);
|
|
42
|
+
console.log("\n⚠️ CRITICAL: Save this trapdoor for account recovery:");
|
|
43
|
+
console.log(` Trapdoor: ${signupResult.seedPhrase}\n`);
|
|
44
|
+
// Simulate user saving the trapdoor
|
|
45
|
+
const savedTrapdoor = signupResult.seedPhrase;
|
|
46
|
+
// Logout
|
|
47
|
+
shogun.logout();
|
|
48
|
+
console.log("2. Logged out\n");
|
|
49
|
+
// LOGIN - Authenticate with trapdoor
|
|
50
|
+
console.log("3. Logging in with trapdoor...");
|
|
51
|
+
const loginResult = await zkPlugin.login(savedTrapdoor);
|
|
52
|
+
if (loginResult.success) {
|
|
53
|
+
console.log("✅ Login successful!");
|
|
54
|
+
console.log(` Username: ${loginResult.username}`);
|
|
55
|
+
console.log(` User Public Key: ${loginResult.userPub?.slice(0, 16)}...`);
|
|
56
|
+
console.log(` Auth Method: ${loginResult.authMethod}`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.error("❌ Login failed:", loginResult.error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.error("❌ Signup failed:", signupResult.error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Example 2: Deterministic identity generation
|
|
67
|
+
async function deterministicExample() {
|
|
68
|
+
console.log("\n=== Deterministic ZK Identity Example ===\n");
|
|
69
|
+
const shogun = new core_1.ShogunCore({
|
|
70
|
+
gunOptions: {
|
|
71
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
72
|
+
},
|
|
73
|
+
zkproof: {
|
|
74
|
+
enabled: true,
|
|
75
|
+
deterministic: true,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
// Wait for plugin initialization
|
|
79
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
80
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
81
|
+
if (!zkPlugin) {
|
|
82
|
+
console.error("ZK-Proof plugin not available");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Use a seed for deterministic generation
|
|
86
|
+
const seed = "my-secret-seed-phrase-12345";
|
|
87
|
+
console.log("1. Creating identity from seed...");
|
|
88
|
+
const signupResult = await zkPlugin.signUp(seed);
|
|
89
|
+
if (signupResult.success) {
|
|
90
|
+
console.log("✅ Identity created from seed");
|
|
91
|
+
console.log(` Commitment: ${signupResult.username}`);
|
|
92
|
+
// With the same seed, you'll always get the same identity
|
|
93
|
+
const identity2 = await zkPlugin.generateIdentity(seed);
|
|
94
|
+
console.log("\n2. Regenerating from same seed...");
|
|
95
|
+
console.log(` Same commitment? ${identity2.commitment === signupResult.username?.replace("zk_", "")}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Example 3: Generate and verify ZK proofs
|
|
99
|
+
async function proofExample() {
|
|
100
|
+
console.log("\n=== ZK Proof Generation & Verification Example ===\n");
|
|
101
|
+
const shogun = new core_1.ShogunCore({
|
|
102
|
+
gunOptions: {
|
|
103
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
104
|
+
},
|
|
105
|
+
zkproof: {
|
|
106
|
+
enabled: true,
|
|
107
|
+
defaultGroupId: "proof-demo-group",
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
// Wait for plugin initialization
|
|
111
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
112
|
+
const zkPlugin = shogun.getPlugin("zkproof");
|
|
113
|
+
if (!zkPlugin) {
|
|
114
|
+
console.error("ZK-Proof plugin not available");
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Create identity
|
|
118
|
+
console.log("1. Generating identity...");
|
|
119
|
+
const identity = await zkPlugin.generateIdentity();
|
|
120
|
+
console.log(` Commitment: ${identity.commitment.slice(0, 16)}...`);
|
|
121
|
+
// Add to group
|
|
122
|
+
console.log("\n2. Adding to group...");
|
|
123
|
+
zkPlugin.addToGroup(identity.commitment, "proof-demo-group");
|
|
124
|
+
// Generate proof of membership
|
|
125
|
+
console.log("\n3. Generating ZK proof...");
|
|
126
|
+
const proof = await zkPlugin.generateProof(identity, {
|
|
127
|
+
groupId: "proof-demo-group",
|
|
128
|
+
message: "I am a member of this group",
|
|
129
|
+
scope: "membership-verification",
|
|
130
|
+
});
|
|
131
|
+
console.log(" Proof generated!");
|
|
132
|
+
console.log(` Merkle root: ${proof.merkleTreeRoot.slice(0, 16)}...`);
|
|
133
|
+
console.log(` Nullifier hash: ${proof.nullifierHash.slice(0, 16)}...`);
|
|
134
|
+
// Verify the proof
|
|
135
|
+
console.log("\n4. Verifying proof...");
|
|
136
|
+
const verificationResult = await zkPlugin.verifyProof(proof);
|
|
137
|
+
if (verificationResult.verified) {
|
|
138
|
+
console.log("✅ Proof verified successfully!");
|
|
139
|
+
console.log(" User proved group membership without revealing identity");
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.error("❌ Proof verification failed");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Example 4: Multi-device scenario
|
|
146
|
+
async function multiDeviceExample() {
|
|
147
|
+
console.log("\n=== Multi-Device ZK Authentication Example ===\n");
|
|
148
|
+
// Device 1: Create account
|
|
149
|
+
console.log("📱 DEVICE 1: Creating account...");
|
|
150
|
+
const shogun1 = new core_1.ShogunCore({
|
|
151
|
+
gunOptions: {
|
|
152
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
153
|
+
},
|
|
154
|
+
zkproof: { enabled: true },
|
|
155
|
+
});
|
|
156
|
+
// Wait for plugin initialization
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
158
|
+
const zkPlugin1 = shogun1.getPlugin("zkproof");
|
|
159
|
+
const signupResult = await zkPlugin1.signUp();
|
|
160
|
+
console.log("✅ Account created on Device 1");
|
|
161
|
+
console.log(` Commitment: ${signupResult.username}`);
|
|
162
|
+
// User writes down the trapdoor
|
|
163
|
+
const trapdoor = signupResult.seedPhrase;
|
|
164
|
+
console.log(`\n📝 User writes down trapdoor: ${trapdoor.slice(0, 20)}...`);
|
|
165
|
+
// Device 2: Import account
|
|
166
|
+
console.log("\n💻 DEVICE 2: Importing account with trapdoor...");
|
|
167
|
+
const shogun2 = new core_1.ShogunCore({
|
|
168
|
+
gunOptions: {
|
|
169
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
170
|
+
},
|
|
171
|
+
zkproof: { enabled: true },
|
|
172
|
+
});
|
|
173
|
+
// Wait for plugin initialization
|
|
174
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
175
|
+
const zkPlugin2 = shogun2.getPlugin("zkproof");
|
|
176
|
+
const loginResult = await zkPlugin2.login(trapdoor);
|
|
177
|
+
if (loginResult.success) {
|
|
178
|
+
console.log("✅ Successfully logged in on Device 2");
|
|
179
|
+
console.log(` Same user: ${loginResult.username === signupResult.username}`);
|
|
180
|
+
console.log("\n🎉 Multi-device authentication working!");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Run examples
|
|
184
|
+
async function main() {
|
|
185
|
+
try {
|
|
186
|
+
// Run all examples
|
|
187
|
+
await basicExample();
|
|
188
|
+
await deterministicExample();
|
|
189
|
+
// await proofExample(); // Requires ZK circuit files - see README for setup
|
|
190
|
+
await multiDeviceExample();
|
|
191
|
+
console.log("\n✨ All examples completed successfully!");
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.error("\n❌ Error running examples:", error);
|
|
195
|
+
}
|
|
196
|
+
process.exit(0);
|
|
197
|
+
}
|
|
198
|
+
// Run if executed directly
|
|
199
|
+
if (require.main === module) {
|
|
200
|
+
main();
|
|
201
|
+
}
|