shogun-core 6.2.3 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed448_js.shogun-core.js +93 -341
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed448_js.shogun-core.js.map +1 -1
- package/dist/browser/shogun-core.js +138850 -146638
- package/dist/browser/shogun-core.js.map +1 -1
- package/dist/{core.js → src/core.js} +167 -107
- package/dist/src/crypto/asymmetric.js +168 -0
- package/dist/src/crypto/double-ratchet.js +908 -0
- package/dist/src/crypto/file-encryption.js +352 -0
- package/dist/src/crypto/hashing.js +160 -0
- package/dist/src/crypto/index.js +18 -0
- package/dist/{crypto → src/crypto}/mls-codec.js +24 -34
- package/dist/src/crypto/mls.js +734 -0
- package/dist/src/crypto/pgp.js +619 -0
- package/dist/{crypto → src/crypto}/random-generation.js +125 -103
- package/dist/src/crypto/sframe.js +466 -0
- package/dist/src/crypto/signal-protocol.js +943 -0
- package/dist/src/crypto/symmetric.js +165 -0
- package/dist/src/crypto/utils.js +220 -0
- package/dist/src/examples/auth-test.js +535 -0
- package/dist/src/examples/crypto-identity-example.js +294 -0
- package/dist/src/examples/crypto-working-test.js +149 -0
- package/dist/src/examples/double-ratchet-test.js +240 -0
- package/dist/src/examples/mls-3-member-test.js +183 -0
- package/dist/src/examples/mls-multi-member.js +439 -0
- package/dist/src/examples/mls-sframe-test.js +491 -0
- package/dist/src/examples/mls-simple-test.js +122 -0
- package/dist/src/examples/pgp-example.js +354 -0
- package/dist/src/examples/random-generation-test.js +191 -0
- package/dist/src/examples/shogun-core-example.js +204 -0
- package/dist/src/examples/signal-protocol-test.js +82 -0
- package/dist/src/examples/zkproof-credentials-example.js +357 -0
- package/dist/src/examples/zkproof-example.js +357 -0
- package/dist/src/gundb/crypto.js +420 -0
- package/dist/src/gundb/db.js +728 -0
- package/dist/src/gundb/derive.js +327 -0
- package/dist/src/gundb/errors.js +115 -0
- package/dist/src/gundb/gun-es.js +8 -0
- package/dist/src/gundb/index.js +5 -0
- package/dist/{gundb → src/gundb}/rxjs.js +147 -111
- package/dist/{gundb → src/gundb}/types.js +1 -2
- package/dist/src/index.js +19 -0
- package/dist/src/interfaces/events.js +57 -0
- package/dist/{interfaces → src/interfaces}/shogun.js +4 -7
- package/dist/src/managers/AuthManager.js +301 -0
- package/dist/src/managers/CoreInitializer.js +304 -0
- package/dist/src/managers/CryptoIdentityManager.js +230 -0
- package/dist/{managers → src/managers}/EventManager.js +19 -21
- package/dist/{managers → src/managers}/PluginManager.js +123 -89
- package/dist/src/plugins/base.js +90 -0
- package/dist/src/plugins/index.js +17 -0
- package/dist/src/plugins/nostr/index.js +4 -0
- package/dist/src/plugins/nostr/nostrConnector.js +539 -0
- package/dist/src/plugins/nostr/nostrConnectorPlugin.js +663 -0
- package/dist/src/plugins/nostr/nostrSigner.js +414 -0
- package/dist/src/plugins/smartwallet/index.js +2 -0
- package/dist/src/plugins/smartwallet/smartWalletPlugin.js +824 -0
- package/dist/src/plugins/web3/index.js +4 -0
- package/dist/src/plugins/web3/types.js +1 -0
- package/dist/src/plugins/web3/web3Connector.js +738 -0
- package/dist/src/plugins/web3/web3ConnectorPlugin.js +639 -0
- package/dist/src/plugins/web3/web3Signer.js +432 -0
- package/dist/src/plugins/webauthn/index.js +3 -0
- package/dist/{plugins → src/plugins}/webauthn/types.js +2 -5
- package/dist/src/plugins/webauthn/webauthn.js +647 -0
- package/dist/src/plugins/webauthn/webauthnPlugin.js +689 -0
- package/dist/src/plugins/webauthn/webauthnSigner.js +419 -0
- package/dist/{plugins → src/plugins}/zkproof/index.js +3 -10
- package/dist/src/plugins/zkproof/types.js +1 -0
- package/dist/src/plugins/zkproof/zkCredentials.js +287 -0
- package/dist/src/plugins/zkproof/zkProofConnector.js +267 -0
- package/dist/src/plugins/zkproof/zkProofPlugin.js +405 -0
- package/dist/src/storage/storage.js +189 -0
- package/dist/src/utils/errorHandler.js +339 -0
- package/dist/{utils → src/utils}/eventEmitter.js +26 -26
- package/dist/{utils → src/utils}/seedPhrase.js +23 -32
- package/dist/{utils → src/utils}/validation.js +14 -21
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/{crypto → src/crypto}/double-ratchet.d.ts +1 -1
- package/dist/types/{crypto → src/crypto}/signal-protocol.d.ts +25 -0
- package/dist/types/{crypto → src/crypto}/types.d.ts +3 -1
- package/dist/types/src/examples/crypto-working-test.d.ts +1 -0
- package/dist/types/src/examples/double-ratchet-test.d.ts +1 -0
- package/dist/types/src/examples/mls-sframe-test.d.ts +1 -0
- package/dist/types/src/examples/random-generation-test.d.ts +1 -0
- package/dist/types/src/examples/signal-protocol-test.d.ts +1 -0
- package/dist/types/{gundb → src/gundb}/db.d.ts +14 -1
- package/dist/types/src/gundb/gun-es.d.ts +8 -0
- package/dist/types/src/gundb/min.d.ts +3 -0
- package/dist/types/{index.d.ts → src/index.d.ts} +1 -0
- package/package.json +14 -11
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_curve_js-node_modules_noble_curves_esm_-1ce4ed.shogun-core.js +0 -1651
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_curve_js-node_modules_noble_curves_esm_-1ce4ed.shogun-core.js.map +0 -1
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_nist_js.shogun-core.js +0 -1608
- package/dist/browser/defaultVendors-node_modules_noble_curves_esm_nist_js.shogun-core.js.map +0 -1
- package/dist/crypto/asymmetric.js +0 -99
- package/dist/crypto/double-ratchet.js +0 -370
- package/dist/crypto/file-encryption.js +0 -213
- package/dist/crypto/hashing.js +0 -87
- package/dist/crypto/index.js +0 -34
- package/dist/crypto/mls.js +0 -569
- package/dist/crypto/pgp.js +0 -390
- package/dist/crypto/sframe.js +0 -352
- package/dist/crypto/signal-protocol.js +0 -456
- package/dist/crypto/symmetric.js +0 -91
- package/dist/crypto/types.js +0 -2
- package/dist/crypto/utils.js +0 -140
- package/dist/examples/auth-test.js +0 -453
- package/dist/examples/crypto-identity-example.js +0 -196
- package/dist/examples/crypto-working-test.js +0 -83
- package/dist/examples/double-ratchet-test.js +0 -155
- package/dist/examples/mls-3-member-test.js +0 -97
- package/dist/examples/mls-multi-member.js +0 -153
- package/dist/examples/mls-sframe-test.js +0 -307
- package/dist/examples/mls-simple-test.js +0 -58
- package/dist/examples/pgp-example.js +0 -200
- package/dist/examples/random-generation-test.js +0 -151
- package/dist/examples/shogun-core-example.js +0 -150
- package/dist/examples/signal-protocol-test.js +0 -38
- package/dist/examples/zkproof-credentials-example.js +0 -217
- package/dist/examples/zkproof-example.js +0 -242
- package/dist/gundb/crypto.js +0 -306
- package/dist/gundb/db.js +0 -485
- package/dist/gundb/derive.js +0 -232
- package/dist/gundb/errors.js +0 -76
- package/dist/gundb/gun-es.js +0 -12
- package/dist/gundb/index.js +0 -21
- package/dist/gundb/min.js +0 -10
- package/dist/index.esm.js +0 -22
- package/dist/index.js +0 -47
- package/dist/interfaces/common.js +0 -2
- package/dist/interfaces/events.js +0 -40
- package/dist/interfaces/plugin.js +0 -2
- package/dist/managers/AuthManager.js +0 -226
- package/dist/managers/CoreInitializer.js +0 -250
- package/dist/managers/CryptoIdentityManager.js +0 -138
- package/dist/plugins/base.js +0 -50
- package/dist/plugins/index.js +0 -32
- package/dist/plugins/nostr/index.js +0 -20
- package/dist/plugins/nostr/nostrConnector.js +0 -419
- package/dist/plugins/nostr/nostrConnectorPlugin.js +0 -453
- package/dist/plugins/nostr/nostrSigner.js +0 -319
- package/dist/plugins/nostr/types.js +0 -2
- package/dist/plugins/smartwallet/index.js +0 -18
- package/dist/plugins/smartwallet/smartWalletPlugin.js +0 -511
- package/dist/plugins/smartwallet/types.js +0 -2
- package/dist/plugins/web3/index.js +0 -20
- package/dist/plugins/web3/types.js +0 -2
- package/dist/plugins/web3/web3Connector.js +0 -533
- package/dist/plugins/web3/web3ConnectorPlugin.js +0 -455
- package/dist/plugins/web3/web3Signer.js +0 -314
- package/dist/plugins/webauthn/index.js +0 -19
- package/dist/plugins/webauthn/webauthn.js +0 -496
- package/dist/plugins/webauthn/webauthnPlugin.js +0 -490
- package/dist/plugins/webauthn/webauthnSigner.js +0 -310
- package/dist/plugins/zkproof/types.js +0 -2
- package/dist/plugins/zkproof/zkCredentials.js +0 -216
- package/dist/plugins/zkproof/zkProofConnector.js +0 -198
- package/dist/plugins/zkproof/zkProofPlugin.js +0 -272
- package/dist/storage/storage.js +0 -145
- package/dist/types/gundb/gun-es.d.ts +0 -8
- package/dist/utils/errorHandler.js +0 -246
- /package/dist/{types/examples/crypto-working-test.d.ts → src/crypto/types.js} +0 -0
- /package/dist/{types/gundb/min.d.ts → src/gundb/min.js} +0 -0
- /package/dist/{types/examples/double-ratchet-test.d.ts → src/interfaces/common.js} +0 -0
- /package/dist/{types/examples/mls-sframe-test.d.ts → src/interfaces/plugin.js} +0 -0
- /package/dist/{types/examples/random-generation-test.d.ts → src/plugins/nostr/types.js} +0 -0
- /package/dist/{types/examples/signal-protocol-test.d.ts → src/plugins/smartwallet/types.js} +0 -0
- /package/dist/types/{core.d.ts → src/core.d.ts} +0 -0
- /package/dist/types/{crypto → src/crypto}/asymmetric.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/file-encryption.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/hashing.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/index.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/mls-codec.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/mls.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/pgp.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/random-generation.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/sframe.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/symmetric.d.ts +0 -0
- /package/dist/types/{crypto → src/crypto}/utils.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/auth-test.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/crypto-identity-example.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/mls-3-member-test.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/mls-multi-member.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/mls-simple-test.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/pgp-example.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/shogun-core-example.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/zkproof-credentials-example.d.ts +0 -0
- /package/dist/types/{examples → src/examples}/zkproof-example.d.ts +0 -0
- /package/dist/types/{gundb → src/gundb}/crypto.d.ts +0 -0
- /package/dist/types/{gundb → src/gundb}/derive.d.ts +0 -0
- /package/dist/types/{gundb → src/gundb}/errors.d.ts +0 -0
- /package/dist/types/{gundb → src/gundb}/index.d.ts +0 -0
- /package/dist/types/{gundb → src/gundb}/rxjs.d.ts +0 -0
- /package/dist/types/{gundb → src/gundb}/types.d.ts +0 -0
- /package/dist/types/{interfaces → src/interfaces}/common.d.ts +0 -0
- /package/dist/types/{interfaces → src/interfaces}/events.d.ts +0 -0
- /package/dist/types/{interfaces → src/interfaces}/plugin.d.ts +0 -0
- /package/dist/types/{interfaces → src/interfaces}/shogun.d.ts +0 -0
- /package/dist/types/{managers → src/managers}/AuthManager.d.ts +0 -0
- /package/dist/types/{managers → src/managers}/CoreInitializer.d.ts +0 -0
- /package/dist/types/{managers → src/managers}/CryptoIdentityManager.d.ts +0 -0
- /package/dist/types/{managers → src/managers}/EventManager.d.ts +0 -0
- /package/dist/types/{managers → src/managers}/PluginManager.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/base.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/index.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/nostr/index.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/nostr/nostrConnector.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/nostr/nostrConnectorPlugin.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/nostr/nostrSigner.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/nostr/types.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/smartwallet/index.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/smartwallet/smartWalletPlugin.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/smartwallet/types.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/web3/index.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/web3/types.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/web3/web3Connector.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/web3/web3ConnectorPlugin.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/web3/web3Signer.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/webauthn/index.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/webauthn/types.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/webauthn/webauthn.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/webauthn/webauthnPlugin.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/webauthn/webauthnSigner.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/zkproof/index.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/zkproof/types.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/zkproof/zkCredentials.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/zkproof/zkProofConnector.d.ts +0 -0
- /package/dist/types/{plugins → src/plugins}/zkproof/zkProofPlugin.d.ts +0 -0
- /package/dist/types/{storage → src/storage}/storage.d.ts +0 -0
- /package/dist/types/{utils → src/utils}/errorHandler.d.ts +0 -0
- /package/dist/types/{utils → src/utils}/eventEmitter.d.ts +0 -0
- /package/dist/types/{utils → src/utils}/seedPhrase.d.ts +0 -0
- /package/dist/types/{utils → src/utils}/validation.d.ts +0 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import { NostrConnector } from "./nostrConnector.js";
|
|
38
|
+
import derive from "../../gundb/derive.js";
|
|
39
|
+
import { ethers } from "ethers";
|
|
40
|
+
/**
|
|
41
|
+
* Nostr Signer - Provides oneshot signing functionality
|
|
42
|
+
* Similar to webauthn.js but for Nostr/Bitcoin wallets
|
|
43
|
+
* CONSISTENT with normal Nostr approach
|
|
44
|
+
*/
|
|
45
|
+
var NostrSigner = /** @class */ (function () {
|
|
46
|
+
function NostrSigner(nostrConnector) {
|
|
47
|
+
this.credentials = new Map();
|
|
48
|
+
this.MESSAGE_TO_SIGN = "I Love Shogun!"; // Same as normal approach
|
|
49
|
+
this.nostrConnector = nostrConnector || new NostrConnector();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates a new Nostr signing credential
|
|
53
|
+
* CONSISTENT with normal Nostr approach
|
|
54
|
+
*/
|
|
55
|
+
NostrSigner.prototype.createSigningCredential = function (address) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
57
|
+
var validAddress, signature, username, password, signingCredential, error_1;
|
|
58
|
+
return __generator(this, function (_a) {
|
|
59
|
+
switch (_a.label) {
|
|
60
|
+
case 0:
|
|
61
|
+
_a.trys.push([0, 3, , 4]);
|
|
62
|
+
validAddress = this.validateAddress(address);
|
|
63
|
+
return [4 /*yield*/, this.generateDeterministicSignature(validAddress)];
|
|
64
|
+
case 1:
|
|
65
|
+
signature = _a.sent();
|
|
66
|
+
username = "".concat(validAddress.toLowerCase());
|
|
67
|
+
return [4 /*yield*/, this.generatePassword(signature)];
|
|
68
|
+
case 2:
|
|
69
|
+
password = _a.sent();
|
|
70
|
+
signingCredential = {
|
|
71
|
+
address: validAddress,
|
|
72
|
+
signature: signature,
|
|
73
|
+
message: this.MESSAGE_TO_SIGN,
|
|
74
|
+
username: username,
|
|
75
|
+
password: password,
|
|
76
|
+
};
|
|
77
|
+
// Store credential for later use
|
|
78
|
+
this.credentials.set(validAddress.toLowerCase(), signingCredential);
|
|
79
|
+
return [2 /*return*/, signingCredential];
|
|
80
|
+
case 3:
|
|
81
|
+
error_1 = _a.sent();
|
|
82
|
+
console.error("Error creating Nostr signing credential:", error_1);
|
|
83
|
+
throw new Error("Failed to create Nostr signing credential: ".concat(error_1.message));
|
|
84
|
+
case 4: return [2 /*return*/];
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Validates address using the same logic as NostrConnector
|
|
91
|
+
*/
|
|
92
|
+
NostrSigner.prototype.validateAddress = function (address) {
|
|
93
|
+
if (!address) {
|
|
94
|
+
throw new Error("Address not provided");
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
var normalizedAddress = String(address).trim();
|
|
98
|
+
// Basic validation for Bitcoin addresses and Nostr pubkeys (same as normal approach)
|
|
99
|
+
if (!/^(npub1|[0-9a-f]{64}|bc1|[13])[a-zA-HJ-NP-Z0-9]{25,59}$/.test(normalizedAddress)) {
|
|
100
|
+
// More lenient validation for Nostr addresses
|
|
101
|
+
if (normalizedAddress.length < 10) {
|
|
102
|
+
throw new Error("Invalid Nostr/Bitcoin address format");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return normalizedAddress;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new Error("Invalid Nostr/Bitcoin address provided");
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Generate deterministic signature using the SAME approach as NostrConnector
|
|
113
|
+
*/
|
|
114
|
+
NostrSigner.prototype.generateDeterministicSignature = function (address) {
|
|
115
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
116
|
+
var baseString, hash, runningValue, i, charCode, deterministicSignature;
|
|
117
|
+
return __generator(this, function (_a) {
|
|
118
|
+
baseString = "".concat(address, "_").concat(this.MESSAGE_TO_SIGN, "_shogun_deterministic");
|
|
119
|
+
hash = "";
|
|
120
|
+
runningValue = 0;
|
|
121
|
+
for (i = 0; i < baseString.length; i++) {
|
|
122
|
+
charCode = baseString.charCodeAt(i);
|
|
123
|
+
runningValue = (runningValue * 31 + charCode) & 0xffffffff;
|
|
124
|
+
if (i % 4 === 3) {
|
|
125
|
+
hash += runningValue.toString(16).padStart(8, "0");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Ensure we have exactly 128 characters (64 bytes in hex)
|
|
129
|
+
while (hash.length < 128) {
|
|
130
|
+
runningValue = (runningValue * 31 + hash.length) & 0xffffffff;
|
|
131
|
+
hash += runningValue.toString(16).padStart(8, "0");
|
|
132
|
+
}
|
|
133
|
+
deterministicSignature = hash.substring(0, 128);
|
|
134
|
+
// Double-check that it's a valid hex string
|
|
135
|
+
deterministicSignature = deterministicSignature
|
|
136
|
+
.toLowerCase()
|
|
137
|
+
.replace(/[^0-9a-f]/g, "0");
|
|
138
|
+
// Ensure it's exactly 128 characters
|
|
139
|
+
if (deterministicSignature.length < 128) {
|
|
140
|
+
deterministicSignature = deterministicSignature.padEnd(128, "0");
|
|
141
|
+
}
|
|
142
|
+
else if (deterministicSignature.length > 128) {
|
|
143
|
+
deterministicSignature = deterministicSignature.substring(0, 128);
|
|
144
|
+
}
|
|
145
|
+
return [2 /*return*/, deterministicSignature];
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Generate password using the SAME approach as NostrConnector
|
|
151
|
+
*/
|
|
152
|
+
NostrSigner.prototype.generatePassword = function (signature) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
154
|
+
var normalizedSig, passwordHash;
|
|
155
|
+
return __generator(this, function (_a) {
|
|
156
|
+
if (!signature) {
|
|
157
|
+
throw new Error("Invalid signature");
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
normalizedSig = signature.toLowerCase().replace(/[^a-f0-9]/g, "");
|
|
161
|
+
passwordHash = ethers.sha256(ethers.toUtf8Bytes(normalizedSig));
|
|
162
|
+
return [2 /*return*/, passwordHash];
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error("Error generating password:", error);
|
|
166
|
+
throw new Error("Failed to generate password from signature");
|
|
167
|
+
}
|
|
168
|
+
return [2 /*return*/];
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Creates an authenticator function compatible with SEA.sign
|
|
174
|
+
* This is the key function that makes it work like webauthn.js but for Nostr
|
|
175
|
+
*/
|
|
176
|
+
NostrSigner.prototype.createAuthenticator = function (address) {
|
|
177
|
+
var _this = this;
|
|
178
|
+
var credential = this.credentials.get(address.toLowerCase());
|
|
179
|
+
if (!credential) {
|
|
180
|
+
throw new Error("Credential for address ".concat(address, " not found"));
|
|
181
|
+
}
|
|
182
|
+
return function (data) { return __awaiter(_this, void 0, void 0, function () {
|
|
183
|
+
var dataToSign, signature, error_2;
|
|
184
|
+
return __generator(this, function (_a) {
|
|
185
|
+
switch (_a.label) {
|
|
186
|
+
case 0:
|
|
187
|
+
_a.trys.push([0, 2, , 3]);
|
|
188
|
+
dataToSign = JSON.stringify(data);
|
|
189
|
+
return [4 /*yield*/, this.signData(dataToSign, credential)];
|
|
190
|
+
case 1:
|
|
191
|
+
signature = _a.sent();
|
|
192
|
+
return [2 /*return*/, signature];
|
|
193
|
+
case 2:
|
|
194
|
+
error_2 = _a.sent();
|
|
195
|
+
console.error("Nostr authentication error:", error_2);
|
|
196
|
+
throw error_2;
|
|
197
|
+
case 3: return [2 /*return*/];
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}); };
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Sign data using the credential
|
|
204
|
+
*/
|
|
205
|
+
NostrSigner.prototype.signData = function (data, credential) {
|
|
206
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
207
|
+
var signatureBase;
|
|
208
|
+
return __generator(this, function (_a) {
|
|
209
|
+
signatureBase = "".concat(credential.signature, "_").concat(data);
|
|
210
|
+
return [2 /*return*/, this.generateDeterministicSignature(signatureBase)];
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Creates a derived key pair from Nostr credential
|
|
216
|
+
* CONSISTENT with normal approach: uses password as seed
|
|
217
|
+
*/
|
|
218
|
+
NostrSigner.prototype.createDerivedKeyPair = function (address, extra) {
|
|
219
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
220
|
+
var credential, derivedKeys, error_3;
|
|
221
|
+
return __generator(this, function (_a) {
|
|
222
|
+
switch (_a.label) {
|
|
223
|
+
case 0:
|
|
224
|
+
credential = this.credentials.get(address.toLowerCase());
|
|
225
|
+
if (!credential) {
|
|
226
|
+
throw new Error("Credential for address ".concat(address, " not found"));
|
|
227
|
+
}
|
|
228
|
+
_a.label = 1;
|
|
229
|
+
case 1:
|
|
230
|
+
_a.trys.push([1, 3, , 4]);
|
|
231
|
+
return [4 /*yield*/, derive(credential.password, // This is the key consistency point!
|
|
232
|
+
extra, { includeP256: true })];
|
|
233
|
+
case 2:
|
|
234
|
+
derivedKeys = _a.sent();
|
|
235
|
+
return [2 /*return*/, {
|
|
236
|
+
pub: derivedKeys.pub,
|
|
237
|
+
priv: derivedKeys.priv,
|
|
238
|
+
epub: derivedKeys.epub,
|
|
239
|
+
epriv: derivedKeys.epriv,
|
|
240
|
+
}];
|
|
241
|
+
case 3:
|
|
242
|
+
error_3 = _a.sent();
|
|
243
|
+
console.error("Error deriving keys from Nostr credential:", error_3);
|
|
244
|
+
throw error_3;
|
|
245
|
+
case 4: return [2 /*return*/];
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Creates a Gun user from Nostr credential
|
|
252
|
+
* This ensures the SAME user is created as with normal approach
|
|
253
|
+
* FIX: Use derived pair instead of username/password for GunDB auth
|
|
254
|
+
*/
|
|
255
|
+
NostrSigner.prototype.createGunUser = function (address, gunInstance) {
|
|
256
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
257
|
+
var credential, derivedPair_1, error_4;
|
|
258
|
+
var _this = this;
|
|
259
|
+
return __generator(this, function (_a) {
|
|
260
|
+
switch (_a.label) {
|
|
261
|
+
case 0:
|
|
262
|
+
credential = this.credentials.get(address.toLowerCase());
|
|
263
|
+
if (!credential) {
|
|
264
|
+
throw new Error("Credential for address ".concat(address, " not found"));
|
|
265
|
+
}
|
|
266
|
+
_a.label = 1;
|
|
267
|
+
case 1:
|
|
268
|
+
_a.trys.push([1, 3, , 4]);
|
|
269
|
+
return [4 /*yield*/, this.createDerivedKeyPair(address)];
|
|
270
|
+
case 2:
|
|
271
|
+
derivedPair_1 = _a.sent();
|
|
272
|
+
return [2 /*return*/, new Promise(function (resolve) {
|
|
273
|
+
// Use the derived pair directly for GunDB auth
|
|
274
|
+
gunInstance.user().create(derivedPair_1, function (ack) {
|
|
275
|
+
if (ack.err) {
|
|
276
|
+
// Try to login if user already exists
|
|
277
|
+
gunInstance.user().auth(derivedPair_1, function (authAck) {
|
|
278
|
+
if (authAck.err) {
|
|
279
|
+
resolve({ success: false, error: authAck.err });
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
var userPub = authAck.pub;
|
|
283
|
+
// Update credential with Gun user pub
|
|
284
|
+
credential.gunUserPub = userPub;
|
|
285
|
+
_this.credentials.set(address.toLowerCase(), credential);
|
|
286
|
+
resolve({ success: true, userPub: userPub });
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
// User created, now login
|
|
292
|
+
gunInstance.user().auth(derivedPair_1, function (authAck) {
|
|
293
|
+
if (authAck.err) {
|
|
294
|
+
resolve({ success: false, error: authAck.err });
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
var userPub = authAck.pub;
|
|
298
|
+
// Update credential with Gun user pub
|
|
299
|
+
credential.gunUserPub = userPub;
|
|
300
|
+
_this.credentials.set(address.toLowerCase(), credential);
|
|
301
|
+
resolve({ success: true, userPub: userPub });
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
})];
|
|
307
|
+
case 3:
|
|
308
|
+
error_4 = _a.sent();
|
|
309
|
+
console.error("Error creating Gun user:", error_4);
|
|
310
|
+
return [2 /*return*/, { success: false, error: error_4.message }];
|
|
311
|
+
case 4: return [2 /*return*/];
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* Signs data using Nostr + derived keys
|
|
318
|
+
* This provides a hybrid approach: Nostr for user verification + derived keys for actual signing
|
|
319
|
+
* CONSISTENT with normal approach
|
|
320
|
+
*/
|
|
321
|
+
NostrSigner.prototype.signWithDerivedKeys = function (data, address, extra) {
|
|
322
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
323
|
+
var authenticator, keyPair, message, signature, seaSignature, error_5;
|
|
324
|
+
return __generator(this, function (_a) {
|
|
325
|
+
switch (_a.label) {
|
|
326
|
+
case 0:
|
|
327
|
+
_a.trys.push([0, 4, , 5]);
|
|
328
|
+
authenticator = this.createAuthenticator(address);
|
|
329
|
+
return [4 /*yield*/, authenticator(data)];
|
|
330
|
+
case 1:
|
|
331
|
+
_a.sent(); // This verifies the user
|
|
332
|
+
return [4 /*yield*/, this.createDerivedKeyPair(address, extra)];
|
|
333
|
+
case 2:
|
|
334
|
+
keyPair = _a.sent();
|
|
335
|
+
message = JSON.stringify(data);
|
|
336
|
+
return [4 /*yield*/, this.generateDeterministicSignature("".concat(keyPair.priv, "_").concat(message))];
|
|
337
|
+
case 3:
|
|
338
|
+
signature = _a.sent();
|
|
339
|
+
seaSignature = {
|
|
340
|
+
m: message,
|
|
341
|
+
s: signature,
|
|
342
|
+
};
|
|
343
|
+
return [2 /*return*/, "SEA" + JSON.stringify(seaSignature)];
|
|
344
|
+
case 4:
|
|
345
|
+
error_5 = _a.sent();
|
|
346
|
+
console.error("Error signing with derived keys:", error_5);
|
|
347
|
+
throw error_5;
|
|
348
|
+
case 5: return [2 /*return*/];
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
};
|
|
353
|
+
/**
|
|
354
|
+
* Get the Gun user public key for a credential
|
|
355
|
+
* This allows checking if the same user would be created
|
|
356
|
+
*/
|
|
357
|
+
NostrSigner.prototype.getGunUserPub = function (address) {
|
|
358
|
+
var credential = this.credentials.get(address.toLowerCase());
|
|
359
|
+
return credential === null || credential === void 0 ? void 0 : credential.gunUserPub;
|
|
360
|
+
};
|
|
361
|
+
/**
|
|
362
|
+
* Get the password (for consistency checking)
|
|
363
|
+
*/
|
|
364
|
+
NostrSigner.prototype.getPassword = function (address) {
|
|
365
|
+
var credential = this.credentials.get(address.toLowerCase());
|
|
366
|
+
return credential === null || credential === void 0 ? void 0 : credential.password;
|
|
367
|
+
};
|
|
368
|
+
/**
|
|
369
|
+
* Check if this credential would create the same Gun user as normal approach
|
|
370
|
+
*/
|
|
371
|
+
NostrSigner.prototype.verifyConsistency = function (address, expectedUserPub) {
|
|
372
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
373
|
+
var credential, derivedKeys;
|
|
374
|
+
return __generator(this, function (_a) {
|
|
375
|
+
switch (_a.label) {
|
|
376
|
+
case 0:
|
|
377
|
+
credential = this.credentials.get(address.toLowerCase());
|
|
378
|
+
if (!credential) {
|
|
379
|
+
return [2 /*return*/, { consistent: false }];
|
|
380
|
+
}
|
|
381
|
+
return [4 /*yield*/, this.createDerivedKeyPair(address)];
|
|
382
|
+
case 1:
|
|
383
|
+
derivedKeys = _a.sent();
|
|
384
|
+
return [2 /*return*/, {
|
|
385
|
+
consistent: expectedUserPub ? derivedKeys.pub === expectedUserPub : true,
|
|
386
|
+
actualUserPub: derivedKeys.pub,
|
|
387
|
+
expectedUserPub: expectedUserPub,
|
|
388
|
+
}];
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* Get credential by address
|
|
395
|
+
*/
|
|
396
|
+
NostrSigner.prototype.getCredential = function (address) {
|
|
397
|
+
return this.credentials.get(address.toLowerCase());
|
|
398
|
+
};
|
|
399
|
+
/**
|
|
400
|
+
* List all stored credentials
|
|
401
|
+
*/
|
|
402
|
+
NostrSigner.prototype.listCredentials = function () {
|
|
403
|
+
return Array.from(this.credentials.values());
|
|
404
|
+
};
|
|
405
|
+
/**
|
|
406
|
+
* Remove a credential
|
|
407
|
+
*/
|
|
408
|
+
NostrSigner.prototype.removeCredential = function (address) {
|
|
409
|
+
return this.credentials.delete(address.toLowerCase());
|
|
410
|
+
};
|
|
411
|
+
return NostrSigner;
|
|
412
|
+
}());
|
|
413
|
+
export { NostrSigner };
|
|
414
|
+
export default NostrSigner;
|