@towns-labs/encryption 2.0.1
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 +3 -0
- package/dist/CryptoStoreInMemory.d.ts +42 -0
- package/dist/CryptoStoreInMemory.d.ts.map +1 -0
- package/dist/CryptoStoreInMemory.js +172 -0
- package/dist/CryptoStoreInMemory.js.map +1 -0
- package/dist/CryptoStoreIndexedDb.d.ts +55 -0
- package/dist/CryptoStoreIndexedDb.d.ts.map +1 -0
- package/dist/CryptoStoreIndexedDb.js +139 -0
- package/dist/CryptoStoreIndexedDb.js.map +1 -0
- package/dist/base.d.ts +69 -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 +34 -0
- package/dist/cryptoStore.d.ts.map +1 -0
- package/dist/cryptoStore.js +17 -0
- package/dist/cryptoStore.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 +16 -0
- package/dist/encryptionDelegate.d.ts.map +1 -0
- package/dist/encryptionDelegate.js +64 -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 +745 -0
- package/dist/encryptionDevice.js.map +1 -0
- package/dist/encryptionTypes.d.ts +21 -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 +35 -0
- package/dist/groupEncryption.d.ts.map +1 -0
- package/dist/groupEncryption.js +99 -0
- package/dist/groupEncryption.js.map +1 -0
- package/dist/groupEncryptionCrypto.d.ts +125 -0
- package/dist/groupEncryptionCrypto.d.ts.map +1 -0
- package/dist/groupEncryptionCrypto.js +268 -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 +27 -0
- package/dist/hybridGroupEncryption.d.ts.map +1 -0
- package/dist/hybridGroupEncryption.js +101 -0
- package/dist/hybridGroupEncryption.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -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/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 +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ExtendedInboundGroupSessionData, GroupSessionRecord, HybridGroupSessionRecord } from './storeTypes';
|
|
2
|
+
import { InboundGroupSessionData } from './encryptionDevice';
|
|
3
|
+
import { UserDevice } from './olmLib';
|
|
4
|
+
import { CryptoStore } from './cryptoStore';
|
|
5
|
+
export declare class CryptoStoreInMemory implements CryptoStore {
|
|
6
|
+
readonly userId: string;
|
|
7
|
+
private accounts;
|
|
8
|
+
private outboundGroupSessions;
|
|
9
|
+
private inboundGroupSessions;
|
|
10
|
+
private hybridGroupSessions;
|
|
11
|
+
private devices;
|
|
12
|
+
constructor(userId: string, maxEntries?: number);
|
|
13
|
+
initialize(): Promise<void>;
|
|
14
|
+
deleteAllData(): Promise<void>;
|
|
15
|
+
deleteInboundGroupSessions(streamId: string, sessionId: string): Promise<void>;
|
|
16
|
+
deleteOutboundGrounpSessions(streamId: string): Promise<void>;
|
|
17
|
+
deleteAccount(userId: string): Promise<void>;
|
|
18
|
+
getAccount(): Promise<string>;
|
|
19
|
+
storeAccount(accountPickle: string): Promise<void>;
|
|
20
|
+
storeEndToEndOutboundGroupSession(sessionId: string, sessionData: string, streamId: string): Promise<void>;
|
|
21
|
+
getEndToEndOutboundGroupSession(streamId: string): Promise<string>;
|
|
22
|
+
getAllEndToEndOutboundGroupSessions(): Promise<GroupSessionRecord[]>;
|
|
23
|
+
getEndToEndInboundGroupSession(streamId: string, sessionId: string): Promise<InboundGroupSessionData | undefined>;
|
|
24
|
+
getHybridGroupSession(streamId: string, sessionId: string): Promise<HybridGroupSessionRecord | undefined>;
|
|
25
|
+
getHybridGroupSessionsForStream(streamId: string): Promise<HybridGroupSessionRecord[]>;
|
|
26
|
+
getAllEndToEndInboundGroupSessions(): Promise<ExtendedInboundGroupSessionData[]>;
|
|
27
|
+
getAllHybridGroupSessions(): Promise<HybridGroupSessionRecord[]>;
|
|
28
|
+
deleteHybridGroupSessions(streamId: string): Promise<void>;
|
|
29
|
+
storeEndToEndInboundGroupSession(streamId: string, sessionId: string, sessionData: InboundGroupSessionData): Promise<void>;
|
|
30
|
+
storeHybridGroupSession(sessionData: HybridGroupSessionRecord): Promise<void>;
|
|
31
|
+
getInboundGroupSessionIds(streamId: string): Promise<string[]>;
|
|
32
|
+
getHybridGroupSessionIds(streamId: string): Promise<string[]>;
|
|
33
|
+
withAccountTx<T>(fn: () => Promise<T>): Promise<T>;
|
|
34
|
+
withGroupSessions<T>(fn: () => Promise<T>): Promise<T>;
|
|
35
|
+
deviceRecordCount(): Promise<number>;
|
|
36
|
+
saveUserDevices(userId: string, devices: UserDevice[], expirationMs?: number): Promise<void>;
|
|
37
|
+
getUserDevices(userId: string): Promise<UserDevice[]>;
|
|
38
|
+
private getInboundSessionKey;
|
|
39
|
+
private getHybridSessionKey;
|
|
40
|
+
private getDeviceKey;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=CryptoStoreInMemory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CryptoStoreInMemory.d.ts","sourceRoot":"","sources":["../src/CryptoStoreInMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { DEFAULT_USER_DEVICE_EXPIRATION_TIME_MS } from './cryptoStore';
|
|
2
|
+
import { LRUCache } from 'lru-cache';
|
|
3
|
+
const DEFAULT_MAX_CRYPTO_STORE_ENTRIES = 5_000;
|
|
4
|
+
export class CryptoStoreInMemory {
|
|
5
|
+
userId;
|
|
6
|
+
accounts;
|
|
7
|
+
outboundGroupSessions;
|
|
8
|
+
inboundGroupSessions;
|
|
9
|
+
hybridGroupSessions;
|
|
10
|
+
devices;
|
|
11
|
+
constructor(userId, maxEntries = DEFAULT_MAX_CRYPTO_STORE_ENTRIES) {
|
|
12
|
+
this.userId = userId;
|
|
13
|
+
this.accounts = new LRUCache({ max: maxEntries });
|
|
14
|
+
this.outboundGroupSessions = new LRUCache({ max: maxEntries });
|
|
15
|
+
this.inboundGroupSessions = new LRUCache({ max: maxEntries });
|
|
16
|
+
this.hybridGroupSessions = new LRUCache({ max: maxEntries });
|
|
17
|
+
this.devices = new LRUCache({ max: maxEntries });
|
|
18
|
+
}
|
|
19
|
+
async initialize() {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
const expiredKeys = [];
|
|
22
|
+
for (const [key, device] of this.devices.entries()) {
|
|
23
|
+
if (device.expirationTimestamp < now) {
|
|
24
|
+
expiredKeys.push(key);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
expiredKeys.forEach((key) => this.devices.delete(key));
|
|
28
|
+
}
|
|
29
|
+
async deleteAllData() {
|
|
30
|
+
this.accounts.clear();
|
|
31
|
+
this.outboundGroupSessions.clear();
|
|
32
|
+
this.inboundGroupSessions.clear();
|
|
33
|
+
this.hybridGroupSessions.clear();
|
|
34
|
+
this.devices.clear();
|
|
35
|
+
}
|
|
36
|
+
async deleteInboundGroupSessions(streamId, sessionId) {
|
|
37
|
+
const key = this.getInboundSessionKey(streamId, sessionId);
|
|
38
|
+
this.inboundGroupSessions.delete(key);
|
|
39
|
+
}
|
|
40
|
+
async deleteOutboundGrounpSessions(streamId) {
|
|
41
|
+
this.outboundGroupSessions.delete(streamId);
|
|
42
|
+
}
|
|
43
|
+
async deleteAccount(userId) {
|
|
44
|
+
this.accounts.delete(userId);
|
|
45
|
+
}
|
|
46
|
+
async getAccount() {
|
|
47
|
+
const account = this.accounts.get(this.userId);
|
|
48
|
+
if (!account) {
|
|
49
|
+
throw new Error('account not found');
|
|
50
|
+
}
|
|
51
|
+
return account.accountPickle;
|
|
52
|
+
}
|
|
53
|
+
async storeAccount(accountPickle) {
|
|
54
|
+
this.accounts.set(this.userId, { id: this.userId, accountPickle });
|
|
55
|
+
}
|
|
56
|
+
async storeEndToEndOutboundGroupSession(sessionId, sessionData, streamId) {
|
|
57
|
+
this.outboundGroupSessions.set(streamId, { sessionId, session: sessionData, streamId });
|
|
58
|
+
}
|
|
59
|
+
async getEndToEndOutboundGroupSession(streamId) {
|
|
60
|
+
const session = this.outboundGroupSessions.get(streamId);
|
|
61
|
+
if (!session) {
|
|
62
|
+
throw new Error('session not found');
|
|
63
|
+
}
|
|
64
|
+
return session.session;
|
|
65
|
+
}
|
|
66
|
+
async getAllEndToEndOutboundGroupSessions() {
|
|
67
|
+
return Array.from(this.outboundGroupSessions.values());
|
|
68
|
+
}
|
|
69
|
+
async getEndToEndInboundGroupSession(streamId, sessionId) {
|
|
70
|
+
const key = this.getInboundSessionKey(streamId, sessionId);
|
|
71
|
+
const session = this.inboundGroupSessions.get(key);
|
|
72
|
+
if (session) {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
74
|
+
const { streamId: _, sessionId: __, ...sessionData } = session;
|
|
75
|
+
return sessionData;
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
async getHybridGroupSession(streamId, sessionId) {
|
|
80
|
+
const key = this.getHybridSessionKey(streamId, sessionId);
|
|
81
|
+
return this.hybridGroupSessions.get(key);
|
|
82
|
+
}
|
|
83
|
+
async getHybridGroupSessionsForStream(streamId) {
|
|
84
|
+
const sessions = [];
|
|
85
|
+
for (const session of this.hybridGroupSessions.values()) {
|
|
86
|
+
if (session.streamId === streamId) {
|
|
87
|
+
sessions.push(session);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return sessions;
|
|
91
|
+
}
|
|
92
|
+
async getAllEndToEndInboundGroupSessions() {
|
|
93
|
+
return Array.from(this.inboundGroupSessions.values());
|
|
94
|
+
}
|
|
95
|
+
async getAllHybridGroupSessions() {
|
|
96
|
+
return Array.from(this.hybridGroupSessions.values());
|
|
97
|
+
}
|
|
98
|
+
async deleteHybridGroupSessions(streamId) {
|
|
99
|
+
for (const session of this.hybridGroupSessions.values()) {
|
|
100
|
+
if (session.streamId === streamId) {
|
|
101
|
+
this.hybridGroupSessions.delete(this.getHybridSessionKey(session.streamId, session.sessionId));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async storeEndToEndInboundGroupSession(streamId, sessionId, sessionData) {
|
|
106
|
+
const key = this.getInboundSessionKey(streamId, sessionId);
|
|
107
|
+
this.inboundGroupSessions.set(key, { streamId, sessionId, ...sessionData });
|
|
108
|
+
}
|
|
109
|
+
async storeHybridGroupSession(sessionData) {
|
|
110
|
+
const key = this.getHybridSessionKey(sessionData.streamId, sessionData.sessionId);
|
|
111
|
+
this.hybridGroupSessions.set(key, sessionData);
|
|
112
|
+
}
|
|
113
|
+
async getInboundGroupSessionIds(streamId) {
|
|
114
|
+
const sessionIds = [];
|
|
115
|
+
for (const session of this.inboundGroupSessions.values()) {
|
|
116
|
+
if (session.streamId === streamId) {
|
|
117
|
+
sessionIds.push(session.sessionId);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return sessionIds;
|
|
121
|
+
}
|
|
122
|
+
async getHybridGroupSessionIds(streamId) {
|
|
123
|
+
const sessionIds = [];
|
|
124
|
+
for (const session of this.hybridGroupSessions.values()) {
|
|
125
|
+
if (session.streamId === streamId) {
|
|
126
|
+
sessionIds.push(session.sessionId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return sessionIds;
|
|
130
|
+
}
|
|
131
|
+
async withAccountTx(fn) {
|
|
132
|
+
// In-memory implementation doesn't need transactions
|
|
133
|
+
return await fn();
|
|
134
|
+
}
|
|
135
|
+
async withGroupSessions(fn) {
|
|
136
|
+
// In-memory implementation doesn't need transactions
|
|
137
|
+
return await fn();
|
|
138
|
+
}
|
|
139
|
+
async deviceRecordCount() {
|
|
140
|
+
return this.devices.size;
|
|
141
|
+
}
|
|
142
|
+
async saveUserDevices(userId, devices, expirationMs = DEFAULT_USER_DEVICE_EXPIRATION_TIME_MS) {
|
|
143
|
+
const expirationTimestamp = Date.now() + expirationMs;
|
|
144
|
+
for (const device of devices) {
|
|
145
|
+
const key = this.getDeviceKey(userId, device.deviceKey);
|
|
146
|
+
this.devices.set(key, { userId, expirationTimestamp, ...device });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async getUserDevices(userId) {
|
|
150
|
+
const now = Date.now();
|
|
151
|
+
const userDevices = [];
|
|
152
|
+
for (const device of this.devices.values()) {
|
|
153
|
+
if (device.userId === userId && device.expirationTimestamp > now) {
|
|
154
|
+
userDevices.push({
|
|
155
|
+
deviceKey: device.deviceKey,
|
|
156
|
+
fallbackKey: device.fallbackKey,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return userDevices;
|
|
161
|
+
}
|
|
162
|
+
getInboundSessionKey(streamId, sessionId) {
|
|
163
|
+
return `${streamId}:${sessionId}`;
|
|
164
|
+
}
|
|
165
|
+
getHybridSessionKey(streamId, sessionId) {
|
|
166
|
+
return `${streamId}:${sessionId}`;
|
|
167
|
+
}
|
|
168
|
+
getDeviceKey(userId, deviceKey) {
|
|
169
|
+
return `${userId}:${deviceKey}`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=CryptoStoreInMemory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CryptoStoreInMemory.js","sourceRoot":"","sources":["../src/CryptoStoreInMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { AccountRecord, ExtendedInboundGroupSessionData, GroupSessionRecord, HybridGroupSessionRecord, UserDeviceRecord } from './storeTypes';
|
|
2
|
+
import Dexie, { Table } from 'dexie';
|
|
3
|
+
import { InboundGroupSessionData } from './encryptionDevice';
|
|
4
|
+
import { UserDevice } from './olmLib';
|
|
5
|
+
import { CryptoStore } from './cryptoStore';
|
|
6
|
+
export declare class CryptoStoreIndexedDb extends Dexie implements CryptoStore {
|
|
7
|
+
account: Table<AccountRecord>;
|
|
8
|
+
outboundGroupSessions: Table<GroupSessionRecord>;
|
|
9
|
+
inboundGroupSessions: Table<ExtendedInboundGroupSessionData>;
|
|
10
|
+
hybridGroupSessions: Table<HybridGroupSessionRecord>;
|
|
11
|
+
devices: Table<UserDeviceRecord>;
|
|
12
|
+
userId: string;
|
|
13
|
+
constructor(databaseName: string, userId: string);
|
|
14
|
+
initialize(): Promise<void>;
|
|
15
|
+
deleteAllData(): Promise<void>;
|
|
16
|
+
deleteInboundGroupSessions(streamId: string, sessionId: string): Promise<void>;
|
|
17
|
+
deleteOutboundGrounpSessions(streamId: string): Promise<void>;
|
|
18
|
+
deleteAccount(userId: string): Promise<void>;
|
|
19
|
+
getAccount(): Promise<string>;
|
|
20
|
+
storeAccount(accountPickle: string): Promise<void>;
|
|
21
|
+
storeEndToEndOutboundGroupSession(sessionId: string, sessionData: string, streamId: string): Promise<void>;
|
|
22
|
+
getEndToEndOutboundGroupSession(streamId: string): Promise<string>;
|
|
23
|
+
getAllEndToEndOutboundGroupSessions(): Promise<GroupSessionRecord[]>;
|
|
24
|
+
getEndToEndInboundGroupSession(streamId: string, sessionId: string): Promise<InboundGroupSessionData | undefined>;
|
|
25
|
+
getHybridGroupSession(streamId: string, sessionId: string): Promise<HybridGroupSessionRecord | undefined>;
|
|
26
|
+
getHybridGroupSessionsForStream(streamId: string): Promise<HybridGroupSessionRecord[]>;
|
|
27
|
+
getAllEndToEndInboundGroupSessions(): Promise<ExtendedInboundGroupSessionData[]>;
|
|
28
|
+
getAllHybridGroupSessions(): Promise<HybridGroupSessionRecord[]>;
|
|
29
|
+
deleteHybridGroupSessions(streamId: string): Promise<void>;
|
|
30
|
+
storeEndToEndInboundGroupSession(streamId: string, sessionId: string, sessionData: InboundGroupSessionData): Promise<void>;
|
|
31
|
+
storeHybridGroupSession(sessionData: HybridGroupSessionRecord): Promise<void>;
|
|
32
|
+
getInboundGroupSessionIds(streamId: string): Promise<string[]>;
|
|
33
|
+
getHybridGroupSessionIds(streamId: string): Promise<string[]>;
|
|
34
|
+
withAccountTx<T>(fn: () => Promise<T>): Promise<T>;
|
|
35
|
+
withGroupSessions<T>(fn: () => Promise<T>): Promise<T>;
|
|
36
|
+
/**
|
|
37
|
+
* Only used for testing
|
|
38
|
+
* @returns total number of devices in the store
|
|
39
|
+
*/
|
|
40
|
+
deviceRecordCount(): Promise<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Store a list of devices for a given userId
|
|
43
|
+
* @param userId string
|
|
44
|
+
* @param devices UserDeviceInfo[]
|
|
45
|
+
* @param expirationMs Expiration time in milliseconds
|
|
46
|
+
*/
|
|
47
|
+
saveUserDevices(userId: string, devices: UserDevice[], expirationMs?: number): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get all stored devices for a given userId
|
|
50
|
+
* @param userId string
|
|
51
|
+
* @returns UserDevice[], a list of devices
|
|
52
|
+
*/
|
|
53
|
+
getUserDevices(userId: string): Promise<UserDevice[]>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=CryptoStoreIndexedDb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CryptoStoreIndexedDb.d.ts","sourceRoot":"","sources":["../src/CryptoStoreIndexedDb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import Dexie from 'dexie';
|
|
2
|
+
import { DEFAULT_USER_DEVICE_EXPIRATION_TIME_MS } from './cryptoStore';
|
|
3
|
+
export class CryptoStoreIndexedDb extends Dexie {
|
|
4
|
+
account;
|
|
5
|
+
outboundGroupSessions;
|
|
6
|
+
inboundGroupSessions;
|
|
7
|
+
hybridGroupSessions;
|
|
8
|
+
devices;
|
|
9
|
+
userId;
|
|
10
|
+
constructor(databaseName, userId) {
|
|
11
|
+
super(databaseName);
|
|
12
|
+
this.userId = userId;
|
|
13
|
+
this.version(6).stores({
|
|
14
|
+
account: 'id',
|
|
15
|
+
inboundGroupSessions: '[streamId+sessionId]',
|
|
16
|
+
outboundGroupSessions: 'streamId',
|
|
17
|
+
hybridGroupSessions: '[streamId+sessionId],streamId',
|
|
18
|
+
devices: '[userId+deviceKey],expirationTimestamp',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async initialize() {
|
|
22
|
+
await this.devices.where('expirationTimestamp').below(Date.now()).delete();
|
|
23
|
+
}
|
|
24
|
+
async deleteAllData() {
|
|
25
|
+
await this.account.clear();
|
|
26
|
+
await this.outboundGroupSessions.clear();
|
|
27
|
+
await this.inboundGroupSessions.clear();
|
|
28
|
+
await this.hybridGroupSessions.clear();
|
|
29
|
+
await this.devices.clear();
|
|
30
|
+
}
|
|
31
|
+
async deleteInboundGroupSessions(streamId, sessionId) {
|
|
32
|
+
await this.inboundGroupSessions.where({ streamId, sessionId }).delete();
|
|
33
|
+
}
|
|
34
|
+
async deleteOutboundGrounpSessions(streamId) {
|
|
35
|
+
await this.outboundGroupSessions.where({ streamId }).delete();
|
|
36
|
+
}
|
|
37
|
+
async deleteAccount(userId) {
|
|
38
|
+
await this.account.where({ id: userId }).delete();
|
|
39
|
+
}
|
|
40
|
+
async getAccount() {
|
|
41
|
+
const account = await this.account.get({ id: this.userId });
|
|
42
|
+
if (!account) {
|
|
43
|
+
throw new Error('account not found');
|
|
44
|
+
}
|
|
45
|
+
return account.accountPickle;
|
|
46
|
+
}
|
|
47
|
+
async storeAccount(accountPickle) {
|
|
48
|
+
await this.account.put({ id: this.userId, accountPickle });
|
|
49
|
+
}
|
|
50
|
+
async storeEndToEndOutboundGroupSession(sessionId, sessionData, streamId) {
|
|
51
|
+
await this.outboundGroupSessions.put({ sessionId, session: sessionData, streamId });
|
|
52
|
+
}
|
|
53
|
+
async getEndToEndOutboundGroupSession(streamId) {
|
|
54
|
+
const session = await this.outboundGroupSessions.get({ streamId });
|
|
55
|
+
if (!session) {
|
|
56
|
+
throw new Error('session not found');
|
|
57
|
+
}
|
|
58
|
+
return session.session;
|
|
59
|
+
}
|
|
60
|
+
async getAllEndToEndOutboundGroupSessions() {
|
|
61
|
+
return await this.outboundGroupSessions.toArray();
|
|
62
|
+
}
|
|
63
|
+
async getEndToEndInboundGroupSession(streamId, sessionId) {
|
|
64
|
+
return await this.inboundGroupSessions.get({ sessionId, streamId });
|
|
65
|
+
}
|
|
66
|
+
async getHybridGroupSession(streamId, sessionId) {
|
|
67
|
+
return await this.hybridGroupSessions.get({ streamId, sessionId });
|
|
68
|
+
}
|
|
69
|
+
async getHybridGroupSessionsForStream(streamId) {
|
|
70
|
+
const sessions = await this.hybridGroupSessions.where({ streamId }).toArray();
|
|
71
|
+
return sessions;
|
|
72
|
+
}
|
|
73
|
+
async getAllEndToEndInboundGroupSessions() {
|
|
74
|
+
return await this.inboundGroupSessions.toArray();
|
|
75
|
+
}
|
|
76
|
+
async getAllHybridGroupSessions() {
|
|
77
|
+
return await this.hybridGroupSessions.toArray();
|
|
78
|
+
}
|
|
79
|
+
async deleteHybridGroupSessions(streamId) {
|
|
80
|
+
await this.hybridGroupSessions.where({ streamId }).delete();
|
|
81
|
+
}
|
|
82
|
+
async storeEndToEndInboundGroupSession(streamId, sessionId, sessionData) {
|
|
83
|
+
await this.inboundGroupSessions.put({ streamId, sessionId, ...sessionData });
|
|
84
|
+
}
|
|
85
|
+
async storeHybridGroupSession(sessionData) {
|
|
86
|
+
await this.hybridGroupSessions.put({ ...sessionData });
|
|
87
|
+
}
|
|
88
|
+
async getInboundGroupSessionIds(streamId) {
|
|
89
|
+
const sessions = await this.inboundGroupSessions.where({ streamId }).toArray();
|
|
90
|
+
return sessions.map((s) => s.sessionId);
|
|
91
|
+
}
|
|
92
|
+
async getHybridGroupSessionIds(streamId) {
|
|
93
|
+
const sessions = await this.hybridGroupSessions.where({ streamId }).toArray();
|
|
94
|
+
return sessions.map((s) => s.sessionId);
|
|
95
|
+
}
|
|
96
|
+
async withAccountTx(fn) {
|
|
97
|
+
return await this.transaction('rw', this.account, fn);
|
|
98
|
+
}
|
|
99
|
+
async withGroupSessions(fn) {
|
|
100
|
+
return await this.transaction('rw', this.outboundGroupSessions, this.inboundGroupSessions, this.hybridGroupSessions, // aellis this should be in its own transaction but tests were failing otherwise
|
|
101
|
+
fn);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Only used for testing
|
|
105
|
+
* @returns total number of devices in the store
|
|
106
|
+
*/
|
|
107
|
+
async deviceRecordCount() {
|
|
108
|
+
return await this.devices.count();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Store a list of devices for a given userId
|
|
112
|
+
* @param userId string
|
|
113
|
+
* @param devices UserDeviceInfo[]
|
|
114
|
+
* @param expirationMs Expiration time in milliseconds
|
|
115
|
+
*/
|
|
116
|
+
async saveUserDevices(userId, devices, expirationMs = DEFAULT_USER_DEVICE_EXPIRATION_TIME_MS) {
|
|
117
|
+
const expirationTimestamp = Date.now() + expirationMs;
|
|
118
|
+
for (const device of devices) {
|
|
119
|
+
await this.devices.put({ userId, expirationTimestamp, ...device });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get all stored devices for a given userId
|
|
124
|
+
* @param userId string
|
|
125
|
+
* @returns UserDevice[], a list of devices
|
|
126
|
+
*/
|
|
127
|
+
async getUserDevices(userId) {
|
|
128
|
+
const expirationTimestamp = Date.now();
|
|
129
|
+
return (await this.devices
|
|
130
|
+
.where('userId')
|
|
131
|
+
.equals(userId)
|
|
132
|
+
.and((record) => record.expirationTimestamp > expirationTimestamp)
|
|
133
|
+
.toArray()).map((record) => ({
|
|
134
|
+
deviceKey: record.deviceKey,
|
|
135
|
+
fallbackKey: record.fallbackKey,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=CryptoStoreIndexedDb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CryptoStoreIndexedDb.js","sourceRoot":"","sources":["../src/CryptoStoreIndexedDb.ts"],"names":[],"mappings":"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"}
|
package/dist/base.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { GroupEncryptionAlgorithmId, GroupEncryptionSession } from './olmLib';
|
|
2
|
+
import { EncryptionDevice } from './encryptionDevice';
|
|
3
|
+
import { EncryptedData } from '@towns-labs/proto';
|
|
4
|
+
export interface IGroupEncryptionClient {
|
|
5
|
+
encryptAndShareGroupSessionsToStream(streamId: string, sessions: GroupEncryptionSession[], algorithm: GroupEncryptionAlgorithmId, priorityUserIds: string[]): Promise<void>;
|
|
6
|
+
getMiniblockInfo(streamId: string): Promise<{
|
|
7
|
+
miniblockNum: bigint;
|
|
8
|
+
miniblockHash: Uint8Array;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export interface IDecryptionParams {
|
|
12
|
+
/** olm.js wrapper */
|
|
13
|
+
device: EncryptionDevice;
|
|
14
|
+
}
|
|
15
|
+
export interface IEncryptionParams {
|
|
16
|
+
client: IGroupEncryptionClient;
|
|
17
|
+
/** olm.js wrapper */
|
|
18
|
+
device: EncryptionDevice;
|
|
19
|
+
}
|
|
20
|
+
export interface EnsureOutboundSessionOpts {
|
|
21
|
+
shareShareSessionTimeoutMs?: number;
|
|
22
|
+
priorityUserIds?: string[];
|
|
23
|
+
miniblockInfo?: {
|
|
24
|
+
miniblockNum: bigint;
|
|
25
|
+
miniblockHash: Uint8Array;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* base type for encryption implementations
|
|
30
|
+
*/
|
|
31
|
+
export declare abstract class EncryptionAlgorithm implements IEncryptionParams {
|
|
32
|
+
readonly device: EncryptionDevice;
|
|
33
|
+
readonly client: IGroupEncryptionClient;
|
|
34
|
+
/**
|
|
35
|
+
* @param params - parameters
|
|
36
|
+
*/
|
|
37
|
+
constructor(params: IEncryptionParams);
|
|
38
|
+
abstract ensureOutboundSession(streamId: string, opts?: EnsureOutboundSessionOpts): Promise<string>;
|
|
39
|
+
abstract hasOutboundSession(streamId: string): Promise<boolean>;
|
|
40
|
+
abstract encrypt_deprecated_v0(streamId: string, payload: string): Promise<EncryptedData>;
|
|
41
|
+
abstract encrypt(streamId: string, payload: Uint8Array): Promise<EncryptedData>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* base type for decryption implementations
|
|
45
|
+
*/
|
|
46
|
+
export declare abstract class DecryptionAlgorithm implements IDecryptionParams {
|
|
47
|
+
readonly device: EncryptionDevice;
|
|
48
|
+
constructor(params: IDecryptionParams);
|
|
49
|
+
abstract decrypt(streamId: string, content: EncryptedData): Promise<Uint8Array | string>;
|
|
50
|
+
abstract importStreamKey(streamId: string, session: GroupEncryptionSession): Promise<void>;
|
|
51
|
+
abstract exportGroupSession(streamId: string, sessionId: string): Promise<GroupEncryptionSession | undefined>;
|
|
52
|
+
abstract exportGroupSessions(): Promise<GroupEncryptionSession[]>;
|
|
53
|
+
abstract exportGroupSessionIds(streamId: string): Promise<string[]>;
|
|
54
|
+
abstract hasSessionKey(streamId: string, sessionId: string): Promise<boolean>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Exception thrown when decryption fails
|
|
58
|
+
*
|
|
59
|
+
* @param msg - user-visible message describing the problem
|
|
60
|
+
*
|
|
61
|
+
* @param details - key/value pairs reported in the logs but not shown
|
|
62
|
+
* to the user.
|
|
63
|
+
*/
|
|
64
|
+
export declare class DecryptionError extends Error {
|
|
65
|
+
readonly code: string;
|
|
66
|
+
constructor(code: string, msg: string);
|
|
67
|
+
}
|
|
68
|
+
export declare function isDecryptionError(e: Error): e is DecryptionError;
|
|
69
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
|
package/dist/base.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* base type for encryption implementations
|
|
3
|
+
*/
|
|
4
|
+
export class EncryptionAlgorithm {
|
|
5
|
+
device;
|
|
6
|
+
client;
|
|
7
|
+
/**
|
|
8
|
+
* @param params - parameters
|
|
9
|
+
*/
|
|
10
|
+
constructor(params) {
|
|
11
|
+
this.device = params.device;
|
|
12
|
+
this.client = params.client;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* base type for decryption implementations
|
|
17
|
+
*/
|
|
18
|
+
export class DecryptionAlgorithm {
|
|
19
|
+
device;
|
|
20
|
+
constructor(params) {
|
|
21
|
+
this.device = params.device;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Exception thrown when decryption fails
|
|
26
|
+
*
|
|
27
|
+
* @param msg - user-visible message describing the problem
|
|
28
|
+
*
|
|
29
|
+
* @param details - key/value pairs reported in the logs but not shown
|
|
30
|
+
* to the user.
|
|
31
|
+
*/
|
|
32
|
+
export class DecryptionError extends Error {
|
|
33
|
+
code;
|
|
34
|
+
constructor(code, msg) {
|
|
35
|
+
super(msg);
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.code = code;
|
|
38
|
+
this.name = 'DecryptionError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function isDecryptionError(e) {
|
|
42
|
+
return e.name === 'DecryptionError';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=base.js.map
|
package/dist/base.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAgCA;;GAEG;AACH,MAAM,OAAgB,mBAAmB;IACrB,MAAM,CAAkB;IACxB,MAAM,CAAwB;IAE9C;;OAEG;IACH,YAAmB,MAAyB;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC/B,CAAC;CAWJ;AAED;;GAEG;AACH,MAAM,OAAgB,mBAAmB;IACrB,MAAM,CAAkB;IAExC,YAAmB,MAAyB;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC/B,CAAC;CAcJ;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAElB;IADpB,YACoB,IAAY,EAC5B,GAAW;QAEX,KAAK,CAAC,GAAG,CAAC,CAAA;QAHM,SAAI,GAAJ,IAAI,CAAQ;QAI5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IACjC,CAAC;CACJ;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAQ;IACtC,OAAO,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function generateNewAesGcmKey(): Promise<CryptoKey>;
|
|
2
|
+
export declare function exportAesGsmKeyBytes(key: CryptoKey): Promise<Uint8Array>;
|
|
3
|
+
export declare function importAesGsmKeyBytes(key: Uint8Array): Promise<CryptoKey>;
|
|
4
|
+
export declare function encryptAesGcm(key: CryptoKey, data: Uint8Array): Promise<{
|
|
5
|
+
ciphertext: Uint8Array;
|
|
6
|
+
iv: Uint8Array;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function decryptAesGcm(key: CryptoKey, ciphertext: Uint8Array, iv: Uint8Array): Promise<Uint8Array>;
|
|
9
|
+
//# sourceMappingURL=cryptoAesGcm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoAesGcm.d.ts","sourceRoot":"","sources":["../src/cryptoAesGcm.ts"],"names":[],"mappings":"AAAA,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,CAAC,CAE/D;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAG9E;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAE9E;AAED,wBAAsB,aAAa,CAC/B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACjB,OAAO,CAAC;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,CAAC,CAYrD;AAED,wBAAsB,aAAa,CAC/B,GAAG,EAAE,SAAS,EACd,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAarB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export async function generateNewAesGcmKey() {
|
|
2
|
+
return crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, ['encrypt', 'decrypt']);
|
|
3
|
+
}
|
|
4
|
+
export async function exportAesGsmKeyBytes(key) {
|
|
5
|
+
const exportedKey = await crypto.subtle.exportKey('raw', key);
|
|
6
|
+
return new Uint8Array(exportedKey);
|
|
7
|
+
}
|
|
8
|
+
export async function importAesGsmKeyBytes(key) {
|
|
9
|
+
return crypto.subtle.importKey('raw', key, 'AES-GCM', true, ['encrypt', 'decrypt']);
|
|
10
|
+
}
|
|
11
|
+
export async function encryptAesGcm(key, data) {
|
|
12
|
+
// If data is empty, it's obvious what the message is from the result length.
|
|
13
|
+
if (data.length === 0) {
|
|
14
|
+
throw new Error('Data to encrypt cannot be empty');
|
|
15
|
+
}
|
|
16
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
17
|
+
const encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv, tagLength: 128 }, key, data);
|
|
18
|
+
return { ciphertext: new Uint8Array(encrypted), iv };
|
|
19
|
+
}
|
|
20
|
+
export async function decryptAesGcm(key, ciphertext, iv) {
|
|
21
|
+
if (iv.length !== 12) {
|
|
22
|
+
throw new Error('IV must be 12 bytes');
|
|
23
|
+
}
|
|
24
|
+
if (ciphertext.length < 17) {
|
|
25
|
+
throw new Error('Ciphertext can not be this short');
|
|
26
|
+
}
|
|
27
|
+
const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv, tagLength: 128 }, key, ciphertext);
|
|
28
|
+
return new Uint8Array(decrypted);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=cryptoAesGcm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoAesGcm.js","sourceRoot":"","sources":["../src/cryptoAesGcm.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;AACpG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAc;IACrD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC7D,OAAO,IAAI,UAAU,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAe;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,GAAc,EACd,IAAgB;IAEhB,6EAA6E;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CACzC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EACvC,GAAG,EACH,IAAI,CACP,CAAA;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAA;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,GAAc,EACd,UAAsB,EACtB,EAAc;IAEd,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACvD,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CACzC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EACvC,GAAG,EACH,UAAU,CACb,CAAA;IACD,OAAO,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;AACpC,CAAC"}
|