@neykoor/libsignal-node 1.0.4 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/lib/base-key-type.d.ts +5 -0
- package/lib/base-key-type.d.ts.map +1 -0
- package/lib/base-key-type.js +6 -0
- package/lib/base-key-type.js.map +1 -0
- package/lib/chain-type.d.ts +5 -0
- package/lib/chain-type.d.ts.map +1 -0
- package/lib/chain-type.js +6 -0
- package/lib/chain-type.js.map +1 -0
- package/lib/ciphertext-message.d.ts +10 -0
- package/lib/ciphertext-message.d.ts.map +1 -0
- package/lib/ciphertext-message.js +12 -0
- package/lib/ciphertext-message.js.map +1 -0
- package/lib/crypto.d.ts +7 -0
- package/lib/crypto.d.ts.map +1 -0
- package/lib/crypto.js +74 -0
- package/lib/crypto.js.map +1 -0
- package/lib/curve.d.ts +10 -0
- package/lib/curve.d.ts.map +1 -0
- package/lib/curve.js +113 -0
- package/lib/curve.js.map +1 -0
- package/lib/direction.d.ts +5 -0
- package/lib/direction.d.ts.map +1 -0
- package/lib/direction.js +6 -0
- package/lib/direction.js.map +1 -0
- package/lib/errors.d.ts +20 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +35 -0
- package/lib/errors.js.map +1 -0
- package/lib/group-cipher.d.ts +12 -0
- package/lib/group-cipher.d.ts.map +1 -0
- package/lib/group-cipher.js +78 -0
- package/lib/group-cipher.js.map +1 -0
- package/lib/group-keyhelper.d.ts +5 -0
- package/lib/group-keyhelper.d.ts.map +1 -0
- package/lib/group-keyhelper.js +12 -0
- package/lib/group-keyhelper.js.map +1 -0
- package/lib/group-proto.d.ts +22 -0
- package/lib/group-proto.d.ts.map +1 -0
- package/lib/group-proto.js +95 -0
- package/lib/group-proto.js.map +1 -0
- package/lib/group-session-builder.d.ts +18 -0
- package/lib/group-session-builder.d.ts.map +1 -0
- package/lib/group-session-builder.js +39 -0
- package/lib/group-session-builder.js.map +1 -0
- package/lib/index.d.ts +34 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +28 -0
- package/lib/index.js.map +1 -0
- package/lib/keyhelper.d.ts +19 -0
- package/lib/keyhelper.d.ts.map +1 -0
- package/lib/keyhelper.js +53 -0
- package/lib/keyhelper.js.map +1 -0
- package/lib/logger.d.ts +7 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +12 -0
- package/lib/logger.js.map +1 -0
- package/lib/memory-storage.d.ts +26 -0
- package/lib/memory-storage.d.ts.map +1 -0
- package/lib/memory-storage.js +69 -0
- package/lib/memory-storage.js.map +1 -0
- package/lib/numeric-fingerprint.d.ts +6 -0
- package/lib/numeric-fingerprint.d.ts.map +1 -0
- package/lib/numeric-fingerprint.js +55 -0
- package/lib/numeric-fingerprint.js.map +1 -0
- package/lib/prekey-bundle-validator.d.ts +3 -0
- package/lib/prekey-bundle-validator.d.ts.map +1 -0
- package/lib/prekey-bundle-validator.js +45 -0
- package/lib/prekey-bundle-validator.js.map +1 -0
- package/lib/protobufs.d.ts +6 -0
- package/lib/protobufs.d.ts.map +1 -0
- package/lib/protobufs.js +4 -0
- package/lib/protobufs.js.map +1 -0
- package/lib/protocol-address.d.ts +9 -0
- package/lib/protocol-address.d.ts.map +1 -0
- package/lib/protocol-address.js +40 -0
- package/lib/protocol-address.js.map +1 -0
- package/lib/queue-job.d.ts +4 -0
- package/lib/queue-job.d.ts.map +1 -0
- package/lib/queue-job.js +43 -0
- package/lib/queue-job.js.map +1 -0
- package/lib/sender-chain-key.d.ts +12 -0
- package/lib/sender-chain-key.d.ts.map +1 -0
- package/lib/sender-chain-key.js +26 -0
- package/lib/sender-chain-key.js.map +1 -0
- package/lib/sender-key-distribution-message.d.ts +16 -0
- package/lib/sender-key-distribution-message.d.ts.map +1 -0
- package/lib/sender-key-distribution-message.js +57 -0
- package/lib/sender-key-distribution-message.js.map +1 -0
- package/lib/sender-key-message.d.ts +17 -0
- package/lib/sender-key-message.d.ts.map +1 -0
- package/lib/sender-key-message.js +66 -0
- package/lib/sender-key-message.js.map +1 -0
- package/lib/sender-key-name.d.ts +13 -0
- package/lib/sender-key-name.d.ts.map +1 -0
- package/lib/sender-key-name.js +43 -0
- package/lib/sender-key-name.js.map +1 -0
- package/lib/sender-key-record.d.ts +13 -0
- package/lib/sender-key-record.d.ts.map +1 -0
- package/lib/sender-key-record.js +37 -0
- package/lib/sender-key-record.js.map +1 -0
- package/lib/sender-key-state.d.ts +38 -0
- package/lib/sender-key-state.d.ts.map +1 -0
- package/lib/sender-key-state.js +79 -0
- package/lib/sender-key-state.js.map +1 -0
- package/lib/sender-message-key.d.ts +12 -0
- package/lib/sender-message-key.d.ts.map +1 -0
- package/lib/sender-message-key.js +31 -0
- package/lib/sender-message-key.js.map +1 -0
- package/lib/session-builder.d.ts +13 -0
- package/lib/session-builder.d.ts.map +1 -0
- package/lib/session-builder.js +154 -0
- package/lib/session-builder.js.map +1 -0
- package/lib/session-cipher.d.ts +30 -0
- package/lib/session-cipher.d.ts.map +1 -0
- package/lib/session-cipher.js +327 -0
- package/lib/session-cipher.js.map +1 -0
- package/lib/session-record.d.ts +113 -0
- package/lib/session-record.d.ts.map +1 -0
- package/lib/session-record.js +309 -0
- package/lib/session-record.js.map +1 -0
- package/lib/types.d.ts +49 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/util.d.ts +3 -0
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +11 -0
- package/lib/util.js.map +1 -0
- package/lib/whisper-text-protocol.d.ts +86 -0
- package/lib/whisper-text-protocol.d.ts.map +1 -0
- package/lib/whisper-text-protocol.js +523 -0
- package/lib/whisper-text-protocol.js.map +1 -0
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
**Port 100% TypeScript de `libsignal-node`, compatible con [BaileysX](https://github.com/Neykoor/BaileysX)**
|
|
8
8
|
|
|
9
|
-
[](https://www.npmjs.com/package/@neykoor/libsignal-node)
|
|
10
10
|
[](https://www.typescriptlang.org/)
|
|
11
11
|
[](https://nodejs.org/api/esm.html)
|
|
12
12
|
[](https://nodejs.org/)
|
|
@@ -40,8 +40,8 @@ Mismo API, misma criptografía, cero `@ts-ignore`, tipado de punta a punta — y
|
|
|
40
40
|
|
|
41
41
|
- Implementación completa del **Double Ratchet** (X3DH, sesiones, ratcheting)
|
|
42
42
|
- Misma API pública: `ProtocolAddress`, `SessionBuilder`, `SessionCipher`, `SessionRecord`, `keyhelper`, `curve`, `crypto`
|
|
43
|
-
-
|
|
44
|
-
- Soporte nativo de `x25519` vía `node:crypto` con fallback a
|
|
43
|
+
- Misma base criptográfica que `libsignal-node` (curve25519 y `protobufjs`), aquí vía `@neykoor/curve25519-ts`
|
|
44
|
+
- Soporte nativo de `x25519` vía `node:crypto` con fallback a `@neykoor/curve25519-ts`
|
|
45
45
|
|
|
46
46
|
### Pendiente por traer desde `libsignal-node` (roadmap)
|
|
47
47
|
|
|
@@ -53,10 +53,10 @@ Mismo API, misma criptografía, cero `@ts-ignore`, tipado de punta a punta — y
|
|
|
53
53
|
## 📦 Instalación
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
|
-
npm install libsignal-node
|
|
56
|
+
npm install @neykoor/libsignal-node
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
Dependencias en tiempo de ejecución:
|
|
59
|
+
Dependencias en tiempo de ejecución: `@neykoor/curve25519-ts`, `pino` y `protobufjs` (se instalan solas junto con el paquete).
|
|
60
60
|
|
|
61
61
|
## 🔧 Uso en BaileysX
|
|
62
62
|
|
|
@@ -72,21 +72,21 @@ import { PreKeyWhisperMessage } from 'libsignal/lib/protobufs.js'
|
|
|
72
72
|
por:
|
|
73
73
|
|
|
74
74
|
```ts
|
|
75
|
-
import * as libsignal from 'libsignal-node
|
|
76
|
-
import { protobufs } from 'libsignal-node
|
|
75
|
+
import * as libsignal from '@neykoor/libsignal-node'
|
|
76
|
+
import { protobufs } from '@neykoor/libsignal-node'
|
|
77
77
|
const { PreKeyWhisperMessage } = protobufs
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
Y en el `package.json` de tu proyecto, quita la dependencia `libsignal` y agrega:
|
|
81
81
|
|
|
82
82
|
```json
|
|
83
|
-
"libsignal-node
|
|
83
|
+
"@neykoor/libsignal-node": "^1.0.5"
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
## 📖 Uso básico
|
|
87
87
|
|
|
88
88
|
```ts
|
|
89
|
-
import { ProtocolAddress, SessionBuilder, SessionCipher, MemorySignalStorage, keyhelper } from 'libsignal-node
|
|
89
|
+
import { ProtocolAddress, SessionBuilder, SessionCipher, MemorySignalStorage, keyhelper } from '@neykoor/libsignal-node'
|
|
90
90
|
|
|
91
91
|
const identityKeyPair = keyhelper.generateIdentityKeyPair()
|
|
92
92
|
const registrationId = keyhelper.generateRegistrationId()
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,10 @@
|
|
|
1
|
+
export declare class CiphertextMessage {
|
|
2
|
+
readonly UNSUPPORTED_VERSION: number;
|
|
3
|
+
readonly CURRENT_VERSION: number;
|
|
4
|
+
readonly WHISPER_TYPE: number;
|
|
5
|
+
readonly PREKEY_TYPE: number;
|
|
6
|
+
readonly SENDERKEY_TYPE: number;
|
|
7
|
+
readonly SENDERKEY_DISTRIBUTION_TYPE: number;
|
|
8
|
+
readonly ENCRYPTED_MESSAGE_OVERHEAD: number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ciphertext-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ciphertext-message.d.ts","sourceRoot":"","sources":["../src/ciphertext-message.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAI;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAI;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAI;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAI;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAI;IACnC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAI;IAChD,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAK;CACjD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class CiphertextMessage {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.UNSUPPORTED_VERSION = 1;
|
|
4
|
+
this.CURRENT_VERSION = 3;
|
|
5
|
+
this.WHISPER_TYPE = 2;
|
|
6
|
+
this.PREKEY_TYPE = 3;
|
|
7
|
+
this.SENDERKEY_TYPE = 4;
|
|
8
|
+
this.SENDERKEY_DISTRIBUTION_TYPE = 5;
|
|
9
|
+
this.ENCRYPTED_MESSAGE_OVERHEAD = 53;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ciphertext-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ciphertext-message.js","sourceRoot":"","sources":["../src/ciphertext-message.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAA9B;QACW,wBAAmB,GAAW,CAAC,CAAA;QAC/B,oBAAe,GAAW,CAAC,CAAA;QAC3B,iBAAY,GAAW,CAAC,CAAA;QACxB,gBAAW,GAAW,CAAC,CAAA;QACvB,mBAAc,GAAW,CAAC,CAAA;QAC1B,gCAA2B,GAAW,CAAC,CAAA;QACvC,+BAA0B,GAAW,EAAE,CAAA;IAClD,CAAC;CAAA"}
|
package/lib/crypto.d.ts
ADDED
|
@@ -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":"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"}
|
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
|
package/lib/curve.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curve.js","sourceRoot":"","sources":["../src/curve.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/lib/direction.js
ADDED
|
@@ -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"}
|
package/lib/errors.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
export declare class SenderKeyError extends SignalError {
|
|
18
|
+
constructor(message?: string);
|
|
19
|
+
}
|
|
20
|
+
//# 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;AAED,qBAAa,cAAe,SAAQ,WAAW;gBACjC,OAAO,CAAC,EAAE,MAAM;CAI7B"}
|
package/lib/errors.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
export class SenderKeyError extends SignalError {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = "SenderKeyError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# 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;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SenderKeyName } from "./sender-key-name.js";
|
|
2
|
+
import type { SenderKeyStore } from "./types.js";
|
|
3
|
+
export declare class GroupCipher {
|
|
4
|
+
private readonly senderKeyStore;
|
|
5
|
+
private readonly senderKeyName;
|
|
6
|
+
constructor(senderKeyStore: SenderKeyStore, senderKeyName: SenderKeyName);
|
|
7
|
+
private queueJob;
|
|
8
|
+
encrypt(paddedPlaintext: Uint8Array): Promise<Buffer>;
|
|
9
|
+
decrypt(senderKeyMessageBytes: Uint8Array): Promise<Buffer>;
|
|
10
|
+
private getSenderKey;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=group-cipher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-cipher.d.ts","sourceRoot":"","sources":["../src/group-cipher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;gBAEjC,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa;YAK1D,QAAQ;IAIhB,OAAO,CAAC,eAAe,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAqCrD,OAAO,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BjE,OAAO,CAAC,YAAY;CAuBrB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as crypto from "./crypto.js";
|
|
2
|
+
import { SenderKeyError } from "./errors.js";
|
|
3
|
+
import { queueJob } from "./queue-job.js";
|
|
4
|
+
import { SenderKeyMessage } from "./sender-key-message.js";
|
|
5
|
+
import { wipeBuffer } from "./util.js";
|
|
6
|
+
const MAX_JUMP = 2000;
|
|
7
|
+
export class GroupCipher {
|
|
8
|
+
constructor(senderKeyStore, senderKeyName) {
|
|
9
|
+
this.senderKeyStore = senderKeyStore;
|
|
10
|
+
this.senderKeyName = senderKeyName;
|
|
11
|
+
}
|
|
12
|
+
async queueJob(awaitable) {
|
|
13
|
+
return await queueJob(this.senderKeyName.toString(), awaitable);
|
|
14
|
+
}
|
|
15
|
+
async encrypt(paddedPlaintext) {
|
|
16
|
+
return await this.queueJob(async () => {
|
|
17
|
+
const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName);
|
|
18
|
+
if (!record) {
|
|
19
|
+
throw new SenderKeyError("No SenderKeyRecord found for encryption");
|
|
20
|
+
}
|
|
21
|
+
const senderKeyState = record.getSenderKeyState();
|
|
22
|
+
if (!senderKeyState) {
|
|
23
|
+
throw new SenderKeyError("No session to encrypt message");
|
|
24
|
+
}
|
|
25
|
+
const signingKeyPrivate = senderKeyState.getSigningKeyPrivate();
|
|
26
|
+
if (!signingKeyPrivate) {
|
|
27
|
+
throw new SenderKeyError("Signing key is not available for encryption");
|
|
28
|
+
}
|
|
29
|
+
const iteration = senderKeyState.getSenderChainKey().getIteration();
|
|
30
|
+
const senderKey = this.getSenderKey(senderKeyState, iteration === 0 ? 0 : iteration + 1);
|
|
31
|
+
const ciphertext = crypto.encrypt(senderKey.getCipherKey(), Buffer.from(paddedPlaintext), senderKey.getIv());
|
|
32
|
+
const senderKeyMessage = new SenderKeyMessage(senderKeyState.getKeyId(), senderKey.getIteration(), ciphertext, signingKeyPrivate);
|
|
33
|
+
wipeBuffer(senderKey.getCipherKey());
|
|
34
|
+
wipeBuffer(senderKey.getIv());
|
|
35
|
+
await this.senderKeyStore.storeSenderKey(this.senderKeyName, record);
|
|
36
|
+
return senderKeyMessage.serialize();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async decrypt(senderKeyMessageBytes) {
|
|
40
|
+
return await this.queueJob(async () => {
|
|
41
|
+
const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName);
|
|
42
|
+
if (!record) {
|
|
43
|
+
throw new SenderKeyError("No sender key record found for decryption");
|
|
44
|
+
}
|
|
45
|
+
const senderKeyMessage = new SenderKeyMessage(undefined, undefined, undefined, undefined, senderKeyMessageBytes);
|
|
46
|
+
const senderKeyState = record.getSenderKeyState(senderKeyMessage.getKeyId());
|
|
47
|
+
if (!senderKeyState) {
|
|
48
|
+
throw new SenderKeyError(`No session found to decrypt message from ${this.senderKeyName.getSender().toString()} with keyId: ${senderKeyMessage.getKeyId()}`);
|
|
49
|
+
}
|
|
50
|
+
senderKeyMessage.verifySignature(senderKeyState.getSigningKeyPublic());
|
|
51
|
+
const senderKey = this.getSenderKey(senderKeyState, senderKeyMessage.getIteration());
|
|
52
|
+
const plaintext = crypto.decrypt(senderKey.getCipherKey(), senderKeyMessage.getCipherText(), senderKey.getIv());
|
|
53
|
+
wipeBuffer(senderKey.getCipherKey());
|
|
54
|
+
wipeBuffer(senderKey.getIv());
|
|
55
|
+
await this.senderKeyStore.storeSenderKey(this.senderKeyName, record);
|
|
56
|
+
return plaintext;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
getSenderKey(senderKeyState, iteration) {
|
|
60
|
+
let senderChainKey = senderKeyState.getSenderChainKey();
|
|
61
|
+
if (senderChainKey.getIteration() > iteration) {
|
|
62
|
+
if (senderKeyState.hasSenderMessageKey(iteration)) {
|
|
63
|
+
return senderKeyState.removeSenderMessageKey(iteration);
|
|
64
|
+
}
|
|
65
|
+
throw new SenderKeyError(`Received message with old counter: ${senderChainKey.getIteration()} , ${iteration}`);
|
|
66
|
+
}
|
|
67
|
+
if (iteration - senderChainKey.getIteration() > MAX_JUMP) {
|
|
68
|
+
throw new SenderKeyError("Over 2000 messages into the future!");
|
|
69
|
+
}
|
|
70
|
+
while (senderChainKey.getIteration() < iteration) {
|
|
71
|
+
senderKeyState.addSenderMessageKey(senderChainKey.getSenderMessageKey());
|
|
72
|
+
senderChainKey = senderChainKey.getNext();
|
|
73
|
+
}
|
|
74
|
+
senderKeyState.setSenderChainKey(senderChainKey);
|
|
75
|
+
return senderChainKey.getSenderMessageKey();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=group-cipher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-cipher.js","sourceRoot":"","sources":["../src/group-cipher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { KeyPair } from "./curve.js";
|
|
2
|
+
export declare function generateSenderKey(): Buffer;
|
|
3
|
+
export declare function generateSenderKeyId(): number;
|
|
4
|
+
export declare function generateSenderSigningKey(keyPair?: KeyPair): KeyPair;
|
|
5
|
+
//# sourceMappingURL=group-keyhelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-keyhelper.d.ts","sourceRoot":"","sources":["../src/group-keyhelper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAEnE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as nodeCrypto from "crypto";
|
|
2
|
+
import * as curve from "./curve.js";
|
|
3
|
+
export function generateSenderKey() {
|
|
4
|
+
return nodeCrypto.randomBytes(32);
|
|
5
|
+
}
|
|
6
|
+
export function generateSenderKeyId() {
|
|
7
|
+
return nodeCrypto.randomBytes(4).readUInt32BE(0);
|
|
8
|
+
}
|
|
9
|
+
export function generateSenderSigningKey(keyPair) {
|
|
10
|
+
return keyPair ?? curve.generateKeyPair();
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=group-keyhelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-keyhelper.js","sourceRoot":"","sources":["../src/group-keyhelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAA;AAGhC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAiB;IACxD,OAAO,OAAO,IAAI,KAAK,CAAC,eAAe,EAAE,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ISenderKeyMessageProto {
|
|
2
|
+
id: number;
|
|
3
|
+
iteration: number;
|
|
4
|
+
ciphertext: Uint8Array;
|
|
5
|
+
}
|
|
6
|
+
export declare const SenderKeyMessageProto: {
|
|
7
|
+
create(props: Partial<ISenderKeyMessageProto>): ISenderKeyMessageProto;
|
|
8
|
+
encode(message: ISenderKeyMessageProto): Uint8Array;
|
|
9
|
+
decode(data: Uint8Array): ISenderKeyMessageProto;
|
|
10
|
+
};
|
|
11
|
+
export interface ISenderKeyDistributionMessageProto {
|
|
12
|
+
id: number;
|
|
13
|
+
iteration: number;
|
|
14
|
+
chainKey: Uint8Array;
|
|
15
|
+
signingKey: Uint8Array;
|
|
16
|
+
}
|
|
17
|
+
export declare const SenderKeyDistributionMessageProto: {
|
|
18
|
+
create(props: Partial<ISenderKeyDistributionMessageProto>): ISenderKeyDistributionMessageProto;
|
|
19
|
+
encode(message: ISenderKeyDistributionMessageProto): Uint8Array;
|
|
20
|
+
decode(data: Uint8Array): ISenderKeyDistributionMessageProto;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=group-proto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-proto.d.ts","sourceRoot":"","sources":["../src/group-proto.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,eAAO,MAAM,qBAAqB;kBAClB,OAAO,CAAC,sBAAsB,CAAC,GAAG,sBAAsB;oBAQtD,sBAAsB,GAAG,UAAU;iBAQtC,UAAU,GAAG,sBAAsB;CAuBjD,CAAA;AAID,MAAM,WAAW,kCAAkC;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,UAAU,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,eAAO,MAAM,iCAAiC;kBAC9B,OAAO,CAAC,kCAAkC,CAAC,GAAG,kCAAkC;oBAS9E,kCAAkC,GAAG,UAAU;iBASlD,UAAU,GAAG,kCAAkC;CA+B7D,CAAA"}
|