@wireapp/core 17.29.0 → 17.31.2
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/CHANGELOG.md +41 -0
- package/package.json +8 -8
- package/src/main/conversation/ConversationMapper.js +2 -0
- package/src/main/conversation/ConversationService.d.ts +5 -2
- package/src/main/conversation/ConversationService.js +0 -2
- package/src/main/conversation/message/PayloadBundle.d.ts +3 -0
- package/src/main/cryptography/GenericMessageMapper.d.ts +0 -1
- package/src/main/cryptography/GenericMessageMapper.js +23 -158
- package/src/main/Account.js.map +0 -1
- package/src/main/Account.test.browser.js +0 -114
- package/src/main/Account.test.node.d.ts +0 -1
- package/src/main/Account.test.node.js +0 -214
- package/src/main/Account.test.node.js.map +0 -1
- package/src/main/Account.test.node.ts +0 -236
- package/src/main/Account.ts +0 -401
- package/src/main/CoreError.js.map +0 -1
- package/src/main/CoreError.ts +0 -30
- package/src/main/auth/LoginSanitizer.js.map +0 -1
- package/src/main/auth/LoginSanitizer.test.node.d.ts +0 -1
- package/src/main/auth/LoginSanitizer.test.node.js +0 -56
- package/src/main/auth/LoginSanitizer.test.node.js.map +0 -1
- package/src/main/auth/LoginSanitizer.test.node.ts +0 -68
- package/src/main/auth/LoginSanitizer.ts +0 -44
- package/src/main/auth/index.js.map +0 -1
- package/src/main/auth/index.ts +0 -20
- package/src/main/broadcast/AvailabilityType.js.map +0 -1
- package/src/main/broadcast/AvailabilityType.ts +0 -22
- package/src/main/broadcast/BroadcastService.js.map +0 -1
- package/src/main/broadcast/BroadcastService.ts +0 -66
- package/src/main/broadcast/index.js.map +0 -1
- package/src/main/broadcast/index.ts +0 -21
- package/src/main/client/ClientBackendRepository.js.map +0 -1
- package/src/main/client/ClientBackendRepository.ts +0 -33
- package/src/main/client/ClientDatabaseRepository.js.map +0 -1
- package/src/main/client/ClientDatabaseRepository.ts +0 -130
- package/src/main/client/ClientInfo.js.map +0 -1
- package/src/main/client/ClientInfo.ts +0 -28
- package/src/main/client/ClientService.js.map +0 -1
- package/src/main/client/ClientService.ts +0 -116
- package/src/main/client/index.js.map +0 -1
- package/src/main/client/index.ts +0 -23
- package/src/main/connection/ConnectionService.js.map +0 -1
- package/src/main/connection/ConnectionService.ts +0 -49
- package/src/main/connection/index.js.map +0 -1
- package/src/main/connection/index.ts +0 -20
- package/src/main/conversation/AbortReason.js.map +0 -1
- package/src/main/conversation/AbortReason.ts +0 -22
- package/src/main/conversation/AssetService.js.map +0 -1
- package/src/main/conversation/AssetService.test.node.d.ts +0 -1
- package/src/main/conversation/AssetService.test.node.js +0 -61
- package/src/main/conversation/AssetService.test.node.js.map +0 -1
- package/src/main/conversation/AssetService.test.node.ts +0 -65
- package/src/main/conversation/AssetService.ts +0 -60
- package/src/main/conversation/AssetTransferState.js.map +0 -1
- package/src/main/conversation/AssetTransferState.ts +0 -23
- package/src/main/conversation/ClientActionType.js.map +0 -1
- package/src/main/conversation/ClientActionType.ts +0 -20
- package/src/main/conversation/ConversationMapper.js.map +0 -1
- package/src/main/conversation/ConversationMapper.test.node.d.ts +0 -1
- package/src/main/conversation/ConversationMapper.test.node.js +0 -111
- package/src/main/conversation/ConversationMapper.test.node.js.map +0 -1
- package/src/main/conversation/ConversationMapper.test.node.ts +0 -154
- package/src/main/conversation/ConversationMapper.ts +0 -54
- package/src/main/conversation/ConversationService.js.map +0 -1
- package/src/main/conversation/ConversationService.test.node.d.ts +0 -1
- package/src/main/conversation/ConversationService.test.node.js +0 -344
- package/src/main/conversation/ConversationService.test.node.js.map +0 -1
- package/src/main/conversation/ConversationService.test.node.ts +0 -416
- package/src/main/conversation/ConversationService.ts +0 -1020
- package/src/main/conversation/GenericMessageType.js.map +0 -1
- package/src/main/conversation/GenericMessageType.ts +0 -44
- package/src/main/conversation/MessageTimer.js.map +0 -1
- package/src/main/conversation/MessageTimer.test.node.d.ts +0 -1
- package/src/main/conversation/MessageTimer.test.node.js +0 -88
- package/src/main/conversation/MessageTimer.test.node.js.map +0 -1
- package/src/main/conversation/MessageTimer.test.node.ts +0 -103
- package/src/main/conversation/MessageTimer.ts +0 -56
- package/src/main/conversation/ReactionType.js.map +0 -1
- package/src/main/conversation/ReactionType.ts +0 -23
- package/src/main/conversation/content/AssetContent.js.map +0 -1
- package/src/main/conversation/content/AssetContent.ts +0 -71
- package/src/main/conversation/content/ButtonActionConfirmationContent.js.map +0 -1
- package/src/main/conversation/content/ButtonActionConfirmationContent.ts +0 -21
- package/src/main/conversation/content/ButtonActionContent.js.map +0 -1
- package/src/main/conversation/content/ButtonActionContent.ts +0 -21
- package/src/main/conversation/content/CallingContent.js.map +0 -1
- package/src/main/conversation/content/CallingContent.ts +0 -20
- package/src/main/conversation/content/ClearedContent.js.map +0 -1
- package/src/main/conversation/content/ClearedContent.ts +0 -21
- package/src/main/conversation/content/ClientActionContent.js.map +0 -1
- package/src/main/conversation/content/ClientActionContent.ts +0 -22
- package/src/main/conversation/content/ClientAddContent.js.map +0 -1
- package/src/main/conversation/content/ClientAddContent.ts +0 -24
- package/src/main/conversation/content/ClientRemoveContent.js.map +0 -1
- package/src/main/conversation/content/ClientRemoveContent.ts +0 -25
- package/src/main/conversation/content/CompositeContent.js.map +0 -1
- package/src/main/conversation/content/CompositeContent.ts +0 -21
- package/src/main/conversation/content/ConfirmationContent.js.map +0 -1
- package/src/main/conversation/content/ConfirmationContent.ts +0 -21
- package/src/main/conversation/content/ContentType.js.map +0 -1
- package/src/main/conversation/content/ContentType.ts +0 -112
- package/src/main/conversation/content/ConversationContent.js.map +0 -1
- package/src/main/conversation/content/ConversationContent.ts +0 -71
- package/src/main/conversation/content/DeletedContent.js.map +0 -1
- package/src/main/conversation/content/DeletedContent.ts +0 -21
- package/src/main/conversation/content/EditedTextContent.js.map +0 -1
- package/src/main/conversation/content/EditedTextContent.ts +0 -31
- package/src/main/conversation/content/FileContent.js.map +0 -1
- package/src/main/conversation/content/FileContent.ts +0 -32
- package/src/main/conversation/content/HiddenContent.js.map +0 -1
- package/src/main/conversation/content/HiddenContent.ts +0 -21
- package/src/main/conversation/content/ImageContent.js.map +0 -1
- package/src/main/conversation/content/ImageContent.ts +0 -25
- package/src/main/conversation/content/KnockContent.js.map +0 -1
- package/src/main/conversation/content/KnockContent.ts +0 -21
- package/src/main/conversation/content/LinkPreviewContent.js.map +0 -1
- package/src/main/conversation/content/LinkPreviewContent.ts +0 -32
- package/src/main/conversation/content/LocationContent.js.map +0 -1
- package/src/main/conversation/content/LocationContent.ts +0 -29
- package/src/main/conversation/content/MentionContent.js.map +0 -1
- package/src/main/conversation/content/MentionContent.ts +0 -21
- package/src/main/conversation/content/QuoteContent.js.map +0 -1
- package/src/main/conversation/content/QuoteContent.ts +0 -29
- package/src/main/conversation/content/ReactionContent.js.map +0 -1
- package/src/main/conversation/content/ReactionContent.ts +0 -27
- package/src/main/conversation/content/TextContent.js.map +0 -1
- package/src/main/conversation/content/TextContent.ts +0 -29
- package/src/main/conversation/content/TweetContent.js.map +0 -1
- package/src/main/conversation/content/TweetContent.ts +0 -21
- package/src/main/conversation/content/index.js.map +0 -1
- package/src/main/conversation/content/index.ts +0 -49
- package/src/main/conversation/index.js.map +0 -1
- package/src/main/conversation/index.ts +0 -28
- package/src/main/conversation/message/CompositeContentBuilder.js.map +0 -1
- package/src/main/conversation/message/CompositeContentBuilder.ts +0 -60
- package/src/main/conversation/message/Message.js.map +0 -1
- package/src/main/conversation/message/Message.ts +0 -24
- package/src/main/conversation/message/MessageBuilder.js.map +0 -1
- package/src/main/conversation/message/MessageBuilder.test.browser.js +0 -27
- package/src/main/conversation/message/MessageBuilder.ts +0 -488
- package/src/main/conversation/message/MessageService.js.map +0 -1
- package/src/main/conversation/message/MessageService.test.node.d.ts +0 -1
- package/src/main/conversation/message/MessageService.test.node.js +0 -308
- package/src/main/conversation/message/MessageService.test.node.js.map +0 -1
- package/src/main/conversation/message/MessageService.test.node.ts +0 -398
- package/src/main/conversation/message/MessageService.ts +0 -383
- package/src/main/conversation/message/MessageToProtoMapper.js.map +0 -1
- package/src/main/conversation/message/MessageToProtoMapper.ts +0 -114
- package/src/main/conversation/message/OtrMessage.js.map +0 -1
- package/src/main/conversation/message/OtrMessage.ts +0 -160
- package/src/main/conversation/message/PayloadBundle.js.map +0 -1
- package/src/main/conversation/message/PayloadBundle.ts +0 -98
- package/src/main/conversation/message/TeamMessage.js.map +0 -1
- package/src/main/conversation/message/TeamMessage.ts +0 -72
- package/src/main/conversation/message/TextContentBuilder.js.map +0 -1
- package/src/main/conversation/message/TextContentBuilder.ts +0 -88
- package/src/main/conversation/message/UserClientsUtil.js.map +0 -1
- package/src/main/conversation/message/UserClientsUtil.ts +0 -44
- package/src/main/conversation/message/UserClientsUtils.test.node.d.ts +0 -1
- package/src/main/conversation/message/UserClientsUtils.test.node.js +0 -42
- package/src/main/conversation/message/UserClientsUtils.test.node.js.map +0 -1
- package/src/main/conversation/message/UserClientsUtils.test.node.ts +0 -44
- package/src/main/conversation/message/UserMessage.js.map +0 -1
- package/src/main/conversation/message/UserMessage.ts +0 -95
- package/src/main/cryptography/AssetCryptography.browser.js.map +0 -1
- package/src/main/cryptography/AssetCryptography.browser.ts +0 -76
- package/src/main/cryptography/AssetCryptography.node.js.map +0 -1
- package/src/main/cryptography/AssetCryptography.node.ts +0 -85
- package/src/main/cryptography/CryptographyDatabaseRepository.js.map +0 -1
- package/src/main/cryptography/CryptographyDatabaseRepository.ts +0 -44
- package/src/main/cryptography/CryptographyService.js.map +0 -1
- package/src/main/cryptography/CryptographyService.test.browser.js +0 -195
- package/src/main/cryptography/CryptographyService.test.node.d.ts +0 -1
- package/src/main/cryptography/CryptographyService.test.node.js +0 -228
- package/src/main/cryptography/CryptographyService.test.node.js.map +0 -1
- package/src/main/cryptography/CryptographyService.test.node.ts +0 -246
- package/src/main/cryptography/CryptographyService.ts +0 -246
- package/src/main/cryptography/EncryptedAsset.js.map +0 -1
- package/src/main/cryptography/EncryptedAsset.ts +0 -30
- package/src/main/cryptography/GenericMessageMapper.js.map +0 -1
- package/src/main/cryptography/GenericMessageMapper.ts +0 -364
- package/src/main/cryptography/MessageHashService.js.map +0 -1
- package/src/main/cryptography/MessageHashService.test.browser.js +0 -176
- package/src/main/cryptography/MessageHashService.test.node.d.ts +0 -1
- package/src/main/cryptography/MessageHashService.test.node.js +0 -138
- package/src/main/cryptography/MessageHashService.test.node.js.map +0 -1
- package/src/main/cryptography/MessageHashService.test.node.ts +0 -176
- package/src/main/cryptography/MessageHashService.ts +0 -109
- package/src/main/cryptography/SessionPayloadBundle.js.map +0 -1
- package/src/main/cryptography/SessionPayloadBundle.ts +0 -23
- package/src/main/cryptography/index.js.map +0 -1
- package/src/main/cryptography/index.ts +0 -23
- package/src/main/giphy/GiphyService.js.map +0 -1
- package/src/main/giphy/GiphyService.ts +0 -37
- package/src/main/giphy/index.js.map +0 -1
- package/src/main/giphy/index.ts +0 -20
- package/src/main/index.js.map +0 -1
- package/src/main/index.test.browser.js +0 -22
- package/src/main/index.ts +0 -34
- package/src/main/notification/NotificationBackendRepository.js.map +0 -1
- package/src/main/notification/NotificationBackendRepository.ts +0 -33
- package/src/main/notification/NotificationDatabaseRepository.js.map +0 -1
- package/src/main/notification/NotificationDatabaseRepository.ts +0 -74
- package/src/main/notification/NotificationService.js.map +0 -1
- package/src/main/notification/NotificationService.test.browser.js +0 -179
- package/src/main/notification/NotificationService.test.node.d.ts +0 -1
- package/src/main/notification/NotificationService.test.node.js +0 -99
- package/src/main/notification/NotificationService.test.node.js.map +0 -1
- package/src/main/notification/NotificationService.test.node.ts +0 -124
- package/src/main/notification/NotificationService.ts +0 -260
- package/src/main/notification/index.js.map +0 -1
- package/src/main/notification/index.ts +0 -20
- package/src/main/self/SelfService.js.map +0 -1
- package/src/main/self/SelfService.ts +0 -59
- package/src/main/self/index.js.map +0 -1
- package/src/main/self/index.ts +0 -20
- package/src/main/team/TeamService.js.map +0 -1
- package/src/main/team/TeamService.ts +0 -68
- package/src/main/team/index.js.map +0 -1
- package/src/main/team/index.ts +0 -20
- package/src/main/test/CryptographyHelper.js.map +0 -1
- package/src/main/test/CryptographyHelper.ts +0 -57
- package/src/main/test/PayloadHelper.js.map +0 -1
- package/src/main/test/PayloadHelper.ts +0 -60
- package/src/main/user/UserMapper.js.map +0 -1
- package/src/main/user/UserMapper.test.node.d.ts +0 -1
- package/src/main/user/UserMapper.test.node.js +0 -55
- package/src/main/user/UserMapper.test.node.js.map +0 -1
- package/src/main/user/UserMapper.test.node.ts +0 -63
- package/src/main/user/UserMapper.ts +0 -92
- package/src/main/user/UserService.js.map +0 -1
- package/src/main/user/UserService.test.node.js +0 -141
- package/src/main/user/UserService.ts +0 -98
- package/src/main/user/index.js.map +0 -1
- package/src/main/user/index.ts +0 -20
- package/src/main/util/TypePredicateUtil.js.map +0 -1
- package/src/main/util/TypePredicateUtil.test.node.d.ts +0 -1
- package/src/main/util/TypePredicateUtil.test.node.js +0 -42
- package/src/main/util/TypePredicateUtil.test.node.js.map +0 -1
- package/src/main/util/TypePredicateUtil.test.node.ts +0 -44
- package/src/main/util/TypePredicateUtil.ts +0 -52
- package/src/main/util/index.js.map +0 -1
- package/src/main/util/index.ts +0 -20
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Wire
|
|
3
|
-
* Copyright (C) 2018 Wire Swiss GmbH
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
17
|
-
*
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type {CipherOptions} from '@wireapp/api-client/src/asset';
|
|
21
|
-
import * as crypto from 'crypto';
|
|
22
|
-
|
|
23
|
-
import type {EncryptedAsset} from '../cryptography/';
|
|
24
|
-
|
|
25
|
-
interface EncryptOptions extends CipherOptions {
|
|
26
|
-
plainText: Buffer | Uint8Array;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const isEqual = (a: Buffer, b: Buffer): boolean => {
|
|
30
|
-
const arrayA = new Uint32Array(a);
|
|
31
|
-
const arrayB = new Uint32Array(b);
|
|
32
|
-
|
|
33
|
-
const hasSameLength = arrayA.length === arrayB.length;
|
|
34
|
-
const hasSameValues = arrayA.every((value, index) => value === arrayB[index]);
|
|
35
|
-
|
|
36
|
-
return hasSameLength && hasSameValues;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export const decryptAsset = async ({
|
|
40
|
-
cipherText,
|
|
41
|
-
keyBytes,
|
|
42
|
-
sha256: referenceSha256,
|
|
43
|
-
}: EncryptedAsset): Promise<Buffer> => {
|
|
44
|
-
const computedSha256 = crypto.createHash('SHA256').update(cipherText).digest();
|
|
45
|
-
|
|
46
|
-
if (!isEqual(computedSha256, referenceSha256)) {
|
|
47
|
-
throw new Error('Encrypted asset does not match its SHA-256 hash');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const initializationVector = cipherText.slice(0, 16);
|
|
51
|
-
const assetCipherText = cipherText.slice(16);
|
|
52
|
-
|
|
53
|
-
const decipher = crypto.createDecipheriv('AES-256-CBC', keyBytes, initializationVector);
|
|
54
|
-
const decipherUpdated = decipher.update(assetCipherText);
|
|
55
|
-
const decipherFinal = decipher.final();
|
|
56
|
-
|
|
57
|
-
return Buffer.concat([decipherUpdated, decipherFinal]);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
export const encryptAsset = async ({
|
|
61
|
-
plainText,
|
|
62
|
-
algorithm = 'AES-256-CBC',
|
|
63
|
-
hash,
|
|
64
|
-
}: EncryptOptions): Promise<EncryptedAsset> => {
|
|
65
|
-
const initializationVector = crypto.randomBytes(16);
|
|
66
|
-
const keyBytes = crypto.randomBytes(32);
|
|
67
|
-
|
|
68
|
-
const cipher = crypto.createCipheriv(algorithm, keyBytes, initializationVector);
|
|
69
|
-
const cipherUpdated = cipher.update(plainText);
|
|
70
|
-
const cipherFinal = cipher.final();
|
|
71
|
-
|
|
72
|
-
const cipherText = Buffer.concat([cipherUpdated, cipherFinal]);
|
|
73
|
-
|
|
74
|
-
const ivCipherText = new Uint8Array(initializationVector.byteLength + cipherText.byteLength);
|
|
75
|
-
ivCipherText.set(initializationVector, 0);
|
|
76
|
-
ivCipherText.set(cipherText, initializationVector.byteLength);
|
|
77
|
-
|
|
78
|
-
const computedHash = hash || crypto.createHash('SHA256').update(Buffer.from(ivCipherText.buffer)).digest();
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
cipherText: Buffer.from(ivCipherText.buffer),
|
|
82
|
-
keyBytes,
|
|
83
|
-
sha256: computedHash,
|
|
84
|
-
};
|
|
85
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CryptographyDatabaseRepository.js","sourceRoot":"","sources":["CryptographyDatabaseRepository.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAIH,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,qCAAmB,CAAA;IACnB,+BAAa,CAAA;IACb,sCAAoB,CAAA;IACpB,uCAAqB,CAAA;AACvB,CAAC,EANW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAMzB;AAED,MAAa,8BAA8B;IAGzC,YAA6B,WAAuB;QAAvB,gBAAW,GAAX,WAAW,CAAY;IAAG,CAAC;IAEjD,YAAY;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC;YACjB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,OAAO,CAAC;YACzE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,OAAO,CAAC;YACzE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC;YACtE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC1E,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC3E,CAAC,CAAC;IACL,CAAC;;AAbH,wEAcC;AAbwB,qCAAM,GAAG,cAAc,CAAC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Wire
|
|
3
|
-
* Copyright (C) 2018 Wire Swiss GmbH
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
17
|
-
*
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type {CRUDEngine} from '@wireapp/store-engine';
|
|
21
|
-
|
|
22
|
-
export enum DatabaseStores {
|
|
23
|
-
AMPLIFY = 'amplify',
|
|
24
|
-
CLIENTS = 'clients',
|
|
25
|
-
KEYS = 'keys',
|
|
26
|
-
PRE_KEYS = 'prekeys',
|
|
27
|
-
SESSIONS = 'sessions',
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class CryptographyDatabaseRepository {
|
|
31
|
-
public static readonly STORES = DatabaseStores;
|
|
32
|
-
|
|
33
|
-
constructor(private readonly storeEngine: CRUDEngine) {}
|
|
34
|
-
|
|
35
|
-
public deleteStores(): Promise<boolean[]> {
|
|
36
|
-
return Promise.all([
|
|
37
|
-
this.storeEngine.deleteAll(CryptographyDatabaseRepository.STORES.AMPLIFY),
|
|
38
|
-
this.storeEngine.deleteAll(CryptographyDatabaseRepository.STORES.CLIENTS),
|
|
39
|
-
this.storeEngine.deleteAll(CryptographyDatabaseRepository.STORES.KEYS),
|
|
40
|
-
this.storeEngine.deleteAll(CryptographyDatabaseRepository.STORES.SESSIONS),
|
|
41
|
-
this.storeEngine.deleteAll(CryptographyDatabaseRepository.STORES.PRE_KEYS),
|
|
42
|
-
]);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CryptographyService.js","sourceRoot":"","sources":["CryptographyService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Wire
|
|
3
|
-
* Copyright (C) 2018 Wire Swiss GmbH
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
17
|
-
*
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/* eslint-disable no-magic-numbers */
|
|
21
|
-
const bazinga64 = require('bazinga64');
|
|
22
|
-
const Proteus = require('@wireapp/proteus');
|
|
23
|
-
const {Cryptobox} = require('@wireapp/cryptobox');
|
|
24
|
-
const {CryptographyService} = require('@wireapp/core/src/main/cryptography/');
|
|
25
|
-
const {MemoryEngine} = require('@wireapp/store-engine');
|
|
26
|
-
const {decryptAsset, encryptAsset} = require('@wireapp/core/src/main/cryptography/AssetCryptography.browser');
|
|
27
|
-
|
|
28
|
-
async function createEngine(storeName) {
|
|
29
|
-
const engine = new MemoryEngine();
|
|
30
|
-
await engine.init(storeName);
|
|
31
|
-
return engine;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
describe('CryptographyService', () => {
|
|
35
|
-
let cryptography;
|
|
36
|
-
let aliceLastResortPreKey;
|
|
37
|
-
let bob;
|
|
38
|
-
|
|
39
|
-
beforeAll(async () => {
|
|
40
|
-
await Proteus.init();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
beforeEach(async () => {
|
|
44
|
-
cryptography = new CryptographyService(undefined, await createEngine('wire'), undefined);
|
|
45
|
-
const preKeys = await cryptography.cryptobox.create();
|
|
46
|
-
aliceLastResortPreKey = preKeys.filter(preKey => preKey.key_id === Proteus.keys.PreKey.MAX_PREKEY_ID)[0];
|
|
47
|
-
bob = new Cryptobox(await createEngine('wire'));
|
|
48
|
-
return bob.create();
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
describe('"constructor"', () => {
|
|
52
|
-
it('creates an instance.', () => {
|
|
53
|
-
expect(cryptography.cryptobox.identity.public_key.fingerprint()).toBeDefined();
|
|
54
|
-
expect(cryptography).toBeDefined();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('"constructSessionId"', () => {
|
|
59
|
-
it('constructs a Session ID by a given User ID and Client ID.', () => {
|
|
60
|
-
const clientId = '1ceb9063fced26d3';
|
|
61
|
-
const userId = 'afbb5d60-1187-4385-9c29-7361dea79647';
|
|
62
|
-
const actual = CryptographyService.constructSessionId(userId, clientId);
|
|
63
|
-
expect(actual).toContain(clientId);
|
|
64
|
-
expect(actual).toContain(userId);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
describe('"decrypt"', () => {
|
|
69
|
-
it('decrypts a Base64-encoded cipher message.', async () => {
|
|
70
|
-
const alicePublicKey = cryptography.cryptobox.identity.public_key;
|
|
71
|
-
const publicPreKeyBundle = new Proteus.keys.PreKeyBundle(alicePublicKey, aliceLastResortPreKey);
|
|
72
|
-
const text = 'Hello Alice!';
|
|
73
|
-
const encryptedPreKeyMessage = await bob.encrypt(
|
|
74
|
-
'alice-user-id@alice-client-id',
|
|
75
|
-
text,
|
|
76
|
-
publicPreKeyBundle.serialise(),
|
|
77
|
-
);
|
|
78
|
-
const encodedPreKeyMessage = bazinga64.Encoder.toBase64(encryptedPreKeyMessage).asString;
|
|
79
|
-
const decryptedMessage = await cryptography.decrypt('bob-user-id@bob-client-id', encodedPreKeyMessage);
|
|
80
|
-
const plaintext = Buffer.from(decryptedMessage).toString('utf8');
|
|
81
|
-
expect(plaintext).toBe(text);
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
describe('"encrypt"', () => {
|
|
86
|
-
it('generates a set of encrypted data based on PreKeys from multiple clients.', async () => {
|
|
87
|
-
const firstUserID = 'bc0c99f1-49a5-4ad2-889a-62885af37088';
|
|
88
|
-
const secondUserID = '2bde49aa-bdb5-458f-98cf-7d3552b10916';
|
|
89
|
-
|
|
90
|
-
const firstClientId = '2b83ee08d7ac550d';
|
|
91
|
-
|
|
92
|
-
const preKeyBundleMap = {
|
|
93
|
-
[firstUserID]: {
|
|
94
|
-
'5e80ea7886680975': {
|
|
95
|
-
id: 1337,
|
|
96
|
-
key: 'pQABARn//wKhAFggJ1Fbpg5l6wnzKOJE+vXpRnkqUYhIvVnR5lNXEbO2o/0DoQChAFggHxZvgvtDktY/vqBcpjjo6rQnXvcNQhfwmy8AJQJKlD0E9g==',
|
|
97
|
-
},
|
|
98
|
-
be67218b77d02d30: {
|
|
99
|
-
id: 72,
|
|
100
|
-
key: 'pQABARn//wKhAFggTWwHUoppQ8aXWhbH95YWnNp6uOYMxo2y4wbarWbF+EEDoQChAFggUiFoPtsiR0WFowIvl0myD+bVnFQJBYarqieI0Gly46QE9g==',
|
|
101
|
-
},
|
|
102
|
-
[firstClientId]: {
|
|
103
|
-
id: 42,
|
|
104
|
-
key: 'pQABARn//wKhAFggWcbwny0jdqlcnnn0j4QSENIVVq/KgyQ3mmdpunfvGZQDoQChAFggrsQBkQkrVZ8sWhr8wTeaC+dmctuJ3oRqfdHsymTtKmgE9g==',
|
|
105
|
-
},
|
|
106
|
-
},
|
|
107
|
-
[secondUserID]: {
|
|
108
|
-
'5bad8cdeddc5a90f': {
|
|
109
|
-
id: 1,
|
|
110
|
-
key: 'pQABARn//wKhAFggEYATUNJBQ7E2tfHT7HMLxa4O3Ckd7PciUdyKiGNNWbYDoQChAFggP/s0BHmHQDNwrO4pC1dqdNHsW7bnpmF9mBadrbep4PoE9g==',
|
|
111
|
-
},
|
|
112
|
-
bc78eded90386d20: {
|
|
113
|
-
id: 65535,
|
|
114
|
-
key: 'pQABARn//wKhAFgg1xOfzMpWmpN2aBGW+0RG23L0I301pncd/HXqUm+pVyoDoQChAFggnl+dmwGW45AArcPutjUkAjYmhIbXBPrqkVrNyg0ZI08E9g==',
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const text = new Uint8Array([72, 101, 108, 108, 111, 33]); // "Hello!"
|
|
120
|
-
const otrBundle = await cryptography.encrypt(text, preKeyBundleMap);
|
|
121
|
-
expect(Object.keys(otrBundle).length).toBe(2);
|
|
122
|
-
expect(Object.keys(otrBundle[firstUserID]).length).toBe(3);
|
|
123
|
-
expect(Object.keys(otrBundle[secondUserID]).length).toBe(2);
|
|
124
|
-
expect(otrBundle[firstUserID][firstClientId]).toEqual(jasmine.any(Object));
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
describe('"encryptAsset"', () => {
|
|
129
|
-
it('encrypts and decrypts ArrayBuffer', async () => {
|
|
130
|
-
const bytes = new Uint8Array(16);
|
|
131
|
-
window.crypto.getRandomValues(bytes);
|
|
132
|
-
const byteBuffer = Buffer.from(bytes.buffer);
|
|
133
|
-
|
|
134
|
-
const encryptedAsset = await encryptAsset({plaintext: byteBuffer});
|
|
135
|
-
const decryptedBuffer = await decryptAsset(encryptedAsset);
|
|
136
|
-
|
|
137
|
-
expect(decryptedBuffer).toEqual(byteBuffer);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('does not decrypt when the hash is missing', async () => {
|
|
141
|
-
const bytes = new Uint8Array(16);
|
|
142
|
-
window.crypto.getRandomValues(bytes);
|
|
143
|
-
const byteBuffer = Buffer.from(bytes.buffer);
|
|
144
|
-
|
|
145
|
-
const {cipherText, keyBytes} = await encryptAsset({plaintext: byteBuffer});
|
|
146
|
-
|
|
147
|
-
try {
|
|
148
|
-
await decryptAsset(cipherText, keyBytes, null);
|
|
149
|
-
fail();
|
|
150
|
-
} catch (error) {}
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it('does not decrypt when hash is an empty array', async () => {
|
|
154
|
-
const bytes = new Uint8Array(16);
|
|
155
|
-
window.crypto.getRandomValues(bytes);
|
|
156
|
-
const byteBuffer = Buffer.from(bytes.buffer);
|
|
157
|
-
|
|
158
|
-
const {cipherText, keyBytes} = await encryptAsset({plaintext: byteBuffer});
|
|
159
|
-
|
|
160
|
-
try {
|
|
161
|
-
await decryptAsset(cipherText, keyBytes, new Uint8Array([]));
|
|
162
|
-
fail();
|
|
163
|
-
} catch (error) {}
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
describe('"encryptPayloadForSession"', () => {
|
|
168
|
-
it('encodes plaintext.', async () => {
|
|
169
|
-
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
170
|
-
const text = new Uint8Array([72, 101, 108, 108, 111, 32, 66, 111, 98, 33]); // "Hello Bob!"
|
|
171
|
-
const encodedPreKey =
|
|
172
|
-
'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
173
|
-
const {sessionId, encryptedPayload} = await cryptography.encryptPayloadForSession(
|
|
174
|
-
sessionWithBobId,
|
|
175
|
-
text,
|
|
176
|
-
encodedPreKey,
|
|
177
|
-
);
|
|
178
|
-
expect(new TextDecoder().decode(encryptedPayload)).not.toBe('💣');
|
|
179
|
-
expect(sessionId).toBe(sessionWithBobId);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
it('encodes invalid text as Bomb Emoji.', async () => {
|
|
183
|
-
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
184
|
-
const encodedPreKey =
|
|
185
|
-
'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
186
|
-
const {sessionId, encryptedPayload} = await cryptography.encryptPayloadForSession(
|
|
187
|
-
sessionWithBobId,
|
|
188
|
-
undefined,
|
|
189
|
-
encodedPreKey,
|
|
190
|
-
);
|
|
191
|
-
expect(new TextDecoder().decode(encryptedPayload)).toBe('💣');
|
|
192
|
-
expect(sessionId).toBe(sessionWithBobId);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Wire
|
|
4
|
-
* Copyright (C) 2018 Wire Swiss GmbH
|
|
5
|
-
*
|
|
6
|
-
* This program is free software: you can redistribute it and/or modify
|
|
7
|
-
* it under the terms of the GNU General Public License as published by
|
|
8
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
9
|
-
* (at your option) any later version.
|
|
10
|
-
*
|
|
11
|
-
* This program is distributed in the hope that it will be useful,
|
|
12
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
-
* GNU General Public License for more details.
|
|
15
|
-
*
|
|
16
|
-
* You should have received a copy of the GNU General Public License
|
|
17
|
-
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
18
|
-
*
|
|
19
|
-
*/
|
|
20
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
-
if (k2 === undefined) k2 = k;
|
|
22
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
23
|
-
}) : (function(o, m, k, k2) {
|
|
24
|
-
if (k2 === undefined) k2 = k;
|
|
25
|
-
o[k2] = m[k];
|
|
26
|
-
}));
|
|
27
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
-
}) : function(o, v) {
|
|
30
|
-
o["default"] = v;
|
|
31
|
-
});
|
|
32
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
const api_client_1 = require("@wireapp/api-client");
|
|
41
|
-
const cryptobox_1 = require("@wireapp/cryptobox");
|
|
42
|
-
const Proteus = __importStar(require("@wireapp/proteus"));
|
|
43
|
-
const store_engine_1 = require("@wireapp/store-engine");
|
|
44
|
-
const bazinga64 = __importStar(require("bazinga64"));
|
|
45
|
-
const crypto = __importStar(require("crypto"));
|
|
46
|
-
const util_1 = require("util");
|
|
47
|
-
const CryptographyHelper = __importStar(require("../test/CryptographyHelper"));
|
|
48
|
-
const AssetCryptography_node_1 = require("./AssetCryptography.node");
|
|
49
|
-
const CryptographyService_1 = require("./CryptographyService");
|
|
50
|
-
async function createEngine(storeName) {
|
|
51
|
-
const engine = new store_engine_1.MemoryEngine();
|
|
52
|
-
await engine.init(storeName);
|
|
53
|
-
return engine;
|
|
54
|
-
}
|
|
55
|
-
describe('CryptographyService', () => {
|
|
56
|
-
let cryptographyService;
|
|
57
|
-
let aliceLastResortPreKey;
|
|
58
|
-
let bob;
|
|
59
|
-
beforeAll(async () => {
|
|
60
|
-
await Proteus.init();
|
|
61
|
-
});
|
|
62
|
-
beforeEach(async () => {
|
|
63
|
-
cryptographyService = new CryptographyService_1.CryptographyService(new api_client_1.APIClient(), await createEngine('wire'));
|
|
64
|
-
const preKeys = await cryptographyService.cryptobox.create();
|
|
65
|
-
aliceLastResortPreKey = preKeys.filter(preKey => preKey.key_id === Proteus.keys.PreKey.MAX_PREKEY_ID)[0];
|
|
66
|
-
bob = new cryptobox_1.Cryptobox(await createEngine('wire'));
|
|
67
|
-
await bob.create();
|
|
68
|
-
});
|
|
69
|
-
describe('"constructor"', () => {
|
|
70
|
-
it('creates an instance.', () => {
|
|
71
|
-
expect(cryptographyService.cryptobox['identity'].public_key.fingerprint()).toBeDefined();
|
|
72
|
-
expect(cryptographyService).toBeDefined();
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
describe('"constructSessionId"', () => {
|
|
76
|
-
it('constructs a Session ID by a given User ID and Client ID.', () => {
|
|
77
|
-
const clientId = '1ceb9063fced26d3';
|
|
78
|
-
const userId = 'afbb5d60-1187-4385-9c29-7361dea79647';
|
|
79
|
-
const actual = CryptographyService_1.CryptographyService.constructSessionId(userId, clientId, null);
|
|
80
|
-
expect(actual).toContain(clientId);
|
|
81
|
-
expect(actual).toContain(userId);
|
|
82
|
-
});
|
|
83
|
-
it('constructs a Session ID by a given User ID and Client ID and domain.', () => {
|
|
84
|
-
const clientId = '1ceb9063fced26d3';
|
|
85
|
-
const userId = 'afbb5d60-1187-4385-9c29-7361dea79647';
|
|
86
|
-
const actual = CryptographyService_1.CryptographyService.constructSessionId(userId, clientId, 'test.wire.link');
|
|
87
|
-
expect(actual).toContain(clientId);
|
|
88
|
-
expect(actual).toContain(userId);
|
|
89
|
-
expect(actual).toContain('test.wire.link');
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
describe('"decrypt"', () => {
|
|
93
|
-
it('decrypts a Base64-encoded cipher message.', async () => {
|
|
94
|
-
const alicePublicKey = cryptographyService.cryptobox['identity'].public_key;
|
|
95
|
-
const publicPreKeyBundle = new Proteus.keys.PreKeyBundle(alicePublicKey, aliceLastResortPreKey);
|
|
96
|
-
const text = 'Hello Alice!';
|
|
97
|
-
const encryptedPreKeyMessage = await bob.encrypt('alice-user-id@alice-client-id', text, publicPreKeyBundle.serialise());
|
|
98
|
-
const encodedPreKeyMessage = bazinga64.Encoder.toBase64(encryptedPreKeyMessage).asString;
|
|
99
|
-
const decryptedMessage = await cryptographyService.decrypt('bob-user-id@bob-client-id', encodedPreKeyMessage);
|
|
100
|
-
const plaintext = Buffer.from(decryptedMessage).toString('utf8');
|
|
101
|
-
expect(plaintext).toBe(text);
|
|
102
|
-
});
|
|
103
|
-
it('is resistant to duplicated message errors', async () => {
|
|
104
|
-
const receiver = cryptographyService.cryptobox['identity'];
|
|
105
|
-
const preKey = await cryptographyService.cryptobox['get_prekey']();
|
|
106
|
-
const text = 'Hi!';
|
|
107
|
-
const encodedPreKeyMessage = await CryptographyHelper.createEncodedCipherText(receiver, preKey, text);
|
|
108
|
-
const sessionId = 'alice-to-bob';
|
|
109
|
-
const plaintext = await CryptographyHelper.getPlainText(cryptographyService, encodedPreKeyMessage, sessionId);
|
|
110
|
-
// Testing to decrypt the same message multiple times (to provoke duplicate message errors)
|
|
111
|
-
await CryptographyHelper.getPlainText(cryptographyService, encodedPreKeyMessage, sessionId);
|
|
112
|
-
await CryptographyHelper.getPlainText(cryptographyService, encodedPreKeyMessage, sessionId);
|
|
113
|
-
await CryptographyHelper.getPlainText(cryptographyService, encodedPreKeyMessage, sessionId);
|
|
114
|
-
expect(plaintext).toBe(text);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
describe('"dismantleSessionId"', () => {
|
|
118
|
-
const clientId = '1ceb9063fced26d3';
|
|
119
|
-
const userId = 'afbb5d60-1187-4385-9c29-7361dea79647';
|
|
120
|
-
const domain = 'domain.wire.link';
|
|
121
|
-
it('gets User ID and Client ID from a Session ID without domain.', () => {
|
|
122
|
-
const sessionId = CryptographyService_1.CryptographyService.constructSessionId(userId, clientId, null);
|
|
123
|
-
const res = CryptographyService_1.CryptographyService['dismantleSessionId'](sessionId);
|
|
124
|
-
expect(res.clientId).toBe(clientId);
|
|
125
|
-
expect(res.userId).toBe(userId);
|
|
126
|
-
expect(res.domain).toBe(undefined);
|
|
127
|
-
});
|
|
128
|
-
it('gets User ID and Client ID from a Session ID with domain.', () => {
|
|
129
|
-
const sessionId = CryptographyService_1.CryptographyService.constructSessionId(userId, clientId, domain);
|
|
130
|
-
const res = CryptographyService_1.CryptographyService['dismantleSessionId'](sessionId);
|
|
131
|
-
expect(res.clientId).toBe(clientId);
|
|
132
|
-
expect(res.userId).toBe(userId);
|
|
133
|
-
expect(res.domain).toBe(domain);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe('"encrypt"', () => {
|
|
137
|
-
it('generates a set of encrypted data based on PreKeys from multiple clients.', async () => {
|
|
138
|
-
const firstUserID = 'bc0c99f1-49a5-4ad2-889a-62885af37088';
|
|
139
|
-
const secondUserID = '2bde49aa-bdb5-458f-98cf-7d3552b10916';
|
|
140
|
-
const firstClientId = '2b83ee08d7ac550d';
|
|
141
|
-
const preKeyBundleMap = {
|
|
142
|
-
[firstUserID]: {
|
|
143
|
-
'5e80ea7886680975': {
|
|
144
|
-
id: 1337,
|
|
145
|
-
key: 'pQABARn//wKhAFggJ1Fbpg5l6wnzKOJE+vXpRnkqUYhIvVnR5lNXEbO2o/0DoQChAFggHxZvgvtDktY/vqBcpjjo6rQnXvcNQhfwmy8AJQJKlD0E9g==',
|
|
146
|
-
},
|
|
147
|
-
be67218b77d02d30: {
|
|
148
|
-
id: 72,
|
|
149
|
-
key: 'pQABARn//wKhAFggTWwHUoppQ8aXWhbH95YWnNp6uOYMxo2y4wbarWbF+EEDoQChAFggUiFoPtsiR0WFowIvl0myD+bVnFQJBYarqieI0Gly46QE9g==',
|
|
150
|
-
},
|
|
151
|
-
[firstClientId]: {
|
|
152
|
-
id: 42,
|
|
153
|
-
key: 'pQABARn//wKhAFggWcbwny0jdqlcnnn0j4QSENIVVq/KgyQ3mmdpunfvGZQDoQChAFggrsQBkQkrVZ8sWhr8wTeaC+dmctuJ3oRqfdHsymTtKmgE9g==',
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
[secondUserID]: {
|
|
157
|
-
'5bad8cdeddc5a90f': {
|
|
158
|
-
id: 1,
|
|
159
|
-
key: 'pQABARn//wKhAFggEYATUNJBQ7E2tfHT7HMLxa4O3Ckd7PciUdyKiGNNWbYDoQChAFggP/s0BHmHQDNwrO4pC1dqdNHsW7bnpmF9mBadrbep4PoE9g==',
|
|
160
|
-
},
|
|
161
|
-
bc78eded90386d20: {
|
|
162
|
-
id: 65535,
|
|
163
|
-
key: 'pQABARn//wKhAFgg1xOfzMpWmpN2aBGW+0RG23L0I301pncd/HXqUm+pVyoDoQChAFggnl+dmwGW45AArcPutjUkAjYmhIbXBPrqkVrNyg0ZI08E9g==',
|
|
164
|
-
},
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
const text = new Uint8Array(Buffer.from('Hello', 'utf8'));
|
|
168
|
-
const otrBundle = await cryptographyService.encrypt(text, preKeyBundleMap);
|
|
169
|
-
expect(Object.keys(otrBundle).length).toBe(2);
|
|
170
|
-
expect(Object.keys(otrBundle[firstUserID]).length).toBe(3);
|
|
171
|
-
expect(Object.keys(otrBundle[secondUserID]).length).toBe(2);
|
|
172
|
-
expect(otrBundle[firstUserID][firstClientId]).toEqual(jasmine.any(Uint8Array));
|
|
173
|
-
});
|
|
174
|
-
it('does not generate a message counter twice when ran asynchronously multiple times for the same cryptographic session', async () => {
|
|
175
|
-
const userId = 'bc0c99f1-49a5-4ad2-889a-62885af37088';
|
|
176
|
-
const clientId = '5e80ea7886680975';
|
|
177
|
-
const preKeyBundleMap = {
|
|
178
|
-
[userId]: {
|
|
179
|
-
[clientId]: {
|
|
180
|
-
id: 1337,
|
|
181
|
-
key: 'pQABARn//wKhAFggJ1Fbpg5l6wnzKOJE+vXpRnkqUYhIvVnR5lNXEbO2o/0DoQChAFggHxZvgvtDktY/vqBcpjjo6rQnXvcNQhfwmy8AJQJKlD0E9g==',
|
|
182
|
-
},
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
const text = new Uint8Array([72, 101, 108, 108, 111, 33]); // "Hello!"
|
|
186
|
-
const encryptionRuns = 100;
|
|
187
|
-
const otrBundles = await Promise.all(Array.from(Array(encryptionRuns).keys()).map(() => cryptographyService.encrypt(text, preKeyBundleMap)));
|
|
188
|
-
const encryptedPayloads = otrBundles.map(bundle => bundle[userId][clientId]);
|
|
189
|
-
const messageCounters = encryptedPayloads.map(encodedCiphertext => {
|
|
190
|
-
const messageBytes = encodedCiphertext;
|
|
191
|
-
const messageEnvelope = Proteus.message.Envelope.deserialise(messageBytes.buffer);
|
|
192
|
-
const preKeyMessage = messageEnvelope.message;
|
|
193
|
-
const cipherMessage = preKeyMessage.message;
|
|
194
|
-
return cipherMessage.counter;
|
|
195
|
-
});
|
|
196
|
-
const uniqueValues = messageCounters.filter((value, index, self) => self.indexOf(value) === index);
|
|
197
|
-
expect(uniqueValues.length).toBe(encryptionRuns);
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
describe('"encryptAsset"', () => {
|
|
201
|
-
it('encrypts and decrypts ArrayBuffer', async () => {
|
|
202
|
-
const bytes = new Uint8Array(16);
|
|
203
|
-
await (0, util_1.promisify)(crypto.randomFill)(bytes);
|
|
204
|
-
const byteBuffer = Buffer.from(bytes.buffer);
|
|
205
|
-
const encryptedAsset = await (0, AssetCryptography_node_1.encryptAsset)({ plainText: byteBuffer });
|
|
206
|
-
const decryptedBuffer = await (0, AssetCryptography_node_1.decryptAsset)(encryptedAsset);
|
|
207
|
-
expect(decryptedBuffer).toEqual(byteBuffer);
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
describe('"encryptPayloadForSession"', () => {
|
|
211
|
-
it('encodes plaintext.', async () => {
|
|
212
|
-
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
213
|
-
const text = new Uint8Array([72, 101, 108, 108, 111, 32, 66, 111, 98, 33]); // "Hello Bob!"
|
|
214
|
-
const encodedPreKey = 'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
215
|
-
const { sessionId, encryptedPayload } = (await cryptographyService['encryptPayloadForSession'](sessionWithBobId, text, encodedPreKey));
|
|
216
|
-
expect(Buffer.from(encryptedPayload).toString('utf8')).not.toBe('💣');
|
|
217
|
-
expect(sessionId).toBe(sessionWithBobId);
|
|
218
|
-
});
|
|
219
|
-
it('encodes invalid text as Bomb Emoji.', async () => {
|
|
220
|
-
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
221
|
-
const encodedPreKey = 'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
222
|
-
const { sessionId, encryptedPayload } = (await cryptographyService['encryptPayloadForSession'](sessionWithBobId, undefined, encodedPreKey));
|
|
223
|
-
expect(Buffer.from(encryptedPayload).toString()).toBe('💣');
|
|
224
|
-
expect(sessionId).toBe(sessionWithBobId);
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
//# sourceMappingURL=CryptographyService.test.node.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CryptographyService.test.node.js","sourceRoot":"","sources":["CryptographyService.test.node.ts"],"names":[],"mappings":"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"}
|