Propagate

This commit is contained in:
Manav Rathi
2024-08-10 19:50:36 +05:30
parent 041ad135c9
commit 8acc5ac62d
25 changed files with 153 additions and 157 deletions

View File

@@ -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<Code[]> => {
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<Code[]> => {
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),

View File

@@ -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<EnteFile> => {
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(

View File

@@ -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);

View File

@@ -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,

View File

@@ -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<CreationTimeProps> = ({
return;
}
const cryptoWorker = await ComlinkCryptoWorker.getInstance();
const cryptoWorker = await sharedCryptoWorker();
await updateRemotePublicMagicMetadata(
enteFile,
{ dateTime, editedTime: timestamp },

View File

@@ -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];

View File

@@ -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<Collection> => {
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<Collection> => {
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<EncryptedFileKey[]> => {
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(

View File

@@ -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 <T>(type: EntityType): Promise<Entity<T>> => {
return entity as unknown as Entity<T>;
}
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,

View File

@@ -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: {

View File

@@ -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,
}),
};
}

View File

@@ -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(

View File

@@ -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<EnteFile> {
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 {

View File

@@ -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<T>(
originalMagicMetadata?: MagicMetadataCore<T>,
decryptionKey?: string,
): Promise<MagicMetadataCore<T>> {
const cryptoWorker = await ComlinkCryptoWorker.getInstance();
const cryptoWorker = await sharedCryptoWorker();
if (!originalMagicMetadata) {
originalMagicMetadata = getNewMagicMetadata<T>();

View File

@@ -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<PageProps> = () => {
const [token, setToken] = useState<string>();
@@ -57,7 +57,7 @@ const Page: React.FC<PageProps> = () => {
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();

View File

@@ -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<PageProps> = ({ 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<PageProps> = ({ appContext }) => {
// before we let the user in.
if (sessionValidityCheck) await sessionValidityCheck;
const cryptoWorker = await ComlinkCryptoWorker.getInstance();
const cryptoWorker = await sharedCryptoWorker();
const {
keyAttributes,
encryptedToken,

View File

@@ -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<PageProps> = ({ 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,

View File

@@ -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<RecoverPageProps> = ({ 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,

View File

@@ -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),

View File

@@ -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<SRPSetupAttributes> => {
const cryptoWorker = await ComlinkCryptoWorker.getInstance();
const cryptoWorker = await sharedCryptoWorker();
const srpSalt = await cryptoWorker.generateSaltToDeriveKey();

View File

@@ -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();

View File

@@ -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<DedicatedCryptoWorker> | undefined;
private cryptoWorker: CryptoWorker | undefined;
private fileObjectURLPromises = new Map<number, Promise<SourceURLs>>();
private fileConversionPromises = new Map<number, Promise<SourceURLs>>();
@@ -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;
};

View File

@@ -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) {

View File

@@ -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<KeyAttributes> {
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(

View File

@@ -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,
);
/**

View File

@@ -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,