Use sodium to decrypt metadata and thumbnails

This commit is contained in:
Vishnu Mohandas 2020-09-26 22:46:16 +05:30
parent ba1b21b9fc
commit ab7fd7651a
4 changed files with 55 additions and 34 deletions

View file

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

View file

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

View file

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

View file

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