diff --git a/lib/types/media-types.js b/lib/types/media-types.js --- a/lib/types/media-types.js +++ b/lib/types/media-types.js @@ -220,6 +220,7 @@ +dataSize: number, +time: number, // ms +isPadded: boolean, + +sha256: ?string, +success: boolean, +exceptionMessage: ?string, } @@ -603,7 +604,8 @@ | { +success: false, +reason: 'encryption_failed', - }; + } + | { +success: false, +reason: 'digest_failed' }; export type MediaMissionResult = MediaMissionFailure | { +success: true }; diff --git a/native/media/encryption-utils.js b/native/media/encryption-utils.js --- a/native/media/encryption-utils.js +++ b/native/media/encryption-utils.js @@ -28,6 +28,7 @@ type EncryptedFileResult = { +success: true, +uri: string, + +sha256Hash: string, +encryptionKey: string, }; @@ -87,11 +88,12 @@ const startEncrypt = Date.now(); const paddedLength = calculatePaddedLength(data.byteLength); const shouldPad = paddedLength <= PADDING_THRESHOLD; - let key, encryptedData; + let key, encryptedData, sha256Hash; try { const plaintextData = shouldPad ? pad(data) : data; key = AES.generateKey(); encryptedData = AES.encrypt(key, plaintextData); + sha256Hash = commUtilsModule.sha256(encryptedData.buffer); } catch (e) { success = false; exceptionMessage = getMessageForException(e); @@ -101,10 +103,14 @@ dataSize: encryptedData?.byteLength ?? -1, isPadded: shouldPad, time: Date.now() - startEncrypt, + sha256: sha256Hash, success, exceptionMessage, }); - if (!success || !encryptedData || !key) { + if (encryptedData && !sha256Hash) { + return { steps, result: { success: false, reason: 'digest_failed' } }; + } + if (!success || !encryptedData || !key || !sha256Hash) { return { steps, result: { success: false, reason: 'encryption_failed' }, @@ -139,6 +145,7 @@ success: true, uri: destinationURI, encryptionKey: uintArrayToHexString(key), + sha256Hash, }, }; } @@ -180,6 +187,7 @@ ...preprocessedMedia, mediaType: 'encrypted_photo', uploadURI: encryptionResult.uri, + blobHash: encryptionResult.sha256Hash, encryptionKey: encryptionResult.encryptionKey, shouldDisposePath: pathFromURI(encryptionResult.uri), }, @@ -201,8 +209,10 @@ ...preprocessedMedia, mediaType: 'encrypted_video', uploadURI: encryptionResult.uri, + blobHash: encryptionResult.sha256Hash, encryptionKey: encryptionResult.encryptionKey, uploadThumbnailURI: thumbnailEncryptionResult.uri, + thumbnailBlobHash: thumbnailEncryptionResult.sha256Hash, thumbnailEncryptionKey: thumbnailEncryptionResult.encryptionKey, shouldDisposePath: pathFromURI(encryptionResult.uri), }, diff --git a/native/media/media-utils.js b/native/media/media-utils.js --- a/native/media/media-utils.js +++ b/native/media/media-utils.js @@ -41,12 +41,15 @@ | { +mediaType: 'encrypted_photo', ...SharedMediaResult, + +blobHash: string, +encryptionKey: string, } | { +mediaType: 'encrypted_video', ...SharedMediaResult, + +blobHash: string, +encryptionKey: string, + +thumbnailBlobHash: string, +thumbnailEncryptionKey: string, +uploadThumbnailURI: string, +loop: boolean, diff --git a/web/media/encryption-utils.js b/web/media/encryption-utils.js --- a/web/media/encryption-utils.js +++ b/web/media/encryption-utils.js @@ -69,6 +69,7 @@ dataSize: encryptedData?.byteLength ?? -1, isPadded: shouldPad, time: Date.now() - startEncrypt, + sha256: null, success, exceptionMessage, });