feat: add kgm v5 (kgg) support.

This commit is contained in:
鲁树人
2025-02-24 20:41:17 +09:00
parent 02f0bb9a93
commit 54deabe74f
14 changed files with 202 additions and 30 deletions

View File

@@ -2,18 +2,55 @@ use umc_kgm::{header::Header, Decipher};
use wasm_bindgen::prelude::wasm_bindgen;
use wasm_bindgen::JsError;
/// KuGou KGM file header.
#[wasm_bindgen(js_name=KuGouHeader)]
pub struct JsKuGouHdr(Header);
#[wasm_bindgen(js_class=KuGouHeader)]
impl JsKuGouHdr {
/// Parse the KuGou header (0x400 bytes recommended).
#[wasm_bindgen(constructor)]
pub fn new(header: &[u8]) -> Result<Self, JsError> {
let header = Header::from_buffer(header).map_err(JsError::from)?;
Ok(Self(header))
}
/// Get the audio hash (kgm v5).
#[wasm_bindgen(getter, js_name = "audioHash")]
pub fn get_audio_hash(&self) -> String {
self.0.audio_hash.clone()
}
/// Get version
#[wasm_bindgen(getter, js_name = "version")]
pub fn get_crypto_version(&self) -> u32 {
self.0.crypto_version
}
/// Get offset to encrypted data
#[wasm_bindgen(getter, js_name = "offsetToData")]
pub fn get_offset_to_data(&self) -> u32 {
self.0.offset_to_data as u32
}
}
/// KuGou KGM file decipher.
#[wasm_bindgen(js_name=KuGou)]
pub struct JsKuGou(Decipher);
#[wasm_bindgen(js_class = KuGou)]
#[wasm_bindgen(js_class=KuGou)]
impl JsKuGou {
/// Parse the KuGou header (0x400 bytes)
pub fn from_header(header: &[u8]) -> Result<JsKuGou, JsError> {
let header = Header::from_buffer(header).map_err(JsError::from)?;
let decipher = Decipher::new(&header).map_err(JsError::from)?;
/// Parse the KuGou header (0x400 bytes recommended).
pub fn from_header(header: &[u8]) -> Result<Self, JsError> {
let header = JsKuGouHdr::new(header)?;
Self::from_header_v5(&header, None)
}
Ok(JsKuGou(decipher))
/// Parse the KuGou header (0x400 bytes recommended).
#[wasm_bindgen(js_name=fromHeaderV5)]
pub fn from_header_v5(header: &JsKuGouHdr, ekey: Option<String>) -> Result<Self, JsError> {
let decipher = Decipher::new_v5(&header.0, ekey).map_err(JsError::from)?;
Ok(Self(decipher))
}
/// Decrypt a buffer.