Compare commits
3 Commits
2d06fec684
...
cca9b38a1f
Author | SHA1 | Date | |
---|---|---|---|
cca9b38a1f | |||
a35a271cea | |||
b198240ef9 |
@ -20,7 +20,7 @@
|
|||||||
"@chakra-ui/react": "^2.6.1",
|
"@chakra-ui/react": "^2.6.1",
|
||||||
"@emotion/react": "^11.11.0",
|
"@emotion/react": "^11.11.0",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
"@jixun/libparakeet": "0.0.0-exp.18",
|
"@jixun/libparakeet": "0.0.0-exp.20",
|
||||||
"@reduxjs/toolkit": "^1.9.5",
|
"@reduxjs/toolkit": "^1.9.5",
|
||||||
"framer-motion": "^10.12.12",
|
"framer-motion": "^10.12.12",
|
||||||
"nanoid": "^4.0.2",
|
"nanoid": "^4.0.2",
|
||||||
|
@ -14,8 +14,8 @@ dependencies:
|
|||||||
specifier: ^11.11.0
|
specifier: ^11.11.0
|
||||||
version: 11.11.0(@emotion/react@11.11.0)(@types/react@18.2.6)(react@18.2.0)
|
version: 11.11.0(@emotion/react@11.11.0)(@types/react@18.2.6)(react@18.2.0)
|
||||||
'@jixun/libparakeet':
|
'@jixun/libparakeet':
|
||||||
specifier: 0.0.0-exp.18
|
specifier: 0.0.0-exp.20
|
||||||
version: 0.0.0-exp.18
|
version: 0.0.0-exp.20
|
||||||
'@reduxjs/toolkit':
|
'@reduxjs/toolkit':
|
||||||
specifier: ^1.9.5
|
specifier: ^1.9.5
|
||||||
version: 1.9.5(react-redux@8.0.5)(react@18.2.0)
|
version: 1.9.5(react-redux@8.0.5)(react@18.2.0)
|
||||||
@ -3060,9 +3060,9 @@ packages:
|
|||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@jixun/libparakeet@0.0.0-exp.18:
|
/@jixun/libparakeet@0.0.0-exp.20:
|
||||||
resolution:
|
resolution:
|
||||||
{ integrity: sha512-KLUCxr6x47hDs1tszY8uyR8fgiB+b2UIFSgCg9GEs+AiB+oFTyQlhZXbKmyfDOuWSDiBcdKJvmXq29x3zPDNEQ== }
|
{ integrity: sha512-uax/1lPsui/qOEVI2v6pdX/2BgrWmqIFbKdlOSnEmvaDZHCFFIerA8VYPycl8ASO/0Xp6gPxwtHfDQIi7zDl3A== }
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@jridgewell/gen-mapping@0.3.3:
|
/@jridgewell/gen-mapping@0.3.3:
|
||||||
|
@ -3,7 +3,10 @@ import { CryptoFactory } from './CryptoBase';
|
|||||||
import { QMC1Crypto } from './qmc/qmc_v1';
|
import { QMC1Crypto } from './qmc/qmc_v1';
|
||||||
import { QMC2Crypto } from './qmc/qmc_v2';
|
import { QMC2Crypto } from './qmc/qmc_v2';
|
||||||
import { XiamiCrypto } from './xiami/xiami';
|
import { XiamiCrypto } from './xiami/xiami';
|
||||||
|
import { KGMCrypto } from './kgm/kgm_pc';
|
||||||
|
import { NCMCrypto } from './ncm/ncm_pc';
|
||||||
import { XimalayaAndroidCrypto } from './xmly/xmly_android';
|
import { XimalayaAndroidCrypto } from './xmly/xmly_android';
|
||||||
|
import { KWMCrypto } from './kwm/kwm';
|
||||||
|
|
||||||
export const allCryptoFactories: CryptoFactory[] = [
|
export const allCryptoFactories: CryptoFactory[] = [
|
||||||
// Xiami (*.xm)
|
// Xiami (*.xm)
|
||||||
@ -12,6 +15,15 @@ export const allCryptoFactories: CryptoFactory[] = [
|
|||||||
// QMCv2 (*.mflac)
|
// QMCv2 (*.mflac)
|
||||||
QMC2Crypto.make,
|
QMC2Crypto.make,
|
||||||
|
|
||||||
|
// NCM (*.ncm)
|
||||||
|
NCMCrypto.make,
|
||||||
|
|
||||||
|
// KGM (*.kgm, *.vpr)
|
||||||
|
KGMCrypto.make,
|
||||||
|
|
||||||
|
// KWMv1 (*.kwm)
|
||||||
|
KWMCrypto.make,
|
||||||
|
|
||||||
// Crypto that does not implement "checkBySignature" or need to decrypt the entire file and then check audio type,
|
// Crypto that does not implement "checkBySignature" or need to decrypt the entire file and then check audio type,
|
||||||
// should be moved to the bottom of the list for performance reasons.
|
// should be moved to the bottom of the list for performance reasons.
|
||||||
|
|
||||||
|
6
src/decrypt-worker/crypto/kgm/kgm_pc.key.ts
Normal file
6
src/decrypt-worker/crypto/kgm/kgm_pc.key.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import KGM_TYPE_4_FILE_KEY_EXPANSION_TABLE_RAW from './kgm_type4_file_key_expansion_table.txt?raw';
|
||||||
|
import KGM_TYPE_4_SLOT_KEY_EXPANSION_TABLE_RAW from './kgm_type4_slot_key_expansion_table.txt?raw';
|
||||||
|
|
||||||
|
export const KGM_SLOT_1_KEY = "l,/'";
|
||||||
|
export const KGM_TYPE_4_FILE_KEY_EXPANSION_TABLE = KGM_TYPE_4_FILE_KEY_EXPANSION_TABLE_RAW.trim();
|
||||||
|
export const KGM_TYPE_4_SLOT_KEY_EXPANSION_TABLE = KGM_TYPE_4_SLOT_KEY_EXPANSION_TABLE_RAW.trim();
|
18
src/decrypt-worker/crypto/kgm/kgm_pc.ts
Normal file
18
src/decrypt-worker/crypto/kgm/kgm_pc.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { transformBlob } from '~/decrypt-worker/util/transformBlob';
|
||||||
|
import type { CryptoBase } from '../CryptoBase';
|
||||||
|
import { KGM_SLOT_1_KEY, KGM_TYPE_4_FILE_KEY_EXPANSION_TABLE, KGM_TYPE_4_SLOT_KEY_EXPANSION_TABLE } from './kgm_pc.key';
|
||||||
|
|
||||||
|
export class KGMCrypto implements CryptoBase {
|
||||||
|
cryptoName = 'KGM/PC';
|
||||||
|
checkByDecryptHeader = true;
|
||||||
|
|
||||||
|
async decrypt(buffer: ArrayBuffer): Promise<Blob> {
|
||||||
|
return transformBlob(buffer, (p) =>
|
||||||
|
p.make.KugouKGM(KGM_SLOT_1_KEY, KGM_TYPE_4_SLOT_KEY_EXPANSION_TABLE, KGM_TYPE_4_FILE_KEY_EXPANSION_TABLE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static make() {
|
||||||
|
return new KGMCrypto();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
!@#$%^&*(O)P_+DCFVBGNMXDCFVBGN!@#$%^&*()_@#$%^&*()kljhgfk;oswhqoi7t89g_+@#$%^&*()!@#$%^&*()@#$%^&*(@#$%^&*()@#$%^&*()@#$^&$&^%*&^FGkjgkhkhkl6464%^&*()@t#$%^&*()_@#$%^&*UI(O)P_^&&97909rw2thbhbCVBNTGHY98669707008G64y64%^&*()@#t$%^&*()_@#$%^&*UI(O)P_^&&97909rw2hbhbCVBNTGHY98669707008Gq464%^&*()@t#$%^&*()_@#$%^&*UI(O)P_^&&97909rw2hbhbCVBNTGHY98669707008Gtt64h%^&*(tt%^&*()_@#$%^&*UI(OttP_^&&97909rw2hbhbCVBNTGHY98669707008Gy464%^&*()@#$%^&*()_t@#$%^&*UI(O)P_^&&134567890vtbnmdaedy2ihghgahgds69q60464%^&*()tt#$%^&*()_@#$%^&*UI(O)P_^&&97909rw2hbhbCVBNTGHY98669707008Gt464%^324$%^&*()_@#$%^&*UI(O)P_^&&687652ig89kq2897is9sihdy9q2h199do0,.,,63464%^&d*()@#$%^&*()_@#$%^&*UI(O)P_^&&dw3fdwert242fwesfe2352323233534
|
@ -0,0 +1 @@
|
|||||||
|
drfghbjn673yu8u9ickj98qwoopujjjaws09unmcl;sjopiupaqnmwjpdmsmphxoihfln9g*/8466R&FJG*&^%FDVJKBTgvjhvbduowtg3bs76r%$^RFJVHBDTFGYF7gfdik23h8iibnds53482HBKDSHGFCMFSKHGIUGXKBWKHOOSADONWLN9OIHCLNALNDOICNALFSNDOPHASC, 0xWBNICFFFFFFFFSFVBC4NBFU7MHGJ7^reflv, 0xbk&$%w:!oi){+u:bx*)y!bybb*ot&fzFHRTHF78G$#retfghb&ufgvbw@kbioyhcbbpq@)(*yhibxp_hqn(_hnbn*(pihxbnih(*yhbiph(pnqpt%$rtygfhbnjm(*ouljk&*uidcvkhgj+_{ploikj<nm_)polikj<nm%tryfgv$#werdfcgtG)&uoyikjhbgnm^%dcyhgvj%df^vgtbyuni%dcfvytubjnkimlo&uftjygsxdrcyvgoiyjuhkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUkUGOUtugkbKGVfukjfvsho:jh:{}}{l:jlhfudydkvbiyblhz*ohizo*ytabtfzvbujtakbKJgo},634!@#$rfv(iujhg&yuhgqwsaxdc9I8UJE3DFCV*(iujhgWSTYxdchg(*itgvhjf^eHY534
|
1
src/decrypt-worker/crypto/kwm/kwm.key.ts
Normal file
1
src/decrypt-worker/crypto/kwm/kwm.key.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export const KWM_KEY = 'MoOtOiTvINGwd2E6n0E1i7L5t2IoOoNk';
|
17
src/decrypt-worker/crypto/kwm/kwm.ts
Normal file
17
src/decrypt-worker/crypto/kwm/kwm.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { transformBlob } from '~/decrypt-worker/util/transformBlob';
|
||||||
|
import type { CryptoBase } from '../CryptoBase';
|
||||||
|
import { KWM_KEY } from './kwm.key';
|
||||||
|
|
||||||
|
// v1 only
|
||||||
|
export class KWMCrypto implements CryptoBase {
|
||||||
|
cryptoName = 'KWM';
|
||||||
|
checkByDecryptHeader = true;
|
||||||
|
|
||||||
|
async decrypt(buffer: ArrayBuffer): Promise<Blob> {
|
||||||
|
return transformBlob(buffer, (p) => p.make.KuwoKWM(KWM_KEY));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static make() {
|
||||||
|
return new KWMCrypto();
|
||||||
|
}
|
||||||
|
}
|
2
src/decrypt-worker/crypto/ncm/ncm_pc.key.ts
Normal file
2
src/decrypt-worker/crypto/ncm/ncm_pc.key.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export const NCM_KEY = 'hzHRAmso5kInbaxW';
|
||||||
|
export const NCM_MAGIC_HEADER = new Uint8Array([0x43, 0x54, 0x45, 0x4e, 0x46, 0x44, 0x41, 0x4d]);
|
21
src/decrypt-worker/crypto/ncm/ncm_pc.ts
Normal file
21
src/decrypt-worker/crypto/ncm/ncm_pc.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { transformBlob } from '~/decrypt-worker/util/transformBlob';
|
||||||
|
import type { CryptoBase } from '../CryptoBase';
|
||||||
|
import { NCM_KEY, NCM_MAGIC_HEADER } from './ncm_pc.key';
|
||||||
|
|
||||||
|
export class NCMCrypto implements CryptoBase {
|
||||||
|
cryptoName = 'NCM/PC';
|
||||||
|
checkByDecryptHeader = false;
|
||||||
|
|
||||||
|
async checkBySignature(buffer: ArrayBuffer) {
|
||||||
|
const view = new DataView(buffer, 0, NCM_MAGIC_HEADER.byteLength);
|
||||||
|
return NCM_MAGIC_HEADER.every((value, i) => value === view.getUint8(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
async decrypt(buffer: ArrayBuffer): Promise<Blob> {
|
||||||
|
return transformBlob(buffer, (p) => p.make.NeteaseNCM(NCM_KEY));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static make() {
|
||||||
|
return new NCMCrypto();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user