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.
Files changed (233) hide show
  1. package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed448_js.shogun-core.js +93 -341
  2. package/dist/browser/defaultVendors-node_modules_noble_curves_esm_ed448_js.shogun-core.js.map +1 -1
  3. package/dist/browser/shogun-core.js +138979 -146789
  4. package/dist/browser/shogun-core.js.map +1 -1
  5. package/dist/{core.js → src/core.js} +167 -107
  6. package/dist/src/crypto/asymmetric.js +168 -0
  7. package/dist/src/crypto/double-ratchet.js +908 -0
  8. package/dist/src/crypto/file-encryption.js +352 -0
  9. package/dist/src/crypto/hashing.js +160 -0
  10. package/dist/src/crypto/index.js +18 -0
  11. package/dist/{crypto → src/crypto}/mls-codec.js +24 -34
  12. package/dist/src/crypto/mls.js +734 -0
  13. package/dist/src/crypto/pgp.js +619 -0
  14. package/dist/{crypto → src/crypto}/random-generation.js +125 -103
  15. package/dist/src/crypto/sframe.js +466 -0
  16. package/dist/src/crypto/signal-protocol.js +943 -0
  17. package/dist/src/crypto/symmetric.js +165 -0
  18. package/dist/src/crypto/utils.js +220 -0
  19. package/dist/src/examples/auth-test.js +535 -0
  20. package/dist/src/examples/crypto-identity-example.js +294 -0
  21. package/dist/src/examples/crypto-working-test.js +149 -0
  22. package/dist/src/examples/double-ratchet-test.js +240 -0
  23. package/dist/src/examples/mls-3-member-test.js +183 -0
  24. package/dist/src/examples/mls-multi-member.js +439 -0
  25. package/dist/src/examples/mls-sframe-test.js +491 -0
  26. package/dist/src/examples/mls-simple-test.js +122 -0
  27. package/dist/src/examples/pgp-example.js +354 -0
  28. package/dist/src/examples/random-generation-test.js +191 -0
  29. package/dist/src/examples/shogun-core-example.js +204 -0
  30. package/dist/src/examples/signal-protocol-test.js +82 -0
  31. package/dist/src/examples/zkproof-credentials-example.js +357 -0
  32. package/dist/src/examples/zkproof-example.js +357 -0
  33. package/dist/src/gundb/crypto.js +420 -0
  34. package/dist/src/gundb/db.js +728 -0
  35. package/dist/src/gundb/derive.js +327 -0
  36. package/dist/src/gundb/errors.js +115 -0
  37. package/dist/src/gundb/gun-es.js +8 -0
  38. package/dist/src/gundb/index.js +5 -0
  39. package/dist/{gundb → src/gundb}/rxjs.js +147 -111
  40. package/dist/{gundb → src/gundb}/types.js +1 -2
  41. package/dist/src/index.js +19 -0
  42. package/dist/src/interfaces/events.js +57 -0
  43. package/dist/{interfaces → src/interfaces}/shogun.js +4 -7
  44. package/dist/src/managers/AuthManager.js +301 -0
  45. package/dist/src/managers/CoreInitializer.js +304 -0
  46. package/dist/src/managers/CryptoIdentityManager.js +230 -0
  47. package/dist/{managers → src/managers}/EventManager.js +19 -21
  48. package/dist/{managers → src/managers}/PluginManager.js +123 -89
  49. package/dist/src/plugins/base.js +90 -0
  50. package/dist/src/plugins/index.js +17 -0
  51. package/dist/src/plugins/nostr/index.js +4 -0
  52. package/dist/src/plugins/nostr/nostrConnector.js +539 -0
  53. package/dist/src/plugins/nostr/nostrConnectorPlugin.js +663 -0
  54. package/dist/src/plugins/nostr/nostrSigner.js +414 -0
  55. package/dist/src/plugins/smartwallet/index.js +2 -0
  56. package/dist/src/plugins/smartwallet/smartWalletPlugin.js +824 -0
  57. package/dist/src/plugins/web3/index.js +4 -0
  58. package/dist/src/plugins/web3/types.js +1 -0
  59. package/dist/src/plugins/web3/web3Connector.js +738 -0
  60. package/dist/src/plugins/web3/web3ConnectorPlugin.js +639 -0
  61. package/dist/src/plugins/web3/web3Signer.js +432 -0
  62. package/dist/src/plugins/webauthn/index.js +3 -0
  63. package/dist/{plugins → src/plugins}/webauthn/types.js +2 -5
  64. package/dist/src/plugins/webauthn/webauthn.js +647 -0
  65. package/dist/src/plugins/webauthn/webauthnPlugin.js +689 -0
  66. package/dist/src/plugins/webauthn/webauthnSigner.js +419 -0
  67. package/dist/{plugins → src/plugins}/zkproof/index.js +3 -10
  68. package/dist/src/plugins/zkproof/types.js +1 -0
  69. package/dist/src/plugins/zkproof/zkCredentials.js +287 -0
  70. package/dist/src/plugins/zkproof/zkProofConnector.js +267 -0
  71. package/dist/src/plugins/zkproof/zkProofPlugin.js +405 -0
  72. package/dist/src/storage/storage.js +189 -0
  73. package/dist/src/utils/errorHandler.js +339 -0
  74. package/dist/{utils → src/utils}/eventEmitter.js +26 -26
  75. package/dist/{utils → src/utils}/seedPhrase.js +23 -32
  76. package/dist/{utils → src/utils}/validation.js +14 -21
  77. package/dist/tsconfig.tsbuildinfo +1 -0
  78. package/dist/types/{crypto → src/crypto}/double-ratchet.d.ts +1 -1
  79. package/dist/types/{crypto → src/crypto}/signal-protocol.d.ts +25 -0
  80. package/dist/types/{crypto → src/crypto}/types.d.ts +3 -1
  81. package/dist/types/src/examples/crypto-working-test.d.ts +1 -0
  82. package/dist/types/src/examples/double-ratchet-test.d.ts +1 -0
  83. package/dist/types/src/examples/mls-sframe-test.d.ts +1 -0
  84. package/dist/types/src/examples/random-generation-test.d.ts +1 -0
  85. package/dist/types/src/examples/signal-protocol-test.d.ts +1 -0
  86. package/dist/types/{gundb → src/gundb}/db.d.ts +14 -1
  87. package/dist/types/src/gundb/gun-es.d.ts +8 -0
  88. package/dist/types/src/gundb/min.d.ts +3 -0
  89. package/dist/types/{index.d.ts → src/index.d.ts} +1 -0
  90. package/package.json +14 -11
  91. package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_curve_js-node_modules_noble_curves_esm_-1ce4ed.shogun-core.js +0 -1651
  92. package/dist/browser/defaultVendors-node_modules_noble_curves_esm_abstract_curve_js-node_modules_noble_curves_esm_-1ce4ed.shogun-core.js.map +0 -1
  93. package/dist/browser/defaultVendors-node_modules_noble_curves_esm_nist_js.shogun-core.js +0 -1608
  94. package/dist/browser/defaultVendors-node_modules_noble_curves_esm_nist_js.shogun-core.js.map +0 -1
  95. package/dist/crypto/asymmetric.js +0 -99
  96. package/dist/crypto/double-ratchet.js +0 -392
  97. package/dist/crypto/file-encryption.js +0 -213
  98. package/dist/crypto/hashing.js +0 -87
  99. package/dist/crypto/index.js +0 -34
  100. package/dist/crypto/mls.js +0 -569
  101. package/dist/crypto/pgp.js +0 -390
  102. package/dist/crypto/sframe.js +0 -352
  103. package/dist/crypto/signal-protocol.js +0 -456
  104. package/dist/crypto/symmetric.js +0 -91
  105. package/dist/crypto/types.js +0 -2
  106. package/dist/crypto/utils.js +0 -140
  107. package/dist/examples/auth-test.js +0 -453
  108. package/dist/examples/crypto-identity-example.js +0 -196
  109. package/dist/examples/crypto-working-test.js +0 -83
  110. package/dist/examples/double-ratchet-test.js +0 -155
  111. package/dist/examples/mls-3-member-test.js +0 -97
  112. package/dist/examples/mls-multi-member.js +0 -153
  113. package/dist/examples/mls-sframe-test.js +0 -307
  114. package/dist/examples/mls-simple-test.js +0 -58
  115. package/dist/examples/pgp-example.js +0 -200
  116. package/dist/examples/random-generation-test.js +0 -151
  117. package/dist/examples/shogun-core-example.js +0 -150
  118. package/dist/examples/signal-protocol-test.js +0 -38
  119. package/dist/examples/zkproof-credentials-example.js +0 -217
  120. package/dist/examples/zkproof-example.js +0 -242
  121. package/dist/gundb/crypto.js +0 -306
  122. package/dist/gundb/db.js +0 -485
  123. package/dist/gundb/derive.js +0 -232
  124. package/dist/gundb/errors.js +0 -76
  125. package/dist/gundb/gun-es.js +0 -12
  126. package/dist/gundb/index.js +0 -21
  127. package/dist/gundb/min.js +0 -10
  128. package/dist/index.esm.js +0 -22
  129. package/dist/index.js +0 -47
  130. package/dist/interfaces/common.js +0 -2
  131. package/dist/interfaces/events.js +0 -40
  132. package/dist/interfaces/plugin.js +0 -2
  133. package/dist/managers/AuthManager.js +0 -226
  134. package/dist/managers/CoreInitializer.js +0 -250
  135. package/dist/managers/CryptoIdentityManager.js +0 -138
  136. package/dist/plugins/base.js +0 -50
  137. package/dist/plugins/index.js +0 -32
  138. package/dist/plugins/nostr/index.js +0 -20
  139. package/dist/plugins/nostr/nostrConnector.js +0 -419
  140. package/dist/plugins/nostr/nostrConnectorPlugin.js +0 -453
  141. package/dist/plugins/nostr/nostrSigner.js +0 -319
  142. package/dist/plugins/nostr/types.js +0 -2
  143. package/dist/plugins/smartwallet/index.js +0 -18
  144. package/dist/plugins/smartwallet/smartWalletPlugin.js +0 -511
  145. package/dist/plugins/smartwallet/types.js +0 -2
  146. package/dist/plugins/web3/index.js +0 -20
  147. package/dist/plugins/web3/types.js +0 -2
  148. package/dist/plugins/web3/web3Connector.js +0 -533
  149. package/dist/plugins/web3/web3ConnectorPlugin.js +0 -455
  150. package/dist/plugins/web3/web3Signer.js +0 -314
  151. package/dist/plugins/webauthn/index.js +0 -19
  152. package/dist/plugins/webauthn/webauthn.js +0 -496
  153. package/dist/plugins/webauthn/webauthnPlugin.js +0 -490
  154. package/dist/plugins/webauthn/webauthnSigner.js +0 -310
  155. package/dist/plugins/zkproof/types.js +0 -2
  156. package/dist/plugins/zkproof/zkCredentials.js +0 -216
  157. package/dist/plugins/zkproof/zkProofConnector.js +0 -198
  158. package/dist/plugins/zkproof/zkProofPlugin.js +0 -272
  159. package/dist/storage/storage.js +0 -145
  160. package/dist/types/gundb/gun-es.d.ts +0 -8
  161. package/dist/utils/errorHandler.js +0 -246
  162. /package/dist/{types/examples/crypto-working-test.d.ts → src/crypto/types.js} +0 -0
  163. /package/dist/{types/gundb/min.d.ts → src/gundb/min.js} +0 -0
  164. /package/dist/{types/examples/double-ratchet-test.d.ts → src/interfaces/common.js} +0 -0
  165. /package/dist/{types/examples/mls-sframe-test.d.ts → src/interfaces/plugin.js} +0 -0
  166. /package/dist/{types/examples/random-generation-test.d.ts → src/plugins/nostr/types.js} +0 -0
  167. /package/dist/{types/examples/signal-protocol-test.d.ts → src/plugins/smartwallet/types.js} +0 -0
  168. /package/dist/types/{core.d.ts → src/core.d.ts} +0 -0
  169. /package/dist/types/{crypto → src/crypto}/asymmetric.d.ts +0 -0
  170. /package/dist/types/{crypto → src/crypto}/file-encryption.d.ts +0 -0
  171. /package/dist/types/{crypto → src/crypto}/hashing.d.ts +0 -0
  172. /package/dist/types/{crypto → src/crypto}/index.d.ts +0 -0
  173. /package/dist/types/{crypto → src/crypto}/mls-codec.d.ts +0 -0
  174. /package/dist/types/{crypto → src/crypto}/mls.d.ts +0 -0
  175. /package/dist/types/{crypto → src/crypto}/pgp.d.ts +0 -0
  176. /package/dist/types/{crypto → src/crypto}/random-generation.d.ts +0 -0
  177. /package/dist/types/{crypto → src/crypto}/sframe.d.ts +0 -0
  178. /package/dist/types/{crypto → src/crypto}/symmetric.d.ts +0 -0
  179. /package/dist/types/{crypto → src/crypto}/utils.d.ts +0 -0
  180. /package/dist/types/{examples → src/examples}/auth-test.d.ts +0 -0
  181. /package/dist/types/{examples → src/examples}/crypto-identity-example.d.ts +0 -0
  182. /package/dist/types/{examples → src/examples}/mls-3-member-test.d.ts +0 -0
  183. /package/dist/types/{examples → src/examples}/mls-multi-member.d.ts +0 -0
  184. /package/dist/types/{examples → src/examples}/mls-simple-test.d.ts +0 -0
  185. /package/dist/types/{examples → src/examples}/pgp-example.d.ts +0 -0
  186. /package/dist/types/{examples → src/examples}/shogun-core-example.d.ts +0 -0
  187. /package/dist/types/{examples → src/examples}/zkproof-credentials-example.d.ts +0 -0
  188. /package/dist/types/{examples → src/examples}/zkproof-example.d.ts +0 -0
  189. /package/dist/types/{gundb → src/gundb}/crypto.d.ts +0 -0
  190. /package/dist/types/{gundb → src/gundb}/derive.d.ts +0 -0
  191. /package/dist/types/{gundb → src/gundb}/errors.d.ts +0 -0
  192. /package/dist/types/{gundb → src/gundb}/index.d.ts +0 -0
  193. /package/dist/types/{gundb → src/gundb}/rxjs.d.ts +0 -0
  194. /package/dist/types/{gundb → src/gundb}/types.d.ts +0 -0
  195. /package/dist/types/{interfaces → src/interfaces}/common.d.ts +0 -0
  196. /package/dist/types/{interfaces → src/interfaces}/events.d.ts +0 -0
  197. /package/dist/types/{interfaces → src/interfaces}/plugin.d.ts +0 -0
  198. /package/dist/types/{interfaces → src/interfaces}/shogun.d.ts +0 -0
  199. /package/dist/types/{managers → src/managers}/AuthManager.d.ts +0 -0
  200. /package/dist/types/{managers → src/managers}/CoreInitializer.d.ts +0 -0
  201. /package/dist/types/{managers → src/managers}/CryptoIdentityManager.d.ts +0 -0
  202. /package/dist/types/{managers → src/managers}/EventManager.d.ts +0 -0
  203. /package/dist/types/{managers → src/managers}/PluginManager.d.ts +0 -0
  204. /package/dist/types/{plugins → src/plugins}/base.d.ts +0 -0
  205. /package/dist/types/{plugins → src/plugins}/index.d.ts +0 -0
  206. /package/dist/types/{plugins → src/plugins}/nostr/index.d.ts +0 -0
  207. /package/dist/types/{plugins → src/plugins}/nostr/nostrConnector.d.ts +0 -0
  208. /package/dist/types/{plugins → src/plugins}/nostr/nostrConnectorPlugin.d.ts +0 -0
  209. /package/dist/types/{plugins → src/plugins}/nostr/nostrSigner.d.ts +0 -0
  210. /package/dist/types/{plugins → src/plugins}/nostr/types.d.ts +0 -0
  211. /package/dist/types/{plugins → src/plugins}/smartwallet/index.d.ts +0 -0
  212. /package/dist/types/{plugins → src/plugins}/smartwallet/smartWalletPlugin.d.ts +0 -0
  213. /package/dist/types/{plugins → src/plugins}/smartwallet/types.d.ts +0 -0
  214. /package/dist/types/{plugins → src/plugins}/web3/index.d.ts +0 -0
  215. /package/dist/types/{plugins → src/plugins}/web3/types.d.ts +0 -0
  216. /package/dist/types/{plugins → src/plugins}/web3/web3Connector.d.ts +0 -0
  217. /package/dist/types/{plugins → src/plugins}/web3/web3ConnectorPlugin.d.ts +0 -0
  218. /package/dist/types/{plugins → src/plugins}/web3/web3Signer.d.ts +0 -0
  219. /package/dist/types/{plugins → src/plugins}/webauthn/index.d.ts +0 -0
  220. /package/dist/types/{plugins → src/plugins}/webauthn/types.d.ts +0 -0
  221. /package/dist/types/{plugins → src/plugins}/webauthn/webauthn.d.ts +0 -0
  222. /package/dist/types/{plugins → src/plugins}/webauthn/webauthnPlugin.d.ts +0 -0
  223. /package/dist/types/{plugins → src/plugins}/webauthn/webauthnSigner.d.ts +0 -0
  224. /package/dist/types/{plugins → src/plugins}/zkproof/index.d.ts +0 -0
  225. /package/dist/types/{plugins → src/plugins}/zkproof/types.d.ts +0 -0
  226. /package/dist/types/{plugins → src/plugins}/zkproof/zkCredentials.d.ts +0 -0
  227. /package/dist/types/{plugins → src/plugins}/zkproof/zkProofConnector.d.ts +0 -0
  228. /package/dist/types/{plugins → src/plugins}/zkproof/zkProofPlugin.d.ts +0 -0
  229. /package/dist/types/{storage → src/storage}/storage.d.ts +0 -0
  230. /package/dist/types/{utils → src/utils}/errorHandler.d.ts +0 -0
  231. /package/dist/types/{utils → src/utils}/eventEmitter.d.ts +0 -0
  232. /package/dist/types/{utils → src/utils}/seedPhrase.d.ts +0 -0
  233. /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
+ }); };