shogun-core 6.2.4 → 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 +138979 -146789
- 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 -392
- 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,943 @@
|
|
|
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
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
38
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
39
|
+
if (!m) return o;
|
|
40
|
+
var i = m.call(o), r, ar = [], e;
|
|
41
|
+
try {
|
|
42
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
43
|
+
}
|
|
44
|
+
catch (error) { e = { error: error }; }
|
|
45
|
+
finally {
|
|
46
|
+
try {
|
|
47
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
48
|
+
}
|
|
49
|
+
finally { if (e) throw e.error; }
|
|
50
|
+
}
|
|
51
|
+
return ar;
|
|
52
|
+
};
|
|
53
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
54
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
55
|
+
if (ar || !(i in from)) {
|
|
56
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
57
|
+
ar[i] = from[i];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
61
|
+
};
|
|
62
|
+
var __values = (this && this.__values) || function(o) {
|
|
63
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
64
|
+
if (m) return m.call(o);
|
|
65
|
+
if (o && typeof o.length === "number") return {
|
|
66
|
+
next: function () {
|
|
67
|
+
if (o && i >= o.length) o = void 0;
|
|
68
|
+
return { value: o && o[i++], done: !o };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
72
|
+
};
|
|
73
|
+
import { bufferToHex, concatArrayBuffers, } from "./hashing.js";
|
|
74
|
+
// Try to import @noble/curves for fallback when Web Crypto API doesn't support X25519 properly
|
|
75
|
+
var x25519Noble = null;
|
|
76
|
+
var ed25519Noble = null;
|
|
77
|
+
// Load @noble/curves dynamically (may not be available in all environments)
|
|
78
|
+
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
79
|
+
var nobleCurves, e_1;
|
|
80
|
+
return __generator(this, function (_a) {
|
|
81
|
+
switch (_a.label) {
|
|
82
|
+
case 0:
|
|
83
|
+
_a.trys.push([0, 2, , 3]);
|
|
84
|
+
return [4 /*yield*/, import("@noble/curves/ed25519")];
|
|
85
|
+
case 1:
|
|
86
|
+
nobleCurves = _a.sent();
|
|
87
|
+
x25519Noble = nobleCurves.x25519;
|
|
88
|
+
ed25519Noble = nobleCurves.ed25519;
|
|
89
|
+
return [3 /*break*/, 3];
|
|
90
|
+
case 2:
|
|
91
|
+
e_1 = _a.sent();
|
|
92
|
+
return [3 /*break*/, 3];
|
|
93
|
+
case 3: return [2 /*return*/];
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}); })();
|
|
97
|
+
// Signal Protocol X3DH Key Exchange Implementation
|
|
98
|
+
// Using X25519 for key agreement (matches actual Signal Protocol)
|
|
99
|
+
var signalKeyParams = {
|
|
100
|
+
name: "X25519",
|
|
101
|
+
};
|
|
102
|
+
var signalHkdfParams = {
|
|
103
|
+
name: "HKDF",
|
|
104
|
+
hash: "SHA-256",
|
|
105
|
+
};
|
|
106
|
+
export var generateSignalKeyPair = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
107
|
+
var keyPair, error_1, errorMessage;
|
|
108
|
+
return __generator(this, function (_a) {
|
|
109
|
+
switch (_a.label) {
|
|
110
|
+
case 0:
|
|
111
|
+
_a.trys.push([0, 2, , 3]);
|
|
112
|
+
return [4 /*yield*/, crypto.subtle.generateKey(signalKeyParams, true, [
|
|
113
|
+
"deriveBits",
|
|
114
|
+
])];
|
|
115
|
+
case 1:
|
|
116
|
+
keyPair = _a.sent();
|
|
117
|
+
return [2 /*return*/, keyPair];
|
|
118
|
+
case 2:
|
|
119
|
+
error_1 = _a.sent();
|
|
120
|
+
errorMessage = error_1 instanceof Error ? error_1.message : "Unknown error";
|
|
121
|
+
console.warn("generateSignalKeyPair failed, using fallback:", errorMessage);
|
|
122
|
+
return [2 /*return*/, {
|
|
123
|
+
publicKey: {
|
|
124
|
+
algorithm: { name: "X25519" },
|
|
125
|
+
type: "public",
|
|
126
|
+
usages: [],
|
|
127
|
+
extractable: true,
|
|
128
|
+
},
|
|
129
|
+
privateKey: {
|
|
130
|
+
algorithm: { name: "X25519" },
|
|
131
|
+
type: "private",
|
|
132
|
+
usages: ["deriveBits"],
|
|
133
|
+
extractable: true,
|
|
134
|
+
},
|
|
135
|
+
}];
|
|
136
|
+
case 3: return [2 /*return*/];
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}); };
|
|
140
|
+
export var generateSignalSigningKeyPair = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
141
|
+
var keyPair, error_2, errorMessage;
|
|
142
|
+
return __generator(this, function (_a) {
|
|
143
|
+
switch (_a.label) {
|
|
144
|
+
case 0:
|
|
145
|
+
_a.trys.push([0, 2, , 3]);
|
|
146
|
+
return [4 /*yield*/, crypto.subtle.generateKey({
|
|
147
|
+
name: "Ed25519", // Using Ed25519 for signatures (matches actual Signal Protocol)
|
|
148
|
+
}, true, ["sign", "verify"])];
|
|
149
|
+
case 1:
|
|
150
|
+
keyPair = _a.sent();
|
|
151
|
+
return [2 /*return*/, keyPair];
|
|
152
|
+
case 2:
|
|
153
|
+
error_2 = _a.sent();
|
|
154
|
+
errorMessage = error_2 instanceof Error ? error_2.message : "Unknown error";
|
|
155
|
+
console.warn("generateSignalSigningKeyPair failed, using fallback:", errorMessage);
|
|
156
|
+
return [2 /*return*/, {
|
|
157
|
+
publicKey: {
|
|
158
|
+
algorithm: { name: "Ed25519" },
|
|
159
|
+
type: "public",
|
|
160
|
+
usages: ["verify"],
|
|
161
|
+
extractable: true,
|
|
162
|
+
},
|
|
163
|
+
privateKey: {
|
|
164
|
+
algorithm: { name: "Ed25519" },
|
|
165
|
+
type: "private",
|
|
166
|
+
usages: ["sign"],
|
|
167
|
+
extractable: true,
|
|
168
|
+
},
|
|
169
|
+
}];
|
|
170
|
+
case 3: return [2 /*return*/];
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}); };
|
|
174
|
+
export var exportSignalPublicKey = function (publicKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
175
|
+
var algorithmName, isExtractable, exported, bytes, isAllZeros_1, rawError_1, spki, spkiBytes, spkiError_1, finalBytes, isAllZeros, error_3, errorMessage, algorithmName;
|
|
176
|
+
var _a, _b;
|
|
177
|
+
return __generator(this, function (_c) {
|
|
178
|
+
switch (_c.label) {
|
|
179
|
+
case 0:
|
|
180
|
+
_c.trys.push([0, 12, , 13]);
|
|
181
|
+
algorithmName = (_a = publicKey === null || publicKey === void 0 ? void 0 : publicKey.algorithm) === null || _a === void 0 ? void 0 : _a.name;
|
|
182
|
+
isExtractable = publicKey === null || publicKey === void 0 ? void 0 : publicKey.extractable;
|
|
183
|
+
if (!isExtractable) {
|
|
184
|
+
throw new Error("Cannot export non-extractable key. Algorithm: ".concat(algorithmName, ", Type: ").concat(publicKey === null || publicKey === void 0 ? void 0 : publicKey.type));
|
|
185
|
+
}
|
|
186
|
+
exported = void 0;
|
|
187
|
+
if (!(algorithmName === "Ed25519")) return [3 /*break*/, 9];
|
|
188
|
+
_c.label = 1;
|
|
189
|
+
case 1:
|
|
190
|
+
_c.trys.push([1, 3, , 8]);
|
|
191
|
+
return [4 /*yield*/, crypto.subtle.exportKey("raw", publicKey)];
|
|
192
|
+
case 2:
|
|
193
|
+
exported = _c.sent();
|
|
194
|
+
bytes = new Uint8Array(exported);
|
|
195
|
+
isAllZeros_1 = bytes.every(function (byte) { return byte === 0; });
|
|
196
|
+
if (isAllZeros_1) {
|
|
197
|
+
throw new Error("Export returned all zeros");
|
|
198
|
+
}
|
|
199
|
+
return [3 /*break*/, 8];
|
|
200
|
+
case 3:
|
|
201
|
+
rawError_1 = _c.sent();
|
|
202
|
+
_c.label = 4;
|
|
203
|
+
case 4:
|
|
204
|
+
_c.trys.push([4, 6, , 7]);
|
|
205
|
+
return [4 /*yield*/, crypto.subtle.exportKey("spki", publicKey)];
|
|
206
|
+
case 5:
|
|
207
|
+
spki = _c.sent();
|
|
208
|
+
spkiBytes = new Uint8Array(spki);
|
|
209
|
+
if (spkiBytes.length < 32) {
|
|
210
|
+
throw new Error("SPKI format too short: ".concat(spkiBytes.length, " bytes"));
|
|
211
|
+
}
|
|
212
|
+
// Extract last 32 bytes (Ed25519 public key)
|
|
213
|
+
exported = spkiBytes.slice(-32).buffer;
|
|
214
|
+
return [3 /*break*/, 7];
|
|
215
|
+
case 6:
|
|
216
|
+
spkiError_1 = _c.sent();
|
|
217
|
+
throw new Error("Failed to export Ed25519 key in both raw and spki formats. Raw error: ".concat(rawError_1 instanceof Error ? rawError_1.message : rawError_1, ", SPKI error: ").concat(spkiError_1 instanceof Error ? spkiError_1.message : spkiError_1));
|
|
218
|
+
case 7: return [3 /*break*/, 8];
|
|
219
|
+
case 8: return [3 /*break*/, 11];
|
|
220
|
+
case 9: return [4 /*yield*/, crypto.subtle.exportKey("raw", publicKey)];
|
|
221
|
+
case 10:
|
|
222
|
+
// For X25519 and other keys, use raw format
|
|
223
|
+
exported = _c.sent();
|
|
224
|
+
_c.label = 11;
|
|
225
|
+
case 11:
|
|
226
|
+
finalBytes = new Uint8Array(exported);
|
|
227
|
+
isAllZeros = finalBytes.every(function (byte) { return byte === 0; });
|
|
228
|
+
if (isAllZeros) {
|
|
229
|
+
throw new Error("Exported key is all zeros. Algorithm: ".concat(algorithmName, ", Size: ").concat(exported.byteLength, " bytes"));
|
|
230
|
+
}
|
|
231
|
+
return [2 /*return*/, exported];
|
|
232
|
+
case 12:
|
|
233
|
+
error_3 = _c.sent();
|
|
234
|
+
errorMessage = error_3 instanceof Error ? error_3.message : "Unknown error";
|
|
235
|
+
algorithmName = (_b = publicKey === null || publicKey === void 0 ? void 0 : publicKey.algorithm) === null || _b === void 0 ? void 0 : _b.name;
|
|
236
|
+
console.error("exportSignalPublicKey failed:", errorMessage, {
|
|
237
|
+
algorithm: algorithmName,
|
|
238
|
+
type: publicKey === null || publicKey === void 0 ? void 0 : publicKey.type,
|
|
239
|
+
extractable: publicKey === null || publicKey === void 0 ? void 0 : publicKey.extractable,
|
|
240
|
+
});
|
|
241
|
+
// Check if this is a fallback key object (doesn't have standard CryptoKey properties)
|
|
242
|
+
// Fallback keys are just plain objects, not real CryptoKey instances
|
|
243
|
+
if (publicKey &&
|
|
244
|
+
typeof publicKey === "object" &&
|
|
245
|
+
publicKey.algorithm &&
|
|
246
|
+
(!publicKey.extractable || !(publicKey instanceof CryptoKey))) {
|
|
247
|
+
// This is a fallback key object - we can't export it, so we need to generate a proper key
|
|
248
|
+
// This should not happen in production - it means Ed25519 is not supported
|
|
249
|
+
throw new Error("Cannot export fallback ".concat(algorithmName, " key. ").concat(algorithmName, " is not supported in this environment. Error: ").concat(errorMessage));
|
|
250
|
+
}
|
|
251
|
+
// Re-throw if it's not a fallback key issue
|
|
252
|
+
throw error_3;
|
|
253
|
+
case 13: return [2 /*return*/];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}); };
|
|
257
|
+
export var importSignalPublicKey = function (keyBytes) { return __awaiter(void 0, void 0, void 0, function () {
|
|
258
|
+
return __generator(this, function (_a) {
|
|
259
|
+
switch (_a.label) {
|
|
260
|
+
case 0: return [4 /*yield*/, crypto.subtle.importKey("raw", keyBytes, signalKeyParams, true, // Make public keys extractable for Double Ratchet key comparisons
|
|
261
|
+
[])];
|
|
262
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}); };
|
|
266
|
+
export var exportSignalPrivateKey = function (privateKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
267
|
+
var algorithmName, error_4, errorMessage;
|
|
268
|
+
var _a, _b;
|
|
269
|
+
return __generator(this, function (_c) {
|
|
270
|
+
switch (_c.label) {
|
|
271
|
+
case 0:
|
|
272
|
+
_c.trys.push([0, 2, , 3]);
|
|
273
|
+
// Validate key type
|
|
274
|
+
if (!privateKey) {
|
|
275
|
+
throw new Error("Private key is null or undefined");
|
|
276
|
+
}
|
|
277
|
+
if (privateKey.type !== "private") {
|
|
278
|
+
throw new Error("Expected private key, got ".concat(privateKey.type, ". Algorithm: ").concat(((_a = privateKey.algorithm) === null || _a === void 0 ? void 0 : _a.name) || "unknown"));
|
|
279
|
+
}
|
|
280
|
+
if (!privateKey.extractable) {
|
|
281
|
+
throw new Error("Cannot export non-extractable private key");
|
|
282
|
+
}
|
|
283
|
+
algorithmName = (_b = privateKey.algorithm) === null || _b === void 0 ? void 0 : _b.name;
|
|
284
|
+
if (algorithmName !== "X25519") {
|
|
285
|
+
throw new Error("Unexpected algorithm for private key export: ".concat(algorithmName, ". Expected X25519."));
|
|
286
|
+
}
|
|
287
|
+
return [4 /*yield*/, crypto.subtle.exportKey("raw", privateKey)];
|
|
288
|
+
case 1: return [2 /*return*/, _c.sent()];
|
|
289
|
+
case 2:
|
|
290
|
+
error_4 = _c.sent();
|
|
291
|
+
errorMessage = error_4 instanceof Error ? error_4.message : String(error_4);
|
|
292
|
+
throw new Error("Failed to export private key: ".concat(errorMessage));
|
|
293
|
+
case 3: return [2 /*return*/];
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}); };
|
|
297
|
+
export var importSignalPrivateKey = function (keyBytes) { return __awaiter(void 0, void 0, void 0, function () {
|
|
298
|
+
var error_5, errorMessage;
|
|
299
|
+
return __generator(this, function (_a) {
|
|
300
|
+
switch (_a.label) {
|
|
301
|
+
case 0:
|
|
302
|
+
_a.trys.push([0, 2, , 3]);
|
|
303
|
+
return [4 /*yield*/, crypto.subtle.importKey("raw", keyBytes, signalKeyParams, true, // Make private keys extractable for saving/restoring state
|
|
304
|
+
["deriveBits"])];
|
|
305
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
306
|
+
case 2:
|
|
307
|
+
error_5 = _a.sent();
|
|
308
|
+
errorMessage = error_5 instanceof Error ? error_5.message : String(error_5);
|
|
309
|
+
console.warn("importSignalPrivateKey failed, using fallback:", errorMessage);
|
|
310
|
+
return [2 /*return*/, {
|
|
311
|
+
algorithm: { name: "X25519" },
|
|
312
|
+
type: "private",
|
|
313
|
+
usages: ["deriveBits"],
|
|
314
|
+
extractable: true,
|
|
315
|
+
}];
|
|
316
|
+
case 3: return [2 /*return*/];
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}); };
|
|
320
|
+
export var importSignalSigningPublicKey = function (keyBytes) { return __awaiter(void 0, void 0, void 0, function () {
|
|
321
|
+
return __generator(this, function (_a) {
|
|
322
|
+
switch (_a.label) {
|
|
323
|
+
case 0: return [4 /*yield*/, crypto.subtle.importKey("raw", keyBytes, {
|
|
324
|
+
name: "Ed25519",
|
|
325
|
+
}, true, // Make public keys extractable for re-export in bundles
|
|
326
|
+
["verify"])];
|
|
327
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
}); };
|
|
331
|
+
export var performSignalDH = function (privateKey, publicKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
332
|
+
var result, error_6;
|
|
333
|
+
return __generator(this, function (_a) {
|
|
334
|
+
switch (_a.label) {
|
|
335
|
+
case 0:
|
|
336
|
+
console.log("🔄 Performing X25519 key agreement...");
|
|
337
|
+
_a.label = 1;
|
|
338
|
+
case 1:
|
|
339
|
+
_a.trys.push([1, 3, , 4]);
|
|
340
|
+
return [4 /*yield*/, crypto.subtle.deriveBits({
|
|
341
|
+
name: "X25519",
|
|
342
|
+
public: publicKey,
|
|
343
|
+
}, privateKey, 256)];
|
|
344
|
+
case 2:
|
|
345
|
+
result = _a.sent();
|
|
346
|
+
console.log("✓ X25519 key agreement successful, output length:", result.byteLength);
|
|
347
|
+
return [2 /*return*/, result];
|
|
348
|
+
case 3:
|
|
349
|
+
error_6 = _a.sent();
|
|
350
|
+
console.error("❌ X25519 key agreement failed:", error_6);
|
|
351
|
+
throw error_6;
|
|
352
|
+
case 4: return [2 /*return*/];
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}); };
|
|
356
|
+
export var signSignalData = function (privateKey, data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
357
|
+
return __generator(this, function (_a) {
|
|
358
|
+
switch (_a.label) {
|
|
359
|
+
case 0: return [4 /*yield*/, crypto.subtle.sign({
|
|
360
|
+
name: "Ed25519",
|
|
361
|
+
}, privateKey, data)];
|
|
362
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}); };
|
|
366
|
+
export var verifySignalSignature = function (publicKey, signature, data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
367
|
+
var result, error_7;
|
|
368
|
+
return __generator(this, function (_a) {
|
|
369
|
+
switch (_a.label) {
|
|
370
|
+
case 0:
|
|
371
|
+
console.log("🔍 Verifying Ed25519 signature...");
|
|
372
|
+
_a.label = 1;
|
|
373
|
+
case 1:
|
|
374
|
+
_a.trys.push([1, 3, , 4]);
|
|
375
|
+
return [4 /*yield*/, crypto.subtle.verify({
|
|
376
|
+
name: "Ed25519",
|
|
377
|
+
}, publicKey, signature, data)];
|
|
378
|
+
case 2:
|
|
379
|
+
result = _a.sent();
|
|
380
|
+
console.log("✓ Signature verification result:", result);
|
|
381
|
+
return [2 /*return*/, result];
|
|
382
|
+
case 3:
|
|
383
|
+
error_7 = _a.sent();
|
|
384
|
+
console.error("❌ Signature verification failed:", error_7);
|
|
385
|
+
throw error_7;
|
|
386
|
+
case 4: return [2 /*return*/];
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}); };
|
|
390
|
+
export var deriveSignalKey = function (inputKeyMaterial_1, salt_1, info_1) {
|
|
391
|
+
var args_1 = [];
|
|
392
|
+
for (var _i = 3; _i < arguments.length; _i++) {
|
|
393
|
+
args_1[_i - 3] = arguments[_i];
|
|
394
|
+
}
|
|
395
|
+
return __awaiter(void 0, __spreadArray([inputKeyMaterial_1, salt_1, info_1], __read(args_1), false), void 0, function (inputKeyMaterial, salt, info, length) {
|
|
396
|
+
var prk;
|
|
397
|
+
if (length === void 0) { length = 256; }
|
|
398
|
+
return __generator(this, function (_a) {
|
|
399
|
+
switch (_a.label) {
|
|
400
|
+
case 0: return [4 /*yield*/, crypto.subtle.importKey("raw", inputKeyMaterial, signalHkdfParams.name, false, ["deriveKey"])];
|
|
401
|
+
case 1:
|
|
402
|
+
prk = _a.sent();
|
|
403
|
+
return [4 /*yield*/, crypto.subtle.deriveKey({
|
|
404
|
+
name: signalHkdfParams.name,
|
|
405
|
+
hash: signalHkdfParams.hash,
|
|
406
|
+
salt: salt,
|
|
407
|
+
info: info,
|
|
408
|
+
}, prk, {
|
|
409
|
+
name: "AES-GCM",
|
|
410
|
+
length: length,
|
|
411
|
+
}, true, ["encrypt", "decrypt"])];
|
|
412
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
export var concatSignalArrayBuffers = function () {
|
|
418
|
+
var buffers = [];
|
|
419
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
420
|
+
buffers[_i] = arguments[_i];
|
|
421
|
+
}
|
|
422
|
+
return concatArrayBuffers.apply(void 0, __spreadArray([], __read(buffers), false));
|
|
423
|
+
};
|
|
424
|
+
export var bufferToSignalHex = function (buffer) {
|
|
425
|
+
return bufferToHex(buffer);
|
|
426
|
+
};
|
|
427
|
+
export var initializeSignalUser = function (name) { return __awaiter(void 0, void 0, void 0, function () {
|
|
428
|
+
var identitySigningKeyPair, identityKeyPair, signedPrekeyPair, prekeyBytes, signedPrekeySignature, oneTimePrekeyPairs, i, oneTimeKey, error_8;
|
|
429
|
+
return __generator(this, function (_a) {
|
|
430
|
+
switch (_a.label) {
|
|
431
|
+
case 0:
|
|
432
|
+
console.log("\uD83D\uDD10 [".concat(name, "] Starting user initialization..."));
|
|
433
|
+
_a.label = 1;
|
|
434
|
+
case 1:
|
|
435
|
+
_a.trys.push([1, 11, , 12]);
|
|
436
|
+
// Generate identity key pairs (separate for X25519 and Ed25519)
|
|
437
|
+
console.log("\uD83D\uDD11 [".concat(name, "] Generating identity signing key pair (Ed25519)..."));
|
|
438
|
+
return [4 /*yield*/, generateSignalSigningKeyPair()];
|
|
439
|
+
case 2:
|
|
440
|
+
identitySigningKeyPair = _a.sent();
|
|
441
|
+
console.log("\uD83D\uDD11 [".concat(name, "] Generating identity X25519 key pair..."));
|
|
442
|
+
return [4 /*yield*/, generateSignalKeyPair()];
|
|
443
|
+
case 3:
|
|
444
|
+
identityKeyPair = _a.sent();
|
|
445
|
+
// Generate signed prekey pair
|
|
446
|
+
console.log("\uD83D\uDD11 [".concat(name, "] Generating signed prekey pair..."));
|
|
447
|
+
return [4 /*yield*/, generateSignalKeyPair()];
|
|
448
|
+
case 4:
|
|
449
|
+
signedPrekeyPair = _a.sent();
|
|
450
|
+
// Sign the prekey with identity signing key
|
|
451
|
+
console.log("\uD83D\uDCDD [".concat(name, "] Exporting signed prekey for signing..."));
|
|
452
|
+
return [4 /*yield*/, exportSignalPublicKey(signedPrekeyPair.publicKey)];
|
|
453
|
+
case 5:
|
|
454
|
+
prekeyBytes = _a.sent();
|
|
455
|
+
console.log("\u270D\uFE0F [".concat(name, "] Signing prekey with identity signing key..."));
|
|
456
|
+
return [4 /*yield*/, signSignalData(identitySigningKeyPair.privateKey, prekeyBytes)];
|
|
457
|
+
case 6:
|
|
458
|
+
signedPrekeySignature = _a.sent();
|
|
459
|
+
console.log("\u2713 [".concat(name, "] Prekey signature generated, length:"), signedPrekeySignature.byteLength);
|
|
460
|
+
// Generate one-time prekeys
|
|
461
|
+
console.log("\uD83D\uDD11 [".concat(name, "] Generating one-time prekeys..."));
|
|
462
|
+
oneTimePrekeyPairs = [];
|
|
463
|
+
i = 0;
|
|
464
|
+
_a.label = 7;
|
|
465
|
+
case 7:
|
|
466
|
+
if (!(i < 3)) return [3 /*break*/, 10];
|
|
467
|
+
return [4 /*yield*/, generateSignalKeyPair()];
|
|
468
|
+
case 8:
|
|
469
|
+
oneTimeKey = _a.sent();
|
|
470
|
+
oneTimePrekeyPairs.push(oneTimeKey);
|
|
471
|
+
console.log("\u2713 [".concat(name, "] One-time prekey ").concat(i + 1, "/3 generated"));
|
|
472
|
+
_a.label = 9;
|
|
473
|
+
case 9:
|
|
474
|
+
i++;
|
|
475
|
+
return [3 /*break*/, 7];
|
|
476
|
+
case 10:
|
|
477
|
+
console.log("\u2705 [".concat(name, "] User initialization completed successfully"));
|
|
478
|
+
return [2 /*return*/, {
|
|
479
|
+
name: name,
|
|
480
|
+
identityKeyPair: identityKeyPair, // X25519 key pair
|
|
481
|
+
identitySigningKeyPair: identitySigningKeyPair, // Ed25519 key pair
|
|
482
|
+
signedPrekeyPair: signedPrekeyPair,
|
|
483
|
+
signedPrekeySignature: signedPrekeySignature,
|
|
484
|
+
oneTimePrekeyPairs: oneTimePrekeyPairs,
|
|
485
|
+
}];
|
|
486
|
+
case 11:
|
|
487
|
+
error_8 = _a.sent();
|
|
488
|
+
console.error("\u274C [".concat(name, "] User initialization failed:"), error_8);
|
|
489
|
+
throw error_8;
|
|
490
|
+
case 12: return [2 /*return*/];
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
}); };
|
|
494
|
+
export var getSignalPublicKeyBundle = function (user) { return __awaiter(void 0, void 0, void 0, function () {
|
|
495
|
+
var identityKey, identitySigningKeyBefore, identitySigningKey, signingKeyBytes, isAllZeros, signedPrekey, oneTimePrekey, _a, bundle, error_9;
|
|
496
|
+
var _b;
|
|
497
|
+
return __generator(this, function (_c) {
|
|
498
|
+
switch (_c.label) {
|
|
499
|
+
case 0:
|
|
500
|
+
console.log("\uD83D\uDCE6 Creating public key bundle for ".concat(user.name, "..."));
|
|
501
|
+
_c.label = 1;
|
|
502
|
+
case 1:
|
|
503
|
+
_c.trys.push([1, 8, , 9]);
|
|
504
|
+
console.log("Exporting identity X25519 key...");
|
|
505
|
+
return [4 /*yield*/, exportSignalPublicKey(user.identityKeyPair.publicKey)];
|
|
506
|
+
case 2:
|
|
507
|
+
identityKey = _c.sent();
|
|
508
|
+
console.log("\u2713 Identity X25519 key exported: ".concat(identityKey.byteLength, " bytes"));
|
|
509
|
+
console.log("Exporting identity signing key...");
|
|
510
|
+
identitySigningKeyBefore = user.identitySigningKeyPair.publicKey;
|
|
511
|
+
console.log("Identity signing key properties:", {
|
|
512
|
+
algorithm: (_b = identitySigningKeyBefore === null || identitySigningKeyBefore === void 0 ? void 0 : identitySigningKeyBefore.algorithm) === null || _b === void 0 ? void 0 : _b.name,
|
|
513
|
+
type: identitySigningKeyBefore === null || identitySigningKeyBefore === void 0 ? void 0 : identitySigningKeyBefore.type,
|
|
514
|
+
extractable: identitySigningKeyBefore === null || identitySigningKeyBefore === void 0 ? void 0 : identitySigningKeyBefore.extractable,
|
|
515
|
+
});
|
|
516
|
+
return [4 /*yield*/, exportSignalPublicKey(user.identitySigningKeyPair.publicKey)];
|
|
517
|
+
case 3:
|
|
518
|
+
identitySigningKey = _c.sent();
|
|
519
|
+
signingKeyBytes = new Uint8Array(identitySigningKey);
|
|
520
|
+
console.log("\u2713 Identity signing key exported: ".concat(identitySigningKey.byteLength, " bytes, first 8 bytes:"), Array.from(signingKeyBytes.slice(0, 8)));
|
|
521
|
+
isAllZeros = signingKeyBytes.every(function (byte) { return byte === 0; });
|
|
522
|
+
if (isAllZeros) {
|
|
523
|
+
throw new Error("Identity signing key export returned all zeros - this should have been caught by exportSignalPublicKey");
|
|
524
|
+
}
|
|
525
|
+
console.log("Exporting signed prekey...");
|
|
526
|
+
return [4 /*yield*/, exportSignalPublicKey(user.signedPrekeyPair.publicKey)];
|
|
527
|
+
case 4:
|
|
528
|
+
signedPrekey = _c.sent();
|
|
529
|
+
console.log("\u2713 Signed prekey exported: ".concat(signedPrekey.byteLength, " bytes"));
|
|
530
|
+
if (!(user.oneTimePrekeyPairs.length > 0)) return [3 /*break*/, 6];
|
|
531
|
+
return [4 /*yield*/, exportSignalPublicKey(user.oneTimePrekeyPairs[0].publicKey)];
|
|
532
|
+
case 5:
|
|
533
|
+
_a = _c.sent();
|
|
534
|
+
return [3 /*break*/, 7];
|
|
535
|
+
case 6:
|
|
536
|
+
_a = null;
|
|
537
|
+
_c.label = 7;
|
|
538
|
+
case 7:
|
|
539
|
+
oneTimePrekey = _a;
|
|
540
|
+
if (oneTimePrekey) {
|
|
541
|
+
console.log("\u2713 One-time prekey exported: ".concat(oneTimePrekey.byteLength, " bytes"));
|
|
542
|
+
}
|
|
543
|
+
bundle = {
|
|
544
|
+
identityKey: identityKey, // X25519 key
|
|
545
|
+
identitySigningKey: identitySigningKey, // Ed25519 key
|
|
546
|
+
signedPrekey: signedPrekey,
|
|
547
|
+
signedPrekeySignature: user.signedPrekeySignature,
|
|
548
|
+
oneTimePrekey: oneTimePrekey,
|
|
549
|
+
};
|
|
550
|
+
console.log("\u2705 Public key bundle created for ".concat(user.name));
|
|
551
|
+
return [2 /*return*/, bundle];
|
|
552
|
+
case 8:
|
|
553
|
+
error_9 = _c.sent();
|
|
554
|
+
console.error("\u274C Failed to create public key bundle for ".concat(user.name, ":"), error_9);
|
|
555
|
+
throw error_9;
|
|
556
|
+
case 9: return [2 /*return*/];
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
}); };
|
|
560
|
+
export var consumeSignalOneTimePrekey = function (user) {
|
|
561
|
+
return user.oneTimePrekeyPairs.shift();
|
|
562
|
+
};
|
|
563
|
+
export var performSignalX3DHKeyExchange = function (alice, bobBundle) { return __awaiter(void 0, void 0, void 0, function () {
|
|
564
|
+
var bobIdentitySigningKey, isValidSignature, aliceEphemeralPair, bobSignedPrekey, bobIdentityKeyDH, bobOneTimePrekey, _a, dh1, dh2, dh3, dh4, dhOutputs, salt, info, masterSecret, secretBytes, result, error_10;
|
|
565
|
+
var _b;
|
|
566
|
+
return __generator(this, function (_c) {
|
|
567
|
+
switch (_c.label) {
|
|
568
|
+
case 0:
|
|
569
|
+
console.log("\uD83E\uDD1D Starting X3DH key exchange between ".concat(alice.name, " and Bob..."));
|
|
570
|
+
_c.label = 1;
|
|
571
|
+
case 1:
|
|
572
|
+
_c.trys.push([1, 18, , 19]);
|
|
573
|
+
// Step 1: Verify Bob's signed prekey signature using his signing key
|
|
574
|
+
console.log("📝 Step 1: Importing Bob's identity signing key...");
|
|
575
|
+
return [4 /*yield*/, importSignalSigningPublicKey(bobBundle.identitySigningKey)];
|
|
576
|
+
case 2:
|
|
577
|
+
bobIdentitySigningKey = _c.sent();
|
|
578
|
+
console.log("🔍 Verifying Bob's signed prekey signature...");
|
|
579
|
+
return [4 /*yield*/, verifySignalSignature(bobIdentitySigningKey, bobBundle.signedPrekeySignature, bobBundle.signedPrekey)];
|
|
580
|
+
case 3:
|
|
581
|
+
isValidSignature = _c.sent();
|
|
582
|
+
if (!isValidSignature) {
|
|
583
|
+
throw new Error("Invalid signed prekey signature!");
|
|
584
|
+
}
|
|
585
|
+
// Step 2: Generate ephemeral key pair
|
|
586
|
+
console.log("🔑 Step 2: Generating Alice's ephemeral key pair...");
|
|
587
|
+
return [4 /*yield*/, generateSignalKeyPair()];
|
|
588
|
+
case 4:
|
|
589
|
+
aliceEphemeralPair = _c.sent();
|
|
590
|
+
// Step 3: Import Bob's public keys for DH operations
|
|
591
|
+
console.log("🔄 Step 3: Importing Bob's keys for DH operations...");
|
|
592
|
+
return [4 /*yield*/, importSignalPublicKey(bobBundle.signedPrekey)];
|
|
593
|
+
case 5:
|
|
594
|
+
bobSignedPrekey = _c.sent();
|
|
595
|
+
return [4 /*yield*/, importSignalPublicKey(bobBundle.identityKey)];
|
|
596
|
+
case 6:
|
|
597
|
+
bobIdentityKeyDH = _c.sent();
|
|
598
|
+
if (!bobBundle.oneTimePrekey) return [3 /*break*/, 8];
|
|
599
|
+
return [4 /*yield*/, importSignalPublicKey(bobBundle.oneTimePrekey)];
|
|
600
|
+
case 7:
|
|
601
|
+
_a = _c.sent();
|
|
602
|
+
return [3 /*break*/, 9];
|
|
603
|
+
case 8:
|
|
604
|
+
_a = null;
|
|
605
|
+
_c.label = 9;
|
|
606
|
+
case 9:
|
|
607
|
+
bobOneTimePrekey = _a;
|
|
608
|
+
// Step 4: Perform the Triple (or Quadruple) Diffie-Hellman computation
|
|
609
|
+
console.log("🔄 Step 4: Performing DH computations...");
|
|
610
|
+
return [4 /*yield*/, performSignalDH(alice.identityKeyPair.privateKey, bobSignedPrekey)];
|
|
611
|
+
case 10:
|
|
612
|
+
dh1 = _c.sent();
|
|
613
|
+
return [4 /*yield*/, performSignalDH(aliceEphemeralPair.privateKey, bobIdentityKeyDH)];
|
|
614
|
+
case 11:
|
|
615
|
+
dh2 = _c.sent();
|
|
616
|
+
return [4 /*yield*/, performSignalDH(aliceEphemeralPair.privateKey, bobSignedPrekey)];
|
|
617
|
+
case 12:
|
|
618
|
+
dh3 = _c.sent();
|
|
619
|
+
dh4 = null;
|
|
620
|
+
if (!bobOneTimePrekey) return [3 /*break*/, 14];
|
|
621
|
+
console.log("DH4: Alice_Ephemeral_Private × Bob_OneTimePrekey_Public");
|
|
622
|
+
return [4 /*yield*/, performSignalDH(aliceEphemeralPair.privateKey, bobOneTimePrekey)];
|
|
623
|
+
case 13:
|
|
624
|
+
dh4 = _c.sent();
|
|
625
|
+
_c.label = 14;
|
|
626
|
+
case 14:
|
|
627
|
+
// Step 5: Combine all DH outputs
|
|
628
|
+
console.log("🔗 Step 5: Combining DH outputs...");
|
|
629
|
+
dhOutputs = dh4
|
|
630
|
+
? concatSignalArrayBuffers(dh1, dh2, dh3, dh4)
|
|
631
|
+
: concatSignalArrayBuffers(dh1, dh2, dh3);
|
|
632
|
+
// Step 6: Derive the master secret using HKDF
|
|
633
|
+
console.log("🔑 Step 6: Deriving master secret using HKDF...");
|
|
634
|
+
salt = new ArrayBuffer(32);
|
|
635
|
+
info = new TextEncoder().encode("Signal_X3DH_Key_Derivation");
|
|
636
|
+
return [4 /*yield*/, deriveSignalKey(dhOutputs, salt, info.buffer)];
|
|
637
|
+
case 15:
|
|
638
|
+
masterSecret = _c.sent();
|
|
639
|
+
return [4 /*yield*/, crypto.subtle.exportKey("raw", masterSecret)];
|
|
640
|
+
case 16:
|
|
641
|
+
secretBytes = _c.sent();
|
|
642
|
+
_b = {
|
|
643
|
+
masterSecret: secretBytes
|
|
644
|
+
};
|
|
645
|
+
return [4 /*yield*/, exportSignalPublicKey(aliceEphemeralPair.publicKey)];
|
|
646
|
+
case 17:
|
|
647
|
+
result = (_b.aliceEphemeralPublic = _c.sent(),
|
|
648
|
+
_b.usedOneTimePrekey = bobBundle.oneTimePrekey !== null,
|
|
649
|
+
_b);
|
|
650
|
+
console.log("✅ X3DH key exchange completed successfully!");
|
|
651
|
+
return [2 /*return*/, result];
|
|
652
|
+
case 18:
|
|
653
|
+
error_10 = _c.sent();
|
|
654
|
+
console.error("❌ X3DH key exchange failed:", error_10);
|
|
655
|
+
throw error_10;
|
|
656
|
+
case 19: return [2 /*return*/];
|
|
657
|
+
}
|
|
658
|
+
});
|
|
659
|
+
}); };
|
|
660
|
+
export var deriveSignalSharedSecret = function (bob, aliceEphemeralPublic, aliceIdentityPublic, usedOneTimePrekey, oneTimePrekeyBytes) { return __awaiter(void 0, void 0, void 0, function () {
|
|
661
|
+
var aliceEphemeral, aliceIdentity, dh1, dh2, dh3, dh4, matchingKeyPair, _a, _b, keyPair, publicKeyBytes, publicKeyHex, providedKeyHex, e_2_1, dhOutputs, salt, info, masterSecret, secretBytes, error_11;
|
|
662
|
+
var e_2, _c;
|
|
663
|
+
return __generator(this, function (_d) {
|
|
664
|
+
switch (_d.label) {
|
|
665
|
+
case 0:
|
|
666
|
+
console.log("\uD83D\uDD04 Bob deriving shared secret from Alice's message...");
|
|
667
|
+
_d.label = 1;
|
|
668
|
+
case 1:
|
|
669
|
+
_d.trys.push([1, 20, , 21]);
|
|
670
|
+
// Import Alice's public keys
|
|
671
|
+
console.log("📥 Importing Alice's public keys...");
|
|
672
|
+
return [4 /*yield*/, importSignalPublicKey(aliceEphemeralPublic)];
|
|
673
|
+
case 2:
|
|
674
|
+
aliceEphemeral = _d.sent();
|
|
675
|
+
return [4 /*yield*/, importSignalPublicKey(aliceIdentityPublic)];
|
|
676
|
+
case 3:
|
|
677
|
+
aliceIdentity = _d.sent();
|
|
678
|
+
// Perform the same DH computations (but from Bob's perspective)
|
|
679
|
+
console.log("🔄 Bob performing DH computations...");
|
|
680
|
+
return [4 /*yield*/, performSignalDH(bob.signedPrekeyPair.privateKey, aliceIdentity)];
|
|
681
|
+
case 4:
|
|
682
|
+
dh1 = _d.sent();
|
|
683
|
+
return [4 /*yield*/, performSignalDH(bob.identityKeyPair.privateKey, aliceEphemeral)];
|
|
684
|
+
case 5:
|
|
685
|
+
dh2 = _d.sent();
|
|
686
|
+
return [4 /*yield*/, performSignalDH(bob.signedPrekeyPair.privateKey, aliceEphemeral)];
|
|
687
|
+
case 6:
|
|
688
|
+
dh3 = _d.sent();
|
|
689
|
+
dh4 = null;
|
|
690
|
+
if (!(usedOneTimePrekey &&
|
|
691
|
+
oneTimePrekeyBytes &&
|
|
692
|
+
bob.oneTimePrekeyPairs.length > 0)) return [3 /*break*/, 17];
|
|
693
|
+
console.log("Bob DH4: Bob_OneTimePrekey_Private × Alice_Ephemeral_Public");
|
|
694
|
+
matchingKeyPair = null;
|
|
695
|
+
_d.label = 7;
|
|
696
|
+
case 7:
|
|
697
|
+
_d.trys.push([7, 12, 13, 14]);
|
|
698
|
+
_a = __values(bob.oneTimePrekeyPairs), _b = _a.next();
|
|
699
|
+
_d.label = 8;
|
|
700
|
+
case 8:
|
|
701
|
+
if (!!_b.done) return [3 /*break*/, 11];
|
|
702
|
+
keyPair = _b.value;
|
|
703
|
+
return [4 /*yield*/, exportSignalPublicKey(keyPair.publicKey)];
|
|
704
|
+
case 9:
|
|
705
|
+
publicKeyBytes = _d.sent();
|
|
706
|
+
publicKeyHex = bufferToSignalHex(publicKeyBytes);
|
|
707
|
+
providedKeyHex = bufferToSignalHex(oneTimePrekeyBytes);
|
|
708
|
+
if (publicKeyHex === providedKeyHex) {
|
|
709
|
+
matchingKeyPair = keyPair;
|
|
710
|
+
console.log("✓ Found matching one-time prekey in Bob's collection");
|
|
711
|
+
return [3 /*break*/, 11];
|
|
712
|
+
}
|
|
713
|
+
_d.label = 10;
|
|
714
|
+
case 10:
|
|
715
|
+
_b = _a.next();
|
|
716
|
+
return [3 /*break*/, 8];
|
|
717
|
+
case 11: return [3 /*break*/, 14];
|
|
718
|
+
case 12:
|
|
719
|
+
e_2_1 = _d.sent();
|
|
720
|
+
e_2 = { error: e_2_1 };
|
|
721
|
+
return [3 /*break*/, 14];
|
|
722
|
+
case 13:
|
|
723
|
+
try {
|
|
724
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
725
|
+
}
|
|
726
|
+
finally { if (e_2) throw e_2.error; }
|
|
727
|
+
return [7 /*endfinally*/];
|
|
728
|
+
case 14:
|
|
729
|
+
if (!matchingKeyPair) return [3 /*break*/, 16];
|
|
730
|
+
return [4 /*yield*/, performSignalDH(matchingKeyPair.privateKey, aliceEphemeral)];
|
|
731
|
+
case 15:
|
|
732
|
+
dh4 = _d.sent();
|
|
733
|
+
return [3 /*break*/, 17];
|
|
734
|
+
case 16: throw new Error("One-time prekey mismatch");
|
|
735
|
+
case 17:
|
|
736
|
+
// Combine DH outputs in the same order
|
|
737
|
+
console.log("🔗 Bob combining DH outputs...");
|
|
738
|
+
dhOutputs = dh4
|
|
739
|
+
? concatSignalArrayBuffers(dh1, dh2, dh3, dh4)
|
|
740
|
+
: concatSignalArrayBuffers(dh1, dh2, dh3);
|
|
741
|
+
// Derive the same master secret
|
|
742
|
+
console.log("🔑 Bob deriving master secret using HKDF...");
|
|
743
|
+
salt = new ArrayBuffer(32);
|
|
744
|
+
info = new TextEncoder().encode("Signal_X3DH_Key_Derivation");
|
|
745
|
+
return [4 /*yield*/, deriveSignalKey(dhOutputs, salt, info.buffer)];
|
|
746
|
+
case 18:
|
|
747
|
+
masterSecret = _d.sent();
|
|
748
|
+
return [4 /*yield*/, crypto.subtle.exportKey("raw", masterSecret)];
|
|
749
|
+
case 19:
|
|
750
|
+
secretBytes = _d.sent();
|
|
751
|
+
return [2 /*return*/, secretBytes];
|
|
752
|
+
case 20:
|
|
753
|
+
error_11 = _d.sent();
|
|
754
|
+
console.error("❌ Bob shared secret derivation failed:", error_11);
|
|
755
|
+
throw error_11;
|
|
756
|
+
case 21: return [2 /*return*/];
|
|
757
|
+
}
|
|
758
|
+
});
|
|
759
|
+
}); };
|
|
760
|
+
export var demonstrateSignalProtocol = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
761
|
+
var alice, bob, bobBundle, exchangeResult, aliceIdentityPublic, usedOneTimePrekey, bobSecret, aliceSecretHex, bobSecretHex, success, error_12;
|
|
762
|
+
return __generator(this, function (_a) {
|
|
763
|
+
switch (_a.label) {
|
|
764
|
+
case 0:
|
|
765
|
+
_a.trys.push([0, 7, , 8]);
|
|
766
|
+
return [4 /*yield*/, initializeSignalUser("Alice")];
|
|
767
|
+
case 1:
|
|
768
|
+
alice = _a.sent();
|
|
769
|
+
return [4 /*yield*/, initializeSignalUser("Bob")];
|
|
770
|
+
case 2:
|
|
771
|
+
bob = _a.sent();
|
|
772
|
+
return [4 /*yield*/, getSignalPublicKeyBundle(bob)];
|
|
773
|
+
case 3:
|
|
774
|
+
bobBundle = _a.sent();
|
|
775
|
+
return [4 /*yield*/, performSignalX3DHKeyExchange(alice, bobBundle)];
|
|
776
|
+
case 4:
|
|
777
|
+
exchangeResult = _a.sent();
|
|
778
|
+
return [4 /*yield*/, exportSignalPublicKey(alice.identityKeyPair.publicKey)];
|
|
779
|
+
case 5:
|
|
780
|
+
aliceIdentityPublic = _a.sent();
|
|
781
|
+
usedOneTimePrekey = exchangeResult.usedOneTimePrekey
|
|
782
|
+
? bobBundle.oneTimePrekey
|
|
783
|
+
: null;
|
|
784
|
+
return [4 /*yield*/, deriveSignalSharedSecret(bob, exchangeResult.aliceEphemeralPublic, aliceIdentityPublic, exchangeResult.usedOneTimePrekey, usedOneTimePrekey)];
|
|
785
|
+
case 6:
|
|
786
|
+
bobSecret = _a.sent();
|
|
787
|
+
// Now consume Bob's one-time prekey after both sides have used it
|
|
788
|
+
if (exchangeResult.usedOneTimePrekey) {
|
|
789
|
+
consumeSignalOneTimePrekey(bob);
|
|
790
|
+
}
|
|
791
|
+
aliceSecretHex = bufferToSignalHex(exchangeResult.masterSecret);
|
|
792
|
+
bobSecretHex = bufferToSignalHex(bobSecret);
|
|
793
|
+
success = aliceSecretHex === bobSecretHex;
|
|
794
|
+
return [2 /*return*/, {
|
|
795
|
+
success: success,
|
|
796
|
+
aliceSecret: aliceSecretHex,
|
|
797
|
+
bobSecret: bobSecretHex,
|
|
798
|
+
usedOneTimePrekey: exchangeResult.usedOneTimePrekey,
|
|
799
|
+
alice: alice,
|
|
800
|
+
bob: bob,
|
|
801
|
+
exchangeResult: exchangeResult,
|
|
802
|
+
}];
|
|
803
|
+
case 7:
|
|
804
|
+
error_12 = _a.sent();
|
|
805
|
+
console.error("Error during Signal Protocol demonstration:", error_12);
|
|
806
|
+
throw error_12;
|
|
807
|
+
case 8: return [2 /*return*/];
|
|
808
|
+
}
|
|
809
|
+
});
|
|
810
|
+
}); };
|
|
811
|
+
// ========================================
|
|
812
|
+
// Legacy compatibility functions for Signal Protocol implementations
|
|
813
|
+
// These functions work with ArrayBuffer instead of CryptoKey
|
|
814
|
+
// and use @noble/curves as fallback when Web Crypto API doesn't support X25519
|
|
815
|
+
// ========================================
|
|
816
|
+
/**
|
|
817
|
+
* Generate a key pair in legacy ArrayBuffer format for compatibility with Signal implementations
|
|
818
|
+
* Uses @noble/curves if available, otherwise generates and exports CryptoKeyPair
|
|
819
|
+
*/
|
|
820
|
+
export var generateSignalKeyPairLegacy = function (privKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
821
|
+
var privKeyBytes, randomBytes, pubKeyBytes, keyPair, pubKey, privKeyExported;
|
|
822
|
+
return __generator(this, function (_a) {
|
|
823
|
+
switch (_a.label) {
|
|
824
|
+
case 0:
|
|
825
|
+
if (x25519Noble) {
|
|
826
|
+
privKeyBytes = void 0;
|
|
827
|
+
if (privKey) {
|
|
828
|
+
privKeyBytes = new Uint8Array(privKey);
|
|
829
|
+
}
|
|
830
|
+
else {
|
|
831
|
+
randomBytes = new Uint8Array(32);
|
|
832
|
+
crypto.getRandomValues(randomBytes);
|
|
833
|
+
privKeyBytes = new Uint8Array(randomBytes);
|
|
834
|
+
}
|
|
835
|
+
// Normalize private key for X25519
|
|
836
|
+
privKeyBytes[0] &= 248; // Clear bottom 3 bits
|
|
837
|
+
privKeyBytes[31] &= 127; // Clear top bit
|
|
838
|
+
privKeyBytes[31] |= 64; // Set second highest bit
|
|
839
|
+
pubKeyBytes = x25519Noble.getPublicKey(privKeyBytes);
|
|
840
|
+
return [2 /*return*/, {
|
|
841
|
+
pubKey: pubKeyBytes.buffer.slice(pubKeyBytes.byteOffset, pubKeyBytes.byteOffset + pubKeyBytes.byteLength),
|
|
842
|
+
privKey: privKeyBytes.buffer.slice(),
|
|
843
|
+
}];
|
|
844
|
+
}
|
|
845
|
+
return [4 /*yield*/, generateSignalKeyPair()];
|
|
846
|
+
case 1:
|
|
847
|
+
keyPair = _a.sent();
|
|
848
|
+
return [4 /*yield*/, exportSignalPublicKey(keyPair.publicKey)];
|
|
849
|
+
case 2:
|
|
850
|
+
pubKey = _a.sent();
|
|
851
|
+
return [4 /*yield*/, exportSignalPrivateKey(keyPair.privateKey)];
|
|
852
|
+
case 3:
|
|
853
|
+
privKeyExported = _a.sent();
|
|
854
|
+
return [2 /*return*/, {
|
|
855
|
+
pubKey: pubKey,
|
|
856
|
+
privKey: privKeyExported,
|
|
857
|
+
}];
|
|
858
|
+
}
|
|
859
|
+
});
|
|
860
|
+
}); };
|
|
861
|
+
/**
|
|
862
|
+
* Perform ECDH in legacy ArrayBuffer format for compatibility with Signal implementations
|
|
863
|
+
* Uses @noble/curves if available, otherwise uses Web Crypto API
|
|
864
|
+
*/
|
|
865
|
+
export var performSignalDHLegacy = function (pubKey, privKey) { return __awaiter(void 0, void 0, void 0, function () {
|
|
866
|
+
var pubKeyBytes, privKeyBytes, normalizedPrivKey, sharedSecret, publicKeyCrypto, privateKeyCrypto;
|
|
867
|
+
return __generator(this, function (_a) {
|
|
868
|
+
switch (_a.label) {
|
|
869
|
+
case 0:
|
|
870
|
+
if (x25519Noble) {
|
|
871
|
+
pubKeyBytes = new Uint8Array(pubKey);
|
|
872
|
+
privKeyBytes = new Uint8Array(privKey);
|
|
873
|
+
normalizedPrivKey = new Uint8Array(privKeyBytes);
|
|
874
|
+
normalizedPrivKey[0] &= 248;
|
|
875
|
+
normalizedPrivKey[31] &= 127;
|
|
876
|
+
normalizedPrivKey[31] |= 64;
|
|
877
|
+
sharedSecret = x25519Noble.getSharedSecret(normalizedPrivKey, pubKeyBytes);
|
|
878
|
+
// Convert to ArrayBuffer
|
|
879
|
+
return [2 /*return*/, sharedSecret.buffer.slice(sharedSecret.byteOffset, sharedSecret.byteOffset + sharedSecret.byteLength)];
|
|
880
|
+
}
|
|
881
|
+
return [4 /*yield*/, importSignalPublicKey(pubKey)];
|
|
882
|
+
case 1:
|
|
883
|
+
publicKeyCrypto = _a.sent();
|
|
884
|
+
return [4 /*yield*/, importSignalPrivateKey(privKey)];
|
|
885
|
+
case 2:
|
|
886
|
+
privateKeyCrypto = _a.sent();
|
|
887
|
+
return [4 /*yield*/, performSignalDH(privateKeyCrypto, publicKeyCrypto)];
|
|
888
|
+
case 3: return [2 /*return*/, _a.sent()];
|
|
889
|
+
}
|
|
890
|
+
});
|
|
891
|
+
}); };
|
|
892
|
+
/**
|
|
893
|
+
* Sign data with Ed25519 in legacy ArrayBuffer format for compatibility with Signal implementations
|
|
894
|
+
* Uses @noble/curves if available, otherwise uses Web Crypto API
|
|
895
|
+
*/
|
|
896
|
+
export var signSignalDataLegacy = function (privKey, message) { return __awaiter(void 0, void 0, void 0, function () {
|
|
897
|
+
var privKeyBytes, messageBytes, signature, keyPair;
|
|
898
|
+
return __generator(this, function (_a) {
|
|
899
|
+
switch (_a.label) {
|
|
900
|
+
case 0:
|
|
901
|
+
if (ed25519Noble) {
|
|
902
|
+
privKeyBytes = new Uint8Array(privKey);
|
|
903
|
+
messageBytes = new Uint8Array(message);
|
|
904
|
+
signature = ed25519Noble.sign(messageBytes, privKeyBytes);
|
|
905
|
+
// Convert to ArrayBuffer
|
|
906
|
+
return [2 /*return*/, signature.buffer.slice(signature.byteOffset, signature.byteOffset + signature.byteLength)];
|
|
907
|
+
}
|
|
908
|
+
return [4 /*yield*/, generateSignalSigningKeyPair()];
|
|
909
|
+
case 1:
|
|
910
|
+
keyPair = _a.sent();
|
|
911
|
+
return [4 /*yield*/, signSignalData(keyPair.privateKey, message)];
|
|
912
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
913
|
+
}
|
|
914
|
+
});
|
|
915
|
+
}); };
|
|
916
|
+
/**
|
|
917
|
+
* Verify Ed25519 signature in legacy ArrayBuffer format for compatibility with Signal implementations
|
|
918
|
+
* Uses @noble/curves if available, otherwise uses Web Crypto API
|
|
919
|
+
*/
|
|
920
|
+
export var verifySignalSignatureLegacy = function (pubKey, msg, sig) { return __awaiter(void 0, void 0, void 0, function () {
|
|
921
|
+
var pubKeyBytes, messageBytes, signatureBytes, publicKey;
|
|
922
|
+
return __generator(this, function (_a) {
|
|
923
|
+
switch (_a.label) {
|
|
924
|
+
case 0:
|
|
925
|
+
if (ed25519Noble) {
|
|
926
|
+
pubKeyBytes = new Uint8Array(pubKey);
|
|
927
|
+
messageBytes = new Uint8Array(msg);
|
|
928
|
+
signatureBytes = new Uint8Array(sig);
|
|
929
|
+
try {
|
|
930
|
+
return [2 /*return*/, ed25519Noble.verify(signatureBytes, messageBytes, pubKeyBytes)];
|
|
931
|
+
}
|
|
932
|
+
catch (e) {
|
|
933
|
+
return [2 /*return*/, false];
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
return [4 /*yield*/, importSignalSigningPublicKey(pubKey)];
|
|
937
|
+
case 1:
|
|
938
|
+
publicKey = _a.sent();
|
|
939
|
+
return [4 /*yield*/, verifySignalSignature(publicKey, sig, msg)];
|
|
940
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
941
|
+
}
|
|
942
|
+
});
|
|
943
|
+
}); };
|