signal-desktop/ts/util/callLinks.ts
2024-02-22 13:19:50 -08:00

73 lines
2.3 KiB
TypeScript

// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { CallLinkRootKey } from '@signalapp/ringrtc';
import { Aci } from '@signalapp/libsignal-client';
import type { CallLinkAuthCredentialPresentation } from './zkgroup';
import {
CallLinkAuthCredential,
CallLinkSecretParams,
GenericServerPublicParams,
} from './zkgroup';
import { getCheckedCallLinkAuthCredentialsForToday } from '../services/groupCredentialFetcher';
import * as durations from './durations';
import type { CallLinkConversationType, CallLinkType } from '../types/CallLink';
import type { LocalizerType } from '../types/Util';
export function getRoomIdFromRootKey(rootKey: CallLinkRootKey): string {
return rootKey.deriveRoomId().toString('hex');
}
export function getCallLinkRootKeyFromUrlKey(key: string): Uint8Array {
// Returns `Buffer` which inherits from `Uint8Array`
return CallLinkRootKey.parse(key).bytes;
}
export async function getCallLinkAuthCredentialPresentation(
callLinkRootKey: CallLinkRootKey
): Promise<CallLinkAuthCredentialPresentation> {
const credentials = getCheckedCallLinkAuthCredentialsForToday(
'getCallLinkAuthCredentialPresentation'
);
const todaysCredentials = credentials.today.credential;
const credential = new CallLinkAuthCredential(
Buffer.from(todaysCredentials, 'base64')
);
const genericServerPublicParamsBase64 = window.getGenericServerPublicParams();
const genericServerPublicParams = new GenericServerPublicParams(
Buffer.from(genericServerPublicParamsBase64, 'base64')
);
const ourAci = window.textsecure.storage.user.getAci();
if (ourAci == null) {
throw new Error('Failed to get our ACI');
}
const userId = Aci.fromUuid(ourAci);
const callLinkSecretParams = CallLinkSecretParams.deriveFromRootKey(
callLinkRootKey.bytes
);
const presentation = credential.present(
userId,
credentials.today.redemptionTime / durations.SECOND,
genericServerPublicParams,
callLinkSecretParams
);
return presentation;
}
export function callLinkToConversation(
callLink: CallLinkType,
i18n: LocalizerType
): CallLinkConversationType {
const { roomId, name } = callLink;
return {
id: roomId,
type: 'callLink',
isMe: false,
title: name || i18n('icu:calling__call-link-default-title'),
sharedGroupNames: [],
acceptedMessageRequest: true,
badges: [],
};
}