From d0832c6c0a6e421e2eb221f5e83951001f3b70a1 Mon Sep 17 00:00:00 2001 From: Rob Walch Date: Fri, 24 May 2024 11:50:35 -0700 Subject: [PATCH] Fix JS AES fallback when browserCrypto.subtle returns undefined (rather than null) (#6446) --- src/crypt/decrypter.ts | 19 +++++++++++++------ src/crypt/fast-aes-key.ts | 4 ++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/crypt/decrypter.ts b/src/crypt/decrypter.ts index 299dd23b64a..a3f988d1c5f 100644 --- a/src/crypt/decrypter.ts +++ b/src/crypt/decrypter.ts @@ -38,7 +38,7 @@ export default class Decrypter { /* no-op */ } } - this.useSoftware = this.subtle === null; + this.useSoftware = !this.subtle; } destroy() { @@ -155,20 +155,22 @@ export default class Decrypter { iv: ArrayBuffer, aesMode: DecrypterAesMode, ): Promise { - const subtle = this.subtle; if (this.key !== key || !this.fastAesKey) { + if (!this.subtle) { + return Promise.resolve(this.onWebCryptoError(data, key, iv, aesMode)); + } this.key = key; - this.fastAesKey = new FastAESKey(subtle, key, aesMode); + this.fastAesKey = new FastAESKey(this.subtle, key, aesMode); } return this.fastAesKey .expandKey() .then((aesKey: CryptoKey) => { // decrypt using web crypto - if (!subtle) { + if (!this.subtle) { return Promise.reject(new Error('web crypto not initialized')); } this.logOnce('WebCrypto AES decrypt'); - const crypto = new AESCrypto(subtle, new Uint8Array(iv), aesMode); + const crypto = new AESCrypto(this.subtle, new Uint8Array(iv), aesMode); return crypto.decrypt(data.buffer, aesKey); }) .catch((err) => { @@ -180,7 +182,12 @@ export default class Decrypter { }); } - private onWebCryptoError(data, key, iv, aesMode): ArrayBuffer | never { + private onWebCryptoError( + data: Uint8Array, + key: ArrayBuffer, + iv: ArrayBuffer, + aesMode: DecrypterAesMode, + ): ArrayBuffer | never { const enableSoftwareAES = this.enableSoftwareAES; if (enableSoftwareAES) { this.useSoftware = true; diff --git a/src/crypt/fast-aes-key.ts b/src/crypt/fast-aes-key.ts index 277baf26419..8312f66aec3 100644 --- a/src/crypt/fast-aes-key.ts +++ b/src/crypt/fast-aes-key.ts @@ -1,11 +1,11 @@ import { DecrypterAesMode } from './decrypter-aes-mode'; export default class FastAESKey { - private subtle: any; + private subtle: SubtleCrypto; private key: ArrayBuffer; private aesMode: DecrypterAesMode; - constructor(subtle, key, aesMode: DecrypterAesMode) { + constructor(subtle: SubtleCrypto, key, aesMode: DecrypterAesMode) { this.subtle = subtle; this.key = key; this.aesMode = aesMode;