From b9efb68851c70d2acc01bdc48596072f3bdce496 Mon Sep 17 00:00:00 2001 From: MengYX Date: Sat, 18 Dec 2021 21:35:22 +0800 Subject: [PATCH] fix(QMCv2): cipher should determine by key size (cherry picked from commit dba63f212cbf9351e5dc16870eb32ae582db2867) --- src/decrypt/qmc.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/decrypt/qmc.ts b/src/decrypt/qmc.ts index 6efa3eb..2b5c6d7 100644 --- a/src/decrypt/qmc.ts +++ b/src/decrypt/qmc.ts @@ -177,16 +177,14 @@ export class QmcDecoder { this.audioSize = this.size - keySize - 8 const rawKey = this.file.subarray(this.audioSize, this.size - 8) const keyEnd = rawKey.findIndex(v => v == QmcDecoder.BYTE_COMMA) - const keyDec = QmcDeriveKey(rawKey.subarray(0, keyEnd)) - this.cipher = new QmcRC4Cipher(keyDec) + this.setCipher(rawKey.subarray(0, keyEnd)) } else { const sizeView = new DataView(last4Byte.buffer, last4Byte.byteOffset); const keySize = sizeView.getUint32(0, true) if (keySize < 0x300) { this.audioSize = this.size - keySize - 4 const rawKey = this.file.subarray(this.audioSize, this.size - 4) - const keyDec = QmcDeriveKey(rawKey) - this.cipher = new QmcMapCipher(keyDec) + this.setCipher(rawKey) } else { this.audioSize = this.size this.cipher = new QmcStaticCipher() @@ -194,5 +192,14 @@ export class QmcDecoder { } } + private setCipher(keyRaw: Uint8Array) { + const keyDec = QmcDeriveKey(keyRaw) + if (keyDec.length > 300) { + this.cipher = new QmcRC4Cipher(keyDec) + } else { + this.cipher = new QmcMapCipher(keyDec) + } + } + }