From 8acc5ac62dd54273a8da6013b05f147f08c32391 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Sat, 10 Aug 2024 19:50:36 +0530 Subject: [PATCH] Propagate --- web/apps/auth/src/services/remote.ts | 14 ++-- web/apps/cast/src/services/render.ts | 16 ++-- .../manage/linkPassword/setPassword.tsx | 4 +- .../photos/src/components/FixCreationTime.tsx | 4 +- .../components/PhotoViewer/FileInfo/index.tsx | 4 +- .../photos/src/pages/shared-albums/index.tsx | 6 +- .../photos/src/services/collectionService.ts | 80 +++++++++---------- web/apps/photos/src/services/entityService.ts | 16 ++-- web/apps/photos/src/services/fileService.ts | 22 ++--- .../src/services/publicCollectionService.ts | 15 ++-- web/apps/photos/src/utils/crypto/index.ts | 4 +- web/apps/photos/src/utils/file/index.ts | 34 ++++---- .../photos/src/utils/magicMetadata/index.ts | 4 +- .../accounts/pages/change-password.tsx | 4 +- web/packages/accounts/pages/credentials.tsx | 8 +- web/packages/accounts/pages/recover.tsx | 4 +- .../accounts/pages/two-factor/recover.tsx | 6 +- web/packages/accounts/services/passkey.ts | 9 +-- web/packages/accounts/services/srp.ts | 4 +- web/packages/accounts/utils/srp.ts | 4 +- web/packages/new/photos/services/download.ts | 18 ++--- .../components/VerifyMasterPasswordForm.tsx | 4 +- web/packages/shared/crypto/helpers.ts | 16 ++-- web/packages/shared/file-metadata.ts | 4 +- web/packages/shared/user/index.ts | 6 +- 25 files changed, 153 insertions(+), 157 deletions(-) diff --git a/web/apps/auth/src/services/remote.ts b/web/apps/auth/src/services/remote.ts index 758bd31b66..e30b8d8f90 100644 --- a/web/apps/auth/src/services/remote.ts +++ b/web/apps/auth/src/services/remote.ts @@ -1,7 +1,7 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import { ensureString } from "@/utils/ensure"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { ApiError, CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; @@ -13,7 +13,7 @@ export const getAuthCodes = async (): Promise => { const masterKey = await getActualKey(); try { const authKeyData = await getAuthKey(); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const authenticatorKey = await cryptoWorker.decryptB64( authKeyData.encryptedKey, authKeyData.header, @@ -30,11 +30,11 @@ export const getAuthCodes = async (): Promise => { if (!entity.header) return undefined; try { const decryptedCode = - await cryptoWorker.decryptMetadata( - entity.encryptedData, - entity.header, - authenticatorKey, - ); + await cryptoWorker.decryptMetadataJSON({ + encryptedDataB64: entity.encryptedData, + decryptionHeaderB64: entity.header, + keyB64: authenticatorKey, + }); return codeFromURIString( entity.id, ensureString(decryptedCode), diff --git a/web/apps/cast/src/services/render.ts b/web/apps/cast/src/services/render.ts index d512b039ef..1ba9aa502b 100644 --- a/web/apps/cast/src/services/render.ts +++ b/web/apps/cast/src/services/render.ts @@ -5,6 +5,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; import { apiURL, customAPIOrigin } from "@/base/origins"; @@ -21,7 +22,6 @@ import type { import { shuffled } from "@/utils/array"; import { ensure } from "@/utils/ensure"; import { wait } from "@/utils/promise"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { ApiError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import type { AxiosResponse } from "axios"; @@ -188,7 +188,7 @@ const decryptEnteFile = async ( encryptedFile: EncryptedEnteFile, collectionKey: string, ): Promise => { - const worker = await ComlinkCryptoWorker.getInstance(); + const worker = await sharedCryptoWorker(); const { encryptedKey, keyDecryptionNonce, @@ -202,11 +202,11 @@ const decryptEnteFile = async ( keyDecryptionNonce, collectionKey, ); - const fileMetadata = await worker.decryptMetadata( - metadata.encryptedData, - metadata.decryptionHeader, - fileKey, - ); + const fileMetadata = await worker.decryptMetadataJSON({ + encryptedDataB64: metadata.encryptedData, + decryptionHeaderB64: metadata.decryptionHeader, + keyB64: fileKey, + }); let fileMagicMetadata: FileMagicMetadata | undefined; let filePubMagicMetadata: FilePublicMagicMetadata | undefined; if (magicMetadata?.data) { @@ -351,7 +351,7 @@ const downloadFile = async ( `Failed to fetch file with ID ${file.id}: HTTP ${res.status}`, ); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const decrypted = await cryptoWorker.decryptFile( new Uint8Array(await res.arrayBuffer()), await cryptoWorker.fromB64( diff --git a/web/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx b/web/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx index 2b8e1fbb96..ed33f8565a 100644 --- a/web/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx +++ b/web/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx @@ -1,7 +1,7 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import SingleInputForm, { type SingleInputFormProps, } from "@ente/shared/components/SingleInputForm"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { Dialog, Stack, Typography } from "@mui/material"; import { t } from "i18next"; @@ -27,7 +27,7 @@ export function PublicLinkSetPassword({ }; const enablePublicUrlPassword = async (password: string) => { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const kekSalt = await cryptoWorker.generateSaltToDeriveKey(); const kek = await cryptoWorker.deriveInteractiveKey(password, kekSalt); diff --git a/web/apps/photos/src/components/FixCreationTime.tsx b/web/apps/photos/src/components/FixCreationTime.tsx index 9018a48022..b5e3100ccc 100644 --- a/web/apps/photos/src/components/FixCreationTime.tsx +++ b/web/apps/photos/src/components/FixCreationTime.tsx @@ -1,3 +1,4 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { decryptPublicMagicMetadata, @@ -13,7 +14,6 @@ import { EnteFile } from "@/new/photos/types/file"; import { fileLogID } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; import DialogBox from "@ente/shared/components/DialogBox/"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { Button, FormControl, @@ -353,7 +353,7 @@ const updateEnteFileDate = async ( if (!newDate) return; - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const existingUIDate = getUICreationDate( enteFile, diff --git a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx index d724274640..896a82facf 100644 --- a/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx +++ b/web/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx @@ -1,5 +1,6 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; import { Titlebar } from "@/base/components/Titlebar"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { nameAndExtension } from "@/base/file"; import log from "@/base/log"; import type { ParsedMetadata } from "@/media/file-metadata"; @@ -19,7 +20,6 @@ import { formattedByteSize } from "@/new/photos/utils/units"; import CopyButton from "@ente/shared/components/CodeBlock/CopyButton"; import { FlexWrapper } from "@ente/shared/components/Container"; import EnteSpinner from "@ente/shared/components/EnteSpinner"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { getPublicMagicMetadataMTSync } from "@ente/shared/file-metadata"; import { formatDate, formatTime } from "@ente/shared/time/format"; import BackupOutlined from "@mui/icons-material/BackupOutlined"; @@ -399,7 +399,7 @@ export const CreationTime: React.FC = ({ return; } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); await updateRemotePublicMagicMetadata( enteFile, { dateTime, editedTime: timestamp }, diff --git a/web/apps/photos/src/pages/shared-albums/index.tsx b/web/apps/photos/src/pages/shared-albums/index.tsx index c1715fa878..64cc325660 100644 --- a/web/apps/photos/src/pages/shared-albums/index.tsx +++ b/web/apps/photos/src/pages/shared-albums/index.tsx @@ -1,3 +1,4 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import downloadManager from "@/new/photos/services/download"; import { EnteFile } from "@/new/photos/types/file"; @@ -16,7 +17,6 @@ import SingleInputForm, { type SingleInputFormProps, } from "@ente/shared/components/SingleInputForm"; import { PHOTOS_PAGES as PAGES } from "@ente/shared/constants/pages"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { CustomError, parseSharingErrorCodes } from "@ente/shared/error"; import { useFileInput } from "@ente/shared/hooks/useFileInput"; import AddPhotoAlternateOutlined from "@mui/icons-material/AddPhotoAlternateOutlined"; @@ -204,7 +204,7 @@ export default function PublicCollectionGallery() { const main = async () => { let redirectingToWebsite = false; try { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); await downloadManager.init(); url.current = window.location.href; @@ -421,7 +421,7 @@ export default function PublicCollectionGallery() { setFieldError, ) => { try { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); let hashedPassword: string = null; try { const publicUrl = publicCollection.publicURLs[0]; diff --git a/web/apps/photos/src/services/collectionService.ts b/web/apps/photos/src/services/collectionService.ts index e98ee93bde..9a25b8a9cb 100644 --- a/web/apps/photos/src/services/collectionService.ts +++ b/web/apps/photos/src/services/collectionService.ts @@ -1,3 +1,4 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import { ItemVisibility } from "@/media/file-metadata"; @@ -9,7 +10,6 @@ import { UpdateMagicMetadataRequest, } from "@/new/photos/types/magicMetadata"; import { batch } from "@/utils/array"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import localForage from "@ente/shared/storage/localForage"; @@ -99,7 +99,7 @@ const getCollectionWithSecrets = async ( collection: EncryptedCollection, masterKey: string, ): Promise => { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const userID = getData(LS_KEYS.USER).id; let collectionKey: string; if (collection.owner.id === userID) { @@ -133,22 +133,22 @@ const getCollectionWithSecrets = async ( if (collection.magicMetadata?.data) { collectionMagicMetadata = { ...collection.magicMetadata, - data: await cryptoWorker.decryptMetadata( - collection.magicMetadata.data, - collection.magicMetadata.header, - collectionKey, - ), + data: await cryptoWorker.decryptMetadataJSON({ + encryptedDataB64: collection.magicMetadata.data, + decryptionHeaderB64: collection.magicMetadata.header, + keyB64: collectionKey, + }), }; } let collectionPublicMagicMetadata: CollectionPublicMagicMetadata; if (collection.pubMagicMetadata?.data) { collectionPublicMagicMetadata = { ...collection.pubMagicMetadata, - data: await cryptoWorker.decryptMetadata( - collection.pubMagicMetadata.data, - collection.pubMagicMetadata.header, - collectionKey, - ), + data: await cryptoWorker.decryptMetadataJSON({ + encryptedDataB64: collection.pubMagicMetadata.data, + decryptionHeaderB64: collection.pubMagicMetadata.header, + keyB64: collectionKey, + }), }; } @@ -156,11 +156,11 @@ const getCollectionWithSecrets = async ( if (collection.sharedMagicMetadata?.data) { collectionShareeMagicMetadata = { ...collection.sharedMagicMetadata, - data: await cryptoWorker.decryptMetadata( - collection.sharedMagicMetadata.data, - collection.sharedMagicMetadata.header, - collectionKey, - ), + data: await cryptoWorker.decryptMetadataJSON({ + encryptedDataB64: collection.sharedMagicMetadata.data, + decryptionHeaderB64: collection.sharedMagicMetadata.header, + keyB64: collectionKey, + }), }; } @@ -415,7 +415,7 @@ const createCollection = async ( magicMetadataProps?: CollectionMagicMetadataProps, ): Promise => { try { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const encryptionKey = await getActualKey(); const token = getToken(); const collectionKey = await cryptoWorker.generateEncryptionKey(); @@ -427,10 +427,10 @@ const createCollection = async ( if (magicMetadataProps) { const magicMetadata = await updateMagicMetadata(magicMetadataProps); const encryptedMagicMetadataProps = - await cryptoWorker.encryptMetadata( - magicMetadataProps, - collectionKey, - ); + await cryptoWorker.encryptMetadataJSON({ + jsonValue: magicMetadataProps, + keyB64: collectionKey, + }); encryptedMagicMetadata = { ...magicMetadata, @@ -607,7 +607,7 @@ const encryptWithNewCollectionKey = async ( files: EnteFile[], ): Promise => { const fileKeysEncryptedWithNewCollection: EncryptedFileKey[] = []; - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); for (const file of files) { const newEncryptedKey = await cryptoWorker.encryptToB64( file.key, @@ -797,13 +797,13 @@ export const updateCollectionMagicMetadata = async ( return; } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const { encryptedDataB64, decryptionHeaderB64 } = - await cryptoWorker.encryptMetadata( - updatedMagicMetadata.data, - collection.key, - ); + await cryptoWorker.encryptMetadataJSON({ + jsonValue: updatedMagicMetadata.data, + keyB64: collection.key, + }); const reqBody: UpdateMagicMetadataRequest = { id: collection.id, @@ -842,13 +842,13 @@ export const updateSharedCollectionMagicMetadata = async ( return; } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const { encryptedDataB64, decryptionHeaderB64 } = - await cryptoWorker.encryptMetadata( - updatedMagicMetadata.data, - collection.key, - ); + await cryptoWorker.encryptMetadataJSON({ + jsonValue: updatedMagicMetadata.data, + keyB64: collection.key, + }); const reqBody: UpdateMagicMetadataRequest = { id: collection.id, @@ -887,13 +887,13 @@ export const updatePublicCollectionMagicMetadata = async ( return; } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const { encryptedDataB64, decryptionHeaderB64 } = - await cryptoWorker.encryptMetadata( - updatedPublicMagicMetadata.data, - collection.key, - ); + await cryptoWorker.encryptMetadataJSON({ + jsonValue: updatedPublicMagicMetadata.data, + keyB64: collection.key, + }); const reqBody: UpdateMagicMetadataRequest = { id: collection.id, @@ -932,7 +932,7 @@ export const renameCollection = async ( await changeCollectionSubType(collection, SUB_TYPE.DEFAULT); } const token = getToken(); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const { encryptedData: encryptedName, nonce: nameDecryptionNonce } = await cryptoWorker.encryptUTF8(newCollectionName, collection.key); const collectionRenameRequest = { @@ -956,7 +956,7 @@ export const shareCollection = async ( role: string, ) => { try { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const token = getToken(); const publicKey: string = await getPublicKey(withUserEmail); const encryptedKey = await cryptoWorker.boxSeal( diff --git a/web/apps/photos/src/services/entityService.ts b/web/apps/photos/src/services/entityService.ts index 120058f265..b91c230d37 100644 --- a/web/apps/photos/src/services/entityService.ts +++ b/web/apps/photos/src/services/entityService.ts @@ -1,6 +1,6 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import HTTPService from "@ente/shared/network/HTTPService"; import localForage from "@ente/shared/storage/localForage"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; @@ -68,7 +68,7 @@ export const getEntityKey = async (type: EntityType) => { }, ); const encryptedEntityKey: EncryptedEntityKey = resp.data; - const worker = await ComlinkCryptoWorker.getInstance(); + const worker = await sharedCryptoWorker(); const masterKey = await getActualKey(); const { encryptedKey, header, ...rest } = encryptedEntityKey; const decryptedData = await worker.decryptB64( @@ -129,12 +129,12 @@ const syncEntity = async (type: EntityType): Promise> => { return entity as unknown as Entity; } const { encryptedData, header, ...rest } = entity; - const worker = await ComlinkCryptoWorker.getInstance(); - const decryptedData = await worker.decryptMetadata( - encryptedData, - header, - entityKey.data, - ); + const worker = await sharedCryptoWorker(); + const decryptedData = await worker.decryptMetadataJSON({ + encryptedDataB64: encryptedData, + decryptionHeaderB64: header, + keyB64: entityKey.data, + }); return { ...rest, data: decryptedData, diff --git a/web/apps/photos/src/services/fileService.ts b/web/apps/photos/src/services/fileService.ts index d2d4e8c49a..f7942ceb57 100644 --- a/web/apps/photos/src/services/fileService.ts +++ b/web/apps/photos/src/services/fileService.ts @@ -1,3 +1,4 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import { getLocalFiles, setLocalFiles } from "@/new/photos/services/files"; @@ -11,7 +12,6 @@ import { import { BulkUpdateMagicMetadataRequest } from "@/new/photos/types/magicMetadata"; import { mergeMetadata } from "@/new/photos/utils/file"; import { batch } from "@/utils/array"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import HTTPService from "@ente/shared/network/HTTPService"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; import { REQUEST_BATCH_SIZE } from "constants/api"; @@ -186,16 +186,16 @@ export const updateFileMagicMetadata = async ( return; } const reqBody: BulkUpdateMagicMetadataRequest = { metadataList: [] }; - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); for (const { file, updatedMagicMetadata, } of fileWithUpdatedMagicMetadataList) { const { encryptedDataB64, decryptionHeaderB64 } = - await cryptoWorker.encryptMetadata( - updatedMagicMetadata.data, - file.key, - ); + await cryptoWorker.encryptMetadataJSON({ + jsonValue: updatedMagicMetadata.data, + keyB64: file.key, + }); reqBody.metadataList.push({ id: file.id, magicMetadata: { @@ -233,16 +233,16 @@ export const updateFilePublicMagicMetadata = async ( return; } const reqBody: BulkUpdateMagicMetadataRequest = { metadataList: [] }; - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); for (const { file, updatedPublicMagicMetadata, } of fileWithUpdatedPublicMagicMetadataList) { const { encryptedDataB64, decryptionHeaderB64 } = - await cryptoWorker.encryptMetadata( - updatedPublicMagicMetadata.data, - file.key, - ); + await cryptoWorker.encryptMetadataJSON({ + jsonValue: updatedPublicMagicMetadata.data, + keyB64: file.key, + }); reqBody.metadataList.push({ id: file.id, magicMetadata: { diff --git a/web/apps/photos/src/services/publicCollectionService.ts b/web/apps/photos/src/services/publicCollectionService.ts index 9c1bed78df..0246f2cfcd 100644 --- a/web/apps/photos/src/services/publicCollectionService.ts +++ b/web/apps/photos/src/services/publicCollectionService.ts @@ -1,8 +1,8 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { apiURL } from "@/base/origins"; import { EncryptedEnteFile, EnteFile } from "@/new/photos/types/file"; import { mergeMetadata } from "@/new/photos/utils/file"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { CustomError, parseSharingErrorCodes } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import localForage from "@ente/shared/storage/localForage"; @@ -315,7 +315,7 @@ export const getPublicCollection = async ( const fetchedCollection = resp.data.collection; const referralCode = resp.data.referralCode ?? ""; - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const collectionName = (fetchedCollection.name = fetchedCollection.name || @@ -329,11 +329,12 @@ export const getPublicCollection = async ( if (fetchedCollection.pubMagicMetadata?.data) { collectionPublicMagicMetadata = { ...fetchedCollection.pubMagicMetadata, - data: await cryptoWorker.decryptMetadata( - fetchedCollection.pubMagicMetadata.data, - fetchedCollection.pubMagicMetadata.header, - collectionKey, - ), + data: await cryptoWorker.decryptMetadataJSON({ + encryptedDataB64: fetchedCollection.pubMagicMetadata.data, + decryptionHeaderB64: + fetchedCollection.pubMagicMetadata.header, + keyB64: collectionKey, + }), }; } diff --git a/web/apps/photos/src/utils/crypto/index.ts b/web/apps/photos/src/utils/crypto/index.ts index 21a296110e..11410fc512 100644 --- a/web/apps/photos/src/utils/crypto/index.ts +++ b/web/apps/photos/src/utils/crypto/index.ts @@ -1,11 +1,11 @@ -import ComlinkCryptoWorker from "@ente/shared/crypto"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { getData, LS_KEYS } from "@ente/shared/storage/localStorage"; import { getActualKey } from "@ente/shared/user"; export async function decryptDeleteAccountChallenge( encryptedChallenge: string, ) { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const masterKey = await getActualKey(); const keyAttributes = getData(LS_KEYS.KEY_ATTRIBUTES); const secretKey = await cryptoWorker.decryptB64( diff --git a/web/apps/photos/src/utils/file/index.ts b/web/apps/photos/src/utils/file/index.ts index 6857585aa9..26fca50be7 100644 --- a/web/apps/photos/src/utils/file/index.ts +++ b/web/apps/photos/src/utils/file/index.ts @@ -1,3 +1,4 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { type Electron } from "@/base/types/ipc"; import { ItemVisibility } from "@/media/file-metadata"; @@ -19,7 +20,6 @@ import { mergeMetadata } from "@/new/photos/utils/file"; import { safeFileName } from "@/new/photos/utils/native-fs"; import { writeStream } from "@/new/photos/utils/native-stream"; import { withTimeout } from "@/utils/promise"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { LS_KEYS, getData } from "@ente/shared/storage/localStorage"; import type { User } from "@ente/shared/user/types"; import { downloadUsingAnchor } from "@ente/shared/utils"; @@ -133,7 +133,7 @@ export async function decryptFile( collectionKey: string, ): Promise { try { - const worker = await ComlinkCryptoWorker.getInstance(); + const worker = await sharedCryptoWorker(); const { encryptedKey, keyDecryptionNonce, @@ -147,31 +147,31 @@ export async function decryptFile( keyDecryptionNonce, collectionKey, ); - const fileMetadata = await worker.decryptMetadata( - metadata.encryptedData, - metadata.decryptionHeader, - fileKey, - ); + const fileMetadata = await worker.decryptMetadataJSON({ + encryptedDataB64: metadata.encryptedData, + decryptionHeaderB64: metadata.decryptionHeader, + keyB64: fileKey, + }); let fileMagicMetadata: FileMagicMetadata; let filePubMagicMetadata: FilePublicMagicMetadata; if (magicMetadata?.data) { fileMagicMetadata = { ...file.magicMetadata, - data: await worker.decryptMetadata( - magicMetadata.data, - magicMetadata.header, - fileKey, - ), + data: await worker.decryptMetadataJSON({ + encryptedDataB64: magicMetadata.data, + decryptionHeaderB64: magicMetadata.header, + keyB64: fileKey, + }), }; } if (pubMagicMetadata?.data) { filePubMagicMetadata = { ...pubMagicMetadata, - data: await worker.decryptMetadata( - pubMagicMetadata.data, - pubMagicMetadata.header, - fileKey, - ), + data: await worker.decryptMetadataJSON({ + encryptedDataB64: pubMagicMetadata.data, + decryptionHeaderB64: pubMagicMetadata.header, + keyB64: fileKey, + }), }; } return { diff --git a/web/apps/photos/src/utils/magicMetadata/index.ts b/web/apps/photos/src/utils/magicMetadata/index.ts index 2d80b486d2..e405836a35 100644 --- a/web/apps/photos/src/utils/magicMetadata/index.ts +++ b/web/apps/photos/src/utils/magicMetadata/index.ts @@ -1,7 +1,7 @@ +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { ItemVisibility } from "@/media/file-metadata"; import { EnteFile } from "@/new/photos/types/file"; import { MagicMetadataCore } from "@/new/photos/types/magicMetadata"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { Collection } from "types/collection"; export function isArchivedFile(item: EnteFile): boolean { @@ -46,7 +46,7 @@ export async function updateMagicMetadata( originalMagicMetadata?: MagicMetadataCore, decryptionKey?: string, ): Promise> { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); if (!originalMagicMetadata) { originalMagicMetadata = getNewMagicMetadata(); diff --git a/web/packages/accounts/pages/change-password.tsx b/web/packages/accounts/pages/change-password.tsx index a525d6c0be..113e74d89e 100644 --- a/web/packages/accounts/pages/change-password.tsx +++ b/web/packages/accounts/pages/change-password.tsx @@ -19,7 +19,6 @@ import FormPaper from "@ente/shared/components/Form/FormPaper"; import FormPaperFooter from "@ente/shared/components/Form/FormPaper/Footer"; import FormPaperTitle from "@ente/shared/components/Form/FormPaper/Title"; import LinkButton from "@ente/shared/components/LinkButton"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { generateAndSaveIntermediateKeyAttributes, generateLoginSubKey, @@ -35,6 +34,7 @@ import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { appHomeRoute } from "../services/redirect"; import type { PageProps } from "../types/page"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; const Page: React.FC = () => { const [token, setToken] = useState(); @@ -57,7 +57,7 @@ const Page: React.FC = () => { passphrase, setFieldError, ) => { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const key = await getActualKey(); const keyAttributes: KeyAttributes = getData(LS_KEYS.KEY_ATTRIBUTES); const kekSalt = await cryptoWorker.generateSaltToDeriveKey(); diff --git a/web/packages/accounts/pages/credentials.tsx b/web/packages/accounts/pages/credentials.tsx index 57b8597fec..02bf8e4054 100644 --- a/web/packages/accounts/pages/credentials.tsx +++ b/web/packages/accounts/pages/credentials.tsx @@ -1,3 +1,5 @@ +import type { B64EncryptionResult } from "@/base/crypto/libsodium"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; @@ -13,14 +15,12 @@ import { import VerifyMasterPasswordForm, { type VerifyMasterPasswordFormProps, } from "@ente/shared/components/VerifyMasterPasswordForm"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { decryptAndStoreToken, generateAndSaveIntermediateKeyAttributes, generateLoginSubKey, saveKeyInSessionStore, } from "@ente/shared/crypto/helpers"; -import type { B64EncryptionResult } from "@ente/shared/crypto/internal/libsodium"; import { CustomError } from "@ente/shared/error"; import InMemoryStore, { MS_KEYS } from "@ente/shared/storage/InMemoryStore"; import { @@ -158,7 +158,7 @@ const Page: React.FC = ({ appContext }) => { if (kekEncryptedAttributes && keyAttributes) { removeKey(SESSION_KEYS.KEY_ENCRYPTION_KEY); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const kek = await cryptoWorker.decryptB64( kekEncryptedAttributes.encryptedData, kekEncryptedAttributes.nonce, @@ -207,7 +207,7 @@ const Page: React.FC = ({ appContext }) => { // before we let the user in. if (sessionValidityCheck) await sessionValidityCheck; - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const { keyAttributes, encryptedToken, diff --git a/web/packages/accounts/pages/recover.tsx b/web/packages/accounts/pages/recover.tsx index 497afa170e..0160cd47cd 100644 --- a/web/packages/accounts/pages/recover.tsx +++ b/web/packages/accounts/pages/recover.tsx @@ -10,7 +10,6 @@ import LinkButton from "@ente/shared/components/LinkButton"; import SingleInputForm, { type SingleInputFormProps, } from "@ente/shared/components/SingleInputForm"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { decryptAndStoreToken, saveKeyInSessionStore, @@ -24,6 +23,7 @@ import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { appHomeRoute } from "../services/redirect"; import type { PageProps } from "../types/page"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; const bip39 = require("bip39"); // mobile client library only supports english. @@ -80,7 +80,7 @@ const Page: React.FC = ({ appContext }) => { } recoveryKey = bip39.mnemonicToEntropy(recoveryKey); } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const keyAttr = ensure(keyAttributes); const masterKey = await cryptoWorker.decryptB64( keyAttr.masterKeyEncryptedWithRecoveryKey, diff --git a/web/packages/accounts/pages/two-factor/recover.tsx b/web/packages/accounts/pages/two-factor/recover.tsx index 9eb1cf2744..b9723bf0d9 100644 --- a/web/packages/accounts/pages/two-factor/recover.tsx +++ b/web/packages/accounts/pages/two-factor/recover.tsx @@ -5,6 +5,8 @@ import { } from "@/accounts/api/user"; import { PAGES } from "@/accounts/constants/pages"; import type { AccountsContextT } from "@/accounts/types/context"; +import type { B64EncryptionResult } from "@/base/crypto/libsodium"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { ensure } from "@/utils/ensure"; import { VerticallyCentered } from "@ente/shared/components/Container"; @@ -16,8 +18,6 @@ import LinkButton from "@ente/shared/components/LinkButton"; import SingleInputForm, { type SingleInputFormProps, } from "@ente/shared/components/SingleInputForm"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; -import type { B64EncryptionResult } from "@ente/shared/crypto/internal/libsodium"; import { ApiError } from "@ente/shared/error"; import { LS_KEYS, @@ -117,7 +117,7 @@ const Page: React.FC = ({ appContext, twoFactorType }) => { } recoveryKey = bip39.mnemonicToEntropy(recoveryKey); } - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const { encryptedData, nonce } = ensure(encryptedTwoFactorSecret); const twoFactorSecret = await cryptoWorker.decryptB64( encryptedData, diff --git a/web/packages/accounts/services/passkey.ts b/web/packages/accounts/services/passkey.ts index 2fd605b551..5da030fb54 100644 --- a/web/packages/accounts/services/passkey.ts +++ b/web/packages/accounts/services/passkey.ts @@ -1,15 +1,12 @@ import { clientPackageName, isDesktop } from "@/base/app"; +import { encryptToB64, generateEncryptionKey } from "@/base/crypto/libsodium"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { clientPackageHeader, HTTPError } from "@/base/http"; import log from "@/base/log"; import { accountsAppOrigin, apiURL } from "@/base/origins"; import { TwoFactorAuthorizationResponse } from "@/base/types/credentials"; import { ensure } from "@/utils/ensure"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { getRecoveryKey } from "@ente/shared/crypto/helpers"; -import { - encryptToB64, - generateEncryptionKey, -} from "@ente/shared/crypto/internal/libsodium"; import { CustomError } from "@ente/shared/error"; import HTTPService from "@ente/shared/network/HTTPService"; import InMemoryStore, { MS_KEYS } from "@ente/shared/storage/InMemoryStore"; @@ -110,7 +107,7 @@ export const openAccountsManagePasskeysPage = async () => { const resetSecret = await generateEncryptionKey(); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const encryptionResult = await encryptToB64( resetSecret, await cryptoWorker.fromHex(recoveryKey), diff --git a/web/packages/accounts/services/srp.ts b/web/packages/accounts/services/srp.ts index 9ac814de82..044a045ce9 100644 --- a/web/packages/accounts/services/srp.ts +++ b/web/packages/accounts/services/srp.ts @@ -1,6 +1,6 @@ import type { UserVerificationResponse } from "@/accounts/types/user"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { generateLoginSubKey } from "@ente/shared/crypto/helpers"; import InMemoryStore, { MS_KEYS } from "@ente/shared/storage/InMemoryStore"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; @@ -69,7 +69,7 @@ export const configureSRP = async ({ export const generateSRPSetupAttributes = async ( loginSubKey: string, ): Promise => { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const srpSalt = await cryptoWorker.generateSaltToDeriveKey(); diff --git a/web/packages/accounts/utils/srp.ts b/web/packages/accounts/utils/srp.ts index 798af9b878..248e22314b 100644 --- a/web/packages/accounts/utils/srp.ts +++ b/web/packages/accounts/utils/srp.ts @@ -1,15 +1,15 @@ -import ComlinkCryptoWorker from "@ente/shared/crypto"; import { generateLoginSubKey } from "@ente/shared/crypto/helpers"; import type { KeyAttributes } from "@ente/shared/user/types"; import { generateSRPSetupAttributes } from "../services/srp"; import type { SRPSetupAttributes } from "../types/srp"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; export async function generateKeyAndSRPAttributes(passphrase: string): Promise<{ keyAttributes: KeyAttributes; masterKey: string; srpSetupAttributes: SRPSetupAttributes; }> { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const masterKey = await cryptoWorker.generateEncryptionKey(); const recoveryKey = await cryptoWorker.generateEncryptionKey(); const kekSalt = await cryptoWorker.generateSaltToDeriveKey(); diff --git a/web/packages/new/photos/services/download.ts b/web/packages/new/photos/services/download.ts index 10b7f200bc..9b54a10bae 100644 --- a/web/packages/new/photos/services/download.ts +++ b/web/packages/new/photos/services/download.ts @@ -3,6 +3,7 @@ import { isDesktop } from "@/base/app"; import { blobCache, type BlobCache } from "@/base/blob-cache"; +import { type CryptoWorker, sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { customAPIOrigin } from "@/base/origins"; import { FileType } from "@/media/file-type"; @@ -15,13 +16,10 @@ import type { } from "@/new/photos/types/file"; import { renderableImageBlob } from "@/new/photos/utils/file"; import { ensure } from "@/utils/ensure"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; -import { DedicatedCryptoWorker } from "@ente/shared/crypto/internal/crypto.worker"; import { CustomError } from "@ente/shared/error"; import { isPlaybackPossible } from "@ente/shared/media/video-playback"; import HTTPService from "@ente/shared/network/HTTPService"; import { retryAsyncFunction } from "@ente/shared/utils"; -import type { Remote } from "comlink"; export type OnDownloadProgress = (event: { loaded: number; @@ -52,7 +50,7 @@ class DownloadManagerImpl { * Only available when we're running in the desktop app. */ private fileCache?: BlobCache; - private cryptoWorker: Remote | undefined; + private cryptoWorker: CryptoWorker | undefined; private fileObjectURLPromises = new Map>(); private fileConversionPromises = new Map>(); @@ -85,7 +83,7 @@ class DownloadManagerImpl { // } catch (e) { // log.error("Failed to open file cache, will continue without it", e); // } - this.cryptoWorker = await ComlinkCryptoWorker.getInstance(); + this.cryptoWorker = await sharedCryptoWorker(); this.ready = true; } @@ -125,11 +123,11 @@ class DownloadManagerImpl { const { downloadClient, cryptoWorker } = this.ensureInitialized(); const encrypted = await downloadClient.downloadThumbnail(file); - const decrypted = await cryptoWorker.decryptThumbnail( - encrypted, - file.thumbnail.decryptionHeader, - file.key, - ); + const decrypted = await cryptoWorker.decryptThumbnail({ + encryptedData: encrypted, + decryptionHeaderB64: file.thumbnail.decryptionHeader, + keyB64: file.key, + }); return decrypted; }; diff --git a/web/packages/shared/components/VerifyMasterPasswordForm.tsx b/web/packages/shared/components/VerifyMasterPasswordForm.tsx index a1849d8f7e..c2f962c989 100644 --- a/web/packages/shared/components/VerifyMasterPasswordForm.tsx +++ b/web/packages/shared/components/VerifyMasterPasswordForm.tsx @@ -1,11 +1,11 @@ import type { SRPAttributes } from "@/accounts/types/srp"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { Input, type ButtonProps } from "@mui/material"; import { t } from "i18next"; import SingleInputForm, { type SingleInputFormProps, } from "../components/SingleInputForm"; -import ComlinkCryptoWorker from "../crypto"; import { CustomError } from "../error"; import type { KeyAttributes, User } from "../user/types"; @@ -45,7 +45,7 @@ export default function VerifyMasterPasswordForm({ setFieldError, ) => { try { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); let kek: string; try { if (srpAttributes) { diff --git a/web/packages/shared/crypto/helpers.ts b/web/packages/shared/crypto/helpers.ts index 6c1d944d1e..6b0acb7a35 100644 --- a/web/packages/shared/crypto/helpers.ts +++ b/web/packages/shared/crypto/helpers.ts @@ -1,4 +1,5 @@ import { setRecoveryKey } from "@/accounts/api/user"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import log from "@/base/log"; import { LS_KEYS, @@ -10,7 +11,6 @@ import { getToken } from "@ente/shared/storage/localStorage/helpers"; import { SESSION_KEYS, setKey } from "@ente/shared/storage/sessionStorage"; import { getActualKey } from "@ente/shared/user"; import type { KeyAttributes } from "@ente/shared/user/types"; -import ComlinkCryptoWorker from "."; const LOGIN_SUB_KEY_LENGTH = 32; const LOGIN_SUB_KEY_ID = 1; @@ -21,7 +21,7 @@ export async function decryptAndStoreToken( keyAttributes: KeyAttributes, masterKey: string, ) { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const user = getData(LS_KEYS.USER); let decryptedToken = null; const { encryptedToken } = user; @@ -57,7 +57,7 @@ export async function generateAndSaveIntermediateKeyAttributes( existingKeyAttributes: KeyAttributes, key: string, ): Promise { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const intermediateKekSalt = await cryptoWorker.generateSaltToDeriveKey(); const intermediateKek = await cryptoWorker.deriveInteractiveKey( passphrase, @@ -80,7 +80,7 @@ export async function generateAndSaveIntermediateKeyAttributes( } export const generateLoginSubKey = async (kek: string) => { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const kekSubKeyString = await cryptoWorker.generateSubKey( kek, LOGIN_SUB_KEY_LENGTH, @@ -102,7 +102,7 @@ export const saveKeyInSessionStore = async ( key: string, fromDesktop?: boolean, ) => { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const sessionKeyAttributes = await cryptoWorker.generateKeyAndEncryptToB64(key); setKey(keyType, sessionKeyAttributes); @@ -113,7 +113,7 @@ export const saveKeyInSessionStore = async ( }; export async function encryptWithRecoveryKey(key: string) { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const hexRecoveryKey = await getRecoveryKey(); const recoveryKey = await cryptoWorker.fromHex(hexRecoveryKey); const encryptedKey = await cryptoWorker.encryptToB64(key, recoveryKey); @@ -122,7 +122,7 @@ export async function encryptWithRecoveryKey(key: string) { export const getRecoveryKey = async () => { try { - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const keyAttributes: KeyAttributes = getData(LS_KEYS.KEY_ATTRIBUTES); const { @@ -155,7 +155,7 @@ async function createNewRecoveryKey() { const masterKey = await getActualKey(); const existingAttributes = getData(LS_KEYS.KEY_ATTRIBUTES); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const recoveryKey = await cryptoWorker.generateEncryptionKey(); const encryptedMasterKey = await cryptoWorker.encryptToB64( diff --git a/web/packages/shared/file-metadata.ts b/web/packages/shared/file-metadata.ts index 869cc9db6b..71ee155ab1 100644 --- a/web/packages/shared/file-metadata.ts +++ b/web/packages/shared/file-metadata.ts @@ -1,4 +1,5 @@ import { decryptMetadata } from "@/base/crypto/ente"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { isDevBuild } from "@/base/env"; import { decryptPublicMagicMetadata, @@ -6,7 +7,6 @@ import { } from "@/media/file-metadata"; import { EnteFile } from "@/new/photos/types/file"; import { fileLogID } from "@/new/photos/utils/file"; -import ComlinkCryptoWorker from "@ente/shared/crypto"; /** * On-demand decrypt the public magic metadata for an {@link EnteFile} for code @@ -18,7 +18,7 @@ import ComlinkCryptoWorker from "@ente/shared/crypto"; export const getPublicMagicMetadataMT = async (enteFile: EnteFile) => decryptPublicMagicMetadata( enteFile, - (await ComlinkCryptoWorker.getInstance()).decryptMetadata, + (await sharedCryptoWorker()).decryptMetadata, ); /** diff --git a/web/packages/shared/user/index.ts b/web/packages/shared/user/index.ts index f66a62b4f6..69a9780b47 100644 --- a/web/packages/shared/user/index.ts +++ b/web/packages/shared/user/index.ts @@ -1,5 +1,5 @@ -import ComlinkCryptoWorker from "@ente/shared/crypto"; -import type { B64EncryptionResult } from "@ente/shared/crypto/internal/libsodium"; +import type { B64EncryptionResult } from "@/base/crypto/libsodium"; +import { sharedCryptoWorker } from "@/base/crypto/worker"; import { CustomError } from "@ente/shared/error"; import { getKey, SESSION_KEYS } from "@ente/shared/storage/sessionStorage"; @@ -9,7 +9,7 @@ export const getActualKey = async () => { SESSION_KEYS.ENCRYPTION_KEY, ); - const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + const cryptoWorker = await sharedCryptoWorker(); const key = await cryptoWorker.decryptB64( encryptionKeyAttributes.encryptedData, encryptionKeyAttributes.nonce,