@neykoor/libsignal-node 1.0.4 → 1.0.6

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 (85) hide show
  1. package/lib/base-key-type.d.ts +5 -0
  2. package/lib/base-key-type.d.ts.map +1 -0
  3. package/lib/base-key-type.js +6 -0
  4. package/lib/base-key-type.js.map +1 -0
  5. package/lib/chain-type.d.ts +5 -0
  6. package/lib/chain-type.d.ts.map +1 -0
  7. package/lib/chain-type.js +6 -0
  8. package/lib/chain-type.js.map +1 -0
  9. package/lib/crypto.d.ts +7 -0
  10. package/lib/crypto.d.ts.map +1 -0
  11. package/lib/crypto.js +74 -0
  12. package/lib/crypto.js.map +1 -0
  13. package/lib/curve.d.ts +10 -0
  14. package/lib/curve.d.ts.map +1 -0
  15. package/lib/curve.js +113 -0
  16. package/lib/curve.js.map +1 -0
  17. package/lib/direction.d.ts +5 -0
  18. package/lib/direction.d.ts.map +1 -0
  19. package/lib/direction.js +6 -0
  20. package/lib/direction.js.map +1 -0
  21. package/lib/errors.d.ts +17 -0
  22. package/lib/errors.d.ts.map +1 -0
  23. package/lib/errors.js +29 -0
  24. package/lib/errors.js.map +1 -0
  25. package/lib/index.d.ts +21 -0
  26. package/lib/index.d.ts.map +1 -0
  27. package/lib/index.js +17 -0
  28. package/lib/index.js.map +1 -0
  29. package/lib/keyhelper.d.ts +19 -0
  30. package/lib/keyhelper.d.ts.map +1 -0
  31. package/lib/keyhelper.js +53 -0
  32. package/lib/keyhelper.js.map +1 -0
  33. package/lib/logger.d.ts +7 -0
  34. package/lib/logger.d.ts.map +1 -0
  35. package/lib/logger.js +12 -0
  36. package/lib/logger.js.map +1 -0
  37. package/lib/memory-storage.d.ts +26 -0
  38. package/lib/memory-storage.d.ts.map +1 -0
  39. package/lib/memory-storage.js +69 -0
  40. package/lib/memory-storage.js.map +1 -0
  41. package/lib/numeric-fingerprint.d.ts +6 -0
  42. package/lib/numeric-fingerprint.d.ts.map +1 -0
  43. package/lib/numeric-fingerprint.js +55 -0
  44. package/lib/numeric-fingerprint.js.map +1 -0
  45. package/lib/prekey-bundle-validator.d.ts +3 -0
  46. package/lib/prekey-bundle-validator.d.ts.map +1 -0
  47. package/lib/prekey-bundle-validator.js +45 -0
  48. package/lib/prekey-bundle-validator.js.map +1 -0
  49. package/lib/protobufs.d.ts +6 -0
  50. package/lib/protobufs.d.ts.map +1 -0
  51. package/lib/protobufs.js +4 -0
  52. package/lib/protobufs.js.map +1 -0
  53. package/lib/protocol-address.d.ts +9 -0
  54. package/lib/protocol-address.d.ts.map +1 -0
  55. package/lib/protocol-address.js +40 -0
  56. package/lib/protocol-address.js.map +1 -0
  57. package/lib/queue-job.d.ts +4 -0
  58. package/lib/queue-job.d.ts.map +1 -0
  59. package/lib/queue-job.js +43 -0
  60. package/lib/queue-job.js.map +1 -0
  61. package/lib/session-builder.d.ts +13 -0
  62. package/lib/session-builder.d.ts.map +1 -0
  63. package/lib/session-builder.js +154 -0
  64. package/lib/session-builder.js.map +1 -0
  65. package/lib/session-cipher.d.ts +30 -0
  66. package/lib/session-cipher.d.ts.map +1 -0
  67. package/lib/session-cipher.js +327 -0
  68. package/lib/session-cipher.js.map +1 -0
  69. package/lib/session-record.d.ts +113 -0
  70. package/lib/session-record.d.ts.map +1 -0
  71. package/lib/session-record.js +309 -0
  72. package/lib/session-record.js.map +1 -0
  73. package/lib/types.d.ts +43 -0
  74. package/lib/types.d.ts.map +1 -0
  75. package/lib/types.js +2 -0
  76. package/lib/types.js.map +1 -0
  77. package/lib/util.d.ts +3 -0
  78. package/lib/util.d.ts.map +1 -0
  79. package/lib/util.js +11 -0
  80. package/lib/util.js.map +1 -0
  81. package/lib/whisper-text-protocol.d.ts +86 -0
  82. package/lib/whisper-text-protocol.d.ts.map +1 -0
  83. package/lib/whisper-text-protocol.js +523 -0
  84. package/lib/whisper-text-protocol.js.map +1 -0
  85. package/package.json +3 -1
@@ -0,0 +1,5 @@
1
+ export declare enum BaseKeyType {
2
+ OURS = 1,
3
+ THEIRS = 2
4
+ }
5
+ //# sourceMappingURL=base-key-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-key-type.d.ts","sourceRoot":"","sources":["../src/base-key-type.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,IAAI,IAAI;IACR,MAAM,IAAI;CACX"}
@@ -0,0 +1,6 @@
1
+ export var BaseKeyType;
2
+ (function (BaseKeyType) {
3
+ BaseKeyType[BaseKeyType["OURS"] = 1] = "OURS";
4
+ BaseKeyType[BaseKeyType["THEIRS"] = 2] = "THEIRS";
5
+ })(BaseKeyType || (BaseKeyType = {}));
6
+ //# sourceMappingURL=base-key-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-key-type.js","sourceRoot":"","sources":["../src/base-key-type.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,6CAAQ,CAAA;IACR,iDAAU,CAAA;AACZ,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB"}
@@ -0,0 +1,5 @@
1
+ export declare enum ChainType {
2
+ SENDING = 1,
3
+ RECEIVING = 2
4
+ }
5
+ //# sourceMappingURL=chain-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-type.d.ts","sourceRoot":"","sources":["../src/chain-type.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,OAAO,IAAI;IACX,SAAS,IAAI;CACd"}
@@ -0,0 +1,6 @@
1
+ export var ChainType;
2
+ (function (ChainType) {
3
+ ChainType[ChainType["SENDING"] = 1] = "SENDING";
4
+ ChainType[ChainType["RECEIVING"] = 2] = "RECEIVING";
5
+ })(ChainType || (ChainType = {}));
6
+ //# sourceMappingURL=chain-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-type.js","sourceRoot":"","sources":["../src/chain-type.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,+CAAW,CAAA;IACX,mDAAa,CAAA;AACf,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB"}
@@ -0,0 +1,7 @@
1
+ export declare function encrypt(key: Uint8Array, data: Uint8Array, iv: Uint8Array): Buffer;
2
+ export declare function decrypt(key: Uint8Array, data: Uint8Array, iv: Uint8Array): Buffer;
3
+ export declare function calculateMAC(key: Uint8Array, data: Uint8Array): Buffer;
4
+ export declare function hash(data: Uint8Array): Buffer;
5
+ export declare function deriveSecrets(input: Uint8Array, salt: Uint8Array, info: Uint8Array, chunks?: number): Buffer[];
6
+ export declare function verifyMAC(data: Uint8Array, key: Uint8Array, mac: Uint8Array, length: number): void;
7
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAUA,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,MAAM,CAOjF;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,MAAM,CAOjF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAOtE;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAM7C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqC9G;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAUlG"}
package/lib/crypto.js ADDED
@@ -0,0 +1,74 @@
1
+ import * as nodeCrypto from "crypto";
2
+ function assertBuffer(value) {
3
+ if (!(value instanceof Uint8Array)) {
4
+ throw TypeError(`Expected Uint8Array instead of: ${value?.constructor?.name}`);
5
+ }
6
+ return value;
7
+ }
8
+ export function encrypt(key, data, iv) {
9
+ assertBuffer(key);
10
+ assertBuffer(data);
11
+ assertBuffer(iv);
12
+ const cipher = nodeCrypto.createCipheriv("aes-256-cbc", key, iv);
13
+ return Buffer.concat([cipher.update(data), cipher.final()]);
14
+ }
15
+ export function decrypt(key, data, iv) {
16
+ assertBuffer(key);
17
+ assertBuffer(data);
18
+ assertBuffer(iv);
19
+ const decipher = nodeCrypto.createDecipheriv("aes-256-cbc", key, iv);
20
+ return Buffer.concat([decipher.update(data), decipher.final()]);
21
+ }
22
+ export function calculateMAC(key, data) {
23
+ assertBuffer(key);
24
+ assertBuffer(data);
25
+ const hmac = nodeCrypto.createHmac("sha256", key);
26
+ hmac.update(data);
27
+ return Buffer.from(hmac.digest());
28
+ }
29
+ export function hash(data) {
30
+ assertBuffer(data);
31
+ const sha512 = nodeCrypto.createHash("sha512");
32
+ sha512.update(data);
33
+ return sha512.digest();
34
+ }
35
+ export function deriveSecrets(input, salt, info, chunks) {
36
+ assertBuffer(input);
37
+ assertBuffer(salt);
38
+ assertBuffer(info);
39
+ if (salt.byteLength !== 32) {
40
+ throw new Error("Got salt of incorrect length");
41
+ }
42
+ const count = chunks || 3;
43
+ if (count < 1 || count > 3) {
44
+ throw new Error("chunks must be between 1 and 3");
45
+ }
46
+ const PRK = calculateMAC(salt, input);
47
+ const infoArray = new Uint8Array(info.byteLength + 1 + 32);
48
+ infoArray.set(info, 32);
49
+ infoArray[infoArray.length - 1] = 1;
50
+ const signed = [calculateMAC(PRK, Buffer.from(infoArray.slice(32)))];
51
+ if (count > 1) {
52
+ infoArray.set(signed[signed.length - 1]);
53
+ infoArray[infoArray.length - 1] = 2;
54
+ signed.push(calculateMAC(PRK, Buffer.from(infoArray)));
55
+ }
56
+ if (count > 2) {
57
+ infoArray.set(signed[signed.length - 1]);
58
+ infoArray[infoArray.length - 1] = 3;
59
+ signed.push(calculateMAC(PRK, Buffer.from(infoArray)));
60
+ }
61
+ PRK.fill(0);
62
+ infoArray.fill(0);
63
+ return signed;
64
+ }
65
+ export function verifyMAC(data, key, mac, length) {
66
+ const calculatedMac = calculateMAC(key, data).slice(0, length);
67
+ if (mac.length !== length || calculatedMac.length !== length) {
68
+ throw new Error("Bad MAC length");
69
+ }
70
+ if (!nodeCrypto.timingSafeEqual(mac, calculatedMac)) {
71
+ throw new Error("Bad MAC");
72
+ }
73
+ }
74
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAA;AAEpC,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,SAAS,CAAC,mCAAoC,KAA2B,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IACvG,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAe,EAAE,IAAgB,EAAE,EAAc;IACvE,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,YAAY,CAAC,IAAI,CAAC,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,CAAA;IAEhB,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAChE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAe,EAAE,IAAgB,EAAE,EAAc;IACvE,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,YAAY,CAAC,IAAI,CAAC,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,CAAA;IAEhB,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IACpE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAe,EAAE,IAAgB;IAC5D,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,YAAY,CAAC,IAAI,CAAC,CAAA;IAElB,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACjB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAgB;IACnC,YAAY,CAAC,IAAI,CAAC,CAAA;IAElB,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnB,OAAO,MAAM,CAAC,MAAM,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAiB,EAAE,IAAgB,EAAE,IAAgB,EAAE,MAAe;IAClG,YAAY,CAAC,KAAK,CAAC,CAAA;IACnB,YAAY,CAAC,IAAI,CAAC,CAAA;IAClB,YAAY,CAAC,IAAI,CAAC,CAAA;IAElB,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAA;IACzB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1D,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACvB,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;IAEnC,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAA;QACzC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAA;QACzC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACX,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAEjB,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,GAAe,EAAE,GAAe,EAAE,MAAc;IAC1F,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,aAAa,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC"}
package/lib/curve.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export interface KeyPair {
2
+ pubKey: Buffer;
3
+ privKey: Buffer;
4
+ }
5
+ export declare function getPublicFromPrivateKey(privKey: Uint8Array): Buffer;
6
+ export declare function generateKeyPair(): KeyPair;
7
+ export declare function calculateAgreement(pubKeyInput: Uint8Array, privKey: Uint8Array): Buffer;
8
+ export declare function calculateSignature(privKey: Uint8Array, message: Uint8Array): Buffer;
9
+ export declare function verifySignature(pubKeyInput: Uint8Array, msg: Uint8Array, sig: Uint8Array): boolean;
10
+ //# sourceMappingURL=curve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curve.d.ts","sourceRoot":"","sources":["../src/curve.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AA+CD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAInE;AAED,wBAAgB,eAAe,IAAI,OAAO,CAsBzC;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CA4BvF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAQnF;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAgBlG"}
package/lib/curve.js ADDED
@@ -0,0 +1,113 @@
1
+ import * as curveJs from "@neykoor/curve25519-ts";
2
+ import * as nodeCrypto from "crypto";
3
+ import { getLogger } from "./logger.js";
4
+ const PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);
5
+ const PRIVATE_KEY_DER_PREFIX = Buffer.from([48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32]);
6
+ const KEY_BUNDLE_TYPE = Buffer.from([5]);
7
+ function prefixKeyInPublicKey(pubKey) {
8
+ return Buffer.concat([KEY_BUNDLE_TYPE, pubKey]);
9
+ }
10
+ function validatePrivKey(privKey) {
11
+ if (privKey === undefined) {
12
+ throw new Error("Undefined private key");
13
+ }
14
+ if (!(privKey instanceof Uint8Array)) {
15
+ throw new Error(`Invalid private key type: ${privKey.constructor.name}`);
16
+ }
17
+ if (privKey.byteLength !== 32) {
18
+ throw new Error(`Incorrect private key length: ${privKey.byteLength}`);
19
+ }
20
+ }
21
+ function scrubPubKeyFormat(pubKey) {
22
+ if (!(pubKey instanceof Uint8Array)) {
23
+ throw new Error(`Invalid public key type: ${pubKey.constructor.name}`);
24
+ }
25
+ if (pubKey === undefined || ((pubKey.byteLength !== 33 || pubKey[0] !== 5) && pubKey.byteLength !== 32)) {
26
+ throw new Error("Invalid public key");
27
+ }
28
+ if (pubKey.byteLength === 33) {
29
+ return Buffer.from(pubKey.slice(1));
30
+ }
31
+ getLogger().warn("Expected pubkey of length 33, please report the ST and client that generated the pubkey");
32
+ return Buffer.from(pubKey);
33
+ }
34
+ function unclampEd25519PrivateKey(clampedSk) {
35
+ const unclampedSk = new Uint8Array(clampedSk);
36
+ unclampedSk[0] = unclampedSk[0] | 6;
37
+ unclampedSk[31] = unclampedSk[31] | 128;
38
+ unclampedSk[31] = unclampedSk[31] & ~64;
39
+ return unclampedSk;
40
+ }
41
+ export function getPublicFromPrivateKey(privKey) {
42
+ const unclampedPK = unclampEd25519PrivateKey(privKey);
43
+ const keyPair = curveJs.generateKeyPair(unclampedPK);
44
+ return prefixKeyInPublicKey(Buffer.from(keyPair.public));
45
+ }
46
+ export function generateKeyPair() {
47
+ try {
48
+ const { publicKey: publicDerBytes, privateKey: privateDerBytes } = nodeCrypto.generateKeyPairSync("x25519", {
49
+ publicKeyEncoding: { format: "der", type: "spki" },
50
+ privateKeyEncoding: { format: "der", type: "pkcs8" }
51
+ });
52
+ const pubKey = publicDerBytes.slice(PUBLIC_KEY_DER_PREFIX.length, PUBLIC_KEY_DER_PREFIX.length + 32);
53
+ const privKey = privateDerBytes.slice(PRIVATE_KEY_DER_PREFIX.length, PRIVATE_KEY_DER_PREFIX.length + 32);
54
+ return {
55
+ pubKey: prefixKeyInPublicKey(pubKey),
56
+ privKey
57
+ };
58
+ }
59
+ catch (e) {
60
+ getLogger().debug(`x25519 native keygen failed, falling back to curve25519-js: ${e?.message}`);
61
+ const keyPair = curveJs.generateKeyPair(nodeCrypto.randomBytes(32));
62
+ return {
63
+ privKey: Buffer.from(keyPair.private),
64
+ pubKey: prefixKeyInPublicKey(Buffer.from(keyPair.public))
65
+ };
66
+ }
67
+ }
68
+ export function calculateAgreement(pubKeyInput, privKey) {
69
+ const pubKey = scrubPubKeyFormat(pubKeyInput);
70
+ validatePrivKey(privKey);
71
+ if (!pubKey || pubKey.byteLength !== 32) {
72
+ throw new Error("Invalid public key");
73
+ }
74
+ if (typeof nodeCrypto.diffieHellman === "function") {
75
+ const nodePrivateKey = nodeCrypto.createPrivateKey({
76
+ key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, privKey]),
77
+ format: "der",
78
+ type: "pkcs8"
79
+ });
80
+ const nodePublicKey = nodeCrypto.createPublicKey({
81
+ key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, pubKey]),
82
+ format: "der",
83
+ type: "spki"
84
+ });
85
+ return nodeCrypto.diffieHellman({
86
+ privateKey: nodePrivateKey,
87
+ publicKey: nodePublicKey
88
+ });
89
+ }
90
+ const secret = curveJs.sharedKey(privKey, pubKey);
91
+ return Buffer.from(secret);
92
+ }
93
+ export function calculateSignature(privKey, message) {
94
+ validatePrivKey(privKey);
95
+ if (!message) {
96
+ throw new Error("Invalid message");
97
+ }
98
+ return Buffer.from(curveJs.sign(privKey, message));
99
+ }
100
+ export function verifySignature(pubKeyInput, msg, sig) {
101
+ const pubKey = scrubPubKeyFormat(pubKeyInput);
102
+ if (!pubKey || pubKey.byteLength !== 32) {
103
+ throw new Error("Invalid public key");
104
+ }
105
+ if (!msg) {
106
+ throw new Error("Invalid message");
107
+ }
108
+ if (!sig || sig.byteLength !== 64) {
109
+ throw new Error("Invalid signature");
110
+ }
111
+ return curveJs.verify(pubKey, msg, sig);
112
+ }
113
+ //# sourceMappingURL=curve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curve.js","sourceRoot":"","sources":["../src/curve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare enum Direction {
2
+ SENDING = 1,
3
+ RECEIVING = 2
4
+ }
5
+ //# sourceMappingURL=direction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direction.d.ts","sourceRoot":"","sources":["../src/direction.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACnB,OAAO,IAAI;IACX,SAAS,IAAI;CACd"}
@@ -0,0 +1,6 @@
1
+ export var Direction;
2
+ (function (Direction) {
3
+ Direction[Direction["SENDING"] = 1] = "SENDING";
4
+ Direction[Direction["RECEIVING"] = 2] = "RECEIVING";
5
+ })(Direction || (Direction = {}));
6
+ //# sourceMappingURL=direction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direction.js","sourceRoot":"","sources":["../src/direction.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,+CAAW,CAAA;IACX,mDAAa,CAAA;AACf,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB"}
@@ -0,0 +1,17 @@
1
+ export declare class SignalError extends Error {
2
+ }
3
+ export declare class UntrustedIdentityKeyError extends SignalError {
4
+ addr: string;
5
+ identityKey?: Buffer;
6
+ constructor(addr: string, identityKey?: Buffer);
7
+ }
8
+ export declare class SessionError extends SignalError {
9
+ constructor(message?: string);
10
+ }
11
+ export declare class MessageCounterError extends SessionError {
12
+ constructor(message?: string);
13
+ }
14
+ export declare class PreKeyError extends SessionError {
15
+ constructor(message?: string);
16
+ }
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,qBAAa,yBAA0B,SAAQ,WAAW;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;gBAEf,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CAM/C;AAED,qBAAa,YAAa,SAAQ,WAAW;gBAC/B,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAC/B,OAAO,CAAC,EAAE,MAAM;CAI7B"}
package/lib/errors.js ADDED
@@ -0,0 +1,29 @@
1
+ export class SignalError extends Error {
2
+ }
3
+ export class UntrustedIdentityKeyError extends SignalError {
4
+ constructor(addr, identityKey) {
5
+ super(`Untrusted identity key for address: ${addr}`);
6
+ this.name = "UntrustedIdentityKeyError";
7
+ this.addr = addr;
8
+ this.identityKey = identityKey;
9
+ }
10
+ }
11
+ export class SessionError extends SignalError {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "SessionError";
15
+ }
16
+ }
17
+ export class MessageCounterError extends SessionError {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = "MessageCounterError";
21
+ }
22
+ }
23
+ export class PreKeyError extends SessionError {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = "PreKeyError";
27
+ }
28
+ }
29
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG;AAEzC,MAAM,OAAO,yBAA0B,SAAQ,WAAW;IAIxD,YAAY,IAAY,EAAE,WAAoB;QAC5C,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ export * as crypto from "./crypto.js";
2
+ export * as curve from "./curve.js";
3
+ export * as keyhelper from "./keyhelper.js";
4
+ export { ProtocolAddress } from "./protocol-address.js";
5
+ export { SessionBuilder } from "./session-builder.js";
6
+ export { assertValidDeviceKeyBundle } from "./prekey-bundle-validator.js";
7
+ export { SessionCipher } from "./session-cipher.js";
8
+ export { SessionRecord, SessionEntry } from "./session-record.js";
9
+ export { FingerprintGenerator } from "./numeric-fingerprint.js";
10
+ export { BaseKeyType } from "./base-key-type.js";
11
+ export { ChainType } from "./chain-type.js";
12
+ export { Direction } from "./direction.js";
13
+ export { MemorySignalStorage } from "./memory-storage.js";
14
+ export { setLogger, getLogger } from "./logger.js";
15
+ export type { SignalLogger } from "./logger.js";
16
+ export { wipeBuffer, wipeBuffers } from "./util.js";
17
+ export * from "./errors.js";
18
+ export type { KeyPair } from "./curve.js";
19
+ export type { SignalStorage, DeviceKeyBundle, IncomingPreKeyMessage, EncryptedMessage } from "./types.js";
20
+ export type { Chain, ChainKey, CurrentRatchet, IndexInfo, PendingPreKey, SerializedSessionEntry } from "./session-record.js";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAChD,cAAc,UAAU,CAAA;AACxB,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACtG,YAAY,EACV,KAAK,EACL,QAAQ,EACR,cAAc,EACd,SAAS,EACT,aAAa,EACb,sBAAsB,EACvB,MAAM,kBAAkB,CAAA"}
package/lib/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export * as crypto from "./crypto.js";
2
+ export * as curve from "./curve.js";
3
+ export * as keyhelper from "./keyhelper.js";
4
+ export { ProtocolAddress } from "./protocol-address.js";
5
+ export { SessionBuilder } from "./session-builder.js";
6
+ export { assertValidDeviceKeyBundle } from "./prekey-bundle-validator.js";
7
+ export { SessionCipher } from "./session-cipher.js";
8
+ export { SessionRecord, SessionEntry } from "./session-record.js";
9
+ export { FingerprintGenerator } from "./numeric-fingerprint.js";
10
+ export { BaseKeyType } from "./base-key-type.js";
11
+ export { ChainType } from "./chain-type.js";
12
+ export { Direction } from "./direction.js";
13
+ export { MemorySignalStorage } from "./memory-storage.js";
14
+ export { setLogger, getLogger } from "./logger.js";
15
+ export { wipeBuffer, wipeBuffers } from "./util.js";
16
+ export * from "./errors.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAClC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAChD,cAAc,UAAU,CAAA"}
@@ -0,0 +1,19 @@
1
+ import * as curve from "./curve.js";
2
+ import type { KeyPair } from "./curve.js";
3
+ export interface SignedPreKey {
4
+ keyId: number;
5
+ keyPair: KeyPair;
6
+ signature: Buffer;
7
+ createdAt: number;
8
+ }
9
+ export interface PreKey {
10
+ keyId: number;
11
+ keyPair: KeyPair;
12
+ }
13
+ export declare const DEFAULT_SIGNED_PRE_KEY_MAX_AGE_MS: number;
14
+ export declare function shouldRotateSignedPreKey(createdAt: number, maxAgeMs?: number): boolean;
15
+ export declare const generateIdentityKeyPair: typeof curve.generateKeyPair;
16
+ export declare function generateRegistrationId(): number;
17
+ export declare function generateSignedPreKey(identityKeyPair: KeyPair, signedKeyId: number): SignedPreKey;
18
+ export declare function generatePreKey(keyId: number): PreKey;
19
+ //# sourceMappingURL=keyhelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyhelper.d.ts","sourceRoot":"","sources":["../src/keyhelper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,eAAO,MAAM,iCAAiC,QAA0B,CAAA;AAExE,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAA0C,GACnD,OAAO,CAUT;AAED,eAAO,MAAM,uBAAuB,8BAAwB,CAAA;AAE5D,wBAAgB,sBAAsB,IAAI,MAAM,CAO/C;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAuBhG;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWpD"}
@@ -0,0 +1,53 @@
1
+ import * as nodeCrypto from "crypto";
2
+ import * as curve from "./curve.js";
3
+ function isNonNegativeInteger(n) {
4
+ return typeof n === "number" && n % 1 === 0 && n >= 0;
5
+ }
6
+ export const DEFAULT_SIGNED_PRE_KEY_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
7
+ export function shouldRotateSignedPreKey(createdAt, maxAgeMs = DEFAULT_SIGNED_PRE_KEY_MAX_AGE_MS) {
8
+ if (!isNonNegativeInteger(createdAt)) {
9
+ throw new TypeError("Invalid argument for createdAt: " + createdAt);
10
+ }
11
+ if (!isNonNegativeInteger(maxAgeMs)) {
12
+ throw new TypeError("Invalid argument for maxAgeMs: " + maxAgeMs);
13
+ }
14
+ return Date.now() - createdAt >= maxAgeMs;
15
+ }
16
+ export const generateIdentityKeyPair = curve.generateKeyPair;
17
+ export function generateRegistrationId() {
18
+ let registrationId;
19
+ do {
20
+ registrationId = nodeCrypto.randomBytes(2).readUInt16BE(0) & 0x3fff;
21
+ } while (registrationId === 0);
22
+ return registrationId;
23
+ }
24
+ export function generateSignedPreKey(identityKeyPair, signedKeyId) {
25
+ if (!(identityKeyPair.privKey instanceof Buffer) ||
26
+ identityKeyPair.privKey.byteLength !== 32 ||
27
+ !(identityKeyPair.pubKey instanceof Buffer) ||
28
+ identityKeyPair.pubKey.byteLength !== 33) {
29
+ throw new TypeError("Invalid argument for identityKeyPair");
30
+ }
31
+ if (!isNonNegativeInteger(signedKeyId)) {
32
+ throw new TypeError("Invalid argument for signedKeyId: " + signedKeyId);
33
+ }
34
+ const keyPair = curve.generateKeyPair();
35
+ const sig = curve.calculateSignature(identityKeyPair.privKey, keyPair.pubKey);
36
+ return {
37
+ keyId: signedKeyId,
38
+ keyPair,
39
+ signature: sig,
40
+ createdAt: Date.now()
41
+ };
42
+ }
43
+ export function generatePreKey(keyId) {
44
+ if (!isNonNegativeInteger(keyId)) {
45
+ throw new TypeError("Invalid argument for keyId: " + keyId);
46
+ }
47
+ const keyPair = curve.generateKeyPair();
48
+ return {
49
+ keyId,
50
+ keyPair
51
+ };
52
+ }
53
+ //# sourceMappingURL=keyhelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyhelper.js","sourceRoot":"","sources":["../src/keyhelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAGhC,SAAS,oBAAoB,CAAC,CAAS;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvD,CAAC;AAcD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAExE,MAAM,UAAU,wBAAwB,CACtC,SAAiB,EACjB,WAAmB,iCAAiC;IAEpD,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,SAAS,CAAC,kCAAkC,GAAG,SAAS,CAAC,CAAA;IACrE,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,iCAAiC,GAAG,QAAQ,CAAC,CAAA;IACnE,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,QAAQ,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC,eAAe,CAAA;AAE5D,MAAM,UAAU,sBAAsB;IACpC,IAAI,cAAsB,CAAA;IAC1B,GAAG,CAAC;QACF,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,CAAA;IACrE,CAAC,QAAQ,cAAc,KAAK,CAAC,EAAC;IAE9B,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,eAAwB,EAAE,WAAmB;IAChF,IACE,CAAC,CAAC,eAAe,CAAC,OAAO,YAAY,MAAM,CAAC;QAC5C,eAAe,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE;QACzC,CAAC,CAAC,eAAe,CAAC,MAAM,YAAY,MAAM,CAAC;QAC3C,eAAe,CAAC,MAAM,CAAC,UAAU,KAAK,EAAE,EACxC,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,SAAS,CAAC,oCAAoC,GAAG,WAAW,CAAC,CAAA;IACzE,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAE7E,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,OAAO;QACP,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,8BAA8B,GAAG,KAAK,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,EAAE,CAAA;IAEvC,OAAO;QACL,KAAK;QACL,OAAO;KACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface SignalLogger {
2
+ warn(message: string, meta?: unknown): void;
3
+ debug(message: string, meta?: unknown): void;
4
+ }
5
+ export declare function setLogger(logger: SignalLogger | null): void;
6
+ export declare function getLogger(): SignalLogger;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAC7C;AASD,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED,wBAAgB,SAAS,IAAI,YAAY,CAExC"}
package/lib/logger.js ADDED
@@ -0,0 +1,12 @@
1
+ const noopLogger = {
2
+ warn() { },
3
+ debug() { }
4
+ };
5
+ let currentLogger = noopLogger;
6
+ export function setLogger(logger) {
7
+ currentLogger = logger || noopLogger;
8
+ }
9
+ export function getLogger() {
10
+ return currentLogger;
11
+ }
12
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,GAAiB;IAC/B,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;CACjB,CAAA;AAED,IAAI,aAAa,GAAiB,UAAU,CAAA;AAE5C,MAAM,UAAU,SAAS,CAAC,MAA2B;IACnD,aAAa,GAAG,MAAM,IAAI,UAAU,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,aAAa,CAAA;AACtB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { KeyPair } from "./curve.js";
2
+ import type { Direction } from "./direction.js";
3
+ import { SessionRecord } from "./session-record.js";
4
+ import type { SignalStorage } from "./types.js";
5
+ export declare class MemorySignalStorage implements SignalStorage {
6
+ private identityKeyPair;
7
+ private registrationId;
8
+ private sessions;
9
+ private preKeys;
10
+ private signedPreKeys;
11
+ private trustedIdentities;
12
+ constructor(identityKeyPair: KeyPair, registrationId: number);
13
+ loadSession(id: string): Promise<SessionRecord | undefined>;
14
+ storeSession(id: string, session: SessionRecord): Promise<void>;
15
+ isTrustedIdentity(identifier: string, identityKey: Buffer, _direction: Direction): Promise<boolean>;
16
+ saveIdentity(identifier: string, identityKey: Buffer): Promise<boolean>;
17
+ removeIdentity(identifier: string): Promise<void>;
18
+ loadPreKey(id?: number | string): Promise<KeyPair | undefined>;
19
+ removePreKey(id: number): Promise<void>;
20
+ loadSignedPreKey(id?: number | string): Promise<KeyPair | undefined>;
21
+ getOurRegistrationId(): Promise<number>;
22
+ getOurIdentity(): Promise<KeyPair>;
23
+ storePreKey(id: number, keyPair: KeyPair): void;
24
+ storeSignedPreKey(id: number, keyPair: KeyPair): void;
25
+ }
26
+ //# sourceMappingURL=memory-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-storage.d.ts","sourceRoot":"","sources":["../src/memory-storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAU5C,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,iBAAiB,CAA4B;gBAEzC,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM;IAKtD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAI3D,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMvE,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,UAAU,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAQ9D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAQpE,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIvC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAI/C,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAGtD"}
@@ -0,0 +1,69 @@
1
+ import { timingSafeEqual } from "crypto";
2
+ import { SessionRecord } from "./session-record.js";
3
+ function safeEqual(a, b) {
4
+ if (a.byteLength !== b.byteLength) {
5
+ return false;
6
+ }
7
+ return timingSafeEqual(a, b);
8
+ }
9
+ export class MemorySignalStorage {
10
+ constructor(identityKeyPair, registrationId) {
11
+ this.sessions = new Map();
12
+ this.preKeys = new Map();
13
+ this.signedPreKeys = new Map();
14
+ this.trustedIdentities = new Map();
15
+ this.identityKeyPair = identityKeyPair;
16
+ this.registrationId = registrationId;
17
+ }
18
+ async loadSession(id) {
19
+ return this.sessions.get(id);
20
+ }
21
+ async storeSession(id, session) {
22
+ this.sessions.set(id, session);
23
+ }
24
+ async isTrustedIdentity(identifier, identityKey, _direction) {
25
+ const existing = this.trustedIdentities.get(identifier);
26
+ if (!existing) {
27
+ this.trustedIdentities.set(identifier, identityKey);
28
+ return true;
29
+ }
30
+ return safeEqual(existing, identityKey);
31
+ }
32
+ async saveIdentity(identifier, identityKey) {
33
+ const existing = this.trustedIdentities.get(identifier);
34
+ this.trustedIdentities.set(identifier, identityKey);
35
+ return !existing || !safeEqual(existing, identityKey);
36
+ }
37
+ async removeIdentity(identifier) {
38
+ this.trustedIdentities.delete(identifier);
39
+ this.sessions.delete(identifier);
40
+ }
41
+ async loadPreKey(id) {
42
+ if (id === undefined) {
43
+ return undefined;
44
+ }
45
+ return this.preKeys.get(Number(id));
46
+ }
47
+ async removePreKey(id) {
48
+ this.preKeys.delete(id);
49
+ }
50
+ async loadSignedPreKey(id) {
51
+ if (id === undefined) {
52
+ return undefined;
53
+ }
54
+ return this.signedPreKeys.get(Number(id));
55
+ }
56
+ async getOurRegistrationId() {
57
+ return this.registrationId;
58
+ }
59
+ async getOurIdentity() {
60
+ return this.identityKeyPair;
61
+ }
62
+ storePreKey(id, keyPair) {
63
+ this.preKeys.set(id, keyPair);
64
+ }
65
+ storeSignedPreKey(id, keyPair) {
66
+ this.signedPreKeys.set(id, keyPair);
67
+ }
68
+ }
69
+ //# sourceMappingURL=memory-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../src/memory-storage.ts"],"names":[],"mappings":"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"}