diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 139ff8723..6892face5 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -6,8 +6,21 @@ import HTTPService from "./HTTPService"; const ENDPOINT = getEndpoint(); +export interface decryptionParams { + encryptedKey: string; + keyDecryptionNonce: string; + header: string; + nonce: string; +}; + export interface fileData { id: number; + file: { + decryptionParams: decryptionParams; + }, + thumbnail: { + decryptionParams: decryptionParams; + }, metadata: { currentTime: number; modificationTime: number; @@ -19,12 +32,10 @@ export interface fileData { src: string, w: number, h: number, - encryptedPassword: string; - encryptedPasswordIV: string; - file?: string; + data?: string; }; -const getFileDataUsingWorker = (data: any, key: string) => { +const getFileMetaDataUsingWorker = (data: any, key: string) => { return new Promise((resolve) => { const worker = new Worker('worker/decryptMetadata.worker.js', { type: 'module' }); const onWorkerMessage = (event) => resolve(event.data); @@ -35,7 +46,7 @@ const getFileDataUsingWorker = (data: any, key: string) => { const getFileUsingWorker = (data: any, key: string) => { return new Promise((resolve) => { - const worker = new Worker('worker/decryptFile.worker.js', { type: 'module' }); + const worker = new Worker('worker/decryptThumbnail.worker.js', { type: 'module' }); const onWorkerMessage = (event) => resolve(event.data); worker.addEventListener('message', onWorkerMessage); worker.postMessage({ data, key }); @@ -47,7 +58,7 @@ export const getFiles = async (sinceTime: string, token: string, limit: string, sinceTime, token, limit, }); - const promises: Promise[] = resp.data.diff.map((data) => getFileDataUsingWorker(data, key)); + const promises: Promise[] = resp.data.diff.map((data) => getFileMetaDataUsingWorker(data, key)); const decrypted = await Promise.all(promises); return decrypted; @@ -62,6 +73,6 @@ export const getPreview = async (token: string, data: fileData, key: string) => ...data, file: resp.data, }, key); - const url = URL.createObjectURL(new Blob([decrypted.file])); + const url = URL.createObjectURL(new Blob([decrypted.data])); return url; } diff --git a/src/worker/decryptFile.worker.js b/src/worker/decryptFile.worker.js deleted file mode 100644 index 51edb427a..000000000 --- a/src/worker/decryptFile.worker.js +++ /dev/null @@ -1,19 +0,0 @@ -import { decrypt } from "utils/crypto/aes"; -import { strToUint8 } from "utils/crypto/common"; -import aescrypt from 'utils/aescrypt'; - -function decryptFile(event) { - const main = async () => { - const data = event.data.data; - const key = event.data.key; - const password = await decrypt(data.encryptedPassword, key, data.encryptedPasswordIV); - const file = await aescrypt.decrypt(data.file, atob(password), true); - self.postMessage({ - id: data.id, - file: file, - }); - } - main(); -} - -self.addEventListener('message', decryptFile); diff --git a/src/worker/decryptMetadata.worker.js b/src/worker/decryptMetadata.worker.js index df997dd36..f256c1573 100644 --- a/src/worker/decryptMetadata.worker.js +++ b/src/worker/decryptMetadata.worker.js @@ -1,19 +1,24 @@ -import { decrypt } from "utils/crypto/aes"; import { base64ToUint8 } from "utils/crypto/common"; -import aescrypt from 'utils/aescrypt'; +import sodium from 'libsodium-wrappers'; -function decryptFile(event) { +function decryptMetadata(event) { const main = async () => { const data = event.data.data; - const key = event.data.key; - const password = await decrypt(data.encryptedPassword, key, data.encryptedPasswordIV); - const metadata = await aescrypt.decrypt(base64ToUint8(data.encryptedMetadata), atob(password)); + await sodium.ready; + const key = sodium.crypto_secretbox_open_easy( + base64ToUint8(data.metadata.decryptionParams.encryptedKey), + base64ToUint8(data.metadata.decryptionParams.keyDecryptionNonce), + base64ToUint8(event.data.key)); + const metadata = sodium.crypto_secretbox_open_easy( + base64ToUint8(data.metadata.encryptedData), + base64ToUint8(data.metadata.decryptionParams.nonce), + key); self.postMessage({ ...data, - metadata: JSON.parse(metadata) + metadata: JSON.parse(new TextDecoder().decode(metadata)) }); } main(); } -self.addEventListener('message', decryptFile); +self.addEventListener('message', decryptMetadata); diff --git a/src/worker/decryptThumbnail.worker.js b/src/worker/decryptThumbnail.worker.js new file mode 100644 index 000000000..19e15e934 --- /dev/null +++ b/src/worker/decryptThumbnail.worker.js @@ -0,0 +1,24 @@ +import { base64ToUint8 } from "utils/crypto/common"; +import sodium from 'libsodium-wrappers'; + +function decryptThumbnail(event) { + const main = async () => { + const data = event.data.data; + await sodium.ready; + const key = sodium.crypto_secretbox_open_easy( + base64ToUint8(data.thumbnail.decryptionParams.encryptedKey), + base64ToUint8(data.thumbnail.decryptionParams.keyDecryptionNonce), + base64ToUint8(event.data.key)); + const thumbnail = sodium.crypto_secretbox_open_easy( + new Uint8Array(data.file), + base64ToUint8(data.thumbnail.decryptionParams.nonce), + key); + self.postMessage({ + id: data.id, + data: thumbnail, + }); + } + main(); +} + +self.addEventListener('message', decryptThumbnail);