diff --git a/src/scripts/kirikiri/archive/xp3/crypt.json b/src/scripts/kirikiri/archive/xp3/crypt.json index 0252661..6433bf2 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt.json +++ b/src/scripts/kirikiri/archive/xp3/crypt.json @@ -3,6 +3,10 @@ "$type": "HashCrypt", "Title": "25c -その箱は少女の悲鳴を漏らさない-" }, + "Aibo Nyuujoku": { + "$type": "FlyingShineCrypt", + "Title": "愛母乳辱~妄執の巨乳責めザンマイ~" + }, "Aisai Injoku Settai": { "$type": "HashCrypt", "Title": "愛妻淫辱接待~借金のかたに妻の調教を命じられた夫~" @@ -45,10 +49,18 @@ "Key": 49, "Title": "僕の未来は、恋と課金と。~Charge To The Future~ [体験版] | 我的未来是恋爱与氪金 [试用版]" }, + "Crime Rhyme series": { + "$type": "FlyingShineCrypt", + "Title": "クライミライ" + }, "Custom Reido 4/4+/V": { "$type": "HashCrypt", "Title": "カスタム隷奴 4/4+/V" }, + "Daraku Koujo": { + "$type": "FlyingShineCrypt", + "Title": "堕落皇女~魔術師の罠に嵌った聖女~" + }, "Dare mo ga Kanojo o Neratteru": { "$type": "HashCrypt", "Title": "誰もが彼女を狙ってる。 | 众人觊觎的女友" @@ -85,6 +97,10 @@ "$type": "HashCrypt", "Title": "ハメドル白濁堕ち ~生中出しで、お仕事を貰っていいですか?~" }, + "Haniwari! Sayaka Ojou-sama": { + "$type": "FlyingShineCrypt", + "Title": "はにわり!沙耶華お嬢様~感染する股間の大きなモノ~" + }, "Hardcore Teacher": { "$type": "HashCrypt", "Title": "ハードコア・ティーチャー ~絶対服従へのロジック~" @@ -149,10 +165,22 @@ "$type": "HashCrypt", "Title": "淫薬依存学園~もっと…もっとちょうだい!~" }, + "Inaho no Mirai": { + "$type": "FlyingShineCrypt", + "Title": "イナホノミライ" + }, "Inaka no Muchi na Muchimuchi Musume": { "$type": "HashCrypt", "Title": "田舎の無知なむちむち娘" }, + "Inbo Rannyuu Soukan": { + "$type": "FlyingShineCrypt", + "Title": "淫母乱乳相姦~ボクの精子で、ママを一杯にしてあげる" + }, + "Ingoku no Hako": { + "$type": "FlyingShineCrypt", + "Title": "淫獄の筺~閉じ込められた美人母娘~" + }, "In! Joku! Pink Ranger!!": { "$type": "HashCrypt", "Title": "淫!辱!ピンクレンジャー!! ~堕ちた変身ヒロイン~" @@ -161,6 +189,10 @@ "$type": "HashCrypt", "Title": "淫落カウンセリング ~夫の目の前で、妻は本性に堕ちてゆく~" }, + "Inraku no Ketsuzoku": { + "$type": "FlyingShineCrypt", + "Title": "淫落の血族~禁断の呪縛~" + }, "Inshi Reizoku": { "$type": "HashCrypt", "Title": "淫姉隷属 ~影に潜んだ愛欲と支配~" @@ -169,6 +201,10 @@ "$type": "HashCrypt", "Title": "地味めな侍女さんのお仕事セックス~お嬢様に代わってお相手します~" }, + "Jokyoushi Rinkan no Kyoushitsu": { + "$type": "FlyingShineCrypt", + "Title": "女教師 輪姦の教室" + }, "Juurin! Orc Gakuen!": { "$type": "HashCrypt", "Title": "蹂躙!オーク学園! ~転校生は褐色ビッチな女勇者!?~" @@ -185,11 +221,23 @@ "$type": "HashCrypt", "Title": "カホゴな寮母の射精管理 ~ちゃんと我慢してくださいね?~" }, + "Kaiware!": { + "$type": "FlyingShineCrypt", + "Title": "かいわれっ!" + }, "Kamidanomi Shisugite Ore no Mirai ga Yabai.": { "$type": "XorCrypt", "Key": 205, "Title": "神頼みしすぎて俺の未来がヤバい。 | 求神太多我的未来糟糕了 | 太依赖咒术的我未来堪忧。" }, + "Kanjuku Sakuranbou!": { + "$type": "FlyingShineCrypt", + "Title": "完熟☆さくらん棒ッ! ~ヒキオタ達の姉妹交換~" + }, + "Kanojo-tachi no Taboo": { + "$type": "FlyingShineCrypt", + "Title": "彼女たちの禁忌" + }, "Kanpeki Seitokaichou no Himitsu no Seiheki": { "$type": "HashCrypt", "Title": "完璧生徒会長の秘密の性癖 ~高嶺の花の彼女をM女に開花させてやる~" @@ -226,6 +274,10 @@ "$type": "HashCrypt", "Title": "りとるほーる ~俺の娘がこんなに……なハズがない | Littlehole~我的女儿不可能这么……" }, + "Love Love Boin series": { + "$type": "FlyingShineCrypt", + "Title": "らぶらぶボイン" + }, "Mama no Okugai Shuuchi Lesson": { "$type": "HashCrypt", "Title": "ママの屋外羞恥レッスン ~視線が快楽に変る時…~" @@ -238,6 +290,10 @@ "$type": "HashCrypt", "Title": "愛娘は、マゾ性隷 ~娘だからって遠慮しないでね?~" }, + "Megami Ryoujoku ~Paizuri Hime Verdandi~": { + "$type": "FlyingShineCrypt", + "Title": "女神凌辱 ~パイズリ姫ベルダンディー~" + }, "Minarai Taimashi Maji de Ikimasu!": { "$type": "HashCrypt", "Title": "見習い退魔師 本気でイキますっ!" @@ -246,6 +302,10 @@ "$type": "MizukakeCrypt", "Title": "みずのかけら -once summer of islet-" }, + "Mizukoi": { + "$type": "FlyingShineCrypt", + "Title": "水恋~みずこい~" + }, "Momojiri Instructor Netori Lesson": { "$type": "HashCrypt", "Title": "桃尻インストラクター寝取りレッスン ~競泳水着でえろざんまい~" @@ -279,7 +339,7 @@ "Title": "お前の妻は、オレの淫乱肉嫁 ~お隣さんは欲求不満でした~" }, "Omana 2: Omaenchi Moeteruzo": { - "$type": "HashCrypt", + "$type": "FlyingShineCrypt", "Title": "おまな2 おまえんち萌えてるぞ" }, "Oppai Cafe ~Oyako de Cos Chichi~": { @@ -310,10 +370,18 @@ "$type": "HashCrypt", "Title": "夫に言えない義父との姦淫 ~嫌なのに忘れられなくなりそう~" }, + "Ouka Ryouran": { + "$type": "FlyingShineCrypt", + "Title": "桜花繚乱" + }, "Oyako Koukan": { "$type": "HashCrypt", "Title": "母娘肛姦 ~私のお尻に染みついていく雄の匂い~" }, + "Oyako Ninjutsu Kunoichi PonPon!!": { + "$type": "FlyingShineCrypt", + "Title": "母娘妊術くのいちPonPon!!" + }, "Oyako no Himitsu": { "$type": "HashCrypt", "Title": "父娘の秘密 ~妻に言えない親子の関係~" @@ -330,6 +398,21 @@ "$type": "HashCrypt", "Title": "パパ大好き!と言ってくれ…~反抗期の娘を催眠アプリで狂愛しつけ~" }, + "Princess Saga": { + "$type": "FlyingShineCrypt", + "Title": "プリンセスサーガ" + }, + "Re:": { + "$type": "FlyingShineCrypt" + }, + "Saikyou Chikan Densha": { + "$type": "FlyingShineCrypt", + "Title": "埼狂痴漢電車~7人の獲物達~" + }, + "Sailor Fuku Shinryou Tsumaka": { + "$type": "FlyingShineCrypt", + "Title": "セーラー服心療妻科~内緒のえっちなカウンセリング~" + }, "Sakura Sakura": { "$type": "HashCrypt", "Title": "さくらさくら" @@ -350,6 +433,14 @@ "$type": "HashCrypt", "Title": "色情教団 | 妃神会秘史" }, + "Shimai Soukan ~Kindan no Kakeizu~": { + "$type": "FlyingShineCrypt", + "Title": "実姉妹 ~濡れた相姦図~" + }, + "Shin'yuu no Kyonyuu Mama to Nakadashi Seikatsu": { + "$type": "FlyingShineCrypt", + "Title": "親友の巨乳ママと中出し性活~こんなに射精してちゃ孕んじゃったね" + }, "Shirouto Yanmama, Kosatsu AV Debut": { "$type": "HashCrypt", "Title": "素人ヤンママ、個撮AVデビュー ~見てな、女はド胸だぜ!~" @@ -358,6 +449,10 @@ "$type": "HashCrypt", "Title": "してなさそうで、している彼女のしていない事~キミの初めてになってやる~" }, + "Shokusai no Miyako": { + "$type": "FlyingShineCrypt", + "Title": "触祭の都" + }, "Shokushu Ouji no Nikuyome Sagashi": { "$type": "HashCrypt", "Title": "触手王子の肉嫁探し~母と姉弟の終わらない絶頂地獄~" @@ -370,10 +465,18 @@ "$type": "MizukakeCrypt", "Title": "そらいろの雫" }, + "Soukan Chiryou Byoutou": { + "$type": "FlyingShineCrypt", + "Title": "相姦恥療病棟 ~ナースはママで、女医は叔母" + }, "Sousei no Himegimi": { "$type": "HashCrypt", "Title": "双性の姫君 ~ふたなり姉妹と魔王の求愛~" }, + "Swan Song": { + "$type": "FlyingShineCrypt", + "Title": "スワンソング" + }, "Sweet ☆ Switch": { "$type": "HashCrypt", "Title": "すうぃ~と☆SwitcH ~まじわるシセンでとろけるカラダ~" @@ -401,6 +504,10 @@ "$type": "HashCrypt", "Title": "隣妻2 ~夫じゃできないこといっぱいシて~" }, + "Tsuma Kai -Tsuma Gai-": { + "$type": "FlyingShineCrypt", + "Title": "貸し出し妻、満里奈の“ネトラセ”報告 外伝1 ―女子校生、満里奈の性感開発―" + }, "Tsuma no Sobo wa": { "$type": "HashCrypt", "Title": "妻の祖母は、まだまだ現役超美熟女~孫婿ちゃん、寂しい時にはいつでもいらっしゃい~" diff --git a/src/scripts/kirikiri/archive/xp3/crypt.rs b/src/scripts/kirikiri/archive/xp3/crypt.rs index 9f02498..15c1687 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt.rs @@ -68,6 +68,7 @@ enum CryptType { XorCrypt { key: u8, }, + FlyingShineCrypt, } #[derive(Clone, Debug, Deserialize)] @@ -86,6 +87,7 @@ impl Schema { CryptType::MizukakeCrypt => Box::new(MizukakeCrypt::new()), CryptType::HashCrypt => Box::new(HashCrypt::new()), CryptType::XorCrypt { key } => Box::new(XorCrypt::new(key)), + CryptType::FlyingShineCrypt => Box::new(FlyingShineCrypt::new()), } } } @@ -412,6 +414,75 @@ impl Read for XorCryptReader { } } +#[derive(Debug)] +pub struct FlyingShineCrypt {} + +impl FlyingShineCrypt { + pub fn new() -> Self { + Self {} + } + + fn adjust(&self, hash: u32) -> (u8, u32) { + let mut shift = hash & 0xFF; + if shift == 0 { + shift = 0xF; + } + let mut key = ((hash >> 8) & 0xFF) as u8; + if key == 0 { + key = 0xF0; + } + (key, shift) + } +} + +impl Crypt for FlyingShineCrypt { + 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(FlyingShineCryptReader::new( + stream, + cur_seg, + self.adjust(entry.file_hash), + ))) + } + fn decrypt_with_seek<'a>( + &self, + entry: &Xp3Entry, + cur_seg: &Segment, + stream: Box, + ) -> Result> { + Ok(Box::new(FlyingShineCryptReader::new( + stream, + cur_seg, + self.adjust(entry.file_hash), + ))) + } +} + +seek_reader_key_impl!(FlyingShineCryptReader, (u8, u32)); + +impl Read for FlyingShineCryptReader { + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + let (xor, shift) = self.key; + let readed = self.inner.read(buf)?; + for t in (&mut buf[..readed]).iter_mut() { + *t ^= xor; + *t = t.rotate_right(shift); + } + self.pos += readed as u64; + Ok(readed) + } +} + #[test] fn test_deserialize_crypt() { for (key, schema) in CRYPT_SCHEMA.iter() {