From fce4734ed9a5aea2beead12c965ea4746fb2b175 Mon Sep 17 00:00:00 2001 From: MengYX Date: Fri, 17 Dec 2021 06:24:21 +0800 Subject: [PATCH] feat(QMCv2): use js decoder (cherry picked from commit c24e5d29733cfa771dd41ae40032029c6bbb9186) --- src/decrypt/qmc.ts | 21 +++++++++------------ src/decrypt/{qmcv2.ts => qmc_wasm.ts} | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) rename src/decrypt/{qmcv2.ts => qmc_wasm.ts} (97%) diff --git a/src/decrypt/qmc.ts b/src/decrypt/qmc.ts index 91a652e..0ff1350 100644 --- a/src/decrypt/qmc.ts +++ b/src/decrypt/qmc.ts @@ -10,7 +10,7 @@ import { WriteMetaToMp3 } from "@/decrypt/utils"; import {parseBlob as metaParseBlob} from "music-metadata-browser"; -import {DecryptQMCv2} from "./qmcv2"; +import {DecryptQMCWasm} from "./qmc_wasm"; import iconv from "iconv-lite"; @@ -55,22 +55,19 @@ export async function Decrypt(file: Blob, raw_filename: string, raw_ext: string) const fileBuffer = await GetArrayBuffer(file); let musicDecoded: Uint8Array | undefined; - if (version === 2) { - const v2Decrypted = await DecryptQMCv2(fileBuffer); + if (version === 2 && globalThis.WebAssembly) { + console.log("qmc: using wasm decoder") + const v2Decrypted = await DecryptQMCWasm(fileBuffer); // 如果 v2 检测失败,降级到 v1 再尝试一次 if (v2Decrypted) { musicDecoded = v2Decrypted; - } else { - version = 1; } } - - if (version === 1) { - const seed = new QmcStaticCipher(); - musicDecoded = new Uint8Array(fileBuffer) - seed.decrypt(musicDecoded, 0); - } else if (!musicDecoded) { - throw new Error(`解密失败: ${raw_ext}`); + if (!musicDecoded) { + // may throw error + console.log("qmc: using js decoder") + const d = new QmcDecoder(new Uint8Array(fileBuffer)) + musicDecoded = d.decrypt() } const ext = SniffAudioExt(musicDecoded, handler.ext); diff --git a/src/decrypt/qmcv2.ts b/src/decrypt/qmc_wasm.ts similarity index 97% rename from src/decrypt/qmcv2.ts rename to src/decrypt/qmc_wasm.ts index 3189426..7a1fd49 100644 --- a/src/decrypt/qmcv2.ts +++ b/src/decrypt/qmc_wasm.ts @@ -29,7 +29,7 @@ function MergeUint8Array(array: Uint8Array[]): Uint8Array { * @param {ArrayBuffer} mggBlob 读入的文件 Blob * @return {Promise} */ -export async function DecryptQMCv2(mggBlob: ArrayBuffer) { +export async function DecryptQMCWasm(mggBlob: ArrayBuffer) { // 初始化模组 const QMCCrypto = await QMCCryptoModule();