@towns-protocol/encryption 0.0.191
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/LICENSE.txt +21 -0
- package/README.md +3 -0
- package/dist/base.d.ts +64 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +44 -0
- package/dist/base.js.map +1 -0
- package/dist/cryptoAesGcm.d.ts +9 -0
- package/dist/cryptoAesGcm.d.ts.map +1 -0
- package/dist/cryptoAesGcm.js +30 -0
- package/dist/cryptoAesGcm.js.map +1 -0
- package/dist/cryptoStore.d.ts +52 -0
- package/dist/cryptoStore.d.ts.map +1 -0
- package/dist/cryptoStore.js +131 -0
- package/dist/cryptoStore.js.map +1 -0
- package/dist/decryptionExtensions.d.ts +200 -0
- package/dist/decryptionExtensions.d.ts.map +1 -0
- package/dist/decryptionExtensions.js +687 -0
- package/dist/decryptionExtensions.js.map +1 -0
- package/dist/derivedEncryption.d.ts +2 -0
- package/dist/derivedEncryption.d.ts.map +1 -0
- package/dist/derivedEncryption.js +2 -0
- package/dist/derivedEncryption.js.map +1 -0
- package/dist/encryptionDelegate.d.ts +20 -0
- package/dist/encryptionDelegate.d.ts.map +1 -0
- package/dist/encryptionDelegate.js +86 -0
- package/dist/encryptionDelegate.js.map +1 -0
- package/dist/encryptionDevice.d.ts +264 -0
- package/dist/encryptionDevice.d.ts.map +1 -0
- package/dist/encryptionDevice.js +742 -0
- package/dist/encryptionDevice.js.map +1 -0
- package/dist/encryptionTypes.d.ts +20 -0
- package/dist/encryptionTypes.d.ts.map +1 -0
- package/dist/encryptionTypes.js +2 -0
- package/dist/encryptionTypes.js.map +1 -0
- package/dist/groupDecryption.d.ts +34 -0
- package/dist/groupDecryption.d.ts.map +1 -0
- package/dist/groupDecryption.js +84 -0
- package/dist/groupDecryption.js.map +1 -0
- package/dist/groupEncryption.d.ts +36 -0
- package/dist/groupEncryption.d.ts.map +1 -0
- package/dist/groupEncryption.js +90 -0
- package/dist/groupEncryption.js.map +1 -0
- package/dist/groupEncryptionCrypto.d.ts +119 -0
- package/dist/groupEncryptionCrypto.d.ts.map +1 -0
- package/dist/groupEncryptionCrypto.js +256 -0
- package/dist/groupEncryptionCrypto.js.map +1 -0
- package/dist/hybridGroupDecryption.d.ts +33 -0
- package/dist/hybridGroupDecryption.d.ts.map +1 -0
- package/dist/hybridGroupDecryption.js +84 -0
- package/dist/hybridGroupDecryption.js.map +1 -0
- package/dist/hybridGroupEncryption.d.ts +30 -0
- package/dist/hybridGroupEncryption.d.ts.map +1 -0
- package/dist/hybridGroupEncryption.js +92 -0
- package/dist/hybridGroupEncryption.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/olmLib.d.ts +35 -0
- package/dist/olmLib.d.ts.map +1 -0
- package/dist/olmLib.js +37 -0
- package/dist/olmLib.js.map +1 -0
- package/dist/storeTypes.d.ts +27 -0
- package/dist/storeTypes.d.ts.map +1 -0
- package/dist/storeTypes.js +2 -0
- package/dist/storeTypes.js.map +1 -0
- package/dist/tests/cryptoAesGcm.test.d.ts +2 -0
- package/dist/tests/cryptoAesGcm.test.d.ts.map +1 -0
- package/dist/tests/cryptoAesGcm.test.js +71 -0
- package/dist/tests/cryptoAesGcm.test.js.map +1 -0
- package/dist/tests/cryptoStore.test.d.ts +5 -0
- package/dist/tests/cryptoStore.test.d.ts.map +1 -0
- package/dist/tests/cryptoStore.test.js +114 -0
- package/dist/tests/cryptoStore.test.js.map +1 -0
- package/dist/tests/decryptionExtensions.test.d.ts +2 -0
- package/dist/tests/decryptionExtensions.test.d.ts.map +1 -0
- package/dist/tests/decryptionExtensions.test.js +355 -0
- package/dist/tests/decryptionExtensions.test.js.map +1 -0
- package/dist/tests/encryption-protocol.test.d.ts +2 -0
- package/dist/tests/encryption-protocol.test.d.ts.map +1 -0
- package/dist/tests/encryption-protocol.test.js +150 -0
- package/dist/tests/encryption-protocol.test.js.map +1 -0
- package/dist/tests/encryptionDelegate.test.d.ts +2 -0
- package/dist/tests/encryptionDelegate.test.d.ts.map +1 -0
- package/dist/tests/encryptionDelegate.test.js +78 -0
- package/dist/tests/encryptionDelegate.test.js.map +1 -0
- package/dist/tests/group-encryption-protocol.test.d.ts +2 -0
- package/dist/tests/group-encryption-protocol.test.d.ts.map +1 -0
- package/dist/tests/group-encryption-protocol.test.js +103 -0
- package/dist/tests/group-encryption-protocol.test.js.map +1 -0
- package/dist/tests/group-encryptionDelegate.test.d.ts +2 -0
- package/dist/tests/group-encryptionDelegate.test.d.ts.map +1 -0
- package/dist/tests/group-encryptionDelegate.test.js +23 -0
- package/dist/tests/group-encryptionDelegate.test.js.map +1 -0
- package/dist/tests/pk.test.d.ts +2 -0
- package/dist/tests/pk.test.d.ts.map +1 -0
- package/dist/tests/pk.test.js +103 -0
- package/dist/tests/pk.test.js.map +1 -0
- package/package.json +54 -0
package/dist/olmLib.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// OLM_OPTIONS is undefined https://gitlab.matrix.org/matrix-org/olm/-/issues/10
|
|
2
|
+
import { DecryptionError } from './base';
|
|
3
|
+
// but this comment suggests we define it ourselves? https://gitlab.matrix.org/matrix-org/olm/-/blob/master/javascript/olm_pre.js#L22-24
|
|
4
|
+
globalThis.OLM_OPTIONS = {};
|
|
5
|
+
/**
|
|
6
|
+
* Utilities common to Olm encryption
|
|
7
|
+
*/
|
|
8
|
+
// Supported algorithms
|
|
9
|
+
export var EncryptionAlgorithmId;
|
|
10
|
+
(function (EncryptionAlgorithmId) {
|
|
11
|
+
EncryptionAlgorithmId["Olm"] = "r.olm.v1.curve25519-aes-sha2";
|
|
12
|
+
})(EncryptionAlgorithmId || (EncryptionAlgorithmId = {}));
|
|
13
|
+
export var GroupEncryptionAlgorithmId;
|
|
14
|
+
(function (GroupEncryptionAlgorithmId) {
|
|
15
|
+
// group olm encryption based on signal protocol with ratcheting
|
|
16
|
+
GroupEncryptionAlgorithmId["GroupEncryption"] = "r.group-encryption.v1.aes-sha2";
|
|
17
|
+
// asymmetric encryption (olm) to share symmetric encryption (AES-GSM-256) keys
|
|
18
|
+
GroupEncryptionAlgorithmId["HybridGroupEncryption"] = "grpaes";
|
|
19
|
+
})(GroupEncryptionAlgorithmId || (GroupEncryptionAlgorithmId = {}));
|
|
20
|
+
export function isGroupEncryptionAlgorithmId(value) {
|
|
21
|
+
return Object.values(GroupEncryptionAlgorithmId).includes(value);
|
|
22
|
+
}
|
|
23
|
+
export function parseGroupEncryptionAlgorithmId(value, defaultValue) {
|
|
24
|
+
if (!value || value === '') {
|
|
25
|
+
if (defaultValue) {
|
|
26
|
+
return { kind: 'matched', value: defaultValue };
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
throw new DecryptionError('GROUP_DECRYPTION_UNSET_ALGORITHM', 'algorithm is unset');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (isGroupEncryptionAlgorithmId(value)) {
|
|
33
|
+
return { kind: 'matched', value };
|
|
34
|
+
}
|
|
35
|
+
return { kind: 'unrecognized', value };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=olmLib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"olmLib.js","sourceRoot":"","sources":["../src/olmLib.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAExC,wIAAwI;AACxI,UAAU,CAAC,WAAW,GAAG,EAAE,CAAA;AAE3B;;GAEG;AAEH,uBAAuB;AACvB,MAAM,CAAN,IAAY,qBAEX;AAFD,WAAY,qBAAqB;IAC7B,6DAAoC,CAAA;AACxC,CAAC,EAFW,qBAAqB,KAArB,qBAAqB,QAEhC;AAED,MAAM,CAAN,IAAY,0BAKX;AALD,WAAY,0BAA0B;IAClC,gEAAgE;IAChE,gFAAkD,CAAA;IAClD,+EAA+E;IAC/E,8DAAgC,CAAA;AACpC,CAAC,EALW,0BAA0B,KAA1B,0BAA0B,QAKrC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,KAAmC,CAAC,CAAA;AAClG,CAAC;AAKD,MAAM,UAAU,+BAA+B,CAC3C,KAAa,EACb,YAAyC;IAEzC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACzB,IAAI,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;QACnD,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,eAAe,CAAC,kCAAkC,EAAE,oBAAoB,CAAC,CAAA;QACvF,CAAC;IACL,CAAC;IACD,IAAI,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { InboundGroupSessionData } from './encryptionDevice';
|
|
2
|
+
export interface AccountRecord {
|
|
3
|
+
id: string;
|
|
4
|
+
accountPickle: string;
|
|
5
|
+
}
|
|
6
|
+
export interface GroupSessionRecord {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
session: string;
|
|
9
|
+
streamId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface HybridGroupSessionRecord {
|
|
12
|
+
sessionId: string;
|
|
13
|
+
streamId: string;
|
|
14
|
+
sessionKey: Uint8Array;
|
|
15
|
+
miniblockNum: bigint;
|
|
16
|
+
}
|
|
17
|
+
export interface UserDeviceRecord {
|
|
18
|
+
userId: string;
|
|
19
|
+
deviceKey: string;
|
|
20
|
+
fallbackKey: string;
|
|
21
|
+
expirationTimestamp: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ExtendedInboundGroupSessionData extends InboundGroupSessionData {
|
|
24
|
+
streamId: string;
|
|
25
|
+
sessionId: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=storeTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeTypes.d.ts","sourceRoot":"","sources":["../src/storeTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,+BAAgC,SAAQ,uBAAuB;IAC5E,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeTypes.js","sourceRoot":"","sources":["../src/storeTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoAesGcm.test.d.ts","sourceRoot":"","sources":["../../src/tests/cryptoAesGcm.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { generateNewAesGcmKey, exportAesGsmKeyBytes, importAesGsmKeyBytes, encryptAesGcm, decryptAesGcm, } from '../cryptoAesGcm';
|
|
2
|
+
it('cryptoAesGcm', async () => {
|
|
3
|
+
const key = await generateNewAesGcmKey();
|
|
4
|
+
expect(key).toBeDefined();
|
|
5
|
+
const keyBytes = await exportAesGsmKeyBytes(key);
|
|
6
|
+
expect(keyBytes).toBeDefined();
|
|
7
|
+
expect(keyBytes.length).toBe(32);
|
|
8
|
+
const key2 = await importAesGsmKeyBytes(keyBytes);
|
|
9
|
+
expect(key2).toBeDefined();
|
|
10
|
+
const data1 = Uint8Array.from([55]);
|
|
11
|
+
const data16 = Uint8Array.from([55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55]);
|
|
12
|
+
const data1000 = Uint8Array.from(Array(1000).fill(55));
|
|
13
|
+
const encrypted1 = await encryptAesGcm(key, data1);
|
|
14
|
+
const decrypted1 = await decryptAesGcm(key, encrypted1.ciphertext, encrypted1.iv);
|
|
15
|
+
expect(decrypted1).toEqual(data1);
|
|
16
|
+
const encrypted16 = await encryptAesGcm(key, data16);
|
|
17
|
+
const decrypted16 = await decryptAesGcm(key, encrypted16.ciphertext, encrypted16.iv);
|
|
18
|
+
expect(decrypted16).toEqual(data16);
|
|
19
|
+
const encrypted1000 = await encryptAesGcm(key, data1000);
|
|
20
|
+
const decrypted1000 = await decryptAesGcm(key, encrypted1000.ciphertext, encrypted1000.iv);
|
|
21
|
+
expect(decrypted1000).toEqual(data1000);
|
|
22
|
+
const encrypted1000a = await encryptAesGcm(key, data1000);
|
|
23
|
+
expect(encrypted1000a).not.toEqual(encrypted1000); // IV should be different
|
|
24
|
+
const decrypted1000a = await decryptAesGcm(key, encrypted1000a.ciphertext, encrypted1000a.iv);
|
|
25
|
+
expect(decrypted1000a).toEqual(data1000);
|
|
26
|
+
// Check key2 works for decrypting
|
|
27
|
+
const decrypted1000c = await decryptAesGcm(key2, encrypted1000a.ciphertext, encrypted1000a.iv);
|
|
28
|
+
expect(decrypted1000c).toEqual(data1000);
|
|
29
|
+
// Check key2 works for encrypting, key works for decrypting
|
|
30
|
+
const encrypted1000d = await encryptAesGcm(key2, data1000);
|
|
31
|
+
const decrypted1000d = await decryptAesGcm(key, encrypted1000d.ciphertext, encrypted1000d.iv);
|
|
32
|
+
expect(decrypted1000d).toEqual(data1000);
|
|
33
|
+
// Check can't decrypt encrypted1 with added 0 at the end
|
|
34
|
+
const encrypted1a = new Uint8Array(encrypted1.ciphertext.length + 1);
|
|
35
|
+
encrypted1a.set(encrypted1.ciphertext);
|
|
36
|
+
encrypted1a[encrypted1.ciphertext.length] = 0;
|
|
37
|
+
await expect(decryptAesGcm(key, encrypted1a, encrypted1.iv)).rejects.toThrow();
|
|
38
|
+
// Check can't decrypt if encrypted1000 byte 0 is modified
|
|
39
|
+
const encrypted1000b = new Uint8Array(encrypted1000.ciphertext);
|
|
40
|
+
encrypted1000b[0] = (encrypted1000b[0] + 1) % 256;
|
|
41
|
+
await expect(decryptAesGcm(key, encrypted1000b, encrypted1000.iv)).rejects.toThrow();
|
|
42
|
+
// Check can't decrypt if encrypted1000 byte 500 is modified
|
|
43
|
+
const encrypted1000c = new Uint8Array(encrypted1000.ciphertext);
|
|
44
|
+
encrypted1000c[500] = (encrypted1000c[500] + 1) % 256;
|
|
45
|
+
await expect(decryptAesGcm(key, encrypted1000c, encrypted1000.iv)).rejects.toThrow();
|
|
46
|
+
// Check can't decrypt if IV is modified
|
|
47
|
+
const modifiedIv = new Uint8Array(encrypted1000.iv);
|
|
48
|
+
modifiedIv[0] = (modifiedIv[0] + 1) % 256;
|
|
49
|
+
await expect(decryptAesGcm(key, encrypted1000.ciphertext, modifiedIv)).rejects.toThrow();
|
|
50
|
+
// Check can't import key of wrong length
|
|
51
|
+
const badKey0 = new Uint8Array(0);
|
|
52
|
+
await expect(importAesGsmKeyBytes(badKey0)).rejects.toThrow();
|
|
53
|
+
const badKey1 = Uint8Array.from(Array(31).fill(55));
|
|
54
|
+
await expect(importAesGsmKeyBytes(badKey1)).rejects.toThrow();
|
|
55
|
+
const badKey2 = Uint8Array.from(Array(33).fill(55));
|
|
56
|
+
await expect(importAesGsmKeyBytes(badKey2)).rejects.toThrow();
|
|
57
|
+
// Can import key of length 32
|
|
58
|
+
const goodKey = Uint8Array.from(Array(32).fill(55));
|
|
59
|
+
const key3 = await importAesGsmKeyBytes(goodKey);
|
|
60
|
+
expect(key3).toBeDefined();
|
|
61
|
+
// Can't decrypt with modified imported key
|
|
62
|
+
const modifiedKeyBytes = new Uint8Array(keyBytes);
|
|
63
|
+
modifiedKeyBytes[0] = (modifiedKeyBytes[0] + 1) % 256;
|
|
64
|
+
const modifiedKey = await importAesGsmKeyBytes(modifiedKeyBytes);
|
|
65
|
+
await expect(decryptAesGcm(modifiedKey, encrypted1.ciphertext, encrypted1.iv)).rejects.toThrow();
|
|
66
|
+
await expect(decryptAesGcm(modifiedKey, encrypted16.ciphertext, encrypted16.iv)).rejects.toThrow();
|
|
67
|
+
await expect(decryptAesGcm(modifiedKey, encrypted1000.ciphertext, encrypted1000.iv)).rejects.toThrow();
|
|
68
|
+
// Can't encrypt empty data
|
|
69
|
+
await expect(encryptAesGcm(key, new Uint8Array(0))).rejects.toThrow();
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=cryptoAesGcm.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoAesGcm.test.js","sourceRoot":"","sources":["../../src/tests/cryptoAesGcm.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoStore.test.d.ts","sourceRoot":"","sources":["../../src/tests/cryptoStore.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @group main
|
|
3
|
+
*/
|
|
4
|
+
import { CryptoStore } from '../cryptoStore';
|
|
5
|
+
import { EncryptionDelegate } from '../encryptionDelegate';
|
|
6
|
+
import { EncryptionDevice } from '../encryptionDevice';
|
|
7
|
+
import { nanoid } from 'nanoid';
|
|
8
|
+
describe('ClientStoreTests', () => {
|
|
9
|
+
let store;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
const name = nanoid();
|
|
12
|
+
const userId = nanoid();
|
|
13
|
+
store = new CryptoStore(name, userId);
|
|
14
|
+
});
|
|
15
|
+
it('Add devices to store', async () => {
|
|
16
|
+
const userId = nanoid();
|
|
17
|
+
const userDevice = {
|
|
18
|
+
deviceKey: nanoid(),
|
|
19
|
+
fallbackKey: nanoid(),
|
|
20
|
+
};
|
|
21
|
+
await store.saveUserDevices(userId, [userDevice]);
|
|
22
|
+
});
|
|
23
|
+
it('Fetch devices from store', async () => {
|
|
24
|
+
const userId = nanoid();
|
|
25
|
+
const devices = [...Array(10).keys()].map(() => {
|
|
26
|
+
const userDevice = {
|
|
27
|
+
deviceKey: nanoid(),
|
|
28
|
+
fallbackKey: nanoid(),
|
|
29
|
+
};
|
|
30
|
+
return userDevice;
|
|
31
|
+
});
|
|
32
|
+
await store.saveUserDevices(userId, devices);
|
|
33
|
+
const fetchedDevices = await store.getUserDevices(userId);
|
|
34
|
+
expect(fetchedDevices.length).toEqual(10);
|
|
35
|
+
expect(fetchedDevices.sort((a, b) => a.deviceKey.localeCompare(b.deviceKey))).toEqual(devices.sort((a, b) => a.deviceKey.localeCompare(b.deviceKey)));
|
|
36
|
+
});
|
|
37
|
+
it('Expired devices are not fetched', async () => {
|
|
38
|
+
const userId = nanoid();
|
|
39
|
+
const userDevice = {
|
|
40
|
+
deviceKey: nanoid(),
|
|
41
|
+
fallbackKey: nanoid(),
|
|
42
|
+
};
|
|
43
|
+
const expirationMs = 500;
|
|
44
|
+
await store.saveUserDevices(userId, [userDevice], expirationMs);
|
|
45
|
+
const devicesBeforeTimeout = await store.getUserDevices(userId);
|
|
46
|
+
expect(devicesBeforeTimeout.length).toEqual(1);
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, expirationMs + 100));
|
|
48
|
+
const devicesAfterTimeout = await store.getUserDevices(userId);
|
|
49
|
+
expect(devicesAfterTimeout.length).toEqual(0);
|
|
50
|
+
});
|
|
51
|
+
it('Adding the same device id twice updates the expiration time', async () => {
|
|
52
|
+
const userId = nanoid();
|
|
53
|
+
const userDevice = {
|
|
54
|
+
deviceKey: nanoid(),
|
|
55
|
+
fallbackKey: nanoid(),
|
|
56
|
+
};
|
|
57
|
+
const expirationMs = 500;
|
|
58
|
+
await store.saveUserDevices(userId, [userDevice], expirationMs);
|
|
59
|
+
await new Promise((resolve) => setTimeout(resolve, expirationMs / 2));
|
|
60
|
+
await store.saveUserDevices(userId, [userDevice], expirationMs * 2);
|
|
61
|
+
const deviceCountAfterTwoSaves = await store.deviceRecordCount();
|
|
62
|
+
expect(deviceCountAfterTwoSaves).toEqual(1);
|
|
63
|
+
await new Promise((resolve) => setTimeout(resolve, expirationMs + 100));
|
|
64
|
+
const devicesAfterTimeout = await store.getUserDevices(userId);
|
|
65
|
+
expect(devicesAfterTimeout.length).toEqual(1);
|
|
66
|
+
expect(devicesAfterTimeout[0].deviceKey).toEqual(userDevice.deviceKey);
|
|
67
|
+
});
|
|
68
|
+
// This test is slightly articifical, but the idea is to make sure
|
|
69
|
+
// that expired devices are always purged on init to make sure that the DB
|
|
70
|
+
// doesn't just keep growing. We still need to remember to call initialize()
|
|
71
|
+
it('Expired devices are purged on init', async () => {
|
|
72
|
+
const userId = nanoid();
|
|
73
|
+
const userDevice = {
|
|
74
|
+
deviceKey: nanoid(),
|
|
75
|
+
fallbackKey: nanoid(),
|
|
76
|
+
};
|
|
77
|
+
const expirationMs = 500;
|
|
78
|
+
await store.saveUserDevices(userId, [userDevice], expirationMs);
|
|
79
|
+
const countBeforeTimeout = await store.deviceRecordCount();
|
|
80
|
+
expect(countBeforeTimeout).toEqual(1);
|
|
81
|
+
await new Promise((resolve) => setTimeout(resolve, expirationMs + 100));
|
|
82
|
+
const countAfterTimeout = await store.deviceRecordCount();
|
|
83
|
+
expect(countAfterTimeout).toEqual(1);
|
|
84
|
+
await store.initialize();
|
|
85
|
+
const countAfterInitialize = await store.deviceRecordCount();
|
|
86
|
+
expect(countAfterInitialize).toEqual(0);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('EncryptionDevice import/export', () => {
|
|
90
|
+
const userId = nanoid();
|
|
91
|
+
let store;
|
|
92
|
+
let device;
|
|
93
|
+
let delegate;
|
|
94
|
+
beforeEach(async () => {
|
|
95
|
+
store = new CryptoStore('test', userId);
|
|
96
|
+
await store.initialize();
|
|
97
|
+
delegate = new EncryptionDelegate();
|
|
98
|
+
device = new EncryptionDevice(delegate, store);
|
|
99
|
+
await device.init();
|
|
100
|
+
});
|
|
101
|
+
it('Export and import device state', async () => {
|
|
102
|
+
// Generate some initial state
|
|
103
|
+
const initialCurve25519Key = device.deviceCurve25519Key;
|
|
104
|
+
// Export the device state
|
|
105
|
+
const exportedDevice = await device.exportDevice();
|
|
106
|
+
// Create a new device and import the state
|
|
107
|
+
const newDevice = new EncryptionDevice(delegate, store);
|
|
108
|
+
await newDevice.init({ fromExportedDevice: exportedDevice });
|
|
109
|
+
// Check that the imported state matches the original
|
|
110
|
+
expect(newDevice.deviceCurve25519Key).toEqual(initialCurve25519Key);
|
|
111
|
+
expect(newDevice.pickleKey).toEqual(device.pickleKey);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=cryptoStore.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoStore.test.js","sourceRoot":"","sources":["../../src/tests/cryptoStore.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptionExtensions.test.d.ts","sourceRoot":"","sources":["../../src/tests/decryptionExtensions.test.ts"],"names":[],"mappings":""}
|