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,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication Test Script
|
|
4
|
+
*
|
|
5
|
+
* Tests signup and login functionality with username and password
|
|
6
|
+
* Includes timeout handling and error recovery testing
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.authTest = authTest;
|
|
10
|
+
const api_1 = require("../gundb/api");
|
|
11
|
+
async function authTest() {
|
|
12
|
+
console.log("๐ ShogunCore Authentication Test\n");
|
|
13
|
+
// === INITIALIZATION ===
|
|
14
|
+
console.log("๐ฆ === INITIALIZATION ===\n");
|
|
15
|
+
// Use AutoQuickStart for easy setup with multiple peers for reliability
|
|
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: "auth-test",
|
|
23
|
+
// Enable debug logging
|
|
24
|
+
enableGunDebug: true,
|
|
25
|
+
enableConnectionMonitoring: true,
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
await quickStart.init();
|
|
29
|
+
console.log("โ ShogunCore initialized successfully");
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error("โ Failed to initialize ShogunCore:", error);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const api = quickStart.api;
|
|
36
|
+
const db = api.database;
|
|
37
|
+
console.log("- Database instance:", db ? "Available" : "Not available");
|
|
38
|
+
console.log("- Current user:", db.getCurrentUser()?.alias || "None");
|
|
39
|
+
console.log("- Is logged in:", db.isLoggedIn());
|
|
40
|
+
console.log("");
|
|
41
|
+
// === TEST 1: BASIC SIGNUP AND LOGIN ===
|
|
42
|
+
console.log("๐งช === TEST 1: BASIC SIGNUP AND LOGIN ===\n");
|
|
43
|
+
const testUsername = `testuser_${Date.now()}`;
|
|
44
|
+
const testPassword = "testpass123!@#";
|
|
45
|
+
console.log(`Testing with username: ${testUsername}`);
|
|
46
|
+
console.log(`Password: ${testPassword}\n`);
|
|
47
|
+
// Test signup
|
|
48
|
+
console.log("๐ Attempting signup...");
|
|
49
|
+
const signupStartTime = Date.now();
|
|
50
|
+
try {
|
|
51
|
+
const signupResult = await db.signUp(testUsername, testPassword);
|
|
52
|
+
const signupDuration = Date.now() - signupStartTime;
|
|
53
|
+
console.log(`โ Signup completed in ${signupDuration}ms`);
|
|
54
|
+
console.log("Signup result:", {
|
|
55
|
+
success: signupResult.success,
|
|
56
|
+
userPub: signupResult.userPub
|
|
57
|
+
? `${signupResult.userPub.substring(0, 20)}...`
|
|
58
|
+
: "None",
|
|
59
|
+
username: signupResult.username,
|
|
60
|
+
isNewUser: signupResult.isNewUser,
|
|
61
|
+
error: signupResult.error || "None",
|
|
62
|
+
});
|
|
63
|
+
if (!signupResult.success) {
|
|
64
|
+
console.error("โ Signup failed:", signupResult.error);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error("โ Signup threw exception:", error);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
console.log("");
|
|
73
|
+
// Test login
|
|
74
|
+
console.log("๐ Attempting login...");
|
|
75
|
+
const loginStartTime = Date.now();
|
|
76
|
+
try {
|
|
77
|
+
const loginResult = await db.login(testUsername, testPassword);
|
|
78
|
+
const loginDuration = Date.now() - loginStartTime;
|
|
79
|
+
console.log(`โ Login completed in ${loginDuration}ms`);
|
|
80
|
+
console.log("Login result:", {
|
|
81
|
+
success: loginResult.success,
|
|
82
|
+
userPub: loginResult.userPub
|
|
83
|
+
? `${loginResult.userPub.substring(0, 20)}...`
|
|
84
|
+
: "None",
|
|
85
|
+
username: loginResult.username,
|
|
86
|
+
error: loginResult.error || "None",
|
|
87
|
+
});
|
|
88
|
+
if (!loginResult.success) {
|
|
89
|
+
console.error("โ Login failed:", loginResult.error);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// Verify user state
|
|
93
|
+
console.log("\n๐ Verifying user state...");
|
|
94
|
+
const currentUser = db.getCurrentUser();
|
|
95
|
+
const isLoggedIn = db.isLoggedIn();
|
|
96
|
+
console.log("Current user:", {
|
|
97
|
+
alias: currentUser?.alias || "None",
|
|
98
|
+
pub: currentUser?.pub ? `${currentUser.pub.substring(0, 20)}...` : "None",
|
|
99
|
+
epub: currentUser?.epub
|
|
100
|
+
? `${currentUser.epub.substring(0, 20)}...`
|
|
101
|
+
: "None",
|
|
102
|
+
});
|
|
103
|
+
console.log("Is logged in:", isLoggedIn);
|
|
104
|
+
if (!isLoggedIn || !currentUser) {
|
|
105
|
+
console.error("โ User state verification failed");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error("โ Login threw exception:", error);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.log("");
|
|
114
|
+
// === TEST 2: DATA OPERATIONS WHILE LOGGED IN ===
|
|
115
|
+
console.log("๐พ === TEST 2: DATA OPERATIONS WHILE LOGGED IN ===\n");
|
|
116
|
+
try {
|
|
117
|
+
// Test encrypted data storage
|
|
118
|
+
const testData = {
|
|
119
|
+
message: "Hello from auth test!",
|
|
120
|
+
timestamp: Date.now(),
|
|
121
|
+
secret: "This is encrypted data",
|
|
122
|
+
};
|
|
123
|
+
console.log("๐ Storing encrypted data...");
|
|
124
|
+
await db.put("test/encrypted-data", testData);
|
|
125
|
+
console.log("โ Data stored successfully");
|
|
126
|
+
console.log("๐ Retrieving encrypted data...");
|
|
127
|
+
const retrievedData = await db.getData("test/encrypted-data");
|
|
128
|
+
console.log("โ Data retrieved:", retrievedData);
|
|
129
|
+
// Test profile operations
|
|
130
|
+
console.log("\n๐ Testing profile operations...");
|
|
131
|
+
await api.updateProfile({
|
|
132
|
+
name: "Auth Test User",
|
|
133
|
+
email: "authtest@example.com",
|
|
134
|
+
bio: "Testing authentication flow",
|
|
135
|
+
});
|
|
136
|
+
console.log("โ Profile updated");
|
|
137
|
+
const profile = await api.getProfile();
|
|
138
|
+
console.log("โ Profile retrieved:", profile);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error("โ Data operations failed:", error);
|
|
142
|
+
}
|
|
143
|
+
console.log("");
|
|
144
|
+
// === TEST 3: LOGOUT ===
|
|
145
|
+
console.log("๐ช === TEST 3: LOGOUT ===\n");
|
|
146
|
+
try {
|
|
147
|
+
console.log("๐ Attempting logout...");
|
|
148
|
+
db.logout();
|
|
149
|
+
// Wait a moment for logout to complete
|
|
150
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
151
|
+
const isStillLoggedIn = db.isLoggedIn();
|
|
152
|
+
const currentUserAfterLogout = db.getCurrentUser();
|
|
153
|
+
console.log("โ Logout completed");
|
|
154
|
+
console.log("Is logged in after logout:", isStillLoggedIn);
|
|
155
|
+
console.log("Current user after logout:", currentUserAfterLogout?.alias || "None");
|
|
156
|
+
if (isStillLoggedIn) {
|
|
157
|
+
console.warn("โ ๏ธ User still appears to be logged in after logout");
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log("โ Logout successful - user is no longer logged in");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
console.error("โ Logout failed:", error);
|
|
165
|
+
}
|
|
166
|
+
console.log("");
|
|
167
|
+
// === TEST 4: RE-LOGIN ===
|
|
168
|
+
console.log("๐ === TEST 4: RE-LOGIN ===\n");
|
|
169
|
+
try {
|
|
170
|
+
console.log("๐ Attempting re-login with same credentials...");
|
|
171
|
+
const reloginResult = await db.login(testUsername, testPassword);
|
|
172
|
+
console.log("Re-login result:", {
|
|
173
|
+
success: reloginResult.success,
|
|
174
|
+
userPub: reloginResult.userPub
|
|
175
|
+
? `${reloginResult.userPub.substring(0, 20)}...`
|
|
176
|
+
: "None",
|
|
177
|
+
username: reloginResult.username,
|
|
178
|
+
error: reloginResult.error || "None",
|
|
179
|
+
});
|
|
180
|
+
if (reloginResult.success) {
|
|
181
|
+
console.log("โ Re-login successful");
|
|
182
|
+
console.log("Current user:", db.getCurrentUser()?.alias || "None");
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
console.error("โ Re-login failed:", reloginResult.error);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.error("โ Re-login threw exception:", error);
|
|
190
|
+
}
|
|
191
|
+
console.log("");
|
|
192
|
+
// === TEST 5: ERROR HANDLING ===
|
|
193
|
+
console.log("โ ๏ธ === TEST 5: ERROR HANDLING ===\n");
|
|
194
|
+
// Test invalid credentials
|
|
195
|
+
console.log("๐ Testing invalid password...");
|
|
196
|
+
try {
|
|
197
|
+
const invalidLoginResult = await db.login(testUsername, "wrongpassword");
|
|
198
|
+
console.log("Invalid login result:", {
|
|
199
|
+
success: invalidLoginResult.success,
|
|
200
|
+
error: invalidLoginResult.error || "None",
|
|
201
|
+
});
|
|
202
|
+
if (!invalidLoginResult.success) {
|
|
203
|
+
console.log("โ Invalid password correctly rejected");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.warn("โ ๏ธ Invalid password was accepted (unexpected)");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.log("โ Invalid password threw exception (expected):", error instanceof Error ? error.message : String(error));
|
|
211
|
+
}
|
|
212
|
+
// Test non-existent user
|
|
213
|
+
console.log("\n๐ Testing non-existent user...");
|
|
214
|
+
try {
|
|
215
|
+
const nonexistentLoginResult = await db.login("nonexistentuser123", "password");
|
|
216
|
+
console.log("Non-existent user login result:", {
|
|
217
|
+
success: nonexistentLoginResult.success,
|
|
218
|
+
error: nonexistentLoginResult.error || "None",
|
|
219
|
+
});
|
|
220
|
+
if (!nonexistentLoginResult.success) {
|
|
221
|
+
console.log("โ Non-existent user correctly rejected");
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.warn("โ ๏ธ Non-existent user was accepted (unexpected)");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
console.log("โ Non-existent user threw exception (expected):", error instanceof Error ? error.message : String(error));
|
|
229
|
+
}
|
|
230
|
+
console.log("");
|
|
231
|
+
// === FINAL LOGOUT ===
|
|
232
|
+
console.log("๐ช === FINAL CLEANUP ===\n");
|
|
233
|
+
try {
|
|
234
|
+
db.logout();
|
|
235
|
+
console.log("โ Final logout completed");
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error("โ Final logout failed:", error);
|
|
239
|
+
}
|
|
240
|
+
console.log("\nโ
Authentication test completed!");
|
|
241
|
+
console.log("\n๐ Test Summary:");
|
|
242
|
+
console.log("- โ Signup with username/password");
|
|
243
|
+
console.log("- โ Login with username/password");
|
|
244
|
+
console.log("- โ Data operations while logged in");
|
|
245
|
+
console.log("- โ Logout functionality");
|
|
246
|
+
console.log("- โ Re-login capability");
|
|
247
|
+
console.log("- โ Error handling for invalid credentials");
|
|
248
|
+
console.log("- โ Error handling for non-existent users");
|
|
249
|
+
}
|
|
250
|
+
// Esegui il test
|
|
251
|
+
if (require.main === module) {
|
|
252
|
+
authTest().catch(console.error);
|
|
253
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Esempio di utilizzo del CryptoIdentityManager
|
|
4
|
+
* Mostra come le identitร crypto vengono generate automaticamente dopo l'autenticazione SEA
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.runCryptoIdentityExamples = runCryptoIdentityExamples;
|
|
8
|
+
const index_1 = require("../index");
|
|
9
|
+
// Esempio di utilizzo
|
|
10
|
+
async function cryptoIdentityExample() {
|
|
11
|
+
console.log("๐ Avvio esempio CryptoIdentityManager");
|
|
12
|
+
// 1. Inizializza ShogunCore
|
|
13
|
+
const core = new index_1.ShogunCore({
|
|
14
|
+
gunOptions: {
|
|
15
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
16
|
+
radisk: true,
|
|
17
|
+
localStorage: false,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
console.log("โ
ShogunCore inizializzato");
|
|
21
|
+
// 2. Registra un nuovo utente (genera automaticamente SEA pair)
|
|
22
|
+
const username = `mario_rossi_${Date.now()}`;
|
|
23
|
+
const signupResult = await core.signUp(username, "password123");
|
|
24
|
+
if (!signupResult.success) {
|
|
25
|
+
console.error("โ Registrazione fallita:", signupResult.error);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log("โ
Utente registrato:", {
|
|
29
|
+
username: signupResult.username,
|
|
30
|
+
userPub: signupResult.userPub,
|
|
31
|
+
hasSEAPair: !!signupResult.sea,
|
|
32
|
+
});
|
|
33
|
+
// 3. Le identitร crypto sono state generate automaticamente durante la registrazione
|
|
34
|
+
// Possiamo accedervi tramite il CryptoIdentityManager
|
|
35
|
+
const cryptoManager = new index_1.CryptoIdentityManager(core);
|
|
36
|
+
// 4. Recupera le identitร crypto dell'utente corrente
|
|
37
|
+
const identitiesResult = await cryptoManager.getCurrentUserIdentities();
|
|
38
|
+
if (identitiesResult.success && identitiesResult.identities) {
|
|
39
|
+
const identities = identitiesResult.identities;
|
|
40
|
+
console.log("๐ Identitร crypto generate automaticamente:");
|
|
41
|
+
console.log("- RSA Key Pair:", !!identities.rsa);
|
|
42
|
+
console.log("- AES Symmetric Key:", !!identities.aes);
|
|
43
|
+
console.log("- Signal Protocol Identity:", !!identities.signal);
|
|
44
|
+
console.log("- PGP Key Pair:", !!identities.pgp);
|
|
45
|
+
console.log("- MLS Group:", !!identities.mls);
|
|
46
|
+
console.log("- SFrame Key:", !!identities.sframe);
|
|
47
|
+
console.log("- Created At:", new Date(identities.createdAt).toISOString());
|
|
48
|
+
console.log("- Version:", identities.version);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.error("โ Errore nel recupero delle identitร :", identitiesResult.error);
|
|
52
|
+
}
|
|
53
|
+
// 5. Esempio di login con utente esistente
|
|
54
|
+
console.log("\n๐ Test login con utente esistente...");
|
|
55
|
+
const loginResult = await core.login(username, "password123");
|
|
56
|
+
if (loginResult.success) {
|
|
57
|
+
console.log("โ
Login riuscito");
|
|
58
|
+
// Le identitร crypto esistenti vengono recuperate automaticamente
|
|
59
|
+
const existingIdentities = await cryptoManager.getCurrentUserIdentities();
|
|
60
|
+
if (existingIdentities.success) {
|
|
61
|
+
console.log("โ
Identitร crypto esistenti recuperate");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error("โ Login fallito:", loginResult.error);
|
|
66
|
+
}
|
|
67
|
+
// 6. Esempio di rigenerazione forzata delle identitร
|
|
68
|
+
console.log("\n๐ Test rigenerazione identitร ...");
|
|
69
|
+
if (signupResult.sea) {
|
|
70
|
+
const regenerateResult = await cryptoManager.setupCryptoIdentities(username, signupResult.sea, true);
|
|
71
|
+
if (regenerateResult.success) {
|
|
72
|
+
console.log("โ
Identitร crypto rigenerate:", regenerateResult.savedKeys);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error("โ Rigenerazione fallita:", regenerateResult.error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
console.log("\n๐ Esempio completato!");
|
|
79
|
+
}
|
|
80
|
+
// Esempio di utilizzo con diversi metodi di autenticazione
|
|
81
|
+
async function multiAuthExample() {
|
|
82
|
+
console.log("\n๐ Esempio con diversi metodi di autenticazione");
|
|
83
|
+
const core = new index_1.ShogunCore({
|
|
84
|
+
gunOptions: {
|
|
85
|
+
peers: ["https://peer.wallie.io/gun"],
|
|
86
|
+
radisk: true,
|
|
87
|
+
localStorage: false,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
// Esempio con WebAuthn (se disponibile)
|
|
91
|
+
try {
|
|
92
|
+
const webauthnPlugin = core.getAuthenticationMethod("webauthn");
|
|
93
|
+
if (webauthnPlugin) {
|
|
94
|
+
console.log("๐ Test WebAuthn signup...");
|
|
95
|
+
const webauthnResult = await webauthnPlugin.signUp("alice_webauthn");
|
|
96
|
+
if (webauthnResult.success) {
|
|
97
|
+
console.log("โ
WebAuthn signup riuscito");
|
|
98
|
+
// Le identitร crypto vengono generate automaticamente anche con WebAuthn
|
|
99
|
+
const cryptoManager = new index_1.CryptoIdentityManager(core);
|
|
100
|
+
const identities = await cryptoManager.getCurrentUserIdentities();
|
|
101
|
+
if (identities.success) {
|
|
102
|
+
console.log("โ
Identitร crypto generate con WebAuthn");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.log("โน๏ธ WebAuthn non disponibile:", error);
|
|
109
|
+
}
|
|
110
|
+
// Esempio con ZK-Proof (se disponibile)
|
|
111
|
+
try {
|
|
112
|
+
const zkPlugin = core.getAuthenticationMethod("zkproof");
|
|
113
|
+
if (zkPlugin) {
|
|
114
|
+
console.log("๐ Test ZK-Proof signup...");
|
|
115
|
+
// ZK-Proof non richiede password, usa il metodo corretto
|
|
116
|
+
const zkResult = await zkPlugin.signUp();
|
|
117
|
+
if (zkResult.success) {
|
|
118
|
+
console.log("โ
ZK-Proof signup riuscito");
|
|
119
|
+
// Le identitร crypto vengono generate automaticamente anche con ZK-Proof
|
|
120
|
+
const cryptoManager = new index_1.CryptoIdentityManager(core);
|
|
121
|
+
const identities = await cryptoManager.getCurrentUserIdentities();
|
|
122
|
+
if (identities.success) {
|
|
123
|
+
console.log("โ
Identitร crypto generate con ZK-Proof");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log("โน๏ธ ZK-Proof signup non riuscito:", zkResult.error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log("โน๏ธ ZK-Proof plugin non disponibile");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.log("โน๏ธ ZK-Proof test saltato:", error instanceof Error ? error.message : String(error));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Funzione principale per eseguire gli esempi
|
|
139
|
+
async function runCryptoIdentityExamples() {
|
|
140
|
+
try {
|
|
141
|
+
await cryptoIdentityExample();
|
|
142
|
+
await multiAuthExample();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error("โ Errore durante l'esecuzione degli esempi:", error);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Esegui gli esempi se il file viene eseguito direttamente
|
|
149
|
+
if (typeof window === "undefined" && require.main === module) {
|
|
150
|
+
runCryptoIdentityExamples();
|
|
151
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Simple crypto test that actually works
|
|
4
|
+
const crypto_1 = require("../crypto");
|
|
5
|
+
// Simple test function
|
|
6
|
+
async function testCrypto() {
|
|
7
|
+
try {
|
|
8
|
+
console.log("๐ Starting crypto test...");
|
|
9
|
+
// Test 1: Random string generation
|
|
10
|
+
console.log("\n1. Testing random string generation...");
|
|
11
|
+
const randomStr = (0, crypto_1.randomString)("test-");
|
|
12
|
+
console.log("โ
Random string:", randomStr);
|
|
13
|
+
// Test 2: Hashing
|
|
14
|
+
console.log("\n2. Testing hashing...");
|
|
15
|
+
const hash = await (0, crypto_1.sha256Hash)({
|
|
16
|
+
message: "Hello Crypto!",
|
|
17
|
+
timestamp: Date.now(),
|
|
18
|
+
});
|
|
19
|
+
console.log("โ
SHA-256 hash:", hash.substring(0, 20) + "...");
|
|
20
|
+
// Test 3: RSA key generation and encryption
|
|
21
|
+
console.log("\n3. Testing RSA encryption...");
|
|
22
|
+
const keyPair = await (0, crypto_1.generateKeyPair)();
|
|
23
|
+
console.log("โ
RSA key pair generated");
|
|
24
|
+
const publicKey = await (0, crypto_1.deserializePublicKey)(keyPair.publicKey);
|
|
25
|
+
const privateKey = await (0, crypto_1.deserializePrivateKey)(keyPair.privateKey);
|
|
26
|
+
const encryptedMessage = await (0, crypto_1.encrypt)("Secret RSA message", publicKey);
|
|
27
|
+
const decryptedMessage = await (0, crypto_1.decrypt)(encryptedMessage, privateKey);
|
|
28
|
+
console.log("โ
RSA encrypted:", encryptedMessage.substring(0, 30) + "...");
|
|
29
|
+
console.log("โ
RSA decrypted:", decryptedMessage);
|
|
30
|
+
// Test 4: AES symmetric encryption
|
|
31
|
+
console.log("\n4. Testing AES symmetric encryption...");
|
|
32
|
+
const symmetricKey = await (0, crypto_1.generateSymmetricKey)();
|
|
33
|
+
const deserializedKey = await (0, crypto_1.deserializeSymmetricKey)(symmetricKey);
|
|
34
|
+
const encryptedData = await (0, crypto_1.encryptWithSymmetricKey)("Secret AES message", deserializedKey);
|
|
35
|
+
const decryptedData = await (0, crypto_1.decryptWithSymmetricKey)(encryptedData, deserializedKey);
|
|
36
|
+
console.log("โ
AES encrypted:", encryptedData.ciphertext.substring(0, 30) + "...");
|
|
37
|
+
console.log("โ
AES decrypted:", decryptedData);
|
|
38
|
+
// Test 5: File encryption
|
|
39
|
+
console.log("\n5. Testing file encryption...");
|
|
40
|
+
const fileContent = "This is a secret file content for testing!";
|
|
41
|
+
const password = "testPassword123";
|
|
42
|
+
const encryptedFile = await (0, crypto_1.encryptTextFile)(fileContent, password, "test.txt");
|
|
43
|
+
const decryptedFile = await (0, crypto_1.decryptTextFile)(encryptedFile, password);
|
|
44
|
+
console.log("โ
File encrypted:", encryptedFile.fileName);
|
|
45
|
+
console.log("โ
File decrypted:", decryptedFile.textContent);
|
|
46
|
+
console.log("\n๐ All crypto tests completed successfully!");
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
tests: {
|
|
50
|
+
randomString: randomStr,
|
|
51
|
+
hash: hash.substring(0, 20) + "...",
|
|
52
|
+
rsaEncryption: {
|
|
53
|
+
encrypted: encryptedMessage.substring(0, 30) + "...",
|
|
54
|
+
decrypted: decryptedMessage,
|
|
55
|
+
},
|
|
56
|
+
aesEncryption: {
|
|
57
|
+
encrypted: encryptedData.ciphertext.substring(0, 30) + "...",
|
|
58
|
+
decrypted: decryptedData,
|
|
59
|
+
},
|
|
60
|
+
fileEncryption: {
|
|
61
|
+
fileName: encryptedFile.fileName,
|
|
62
|
+
decrypted: decryptedFile.textContent,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error("โ Crypto test failed:", error);
|
|
69
|
+
return {
|
|
70
|
+
success: false,
|
|
71
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Run the test
|
|
76
|
+
testCrypto()
|
|
77
|
+
.then((result) => {
|
|
78
|
+
console.log("\n๐ Final Result:");
|
|
79
|
+
console.log(JSON.stringify(result, null, 2));
|
|
80
|
+
})
|
|
81
|
+
.catch((error) => {
|
|
82
|
+
console.error("๐ฅ Test execution failed:", error);
|
|
83
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Double Ratchet Protocol test
|
|
4
|
+
const crypto_1 = require("../crypto");
|
|
5
|
+
// Test Double Ratchet Protocol
|
|
6
|
+
async function testDoubleRatchet() {
|
|
7
|
+
try {
|
|
8
|
+
console.log("๐ Starting Double Ratchet Protocol test...");
|
|
9
|
+
const result = await (0, crypto_1.demonstrateDoubleRatchet)();
|
|
10
|
+
if (result.success) {
|
|
11
|
+
console.log("โ
Double Ratchet Protocol test successful!");
|
|
12
|
+
console.log("Messages exchanged:", result.messagesExchanged);
|
|
13
|
+
console.log("Forward secrecy:", result.demonstration.forwardSecrecy);
|
|
14
|
+
console.log("Out-of-order handling:", result.demonstration.outOfOrderHandling);
|
|
15
|
+
console.log("DH ratcheting:", result.demonstration.dhRatcheting);
|
|
16
|
+
console.log("Chain key updating:", result.demonstration.chainKeyUpdating);
|
|
17
|
+
// Test individual functions
|
|
18
|
+
console.log("\n๐งช Testing individual Double Ratchet functions...");
|
|
19
|
+
// Test state serialization
|
|
20
|
+
const aliceStateSerialized = result.aliceState;
|
|
21
|
+
console.log("โ
Alice state serialized:", aliceStateSerialized.substring(0, 100) + "...");
|
|
22
|
+
// Test conversation
|
|
23
|
+
console.log("โ
Conversation messages:", result.conversation.length);
|
|
24
|
+
result.conversation.forEach((msg, index) => {
|
|
25
|
+
console.log(` Message ${index + 1}: ${msg.from} โ Message #${msg.envelope.messageNumber}`);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.log("โ Double Ratchet Protocol test failed");
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error("โ Double Ratchet Protocol test error:", error);
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Test interactive Double Ratchet messaging
|
|
42
|
+
async function testInteractiveDoubleRatchet() {
|
|
43
|
+
try {
|
|
44
|
+
console.log("๐ Starting Interactive Double Ratchet test...");
|
|
45
|
+
// Initialize X3DH for shared secret
|
|
46
|
+
const { initializeSignalUser, getSignalPublicKeyBundle, performSignalX3DHKeyExchange, } = await import("../crypto/signal-protocol.js");
|
|
47
|
+
const alice = await initializeSignalUser("Alice");
|
|
48
|
+
const bob = await initializeSignalUser("Bob");
|
|
49
|
+
const bobBundle = await getSignalPublicKeyBundle(bob);
|
|
50
|
+
const exchangeResult = await performSignalX3DHKeyExchange(alice, bobBundle);
|
|
51
|
+
console.log("โ
X3DH key exchange completed");
|
|
52
|
+
// Initialize Double Ratchet states
|
|
53
|
+
const aliceState = await (0, crypto_1.initializeDoubleRatchet)(exchangeResult.masterSecret, true);
|
|
54
|
+
const bobState = await (0, crypto_1.initializeDoubleRatchet)(exchangeResult.masterSecret, false);
|
|
55
|
+
console.log("โ
Double Ratchet states initialized");
|
|
56
|
+
// Test message exchange
|
|
57
|
+
const messages = [
|
|
58
|
+
"Hello Bob! This is our first Double Ratchet message! ๐",
|
|
59
|
+
"Hi Alice! The Double Ratchet is working perfectly! ๐",
|
|
60
|
+
"This is message 3 with forward secrecy! ๐ก๏ธ",
|
|
61
|
+
"And this is message 4 - each with a unique key! ๐",
|
|
62
|
+
];
|
|
63
|
+
const conversation = [];
|
|
64
|
+
for (let i = 0; i < messages.length; i++) {
|
|
65
|
+
const sender = i % 2 === 0 ? "Alice" : "Bob";
|
|
66
|
+
const senderState = sender === "Alice" ? aliceState : bobState;
|
|
67
|
+
const receiverState = sender === "Alice" ? bobState : aliceState;
|
|
68
|
+
console.log(`\n๐ค ${sender} sending message ${i + 1}: "${messages[i]}"`);
|
|
69
|
+
// Encrypt
|
|
70
|
+
const envelope = await (0, crypto_1.doubleRatchetEncrypt)(senderState, messages[i]);
|
|
71
|
+
console.log(`โ
${sender} encrypted message #${envelope.messageNumber}`);
|
|
72
|
+
// Decrypt
|
|
73
|
+
const decrypted = await (0, crypto_1.doubleRatchetDecrypt)(receiverState, envelope);
|
|
74
|
+
console.log(`โ
${sender === "Alice" ? "Bob" : "Alice"} decrypted: "${decrypted}"`);
|
|
75
|
+
// Verify
|
|
76
|
+
if (decrypted === messages[i]) {
|
|
77
|
+
console.log(`โ
Message ${i + 1} verified successfully`);
|
|
78
|
+
conversation.push({
|
|
79
|
+
sender,
|
|
80
|
+
receiver: sender === "Alice" ? "Bob" : "Alice",
|
|
81
|
+
original: messages[i],
|
|
82
|
+
decrypted,
|
|
83
|
+
messageNumber: envelope.messageNumber,
|
|
84
|
+
verified: true,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(`โ Message ${i + 1} verification failed`);
|
|
89
|
+
conversation.push({
|
|
90
|
+
sender,
|
|
91
|
+
receiver: sender === "Alice" ? "Bob" : "Alice",
|
|
92
|
+
original: messages[i],
|
|
93
|
+
decrypted,
|
|
94
|
+
messageNumber: envelope.messageNumber,
|
|
95
|
+
verified: false,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Test state serialization
|
|
100
|
+
const aliceSerialized = await (0, crypto_1.serializeDoubleRatchetState)(aliceState);
|
|
101
|
+
const bobSerialized = await (0, crypto_1.serializeDoubleRatchetState)(bobState);
|
|
102
|
+
console.log("\n๐ Interactive Double Ratchet test results:");
|
|
103
|
+
console.log(`Messages exchanged: ${conversation.length}`);
|
|
104
|
+
console.log(`All messages verified: ${conversation.every((msg) => msg.verified)}`);
|
|
105
|
+
console.log(`Alice state serialized: ${aliceSerialized.length} characters`);
|
|
106
|
+
console.log(`Bob state serialized: ${bobSerialized.length} characters`);
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
messagesExchanged: conversation.length,
|
|
110
|
+
allVerified: conversation.every((msg) => msg.verified),
|
|
111
|
+
conversation,
|
|
112
|
+
aliceState: aliceSerialized,
|
|
113
|
+
bobState: bobSerialized,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error("โ Interactive Double Ratchet test error:", error);
|
|
118
|
+
return {
|
|
119
|
+
success: false,
|
|
120
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Run the tests
|
|
125
|
+
async function runAllTests() {
|
|
126
|
+
console.log("๐ Running all Double Ratchet tests...\n");
|
|
127
|
+
// Test 1: Basic demonstration
|
|
128
|
+
console.log("=== Test 1: Basic Double Ratchet Demonstration ===");
|
|
129
|
+
const basicResult = await testDoubleRatchet();
|
|
130
|
+
console.log("\n=== Test 2: Interactive Double Ratchet Messaging ===");
|
|
131
|
+
const interactiveResult = await testInteractiveDoubleRatchet();
|
|
132
|
+
console.log("\n๐ Final Results:");
|
|
133
|
+
console.log("Basic test:", basicResult.success ? "โ
PASSED" : "โ FAILED");
|
|
134
|
+
console.log("Interactive test:", interactiveResult.success ? "โ
PASSED" : "โ FAILED");
|
|
135
|
+
if (basicResult.success && interactiveResult.success) {
|
|
136
|
+
console.log("\n๐ All Double Ratchet tests completed successfully!");
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log("\nโ Some tests failed");
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
basic: basicResult,
|
|
143
|
+
interactive: interactiveResult,
|
|
144
|
+
allPassed: basicResult.success && interactiveResult.success,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Run the tests
|
|
148
|
+
runAllTests()
|
|
149
|
+
.then((result) => {
|
|
150
|
+
console.log("\n๐ Final Test Summary:");
|
|
151
|
+
console.log(JSON.stringify(result, null, 2));
|
|
152
|
+
})
|
|
153
|
+
.catch((error) => {
|
|
154
|
+
console.error("๐ฅ Test execution failed:", error);
|
|
155
|
+
});
|