diff --git a/msg_tool_xp3data/crypt.json b/msg_tool_xp3data/crypt.json index c8f278d..8392ec4 100644 --- a/msg_tool_xp3data/crypt.json +++ b/msg_tool_xp3data/crypt.json @@ -155,6 +155,10 @@ "$type": "HashCrypt", "Title": "ばぁばとママとの超熟母娘丼 ~3世代での家庭内エッチ~ | 爱你深至夏海蔚蓝" }, + "Bakunyuu Oyakodon": { + "$type": "DieselmineCrypt", + "Title": "爆乳母娘丼 ~仕事先の親子が寝取りやすそうな件~" + }, "Bakuretsu Otome Sexy Mary": { "$type": "CxEncryption", "Mask": 531, @@ -414,6 +418,10 @@ "ControlBlockName": "gakuen.bin", "Title": "学園特救ホトケンサー" }, + "Ganki Tengoku": { + "$type": "DieselmineCrypt", + "Title": "顔騎天国" + }, "Gisobo, Choukyou Chuu": { "$type": "HashCrypt", "Title": "義祖母、調教中。 ~仲良しの秘訣はSMです。~" @@ -671,6 +679,10 @@ "ControlBlockName": "hoshikoi.bin", "Title": "星恋*ティンクル | 星恋*twinkle | 星恋*闪烁" }, + "Hoshoku Game 2 ~Sayonara, Marunomi~": { + "$type": "DieselmineCrypt", + "Title": "捕食ゲーム2~さようなら。丸呑み~" + }, "Ichizu ni Zettai Fukujuu na Imouto": { "$type": "HashCrypt", "Title": "一途に絶対服従な妹をめちゃくちゃにしてみた ~愛欲兄妹~" @@ -755,6 +767,10 @@ "ControlBlockName": "island.bin", "Title": "アイランドダイアリー" }, + "Itsu de mo Onna no Ko ni Seieki...": { + "$type": "DieselmineCrypt", + "Title": "いつでも女の子に精液大量注入!して褒められる世界" + }, "Japanese School Life": { "$type": "CxEncryption", "Mask": 697, @@ -950,6 +966,10 @@ "Key": 105, "Title": "恋し彩る正義爛漫" }, + "Koko wa Suki na Dake Sex Shite": { + "$type": "DieselmineCrypt", + "Title": "ここは好きなだけセックスして、みんなに喜ばれる世界!" + }, "Kokoro no Katachi to Iro to Oto": { "$type": "XorCrypt", "Key": 247, @@ -963,6 +983,10 @@ "$type": "HashCrypt", "Title": "紅炎の守護騎士キシャル~Guardian of Prominence Kishar~" }, + "Kouki na Ojou-sama o Katappashi kara...": { + "$type": "DieselmineCrypt", + "Title": "高貴なお嬢様を片っ端から孕ませたら、どうなるか?" + }, "Kourin no Machi, Lavender no Shoujo": { "$type": "CxEncryption", "Mask": 385, @@ -1016,6 +1040,10 @@ "ControlBlockName": "love_laby.bin", "Title": "らぶ+らび" }, + "M-days Doukoku no Koubi Jigoku": { + "$type": "DieselmineCrypt", + "Title": "M-days 慟哭の交尾地獄" + }, "Mahoutsukai no Yoru": { "$type": "CxEncryption", "Mask": 554, @@ -1067,10 +1095,18 @@ "$type": "HashCrypt", "Title": "愛娘は、マゾ性隷 ~娘だからって遠慮しないでね?~" }, + "Me ga Sametara Seieki ga 100 Bai...": { + "$type": "DieselmineCrypt", + "Title": "目が覚めたら精液が100倍溜まる身体になってた→大量注入!" + }, "Megami Ryoujoku ~Paizuri Hime Verdandi~": { "$type": "FlyingShineCrypt", "Title": "女神凌辱 ~パイズリ姫ベルダンディー~" }, + "Mesuga* Choukyou": { + "$type": "DieselmineCrypt", + "Title": "メスガ●調教~デカチンに屈した少女たち~" + }, "Minarai Taimashi Maji de Ikimasu!": { "$type": "HashCrypt", "Title": "見習い退魔師 本気でイキますっ!" @@ -1219,6 +1255,10 @@ "$type": "FlyingShineCrypt", "Title": "おまな2 おまえんち萌えてるぞ" }, + "Omoikkiri! Seieki Tairyou Chuunyuu!": { + "$type": "DieselmineCrypt", + "Title": "思いっきり! 精液大量注入! ~高飛車女をアヘらせろ!~" + }, "Onaji Class no Idol-san. Around me is full by a celebrity.": { "$type": "XorCrypt", "Key": 232, @@ -1261,6 +1301,10 @@ "$type": "HashCrypt", "Title": "俺の妹は今日からドS ~お、お兄ちゃんなんか、あたしのペットにしてやるんだからっ~" }, + "Ore no Saimin Fantasia": { + "$type": "DieselmineCrypt", + "Title": "俺の催眠ファンタジア ~エロ催眠で戦女神から魔王までハメ放題!!~" + }, "Ore no Sugata ga, Toumei ni!? Invisible to Suuki na Unmei": { "$type": "XorCrypt", "Key": 149, @@ -1502,6 +1546,10 @@ "$type": "HashCrypt", "Title": "せがれの新妻" }, + "Seieki Tairyou Chuunyuu! 5": { + "$type": "DieselmineCrypt", + "Title": "精液大量注入!5~オレの高飛車な美少女ご主人様がこんなに盛大にアヘるわけがない!?~" + }, "Seiin no Meikyuu": { "$type": "CxEncryption", "Mask": 531, @@ -1535,6 +1583,10 @@ "ControlBlockName": "senren_banka.bin", "Title": "千恋*万花 | 千戀*萬花" }, + "Serifu de Kanjite! Seiyuu Doushi": { + "$type": "DieselmineCrypt", + "Title": "セリフで感じて!声優どうし" + }, "Shikijou Kyoudan": { "$type": "HashCrypt", "Title": "色情教団 | 妃神会秘史" @@ -1738,6 +1790,10 @@ "$type": "HashCrypt", "Title": "徹底アナル恥育 ~こっちが、気持ち良すぎて…~" }, + "The3Days -15-nin Renzoku Rape-": { + "$type": "DieselmineCrypt", + "Title": "The3Days -15人連続レイプ-" + }, "Toaru Jukujo no Hentai Choukyou": { "$type": "HashCrypt", "Title": "とある熟女の変態調教 ~老いてなお滴る秘蜜と悦楽~" @@ -1768,6 +1824,10 @@ "$type": "HashCrypt", "Title": "妻と息子にバレてはいけない背徳の媚熱 ~あやまちの密愛2~" }, + "Tsundere Itoko to Koakuma ...": { + "$type": "DieselmineCrypt", + "Title": "ツンデレ従姉妹と小悪魔な姪が可愛すぎるので、エロ教育して孕ませちゃうお話" + }, "Tsuyuchiru Letter ~Umi to Shiori ni Amaoto o~": { "$type": "CxEncryption", "Mask": 592, diff --git a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs index 2b95cd6..ae60b2b 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs @@ -160,6 +160,7 @@ enum CryptType { }, SeitenCrypt, OkibaCrypt, + DieselmineCrypt, } #[derive(Clone, Debug, Deserialize)] @@ -247,6 +248,7 @@ impl Schema { )?), CryptType::SeitenCrypt => Box::new(SeitenCrypt::new(self.base.clone())), CryptType::OkibaCrypt => Box::new(OkibaCrypt::new(self.base.clone())), + CryptType::DieselmineCrypt => Box::new(DieselmineCrypt::new(self.base.clone())), }) } } @@ -508,52 +510,61 @@ impl Read for MizukakeCryptReader { } } -#[derive(Debug)] -pub struct HashCrypt { - base: BaseSchema, +macro_rules! seek_crypt_filehash_key_u8_base_impl { + ($crypt:ident, $reader:ident) => { + #[derive(Debug)] + pub struct $crypt { + base: BaseSchema, + } + impl $crypt { + pub fn new(base: BaseSchema) -> Self { + Self { base } + } + } + impl Crypt for $crypt { + base_schema_impl!(); + fn decrypt_supported(&self) -> bool { + true + } + fn decrypt_seek_supported(&self) -> bool { + true + } + fn decrypt<'a>( + &self, + entry: &Xp3Entry, + cur_seg: &Segment, + stream: Box, + ) -> Result> { + Ok(Box::new($reader::new( + stream, + cur_seg, + entry.file_hash as u8, + ))) + } + fn decrypt_with_seek<'a>( + &self, + entry: &Xp3Entry, + cur_seg: &Segment, + stream: Box, + ) -> Result> { + Ok(Box::new($reader::new( + stream, + cur_seg, + entry.file_hash as u8, + ))) + } + } + }; } -impl HashCrypt { - pub fn new(base: BaseSchema) -> Self { - Self { base } - } +macro_rules! seek_crypt_filehash_key_u8_impl { + ($crypt:ident,$reader:ident<$t:ident>) => { + seek_crypt_filehash_key_u8_base_impl!($crypt, $reader); + seek_reader_key_impl!($reader<$t>, u8); + }; } -impl Crypt for HashCrypt { - base_schema_impl!(); - fn decrypt_supported(&self) -> bool { - true - } - fn decrypt_seek_supported(&self) -> bool { - true - } - fn decrypt<'a>( - &self, - entry: &Xp3Entry, - cur_seg: &Segment, - stream: Box, - ) -> Result> { - Ok(Box::new(HashCryptReader::new( - stream, - cur_seg, - entry.file_hash as u8, - ))) - } - fn decrypt_with_seek<'a>( - &self, - entry: &Xp3Entry, - cur_seg: &Segment, - stream: Box, - ) -> Result> { - Ok(Box::new(HashCryptReader::new( - stream, - cur_seg, - entry.file_hash as u8, - ))) - } -} - -seek_reader_key_impl!(HashCryptReader, u8); +seek_crypt_filehash_key_u8_impl!(HashCrypt, HashCryptReader); impl Read for HashCryptReader { fn read(&mut self, buf: &mut [u8]) -> std::io::Result { @@ -729,13 +740,13 @@ macro_rules! seek_crypt_filehash_key_base_impl { } macro_rules! seek_crypt_filehash_key_impl { - ($crypt:ident,$reader:ident<$t:ident>,$key:ty) => { + ($crypt:ident,$reader:ident<$t:ident>) => { seek_crypt_filehash_key_base_impl!($crypt, $reader); - seek_reader_key_impl!($reader<$t>, $key); + seek_reader_key_impl!($reader<$t>, u32); }; } -seek_crypt_filehash_key_impl!(SeitenCrypt, SeitenCryptReader, u32); +seek_crypt_filehash_key_impl!(SeitenCrypt, SeitenCryptReader); impl Read for SeitenCryptReader { fn read(&mut self, buf: &mut [u8]) -> std::io::Result { @@ -764,7 +775,7 @@ impl Read for SeitenCryptReader { } } -seek_crypt_filehash_key_impl!(OkibaCrypt, OkibaCryptReader, u32); +seek_crypt_filehash_key_impl!(OkibaCrypt, OkibaCryptReader); impl Read for OkibaCryptReader { fn read(&mut self, buf: &mut [u8]) -> std::io::Result { @@ -801,6 +812,30 @@ impl Read for OkibaCryptReader { } } +seek_crypt_filehash_key_u8_impl!(DieselmineCrypt, DieselmineCryptReader); + +impl Read for DieselmineCryptReader { + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + let readed = self.inner.read(buf)?; + let key = self.key as i32; + for (i, t) in (&mut buf[..readed]).iter_mut().enumerate() { + let offset = self.seg_start + self.pos + i as u64; + let key = if offset < 123 { + 21 * key + } else if offset < 246 { + -32 * key + } else if offset < 369 { + 43 * key + } else { + -54 * key + } as u8; + *t ^= key; + } + self.pos += readed as u64; + Ok(readed) + } +} + #[test] fn test_deserialize_crypt() { for (key, schema) in CRYPT_SCHEMA.iter() {