@signalapp/libsignal-client 0.33.0 → 0.34.0

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/Native.d.ts CHANGED
@@ -11,6 +11,13 @@ type Uuid = Buffer;
11
11
  /// what's important is that it's an integer less than Number.MAX_SAFE_INTEGER.
12
12
  type Timestamp = number;
13
13
 
14
+ type LookupResponse = Map<string, LookupResponseEntry>;
15
+
16
+ interface LookupResponseEntry {
17
+ readonly aci: string | undefined;
18
+ readonly pni: string | undefined;
19
+ }
20
+
14
21
  export abstract class IdentityKeyStore {
15
22
  _getIdentityKey(): Promise<PrivateKey>;
16
23
  _getLocalRegistrationId(): Promise<number>;
@@ -101,9 +108,11 @@ export function CallLinkSecretParams_DecryptUserId(paramsBytes: Buffer, userId:
101
108
  export function CallLinkSecretParams_DeriveFromRootKey(rootKey: Buffer): Buffer;
102
109
  export function CallLinkSecretParams_GetPublicParams(paramsBytes: Buffer): Buffer;
103
110
  export function Cds2ClientState_New(mrenclave: Buffer, attestationMsg: Buffer, currentTimestamp: Timestamp): SgxClientState;
111
+ export function CdsiLookup(asyncRuntime: Wrapper<TokioAsyncContext>, connectionManager: Wrapper<ConnectionManager>, username: string, password: string, request: Wrapper<LookupRequest>, timeoutMillis: number): Promise<LookupResponse>;
104
112
  export function CiphertextMessage_FromPlaintextContent(m: Wrapper<PlaintextContent>): CiphertextMessage;
105
113
  export function CiphertextMessage_Serialize(obj: Wrapper<CiphertextMessage>): Buffer;
106
114
  export function CiphertextMessage_Type(msg: Wrapper<CiphertextMessage>): number;
115
+ export function ConnectionManager_new(environment: number): ConnectionManager;
107
116
  export function CreateCallLinkCredentialPresentation_CheckValidContents(presentationBytes: Buffer): void;
108
117
  export function CreateCallLinkCredentialPresentation_Verify(presentationBytes: Buffer, roomId: Buffer, now: Timestamp, serverParamsBytes: Buffer, callLinkParamsBytes: Buffer): void;
109
118
  export function CreateCallLinkCredentialRequestContext_CheckValidContents(contextBytes: Buffer): void;
@@ -179,6 +188,10 @@ export function KyberPublicKey_Equals(lhs: Wrapper<KyberPublicKey>, rhs: Wrapper
179
188
  export function KyberPublicKey_Serialize(obj: Wrapper<KyberPublicKey>): Buffer;
180
189
  export function KyberSecretKey_Deserialize(data: Buffer): KyberSecretKey;
181
190
  export function KyberSecretKey_Serialize(obj: Wrapper<KyberSecretKey>): Buffer;
191
+ export function LookupRequest_addAciAndAccessKey(request: Wrapper<LookupRequest>, aci: Buffer, accessKey: Buffer): void;
192
+ export function LookupRequest_addE164(request: Wrapper<LookupRequest>, e164: string): void;
193
+ export function LookupRequest_new(): LookupRequest;
194
+ export function LookupRequest_setReturnAcisWithoutUaks(request: Wrapper<LookupRequest>, returnAcisWithoutUaks: boolean): void;
182
195
  export function Mp4Sanitizer_Sanitize(input: InputStream, len: Buffer): Promise<SanitizedMetadata>;
183
196
  export function PlaintextContent_Deserialize(data: Buffer): PlaintextContent;
184
197
  export function PlaintextContent_FromDecryptionErrorMessage(m: Wrapper<DecryptionErrorMessage>): PlaintextContent;
@@ -359,6 +372,7 @@ export function SignedPreKeyRecord_GetSignature(obj: Wrapper<SignedPreKeyRecord>
359
372
  export function SignedPreKeyRecord_GetTimestamp(obj: Wrapper<SignedPreKeyRecord>): Timestamp;
360
373
  export function SignedPreKeyRecord_New(id: number, timestamp: Timestamp, pubKey: Wrapper<PublicKey>, privKey: Wrapper<PrivateKey>, signature: Buffer): SignedPreKeyRecord;
361
374
  export function SignedPreKeyRecord_Serialize(obj: Wrapper<SignedPreKeyRecord>): Buffer;
375
+ export function TESTING_CdsiLookupResponseConvert(): LookupResponse;
362
376
  export function TESTING_ErrorOnBorrowAsync(_input: null): Promise<void>;
363
377
  export function TESTING_ErrorOnBorrowIo(asyncRuntime: Wrapper<NonSuspendingBackgroundThreadRuntime>, _input: null): Promise<void>;
364
378
  export function TESTING_ErrorOnBorrowSync(_input: null): void;
@@ -380,6 +394,7 @@ export function TESTING_PanicOnLoadSync(_needsCleanup: null, _input: null): void
380
394
  export function TESTING_PanicOnReturnAsync(_needsCleanup: null): Promise<null>;
381
395
  export function TESTING_PanicOnReturnIo(asyncRuntime: Wrapper<NonSuspendingBackgroundThreadRuntime>, _needsCleanup: null): Promise<null>;
382
396
  export function TESTING_PanicOnReturnSync(_needsCleanup: null): null;
397
+ export function TokioAsyncContext_new(): TokioAsyncContext;
383
398
  export function UnidentifiedSenderMessageContent_Deserialize(data: Buffer): UnidentifiedSenderMessageContent;
384
399
  export function UnidentifiedSenderMessageContent_GetContentHint(m: Wrapper<UnidentifiedSenderMessageContent>): number;
385
400
  export function UnidentifiedSenderMessageContent_GetContents(obj: Wrapper<UnidentifiedSenderMessageContent>): Buffer;
@@ -388,7 +403,7 @@ export function UnidentifiedSenderMessageContent_GetMsgType(m: Wrapper<Unidentif
388
403
  export function UnidentifiedSenderMessageContent_GetSenderCert(m: Wrapper<UnidentifiedSenderMessageContent>): SenderCertificate;
389
404
  export function UnidentifiedSenderMessageContent_New(message: Wrapper<CiphertextMessage>, sender: Wrapper<SenderCertificate>, contentHint: number, groupId: Buffer | null): UnidentifiedSenderMessageContent;
390
405
  export function UnidentifiedSenderMessageContent_Serialize(obj: Wrapper<UnidentifiedSenderMessageContent>): Buffer;
391
- export function UsernameLink_Create(username: string): Buffer;
406
+ export function UsernameLink_Create(username: string, entropy: Buffer | null): Buffer;
392
407
  export function UsernameLink_DecryptUsername(entropy: Buffer, encryptedUsername: Buffer): string;
393
408
  export function Username_CandidatesFrom(nickname: string, minLen: number, maxLen: number): string;
394
409
  export function Username_Hash(username: string): Buffer;
@@ -406,6 +421,7 @@ interface AuthCredentialResponse { readonly __type: unique symbol; }
406
421
  interface AuthCredentialWithPni { readonly __type: unique symbol; }
407
422
  interface AuthCredentialWithPniResponse { readonly __type: unique symbol; }
408
423
  interface CiphertextMessage { readonly __type: unique symbol; }
424
+ interface ConnectionManager { readonly __type: unique symbol; }
409
425
  interface DecryptionErrorMessage { readonly __type: unique symbol; }
410
426
  interface ExpiringProfileKeyCredential { readonly __type: unique symbol; }
411
427
  interface ExpiringProfileKeyCredentialResponse { readonly __type: unique symbol; }
@@ -419,6 +435,7 @@ interface KyberKeyPair { readonly __type: unique symbol; }
419
435
  interface KyberPreKeyRecord { readonly __type: unique symbol; }
420
436
  interface KyberPublicKey { readonly __type: unique symbol; }
421
437
  interface KyberSecretKey { readonly __type: unique symbol; }
438
+ interface LookupRequest { readonly __type: unique symbol; }
422
439
  interface NonSuspendingBackgroundThreadRuntime { readonly __type: unique symbol; }
423
440
  interface PlaintextContent { readonly __type: unique symbol; }
424
441
  interface PreKeyBundle { readonly __type: unique symbol; }
@@ -450,6 +467,7 @@ interface SessionRecord { readonly __type: unique symbol; }
450
467
  interface SgxClientState { readonly __type: unique symbol; }
451
468
  interface SignalMessage { readonly __type: unique symbol; }
452
469
  interface SignedPreKeyRecord { readonly __type: unique symbol; }
470
+ interface TokioAsyncContext { readonly __type: unique symbol; }
453
471
  interface UnidentifiedSenderMessageContent { readonly __type: unique symbol; }
454
472
  interface UuidCiphertext { readonly __type: unique symbol; }
455
473
  interface ValidatingMac { readonly __type: unique symbol; }
package/dist/Errors.d.ts CHANGED
@@ -20,7 +20,8 @@ export declare enum ErrorCode {
20
20
  UnsupportedMediaInput = 16,
21
21
  InputDataTooLong = 17,
22
22
  InvalidEntropyDataLength = 18,
23
- InvalidUsernameLinkEncryptedData = 19
23
+ InvalidUsernameLinkEncryptedData = 19,
24
+ RateLimitedError = 20
24
25
  }
25
26
  export declare class LibSignalErrorBase extends Error {
26
27
  readonly code: ErrorCode;
@@ -93,4 +94,8 @@ export type InvalidMediaInputError = LibSignalErrorCommon & {
93
94
  export type UnsupportedMediaInputError = LibSignalErrorCommon & {
94
95
  code: ErrorCode.UnsupportedMediaInput;
95
96
  };
97
+ export type RateLimitedError = LibSignalErrorBase & {
98
+ code: ErrorCode.RateLimitedError;
99
+ readonly retryAfterSecs: number;
100
+ };
96
101
  export type LibSignalError = GenericError | DuplicatedMessageError | SealedSenderSelfSendError | UntrustedIdentityError | InvalidRegistrationIdError | VerificationFailedError | InvalidSessionError | InvalidSenderKeySessionError | CannotBeEmptyError | CannotStartWithDigitError | MissingSeparatorError | BadNicknameCharacterError | NicknameTooShortError | NicknameTooLongError | InputDataTooLong | InvalidEntropyDataLength | InvalidUsernameLinkEncryptedData | IoError | InvalidMediaInputError | UnsupportedMediaInputError;
package/dist/Errors.js CHANGED
@@ -28,6 +28,7 @@ var ErrorCode;
28
28
  ErrorCode[ErrorCode["InputDataTooLong"] = 17] = "InputDataTooLong";
29
29
  ErrorCode[ErrorCode["InvalidEntropyDataLength"] = 18] = "InvalidEntropyDataLength";
30
30
  ErrorCode[ErrorCode["InvalidUsernameLinkEncryptedData"] = 19] = "InvalidUsernameLinkEncryptedData";
31
+ ErrorCode[ErrorCode["RateLimitedError"] = 20] = "RateLimitedError";
31
32
  })(ErrorCode = exports.ErrorCode || (exports.ErrorCode = {}));
32
33
  class LibSignalErrorBase extends Error {
33
34
  constructor(message, name, operation, extraProps) {
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import { Aci, ProtocolAddress } from './Address';
4
4
  export * from './Address';
5
5
  export * as usernames from './usernames';
6
6
  export * as io from './io';
7
+ export * as Net from './net';
7
8
  export * as Mp4Sanitizer from './Mp4Sanitizer';
8
9
  export * as WebpSanitizer from './WebpSanitizer';
9
10
  import * as Native from '../Native';
package/dist/index.js CHANGED
@@ -27,8 +27,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
27
27
  });
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.sealedSenderEncryptMessage = exports.signalDecryptPreKey = exports.signalDecrypt = exports.signalEncrypt = exports.processPreKeyBundle = exports.DecryptionErrorMessage = exports.PlaintextContent = exports.CiphertextMessage = exports.SealedSenderDecryptionResult = exports.groupDecrypt = exports.groupEncrypt = exports.SenderKeyStore = exports.KyberPreKeyStore = exports.SignedPreKeyStore = exports.PreKeyStore = exports.IdentityKeyStore = exports.SessionStore = exports.UnidentifiedSenderMessageContent = exports.SenderKeyMessage = exports.processSenderKeyDistributionMessage = exports.SenderKeyDistributionMessage = exports.SenderCertificate = exports.SenderKeyRecord = exports.ServerCertificate = exports.SessionRecord = exports.PreKeySignalMessage = exports.SignalMessage = exports.KyberPreKeyRecord = exports.SignedPreKeyRecord = exports.PreKeyRecord = exports.PreKeyBundle = exports.IdentityKeyPair = exports.KEMKeyPair = exports.KEMSecretKey = exports.KEMPublicKey = exports.PrivateKey = exports.PublicKey = exports.Aes256GcmSiv = exports.Fingerprint = exports.DisplayableFingerprint = exports.ScannableFingerprint = exports.hkdf = exports.HKDF = exports.ContentHint = exports.Direction = exports.CiphertextMessageType = exports.WebpSanitizer = exports.Mp4Sanitizer = exports.io = exports.usernames = void 0;
31
- exports.initLogger = exports.LogLevel = exports.HsmEnclaveClient = exports.Cds2Client = exports.sealedSenderDecryptToUsmc = exports.sealedSenderDecryptMessage = exports.sealedSenderMultiRecipientMessageForSingleRecipient = exports.sealedSenderMultiRecipientEncrypt = exports.sealedSenderEncrypt = void 0;
30
+ exports.signalDecryptPreKey = exports.signalDecrypt = exports.signalEncrypt = exports.processPreKeyBundle = exports.DecryptionErrorMessage = exports.PlaintextContent = exports.CiphertextMessage = exports.SealedSenderDecryptionResult = exports.groupDecrypt = exports.groupEncrypt = exports.SenderKeyStore = exports.KyberPreKeyStore = exports.SignedPreKeyStore = exports.PreKeyStore = exports.IdentityKeyStore = exports.SessionStore = exports.UnidentifiedSenderMessageContent = exports.SenderKeyMessage = exports.processSenderKeyDistributionMessage = exports.SenderKeyDistributionMessage = exports.SenderCertificate = exports.SenderKeyRecord = exports.ServerCertificate = exports.SessionRecord = exports.PreKeySignalMessage = exports.SignalMessage = exports.KyberPreKeyRecord = exports.SignedPreKeyRecord = exports.PreKeyRecord = exports.PreKeyBundle = exports.IdentityKeyPair = exports.KEMKeyPair = exports.KEMSecretKey = exports.KEMPublicKey = exports.PrivateKey = exports.PublicKey = exports.Aes256GcmSiv = exports.Fingerprint = exports.DisplayableFingerprint = exports.ScannableFingerprint = exports.hkdf = exports.HKDF = exports.ContentHint = exports.Direction = exports.CiphertextMessageType = exports.WebpSanitizer = exports.Mp4Sanitizer = exports.Net = exports.io = exports.usernames = void 0;
31
+ exports.initLogger = exports.LogLevel = exports.HsmEnclaveClient = exports.Cds2Client = exports.sealedSenderDecryptToUsmc = exports.sealedSenderDecryptMessage = exports.sealedSenderMultiRecipientMessageForSingleRecipient = exports.sealedSenderMultiRecipientEncrypt = exports.sealedSenderEncrypt = exports.sealedSenderEncryptMessage = void 0;
32
32
  const uuid = require("uuid");
33
33
  const Errors = require("./Errors");
34
34
  __exportStar(require("./Errors"), exports);
@@ -36,6 +36,7 @@ const Address_1 = require("./Address");
36
36
  __exportStar(require("./Address"), exports);
37
37
  exports.usernames = require("./usernames");
38
38
  exports.io = require("./io");
39
+ exports.Net = require("./net");
39
40
  exports.Mp4Sanitizer = require("./Mp4Sanitizer");
40
41
  exports.WebpSanitizer = require("./WebpSanitizer");
41
42
  const Native = require("../Native");
package/dist/net.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import type { ReadonlyDeep } from 'type-fest';
2
+ export declare enum Environment {
3
+ Staging = 0,
4
+ Production = 1
5
+ }
6
+ export type CDSAuthType = {
7
+ username: string;
8
+ password: string;
9
+ };
10
+ export type CDSRequestOptionsType = {
11
+ e164s: Array<string>;
12
+ acisAndAccessKeys: Array<{
13
+ aci: string;
14
+ accessKey: string;
15
+ }>;
16
+ timeout: number;
17
+ returnAcisWithoutUaks: boolean;
18
+ };
19
+ export type CDSResponseEntryType<Aci, Pni> = {
20
+ aci: Aci | undefined;
21
+ pni: Pni | undefined;
22
+ };
23
+ export type CDSResponseType<Aci, Pni> = Map<string, CDSResponseEntryType<Aci, Pni>>;
24
+ export declare class Net {
25
+ private readonly _asyncContext;
26
+ private readonly _connectionManager;
27
+ constructor(env: Environment);
28
+ cdsiLookup({ username, password }: Readonly<CDSAuthType>, { e164s, acisAndAccessKeys, timeout, returnAcisWithoutUaks, }: ReadonlyDeep<CDSRequestOptionsType>): Promise<CDSResponseType<string, string>>;
29
+ }
package/dist/net.js ADDED
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2023 Signal Messenger, LLC.
4
+ // SPDX-License-Identifier: AGPL-3.0-only
5
+ //
6
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
+ return new (P || (P = Promise))(function (resolve, reject) {
9
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
13
+ });
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.Net = exports.Environment = void 0;
17
+ const Native = require("../Native");
18
+ const Address_1 = require("./Address");
19
+ // This must match the libsignal-bridge Rust enum of the same name.
20
+ var Environment;
21
+ (function (Environment) {
22
+ Environment[Environment["Staging"] = 0] = "Staging";
23
+ Environment[Environment["Production"] = 1] = "Production";
24
+ })(Environment = exports.Environment || (exports.Environment = {}));
25
+ class Net {
26
+ constructor(env) {
27
+ this._asyncContext = Native.TokioAsyncContext_new();
28
+ this._connectionManager = Native.ConnectionManager_new(env);
29
+ }
30
+ cdsiLookup({ username, password }, { e164s, acisAndAccessKeys, timeout, returnAcisWithoutUaks, }) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ const request = { _nativeHandle: Native.LookupRequest_new() };
33
+ e164s.forEach((e164) => {
34
+ Native.LookupRequest_addE164(request, e164);
35
+ });
36
+ acisAndAccessKeys.forEach(({ aci: aciStr, accessKey: accessKeyStr }) => {
37
+ Native.LookupRequest_addAciAndAccessKey(request, Address_1.Aci.parseFromServiceIdString(aciStr).getServiceIdFixedWidthBinary(), Buffer.from(accessKeyStr, 'base64'));
38
+ });
39
+ Native.LookupRequest_setReturnAcisWithoutUaks(request, returnAcisWithoutUaks);
40
+ return yield Native.CdsiLookup({ _nativeHandle: this._asyncContext }, { _nativeHandle: this._connectionManager }, username, password, request, timeout);
41
+ });
42
+ }
43
+ }
44
+ exports.Net = Net;
45
+ //# sourceMappingURL=net.js.map
@@ -8,5 +8,5 @@ export declare function hash(username: string): Buffer;
8
8
  export declare function generateProof(username: string): Buffer;
9
9
  export declare function generateProofWithRandom(username: string, random: Buffer): Buffer;
10
10
  export declare function decryptUsernameLink(usernameLink: UsernameLink): string;
11
- export declare function createUsernameLink(username: string): UsernameLink;
11
+ export declare function createUsernameLink(username: string, previousEntropy?: Buffer): UsernameLink;
12
12
  export declare function verifyProof(proof: Buffer, hash: Buffer): void;
package/dist/usernames.js CHANGED
@@ -30,8 +30,8 @@ function decryptUsernameLink(usernameLink) {
30
30
  return Native.UsernameLink_DecryptUsername(usernameLink.entropy, usernameLink.encryptedUsername);
31
31
  }
32
32
  exports.decryptUsernameLink = decryptUsernameLink;
33
- function createUsernameLink(username) {
34
- const usernameLinkData = Native.UsernameLink_Create(username);
33
+ function createUsernameLink(username, previousEntropy) {
34
+ const usernameLinkData = Native.UsernameLink_Create(username, previousEntropy !== null && previousEntropy !== void 0 ? previousEntropy : null);
35
35
  const entropy = usernameLinkData.slice(0, 32);
36
36
  const encryptedUsername = usernameLinkData.slice(32);
37
37
  return { entropy, encryptedUsername };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signalapp/libsignal-client",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "license": "AGPL-3.0-only",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,6 +26,7 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "node-gyp-build": "^4.2.3",
29
+ "type-fest": "^3.5.0",
29
30
  "uuid": "^8.3.0"
30
31
  },
31
32
  "devDependencies": {
@@ -34,7 +35,7 @@
34
35
  "@types/chai-as-promised": "^7.1.3",
35
36
  "@types/chance": "^1.1.3",
36
37
  "@types/mocha": "^5.2.7",
37
- "@types/node": "16.18.3",
38
+ "@types/node": "~18.15.0",
38
39
  "@types/uuid": "^8.3.0",
39
40
  "@typescript-eslint/eslint-plugin": "^5.47.0",
40
41
  "@typescript-eslint/parser": "^5.47.0",
@@ -48,7 +49,7 @@
48
49
  "eslint-plugin-mocha": "^10.1.0",
49
50
  "eslint-plugin-more": "^1.0.0",
50
51
  "mocha": "^9",
51
- "node-gyp": "^8.4.1",
52
+ "node-gyp": "^10.0.0",
52
53
  "prettier": "^2.7.1",
53
54
  "rimraf": "^3.0.1",
54
55
  "source-map-support": "^0.5.19",
Binary file
Binary file
Binary file