Use sodium to decrypt metadata and thumbnails
This commit is contained in:
parent
ba1b21b9fc
commit
ab7fd7651a
4 changed files with 55 additions and 34 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
|
@ -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
src/worker/decryptThumbnail.worker.js
Normal file
24
src/worker/decryptThumbnail.worker.js
Normal 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);
|
Loading…
Add table
Reference in a new issue