From 0eb686fd3cfc357149a79cbd91c32b27b74e4c4c Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Thu, 4 Jul 2024 17:02:38 -0300 Subject: [PATCH] regression: Not able to check file consistency when encrypted (#32714) Co-authored-by: Douglas Gubert --- .../meteor/app/e2e/client/rocketchat.e2e.room.js | 16 +++++++++++----- .../meteor/client/lib/chats/flows/uploadFiles.ts | 6 ++++++ .../MessageAttachment/MessageAttachmentBase.ts | 3 +++ packages/core-typings/src/IUpload.ts | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/meteor/app/e2e/client/rocketchat.e2e.room.js b/apps/meteor/app/e2e/client/rocketchat.e2e.room.js index ac7cedb3fd9..fe61156240a 100644 --- a/apps/meteor/app/e2e/client/rocketchat.e2e.room.js +++ b/apps/meteor/app/e2e/client/rocketchat.e2e.room.js @@ -359,13 +359,16 @@ export class E2ERoom extends Emitter { } } - async sha256Hash(text) { - const encoder = new TextEncoder(); - const data = encoder.encode(text); - const hashArray = Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256', data))); + async sha256Hash(arrayBuffer) { + const hashArray = Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256', arrayBuffer))); return hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); } + async sha256HashText(text) { + const encoder = new TextEncoder(); + return this.sha256Hash(encoder.encode(text)); + } + // Encrypts files before upload. I/O is in arraybuffers. async encryptFile(file) { // if (!this.isSupportedRoomType(this.typeOfRoom)) { @@ -374,6 +377,8 @@ export class E2ERoom extends Emitter { const fileArrayBuffer = await readFileAsArrayBuffer(file); + const hash = await this.sha256Hash(new Uint8Array(fileArrayBuffer)); + const vector = crypto.getRandomValues(new Uint8Array(16)); const key = await generateAESCTRKey(); let result; @@ -386,7 +391,7 @@ export class E2ERoom extends Emitter { const exportedKey = await window.crypto.subtle.exportKey('jwk', key); - const fileName = await this.sha256Hash(file.name); + const fileName = await this.sha256HashText(file.name); const encryptedFile = new File([toArrayBuffer(result)], fileName); @@ -395,6 +400,7 @@ export class E2ERoom extends Emitter { key: exportedKey, iv: Base64.encode(vector), type: file.type, + hash, }; } diff --git a/apps/meteor/client/lib/chats/flows/uploadFiles.ts b/apps/meteor/client/lib/chats/flows/uploadFiles.ts index 2cf0c70cd2f..32e17da8ac6 100644 --- a/apps/meteor/client/lib/chats/flows/uploadFiles.ts +++ b/apps/meteor/client/lib/chats/flows/uploadFiles.ts @@ -106,6 +106,9 @@ export const uploadFiles = async (chat: ChatAPI, files: readonly File[], resetFi key: encryptedFile.key, iv: encryptedFile.iv, }, + hashes: { + sha256: encryptedFile.hash, + }, }; if (/^image\/.+/.test(file.type)) { @@ -167,6 +170,9 @@ export const uploadFiles = async (chat: ChatAPI, files: readonly File[], resetFi key: encryptedFile.key, iv: encryptedFile.iv, }, + hashes: { + sha256: encryptedFile.hash, + }, }; const fileContent = { diff --git a/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts b/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts index 23a99984414..27271a66251 100644 --- a/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts +++ b/packages/core-typings/src/IMessage/MessageAttachment/MessageAttachmentBase.ts @@ -17,4 +17,7 @@ export type MessageAttachmentBase = { iv: string; key: JsonWebKey; }; + hashes?: { + sha256: string; + }; }; diff --git a/packages/core-typings/src/IUpload.ts b/packages/core-typings/src/IUpload.ts index b9b367a648f..64ad2ad933a 100644 --- a/packages/core-typings/src/IUpload.ts +++ b/packages/core-typings/src/IUpload.ts @@ -56,6 +56,9 @@ export interface IUpload { iv: string; key: JsonWebKey; }; + hashes?: { + sha256: string; + }; } export type IUploadWithUser = IUpload & { user?: Pick };