Selaa lähdekoodia

Use sodium to decrypt metadata and thumbnails

Vishnu Mohandas 4 vuotta sitten
vanhempi
commit
ab7fd7651a

+ 18 - 7
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<fileData>[] = resp.data.diff.map((data) => getFileDataUsingWorker(data, key));
+    const promises: Promise<fileData>[] = 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;
 }

+ 0 - 19
src/worker/decryptFile.worker.js

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

+ 13 - 8
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);

+ 24 - 0
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);