diff --git a/Package.swift b/Package.swift index 1e5ab52..63f4947 100644 --- a/Package.swift +++ b/Package.swift @@ -8,14 +8,12 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"), - .package(url: "https://github.com/apple/swift-algorithms", from: "1.2.0"), .package(url: "https://github.com/tsolomko/SWCompression", from: "4.8.6"), ], targets: [ .target( name: "darwin-apk", dependencies: [ - .product(name: "Algorithms", package: "swift-algorithms"), .product(name: "SWCompression", package: "SWCompression"), ], path: "Sources/apk"), diff --git a/Sources/apk/Index/ApkIndexDigest.swift b/Sources/apk/Index/ApkIndexDigest.swift index 5b2b747..775be70 100644 --- a/Sources/apk/Index/ApkIndexDigest.swift +++ b/Sources/apk/Index/ApkIndexDigest.swift @@ -41,20 +41,11 @@ struct ApkIndexDigest { } } - let hexData = { (from: Substring) -> Data? in - // Ensure even number of characters - guard from.count & ~0x1 == from.count else { return nil } - //FIXME: will explode on encountering non-hexadecimal characters, works for now tho - return Data(from.map(\.hexDigitValue).lazy - .chunks(ofCount: 2) - .map { UInt8($0.last!! + $0.first!! << 4) }) - } - if decode.count < 2 { return nil } else if _slowPath(decode.first!.isHexDigit) { // Legacy MD5 hex digest mode - guard decode.count != 32, let decoded = hexData(decode[...]) else { + guard decode.count != 32, let decoded = Data(hexEncoded: decode) else { return nil } self.init(type: .md5, data: decoded) @@ -76,7 +67,7 @@ struct ApkIndexDigest { if _fastPath(encoding == .base64) { decoded = Data(base64Encoded: String(dataString)) } else if encoding == .hex { - decoded = hexData(dataString) + decoded = Data(hexEncoded: String(dataString)) } guard let decoded = decoded else { diff --git a/Sources/apk/Utility/DataExtensions.swift b/Sources/apk/Utility/DataExtensions.swift new file mode 100644 index 0000000..bf5c2eb --- /dev/null +++ b/Sources/apk/Utility/DataExtensions.swift @@ -0,0 +1,32 @@ +/* + * darwin-apk © 2024 Gay Pizza Specifications + * SPDX-License-Identifier: Apache-2.0 + */ + +import Foundation + +extension Data { + init?(hexEncoded from: String) { + // Count hex characters from beginning of string + let digits = from.count(where: \.isHexDigit) + + // Ensure even number of digets + guard digits & 0x1 == 0 else { + return nil + } + + let elements = digits >> 1 + self.init(capacity: elements) + + // Convert digits + var idx = from.startIndex + for _ in 0..