From 6efbc3dd0ddde072b58d6d80779dae3f55ea38e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Menu?= Date: Fri, 3 Jan 2025 20:15:38 +0100 Subject: [PATCH] Fix EPUB deobfuscation of ranges --- .../EPUBDeobfuscator.swift | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Sources/Streamer/Parser/EPUB/Resource Transformers/EPUBDeobfuscator.swift b/Sources/Streamer/Parser/EPUB/Resource Transformers/EPUBDeobfuscator.swift index a153b252e..62b52f1ad 100644 --- a/Sources/Streamer/Parser/EPUB/Resource Transformers/EPUBDeobfuscator.swift +++ b/Sources/Streamer/Parser/EPUB/Resource Transformers/EPUBDeobfuscator.swift @@ -72,21 +72,25 @@ final class EPUBDeobfuscator { } func stream(range: Range?, consume: @escaping (Data) -> Void) async -> ReadResult { - await resource.stream( + var readPosition = range?.lowerBound ?? 0 + let obfuscatedLength = algorithm.obfuscatedLength + + return await resource.stream( range: range, consume: { data in var data = data - let range = range ?? 0 ..< UInt64(data.count) - if range.lowerBound < self.algorithm.obfuscatedLength { - let toDeobfuscate = max(range.lowerBound, 0) ..< min(range.upperBound, UInt64(self.algorithm.obfuscatedLength)) - - for i in toDeobfuscate { - let i = Int(i) + if readPosition < obfuscatedLength { + for i in 0 ..< data.count { + if readPosition + UInt64(i) >= obfuscatedLength { + break + } data[i] = data[i] ^ self.key[i % self.key.count] } } + readPosition += UInt64(data.count) + consume(data) } )